package com.cnbm.packing.dispatch; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; import com.cnbm.packing.dispatch.enums.kuka.step1.Step1Mes2PlcVar; import com.cnbm.packing.dispatch.enums.kuka.step1.Step1Plc2MesVar; import com.cnbm.packing.dispatch.enums.kuka.step2.Step2Mes2PlcVar; import com.cnbm.packing.dispatch.enums.kuka.step2.Step2Plc2MesVar; import com.cnbm.packing.dispatch.enums.kuka.step3.Step3Mes2PlcVar; import com.cnbm.packing.dispatch.enums.kuka.step3.Step3Plc2MesVar; import com.cnbm.packing.dto.CamlineExtendArgDTO; import com.cnbm.packing.dto.WoPowerLevelDTO; import com.cnbm.packing.entity.WoPackagingBox; import com.cnbm.packing.entity.WoPackagingBoxSubstrate; import com.cnbm.packing.entity.WoPowerLevel; import com.cnbm.packing.service.*; import com.cnbm.s7.s7connector.enmuc.S7Client; import com.cnbm.s7.s7connector.type.PlcVar; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * @Desc: "" * @Author: caixiang * @DATE: 2022/12/23 12:33 */ @Component @Order(value = 1) public class KukaJoinThread implements ApplicationRunner { private static final Logger logger = LoggerFactory.getLogger(KukaJoinThread.class); @Autowired DynamicDataSourceService service; @Autowired WoPowerLevelServiceBiz levelServiceBiz; @Autowired WoCompensationPowerServiceBiz compensationPowerServiceBiz; @Autowired WoPackagingBoxSubstrateServiceBiz substrateServiceBiz; @Autowired WoPackagingBoxServiceBiz boxServiceBiz; public KukaJoinThread(){ this.kukaStep1 = Executors.newScheduledThreadPool(1); this.kukaStep2 = Executors.newScheduledThreadPool(1); this.kukaStep3 = Executors.newScheduledThreadPool(1); } private ScheduledExecutorService kukaStep1; private ScheduledExecutorService kukaStep2; private ScheduledExecutorService kukaStep3; /** * return * 成功: 返回相应的object对象 * 失败: 返回null * */ private Object read(S7Client s7Client,Step1Plc2MesVar var) { try { return s7Client.read(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getLength(), var.getStrSize(), var.getType()); }catch (Exception e){ logger.error("host:"+s7Client.getHost()+" ; read 操作出现问题: "+e.getMessage()); e.printStackTrace(); return null; } } private void write(S7Client s7Client, Step1Mes2PlcVar var, Object newValue) { if(var.getType().equals(PlcVar.STRING_Array)){ String[] s = (String[])newValue; String[] ss = (String[])newValue; if(s.length > var.getLength() ){ ss = new String[var.getLength()]; for(int i=0;i< var.getLength();i++){ ss[i] = s[i]; } } s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),ss); }else { s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),newValue); } } private Object read(S7Client s7Client, Step2Plc2MesVar var) { try { return s7Client.read(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getLength(), var.getStrSize(), var.getType()); }catch (Exception e){ logger.error("host:"+s7Client.getHost()+" ; read 操作出现问题: "+e.getMessage()); e.printStackTrace(); return null; } } private void write(S7Client s7Client, Step2Mes2PlcVar var, Object newValue) { if(var.getType().equals(PlcVar.STRING_Array)){ String[] s = (String[])newValue; String[] ss = (String[])newValue; if(s.length > var.getLength() ){ ss = new String[var.getLength()]; for(int i=0;i< var.getLength();i++){ ss[i] = s[i]; } } s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),ss); }else { s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),newValue); } } private Object read(S7Client s7Client, Step3Plc2MesVar var) { try { return s7Client.read(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getLength(), var.getStrSize(), var.getType()); }catch (Exception e){ logger.error("host:"+s7Client.getHost()+" ; read 操作出现问题: "+e.getMessage()); e.printStackTrace(); return null; } } private void write(S7Client s7Client, Step3Mes2PlcVar var, Object newValue) { if(var.getType().equals(PlcVar.STRING_Array)){ String[] s = (String[])newValue; String[] ss = (String[])newValue; if(s.length > var.getLength() ){ ss = new String[var.getLength()]; for(int i=0;i< var.getLength();i++){ ss[i] = s[i]; } } s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),ss); }else { s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),newValue); } } public String getBoxId(String sapMaterial){ Integer todayBoxNum = service.getTodayBoxNum(); String nowTime = DateUtil.format(new Date(), "yyMMdd"); String res = "301"+sapMaterial+nowTime+todayBoxNum; return res; } @Override public void run(ApplicationArguments args) throws Exception { kukaStep1.scheduleAtFixedRate(new Runnable() { @Override public void run() { //调度开始 // logger.info(""); // logger.info("================= 现在开始执行 过程一 任务 =================="); Integer subArrived = waitingForTarget(Step1Plc2MesVar.SubArrivedToMes, true); if(subArrived != 1){ logger.info("失败"+" --- "+" MES监听 Step1Plc2MesVar.SubArrivedToMes 是否 等于 1 失败"); } //一. 从plc 中获取 subId 和 lineNum String subId = (String) read(S7Client.S7_KUKA,Step1Plc2MesVar.SubIdToMes); Integer lineNum = (Integer) read(S7Client.S7_KUKA,Step1Plc2MesVar.LineNum); logger.info("采集到 基板ID: "+subId+", 线边号:"+lineNum); //二. MES 业务 //=============== MES 业务 开始 ================= //1. 从comline数据库中获取 实际pmpp float pmppBySubId = service.getPMPPBySubId(subId); //2. 匹配和计算补偿功率 float actualPMPP = compensationPowerServiceBiz.calculCompensationPMPP(pmppBySubId,lineNum); //3. 依据补偿功率,获取工艺参数,并且把这些工艺参数传给kuka WoPowerLevel argByPMPP = levelServiceBiz.getArgByPMPP(actualPMPP, lineNum); write(S7Client.S7_KUKA,Step1Mes2PlcVar.dLable_Pnom,Integer.valueOf(argByPMPP.getPowerClass())); write(S7Client.S7_KUKA,Step1Mes2PlcVar.dLable_Voc,argByPMPP.getLableVoc()); write(S7Client.S7_KUKA,Step1Mes2PlcVar.dLable_Isc,argByPMPP.getLableIsc()); write(S7Client.S7_KUKA,Step1Mes2PlcVar.dLable_Vmpp,argByPMPP.getLableVmpp()); write(S7Client.S7_KUKA,Step1Mes2PlcVar.dLable_Impp,argByPMPP.getLableImpp()); //4. 把基板录到数据库 WoPackagingBoxSubstrate woPackagingBoxSubstrate = new WoPackagingBoxSubstrate(); woPackagingBoxSubstrate.setLineBody(lineNum); woPackagingBoxSubstrate.setPowerLevel(argByPMPP.getPowerClass()); woPackagingBoxSubstrate.setSapMaterial(argByPMPP.getSapMaterialNum()); woPackagingBoxSubstrate.setWoSubstrateId(subId); //5. 从camline那里获取可变字段 CamlineExtendArgDTO extendArgFromCamline = service.getExtendArgFromCamline(subId); woPackagingBoxSubstrate.setLastUpdateTime(extendArgFromCamline.getLastUpdateTime()); woPackagingBoxSubstrate.setPmpp(actualPMPP); woPackagingBoxSubstrate.setOrderName(extendArgFromCamline.getOrderName()); woPackagingBoxSubstrate.setBinclassFl1(extendArgFromCamline.getBinclassFl1()); woPackagingBoxSubstrate.setBinclassFl2(extendArgFromCamline.getBinclassFl2()); woPackagingBoxSubstrate.setEtaFl1(extendArgFromCamline.getEtaFl1()); woPackagingBoxSubstrate.setEtaFl2(extendArgFromCamline.getEtaFl2()); woPackagingBoxSubstrate.setFfFl1(extendArgFromCamline.getFfFl1()); woPackagingBoxSubstrate.setFfFl2(extendArgFromCamline.getFfFl2()); woPackagingBoxSubstrate.setImppFl1(extendArgFromCamline.getImppFl1()); woPackagingBoxSubstrate.setImppFl2(extendArgFromCamline.getImppFl2()); woPackagingBoxSubstrate.setInsolflashcontrolFl1(extendArgFromCamline.getInsolflashcontrolFl1()); woPackagingBoxSubstrate.setInsolflashcontrolFl2(extendArgFromCamline.getInsolflashcontrolFl2()); woPackagingBoxSubstrate.setInsolmppFl1(extendArgFromCamline.getInsolmppFl1()); woPackagingBoxSubstrate.setInsolmppFl2(extendArgFromCamline.getInsolmppFl2()); woPackagingBoxSubstrate.setInsolvocFl1(extendArgFromCamline.getInsolvocFl1()); woPackagingBoxSubstrate.setInsolvocFl2(extendArgFromCamline.getInsolvocFl2()); woPackagingBoxSubstrate.setInsolFl1(extendArgFromCamline.getInsolFl1()); woPackagingBoxSubstrate.setInsolFl2(extendArgFromCamline.getInsolFl2()); woPackagingBoxSubstrate.setIscFl1(extendArgFromCamline.getIscFl1()); woPackagingBoxSubstrate.setIscFl2(extendArgFromCamline.getIscFl2()); woPackagingBoxSubstrate.setMeasTimeFl1(extendArgFromCamline.getMeasTimeFl1()); woPackagingBoxSubstrate.setMeasTimeFl2(extendArgFromCamline.getMeasTimeFl2()); woPackagingBoxSubstrate.setPmppFl1(extendArgFromCamline.getPmppFl1()); woPackagingBoxSubstrate.setPmppFl2(extendArgFromCamline.getPmppFl2()); woPackagingBoxSubstrate.setTcellFl1(extendArgFromCamline.getTcellFl1()); woPackagingBoxSubstrate.setTcellFl2(extendArgFromCamline.getTcellFl2()); woPackagingBoxSubstrate.setTmonicellFl1(extendArgFromCamline.getTmonicellFl1()); woPackagingBoxSubstrate.setTmonicellFl2(extendArgFromCamline.getTmonicellFl2()); woPackagingBoxSubstrate.setUmppFl1(extendArgFromCamline.getUmppFl1()); woPackagingBoxSubstrate.setUmppFl2(extendArgFromCamline.getUmppFl2()); woPackagingBoxSubstrate.setUocFl1(extendArgFromCamline.getUocFl1()); woPackagingBoxSubstrate.setUocFl1(extendArgFromCamline.getUocFl2()); substrateServiceBiz.insert(woPackagingBoxSubstrate); //=============== MES 业务 结束 ================= //三. 当MES完成任务后,把MesToPlc.SubArrivedFinish变量置为true,告诉plc,我操作完成了 write(S7Client.S7_KUKA,Step1Mes2PlcVar.SubArrivedFinish,true); //四. mes 监控 到PlcToMes.SubArrived==false,就把MesToPlc.SubArrivedFinish置为false Integer subArrived2 = waitingForTarget(Step1Plc2MesVar.SubArrivedToMes, false); if(subArrived2 != 1){ logger.info("失败"+" --- "+"MES监听 Step1Plc2MesVar.SubArrivedToMes 是否 等于 1 失败"); } write(S7Client.S7_KUKA,Step1Mes2PlcVar.SubArrivedFinish,false); } },1,1, TimeUnit.SECONDS); kukaStep2.scheduleAtFixedRate(new Runnable() { @Override public void run() { //调度开始 Integer shelfIsFull = waitingForTarget(Step2Plc2MesVar.ShelfIsFull, true); if(shelfIsFull != 1){ logger.info("失败"+" --- "+"MES监听 Step2Plc2MesVar.ShelfIsFull 是否 等于 1 失败"); } //一. 从plc 中获取 subIdList 和 lineNum String[] subIdList = (String[])read(S7Client.S7_KUKA,Step2Plc2MesVar.SubIdList); // Integer lineNum = (Integer) read(S7Client.S7_KUKA,Step2Plc2MesVar.LineNum); logger.info("获取到基板列表:"+ Arrays.toString(subIdList)); //二. MES 业务 //=============== MES 业务 开始 ================= //1.MES 生成BoxId if(subIdList.length<=0){ logger.info("失败"+" --- "+"从plc里面获取到的基板列表 为空"); } WoPackagingBoxSubstrate bySubId = substrateServiceBiz.getBySubId(subIdList[0]); String boxId = getBoxId(bySubId.getSapMaterial()); logger.info("mes 生成的boxId :"+ boxId); //2. 依次update 基板表,把boxId 赋予这些基板 for(int i=0;i