package com.mes.plcTaskThread; import com.mes.md.entity.LineConfiguration; import com.mes.md.entity.Machine; import com.mes.md.entity.PrimitiveTask; import com.mes.md.mapper.MachineMapper; import com.mes.md.mapper.PrimitiveTaskMapper; import com.mes.md.mapper.TaskingMapper; import com.mes.md.service.LineConfigurationService; import com.mes.md.service.PrimitiveTaskService; import com.mes.md.service.TaskingService; 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 java.util.ArrayList; import java.util.List; import java.util.Map; @Slf4j public class MachineLoad extends Thread { TaskingMapper taskingMapper; MachineMapper machineMapper; TaskingService taskingService; PrimitiveTaskService primitiveTaskService; PrimitiveTaskMapper primitiveTaskMapper; LineConfigurationService lineConfigurationService; public Machine thisMachine; //public Long machineId = 2L; public List sendRecords = new ArrayList<>(); public MachineLoad(Machine machine, PrimitiveTaskMapper primitiveTaskMapper, TaskingMapper taskingMapper, MachineMapper machineMapper, TaskingService taskingService, PrimitiveTaskService primitiveTaskService, LineConfigurationService lineConfigurationService) { this.thisMachine = machine; this.primitiveTaskMapper = primitiveTaskMapper; this.taskingMapper = taskingMapper; this.machineMapper = machineMapper; this.taskingService = taskingService; this.primitiveTaskService = primitiveTaskService; this.lineConfigurationService = lineConfigurationService; } public void plcStart() throws Exception{ ModbusTcp modbusTcp1 = null; try { Machine machine = machineMapper.selectById(thisMachine.getId()); modbusTcp1 = new ModbusTcp(machine.getIp(), machine.getPort(), machine.getFileName()); if (!modbusTcp1.connect()) { log.error("连接PLC失败,退出本次操作"); return; } PlcAgreement plcAgreement = modbusTcp1.getPlcAgreement(machine.getFileName()); if (!modbusTcp1.read(plcAgreement)) { log.info("通讯读取新数据失败"); if (!"关机".equals(machine.getStatePowerOn())) { machine.setStatePowerOn("关机"); machineMapper.updateById(machine); } modbusTcp1.close(); return; } if (!"开机".equals(machine.getStatePowerOn())) { machine.setStatePowerOn("开机"); machineMapper.updateById(machine); } 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 = plcReportID.getValueInt(); if (finishCount > 0) {//有任务 if (machine.getMode() == 1) { //标准模式 找已领取未完成的第一条任务 LineConfiguration lineConfiguration = lineConfigurationService.machineLineConfiguration(machine); List findPrimitiveTasking = primitiveTaskService.findPrimitiveTasking(machine, lineConfiguration.getLineId()); for (PrimitiveTask primitiveTask : findPrimitiveTasking) { primitiveTask.setLoadCount(primitiveTask.getLoadCount() + 1); primitiveTaskMapper.updateById(primitiveTask); break; } } else if (machine.getMode() == 3) { machine.setFinshCount(machine.getFinshCount() + plcReportID.getValueInt()); machineMapper.updateById(machine); } 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; } 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) { //任务数-已上数量>0 返回1 if ((primitiveTask.getTaskQuantity() - primitiveTask.getLoadCount()) > 0) { loadCount = 1; } break; } } else if (machine.getMode() == 2) { //定制模式 loadCount = 1; } else if (machine.getMode() == 3) { loadCount = machine.getTaskCount() - machine.getFinshCount(); loadCount = (loadCount > 0 ? 1 : 0); } 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(); return; } } } catch (Exception e) { log.info("交互逻辑错误"); } finally { // 确保连接关闭 if (modbusTcp1 != null) { modbusTcp1.close(); } } } @Override public void run() { while (true) { try { Thread.sleep(1000); plcStart(); } catch (InterruptedException e) { e.printStackTrace(); }catch (Exception e) { throw new RuntimeException(e); } } } }