hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java
@@ -113,4 +113,13 @@ @TableField("strRemark") private String strRemark; public double getWidth() { return width; } public double getHeigth() { return height; } } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java
@@ -3,6 +3,9 @@ import com.github.yulichang.base.MPJBaseService; import com.mes.pp.entity.OptimizeDetail; import com.mes.pp.entity.OptimizeHeatDetail; import com.mes.pp.entity.OptimizeHeatLayout; import java.util.List; /** * <p> @@ -14,4 +17,9 @@ */ public interface OptimizeHeatDetailService extends MPJBaseService<OptimizeHeatDetail> { /** * 返回指定工程 指定版图号的小片玻璃信息 * @return */ List<OptimizeHeatDetail> selectHeatDetailGlassInfo(String engineerId, Integer temperingid); } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java
@@ -3,6 +3,9 @@ import com.github.yulichang.base.MPJBaseService; import com.mes.pp.entity.OptimizeDetail; import com.mes.pp.entity.OptimizeHeatLayout; import com.mes.temperingglass.entity.TemperingGlassInfo; import java.util.List; /** * <p> @@ -13,5 +16,9 @@ * @since 2024-04-16 */ public interface OptimizeHeatLayoutService extends MPJBaseService<OptimizeHeatLayout> { /** * 返回指定工程 指定版图号的版图信息 * @return */ OptimizeHeatLayout selectHeatLayoutInfo(String engineerId,Integer temperingid); } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java
@@ -1,14 +1,18 @@ package com.mes.pp.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.yulichang.base.MPJBaseServiceImpl; import com.mes.pp.entity.OptimizeDetail; import com.mes.pp.entity.OptimizeHeatDetail; import com.mes.pp.entity.OptimizeHeatLayout; import com.mes.pp.mapper.OptimizeDetailMapper; import com.mes.pp.mapper.OptimizeHeatDetailMapper; import com.mes.pp.service.OptimizeDetailService; import com.mes.pp.service.OptimizeHeatDetailService; import org.springframework.stereotype.Service; import java.util.List; /** * <p> @@ -22,4 +26,12 @@ @DS("pp") public class OptimizeHeatDetailServiceImpl extends MPJBaseServiceImpl<OptimizeHeatDetailMapper, OptimizeHeatDetail> implements OptimizeHeatDetailService { @Override public List<OptimizeHeatDetail> selectHeatDetailGlassInfo(String engineerId, Integer temperingid) { QueryWrapper<OptimizeHeatDetail> wrapper = new QueryWrapper<>(); wrapper.eq("project_no", engineerId) .eq("layout_id", temperingid) .orderByAsc("sort"); return baseMapper.selectList(wrapper); } } hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java
@@ -1,6 +1,7 @@ package com.mes.pp.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.yulichang.base.MPJBaseServiceImpl; import com.mes.pp.entity.OptimizeDetail; import com.mes.pp.entity.OptimizeHeatLayout; @@ -8,6 +9,9 @@ import com.mes.pp.mapper.OptimizeHeatLayoutMapper; import com.mes.pp.service.OptimizeDetailService; import com.mes.pp.service.OptimizeHeatLayoutService; import com.mes.temperingglass.entity.TemperingGlassInfo; import com.mes.temperingglass.mapper.TemperingGlassInfoMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -22,4 +26,14 @@ @DS("pp") public class OptimizeHeatLayoutServiceImpl extends MPJBaseServiceImpl<OptimizeHeatLayoutMapper, OptimizeHeatLayout> implements OptimizeHeatLayoutService { @Override public OptimizeHeatLayout selectHeatLayoutInfo(String engineerId, Integer temperingid) { QueryWrapper<OptimizeHeatLayout> wrapper = new QueryWrapper<>(); wrapper.select("Top 1 *").eq("project_no", engineerId) .eq("layout_id", temperingid); return baseMapper.selectOne(wrapper); } } hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java
@@ -47,5 +47,10 @@ * @return */ Integer updateTemperingState(TemperingGlassInfo temperingGlassInfo); /** * 根据炉号查钢化版图玻璃信息 * @return */ List<TemperingGlassInfo> selectGlassInfoById(Integer id); } hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java
@@ -108,4 +108,21 @@ return 100; } } @Override public List<TemperingGlassInfo> selectGlassInfoById(Integer id) { List<TemperingGlassInfo> result=null; QueryWrapper<TemperingGlassInfo> wrapper = new QueryWrapper<>(); wrapper.select("Top 1 *").in("state",1,0).eq("temperingLayoutId",id); TemperingGlassInfo glass=temperingMapper.selectOne(wrapper); if(glass!=null) { QueryWrapper<TemperingGlassInfo> glassinfo = new QueryWrapper<>(); glassinfo.eq("engineer_id", glass.getEngineerId()) .eq("tempering_layout_id", id); //return temperingMapper.selectList(glassinfo); result= temperingMapper.selectByEngineerIdAndLayoutId(glass.getEngineerId(),glass.getTemperingLayoutId()); } return result; } } hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java
New file @@ -0,0 +1,152 @@ package com.mes.job; import com.kangaroohy.milo.model.ReadWriteEntity; import com.kangaroohy.milo.service.MiloService; import com.mes.pp.entity.OptimizeHeatDetail; import com.mes.pp.entity.OptimizeHeatLayout; import com.mes.pp.service.OptimizeHeatDetailService; import com.mes.pp.service.OptimizeHeatLayoutService; import com.mes.temperingglass.entity.TemperingGlass; import com.mes.temperingglass.entity.TemperingGlassInfo; import com.mes.temperingglass.service.TemperingGlassInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Comparator; import java.util.List; import java.util.Optional; @Component @Slf4j public class OpcNGTemperingTask { @Autowired(required = false) MiloService miloService; @Autowired private TemperingGlassInfoService temperingAgoService; @Autowired private OptimizeHeatLayoutService optimizeHeatLayoutService; @Autowired private OptimizeHeatDetailService optimizeHeatDetailService; /** * 摆片台请求进片逻辑处理 * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成) * fixedDelay : 上一个调用结束后再次调用的延时 */ @Scheduled(fixedDelay = 1000) public void requestTemperingTask() throws Exception { ReadWriteEntity requestTemperingId = miloService.readFromOpcUa("XX.XX.requestTemperingId");//请求进片 炉号ID Integer id = Integer.parseInt(requestTemperingId.getValue().toString()); if (id == 0) { miloService.writeToOpcUa(generateReadWriteEntity("XX.XX.responseInTempering", 0));//允许送片清零 } ReadWriteEntity placedNumber = miloService.readFromOpcUa("XX.XX.placedNumber");//已摆片数量 List<TemperingGlassInfo> glassList = temperingAgoService.selectGlassInfoById(id); if (glassList.size() == Integer.parseInt(placedNumber.getValue().toString())) { miloService.writeToOpcUa(generateReadWriteEntity("XX.XX.responseInTempering", 1));//写入允许送片 } } /** * 钢化上片台下发参数逻辑处理 * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成) * fixedDelay : 上一个调用结束后再次调用的延时 */ @Scheduled(fixedDelay = 1000) public void loadTemperingTask() throws Exception { ReadWriteEntity loadTemperingId = miloService.readFromOpcUa("XX.XX.loadTemperingId");//进片完成 炉号ID getNewTemperingID(Integer.parseInt(loadTemperingId.getValue().toString()));//进片完成 下发参数 } //获取到炉号id执行参数下发任务 private void getNewTemperingID(Integer temperingid) throws Exception { ReadWriteEntity AutoStatus = miloService.readFromOpcUa("GH1.GH1.AutoStatus"); if (1 != Integer.parseInt(AutoStatus.getValue().toString())) { log.info("当前为非联机状态,结束钢化下发参数任务"); return; } ReadWriteEntity QandA = miloService.readFromOpcUa("GH1.GH1.QandA"); ReadWriteEntity RecipeStatus = miloService.readFromOpcUa("GH1.GH1.RecipeStatus"); if (1 == Integer.parseInt(QandA.getValue().toString()) && 2 == Integer.parseInt(RecipeStatus.getValue().toString())) { log.info("版面信息已经下发,并且已经匹配参数,结束钢化下发参数任务"); return; } List<TemperingGlassInfo> glassList = temperingAgoService.selectGlassInfoById(temperingid); if (glassList != null && glassList.size() > 0) { int glasstype = GetGlassType(glassList.get(0).getFilmsid());//膜系 int process = 0;//钢化类型 int thiness = (int) glassList.get(0).getThickness();//厚度 String engineerId = glassList.get(0).getEngineerId(); Integer temperingLayoutId = glassList.get(0).getTemperingLayoutId(); OptimizeHeatLayout heatLayoutinfo = optimizeHeatLayoutService.selectHeatLayoutInfo(engineerId, temperingLayoutId); int loadingRate = (int) (heatLayoutinfo.getLayoutRate() * 100); //装载率 loadingRate = loadingRate > 10000 ? 10000 : loadingRate; List<OptimizeHeatDetail> heatDetailGlassInfoList = optimizeHeatDetailService.selectHeatDetailGlassInfo(engineerId, temperingLayoutId); Optional<Double> maxProductOpt = heatDetailGlassInfoList.stream() .map(ohd -> ohd.getWidth() * ohd.getHeight()) .max(Double::compareTo); double totalarea = heatDetailGlassInfoList.stream().mapToDouble(ohd -> ohd.getWidth() * ohd.getHeight()).sum(); int shape = 0; //最大片占总面积的比例 if (maxProductOpt.isPresent()) { shape = (int) (maxProductOpt.get() / totalarea * 100); } shape = shape > 10000 ? 10000 : shape; int workmode = 0; //工位数 int furmode = 0; //双室/联室 miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.TemperingId", temperingid));//写入炉号 miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.GlassType", glasstype));//写入玻璃类型 miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Process", process));//写入钢化类型 全钢 半钢 防火 miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Thickness", thiness));//写入厚度 miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.LoadingRate", loadingRate));//写入装载率 miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Shape", shape));//写入大片比例 miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.WorkMode", workmode));//写入工位数 miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.FurnaceMode", furmode));//写入炉体工作方式 log.info("炉号" + temperingid + "版面信息尝试下发"); } } //根据膜系返回玻璃类型 private int GetGlassType(String glasstype) { int result = 0; String str = glasstype.toLowerCase(); if (str.contains("白玻")) { result = 0; } if (str.contains("超白")) { result = 4; } if (str.contains("lowe") || str.contains("low-e")) { result = 1; } if (str.contains("双银")) { result = 2; } if (str.contains("三银")) { result = 3; } if (str.contains("热反射")) { result = 5; } return result; } private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) { return ReadWriteEntity.builder() .identifier(identifier) //Kep中是Long类型,即:Int32,Java中的int类型 .value(value) .build(); } }