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.dto.CamlineExtendArgDTO; import com.cnbm.packing.dto.CamlineSubIdDTO; 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 io.swagger.models.auth.In; 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.text.DecimalFormat; import java.text.Format; 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"); todayBoxNum+=500; String res = "301"+sapMaterial+nowTime+formateString(todayBoxNum); return res; } public String removeKG(String str){ return str.substring(0,17); } public static void main(String[] args) { Integer a = 102; Format f1 = new DecimalFormat("000"); System.out.println(f1.format(a)); } public String formateString(Integer a){ Format f1 = new DecimalFormat("000"); return f1.format(a); } @Override public void run(ApplicationArguments args) throws Exception { // kukaStep1.scheduleAtFixedRate(new Runnable() { // @Override // public void run() { // try { // // //调度开始 //// logger.info(""); //// logger.info("================= 现在开始执行 过程一 任务 =================="); // Integer subArrived = waitingForTarget(Step1Plc2MesVar.SubArrivedToMes, true); // if(subArrived != 1){ // logger.info("标签打印Event--- 失败"+" --- "+" 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); // //把基板ID字符串的空格去掉,因为plc中设置的20位,但实际基板ID就是17位,因为带空格去数据库查询 有问题的。 // subId = removeKG(subId); // // //二. 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()); // logger.info("标签打印Event--- 采集到 基板ID: "+subId+", 线边号:"+lineNum+",从camline 获取到实际pmpp"+pmppBySubId+",计算后 补偿功率:"+actualPMPP+",dLable_Pnom: "+argByPMPP.getPowerClass() +",dLable_Voc: "+argByPMPP.getLableVoc()+",dLable_Isc: "+argByPMPP.getLableIsc()+",dLable_Vmpp: "+argByPMPP.getLableVmpp()+",dLable_Impp: "+argByPMPP.getLableImpp()); // // // // //4. 把基板录到数据库 // WoPackagingBoxSubstrate woPackagingBoxSubstrate = new WoPackagingBoxSubstrate(); // woPackagingBoxSubstrate.setLineBody(lineNum); // woPackagingBoxSubstrate.setPowerLevel(argByPMPP.getPowerClass()); // woPackagingBoxSubstrate.setSapMaterial(argByPMPP.getSapMaterialNum()); // woPackagingBoxSubstrate.setWoSubstrateId(subId); // woPackagingBoxSubstrate.setActualPmpp(pmppBySubId); // woPackagingBoxSubstrate.setCreateTime(LocalDateTime.now()); // // // //5. 从camline那里获取可变字段 // CamlineExtendArgDTO extendArgFromCamline = service.getExtendArgFromCamline(subId); // logger.info("标签打印Event--- 基板ID: "+subId+", 从camline获取PID16~PID22 的实测数据 成功, 数据内容:"+extendArgFromCamline.toString()); // 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); // logger.info("标签打印Event--- 基板ID: "+subId+", 录入数据库成功"); // //=============== MES 业务 结束 ================= // // //三. 当MES完成任务后,把MesToPlc.SubArrivedFinish变量置为true,告诉plc,我操作完成了 // write(S7Client.S7_KUKA,Step1Mes2PlcVar.SubArrivedFinish,true); // logger.info("标签打印Event--- 基板ID: "+subId+", SubArrivedFinish,置为true 成功"); // //四. mes 监控 到PlcToMes.SubArrived==false,就把MesToPlc.SubArrivedFinish置为false // Integer subArrived2 = waitingForTarget(Step1Plc2MesVar.SubArrivedToMes, false); // if(subArrived2 != 1){ // logger.info("标签打印Event--- 失败"+" --- "+"MES监听 Step1Plc2MesVar.SubArrivedToMes 是否 等于 1 失败"); // } // // write(S7Client.S7_KUKA,Step1Mes2PlcVar.SubArrivedFinish,false); // logger.info("标签打印Event--- 基板ID: "+subId+", SubArrivedFinish,置为 false 成功, Event1 成功结束"); // // }catch (Throwable e){ // logger.info("标签打印Event--- :"+e.getMessage()); // } // } // },1,1, TimeUnit.SECONDS); // // // kukaStep2.scheduleAtFixedRate(new Runnable() { // @Override // public void run() { // try { // // //调度开始 // Integer shelfIsFull = waitingForTarget(Step2Plc2MesVar.ShelfIsFull, true); // if(shelfIsFull != 1){ // logger.info("BOXID生成Event-------失败"+" --- "+"MES监听 Step2Plc2MesVar.ShelfIsFull 是否 等于 1 失败"); // } // // //一. 从plc 中获取 subIdList 和 lineNum // String[] subIdList = (String[])read(S7Client.S7_KUKA,Step2Plc2MesVar.SubIdList); // Integer listSize = (Integer)read(S7Client.S7_KUKA,Step2Plc2MesVar.PackageNumberSet); // // //二. MES 业务 // //=============== MES 业务 开始 ================= // //1.MES 生成BoxId // if(subIdList.length<=0){ // logger.info("BOXID生成Event-------失败"+" --- "+"从plc里面获取到的基板列表 为空"); // throw new Exception("BOXID生成Event-------kuka机械手 取到了空箱"); // } // //真实的基板ID 就是17位的,plc读取过来,有空格,要把后面3位空格去掉就行了。 // for(int i=0;i