package com.cnbm.dispatch; import cn.hutool.core.date.DateUtil; import com.cnbm.dispatch.enums.kuka.step1.Step1Mes2PlcVar; import com.cnbm.dispatch.enums.kuka.step1.Step1Plc2MesVar; import com.cnbm.dispatch.enums.kuka.step2.Step2Mes2PlcVar; import com.cnbm.dispatch.enums.kuka.step2.Step2Plc2MesVar; import com.cnbm.dispatch.enums.kuka.step3.Step3Mes2PlcVar; import com.cnbm.dispatch.enums.kuka.step3.Step3Plc2MesVar; 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.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("================= 现在开始执行 过程一 任务 =================="); } },1,1, TimeUnit.SECONDS); // 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