package com.mes.plcTaskThread; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mes.md.entity.LineConfiguration; import com.mes.md.entity.Machine; import com.mes.md.entity.PrimitiveTask; import com.mes.md.entity.Tasking; import com.mes.md.mapper.MachineMapper; import com.mes.md.mapper.TaskingMapper; import com.mes.md.service.*; import com.mes.service.ModbusTcp; import com.mes.service.PlcAgreement; import com.mes.service.PlcParameter; import com.mes.utils.HexUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.protocol.HTTP; import java.text.SimpleDateFormat; import java.util.*; @Slf4j public class MachineThread extends Thread{ TaskingMapper taskingMapper; MachineMapper machineMapper; TaskingService taskingService; PrimitiveTaskService primitiveTaskService; LineConfigurationService lineConfigurationService; public MachineThread(TaskingMapper taskingMapper, MachineMapper machineMapper, TaskingService taskingService, PrimitiveTaskService primitiveTaskService, LineConfigurationService lineConfigurationService){ this.taskingMapper = taskingMapper; this.machineMapper = machineMapper; this.taskingService = taskingService; this.primitiveTaskService = primitiveTaskService; this.lineConfigurationService = lineConfigurationService; } public Long machineId = 2L; public List sendRecords = new ArrayList<>(); // public void plcStart1(PlcAgreement plcAgreement,String zuKey) { // //逻辑组 :请求组,完成组,其他组 // //List> map=new ArrayList<>();//逻辑组 // Map>> map=new HashMap<>();//请求逻辑组 // Map> zuMap=map.get(zuKey); // // for(String key:map.keySet()){ // boolean istrue=false; // if(plcAgreement.getPlcParameter(key).getValueString()==map.get(key)){ // istrue=true; // } // map.put(key,plcAgreement.getPlcParameter(key).getValueString()); // } // // } public void plcStart() { Machine machine=machineMapper.selectById(machineId); ModbusTcp modbusTcp1 =new ModbusTcp(machine.getIp(),machine.getPort(),"PlcLoad"); modbusTcp1.connect(); PlcAgreement plcAgreement=modbusTcp1.getPlcAgreement("PlcLoad"); try { if(!modbusTcp1.read(plcAgreement)){ log.info("通讯读取新数据失败"); modbusTcp1.close(); return; } PlcParameter plcRequest =plcAgreement.getPlcParameter("plcRequest");//请求字 PlcParameter mesSend =plcAgreement.getPlcParameter("mesSend");//发送字 PlcParameter mesSendCount =plcAgreement.getPlcParameter("mesSendCount");//发送数量 PlcParameter plcReport =plcAgreement.getPlcParameter("plcReport");//汇报字 PlcParameter plcReportID =plcAgreement.getPlcParameter("plcReportID");//汇报ID PlcParameter mesConfirm =plcAgreement.getPlcParameter("mesConfirm");//确认字 PlcParameter mesConfirmID =plcAgreement.getPlcParameter("mesConfirmID");//确认ID if (machine.getIsLog()>0){ modbusTcp1.consoleLogInfo(plcAgreement); } if (0==plcRequest.getValueInt()&&1==mesSend.getValueInt()) { //发送字置0 String send= HexUtil.intTo2ByteHex(0); modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesSend.getAddressStart()/2)); log.info("1.发送字置零 发送字 清空成功;内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesSend.getAddressStart())); modbusTcp1.close(); return; } if (0==plcReport.getValueInt()&&0!=mesConfirm.getValueInt()) { //确认字置零 String send=HexUtil.intTo2ByteHex(0); modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm.getAddressStart()/2)); log.info("2.确认字置零 任务完成 清空成功;内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } if(1==plcReport.getValueInt()&&0==mesConfirm.getValueInt()){ int finishCount=taskingService.finishMachineTask(machine); log.info("3、任务完成:"+plcReportID.getValueString()); if(finishCount>0) {//有任务 String send = HexUtil.intTo2ByteHex(1); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart()/ 2)); log.info("任务完成 成功 内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } String send = HexUtil.intTo2ByteHex(1); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); log.info("任务完成 异常成功 内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } List taskingCount=taskingService.findMachineWorkStateTask(machine,"正在工作"); if((1==plcRequest.getValueInt()&&0==mesSend.getValueInt()) &&"开工".equals(machine.getState())){ int loadCount=0; if(machine.getMode()==1){ //标准模式 找已领取未完成的第一条任务 LineConfiguration lineConfiguration=lineConfigurationService.machineLineConfiguration(machine); List findPrimitiveTasking=primitiveTaskService.findPrimitiveTasking(machine,lineConfiguration.getLineId()); for(PrimitiveTask primitiveTask:findPrimitiveTasking){ //任务数>已上数量 List taskingTopList=taskingMapper.selectList(new QueryWrapper().lambda() .eq(Tasking::getScanId,primitiveTask.getScanId()) ); loadCount=primitiveTask.getTaskQuantity()-taskingTopList.size(); loadCount=(loadCount>0?loadCount:0); break; } //loadCount=taskingCount.size(); }else{ //定制模式 loadCount=1; } if(loadCount>0){ log.info("4、发送任务 任务数据:{}, 设备状态:{}, ",loadCount,machine); String send=HexUtil.intTo2ByteHex(1)+ HexUtil.intTo2ByteHex(loadCount); modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesSend.getAddressStart()/2)); log.info("发送任务发送报文内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesSend.getAddressStart()/2)); modbusTcp1.close(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String sendRecord=df.format(new Date())+" "+"1 "+ loadCount; if (sendRecords.size()>7){ sendRecords.remove(0); } Map sendContentMap=new HashMap(); sendContentMap.put("sendContent",sendRecord); sendRecords.add(sendContentMap); return; } } } catch (Exception e) { log.info("交互逻辑错误"); } modbusTcp1.close(); } @Override public void run() { while (this != null) { try { Thread.sleep(1000); log.info("111"); plcStart(); //plcStart(); // if ("开工".equals(machine.getState()) ){ // // } } catch (InterruptedException e) { e.printStackTrace(); } } } }