package com.mes.plcTaskThread; import com.mes.md.entity.Machine; import com.mes.md.entity.Tasking; import com.mes.md.mapper.MachineMapper; 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.text.SimpleDateFormat; import java.util.*; @Slf4j public class MachineDispensing extends Thread { private MachineMapper machineMapper; private TaskingService taskingService; public static Long machineId = 16L; public List sendRecords = new ArrayList<>(); public Machine thisMachine; public MachineDispensing(Machine machine, MachineMapper machineMapper, TaskingService taskingService) { this.thisMachine = machine; this.machineMapper = machineMapper; this.taskingService = taskingService; } public void plcStart() { Machine machine = machineMapper.selectById(thisMachine.getId()); String fileName = machine.getFileName(); ModbusTcp modbusTcp1 = new ModbusTcp(machine.getIp(), machine.getPort(), fileName); modbusTcp1.connect(); PlcAgreement plcAgreement = modbusTcp1.getPlcAgreement(fileName); try { if (!modbusTcp1.read(plcAgreement)) { log.info("通讯读取新数据失败"); modbusTcp1.close(); return; } PlcParameter plcRequest = plcAgreement.getPlcParameter("plcRequest");//请求字 PlcParameter plcRequestID = plcAgreement.getPlcParameter("plcRequestID");//请求ID PlcParameter mesSend = plcAgreement.getPlcParameter("mesSend");//发送字 PlcParameter mesSendID = plcAgreement.getPlcParameter("mesSendID");//发送ID // PlcParameterInfo drawingMark =plcParameterObject.getPlcParameter("drawingGlue");//点胶图纸地址 PlcParameter JPZX = plcAgreement.getPlcParameter("JPZX");//类型 PlcParameter thickness = plcAgreement.getPlcParameter("thickness");//厚 PlcParameter side1 = plcAgreement.getPlcParameter("side1");//下边 PlcParameter side2 = plcAgreement.getPlcParameter("side2");//右边 PlcParameter side3 = plcAgreement.getPlcParameter("side3");//上边 PlcParameter side4 = plcAgreement.getPlcParameter("side4");//左边 PlcParameter R_angle1_1 = plcAgreement.getPlcParameter("R_angle1_1");//R角1-1 PlcParameter R_angle1_2 = plcAgreement.getPlcParameter("R_angle1_2");//R角1-2 PlcParameter R_angle2_1 = plcAgreement.getPlcParameter("R_angle2_1");//R角2-1 PlcParameter R_angle2_2 = plcAgreement.getPlcParameter("R_angle2_2");//R角2-2 PlcParameter R_angle3_1 = plcAgreement.getPlcParameter("R_angle3_1");//R角3-1 PlcParameter R_angle3_2 = plcAgreement.getPlcParameter("R_angle3_2");//R角3-2 PlcParameter R_angle4_1 = plcAgreement.getPlcParameter("R_angle4_1");//R角4-1 PlcParameter R_angle4_2 = plcAgreement.getPlcParameter("R_angle4_2");//R角4-2 PlcParameter plcReport = plcAgreement.getPlcParameter("plcReport");//汇报字 PlcParameter plcReportID = plcAgreement.getPlcParameter("plcReportID");//汇报ID PlcParameter mesConfirm = plcAgreement.getPlcParameter("mesConfirm");//确认字 PlcParameter mesConfirmID = plcAgreement.getPlcParameter("mesConfirmID");//确认ID PlcParameter machineStatusWord = plcAgreement.getPlcParameter("machineStatusWord"); if (machine.getIsLog() > 0) { modbusTcp1.consoleLogInfo(plcAgreement); } if (0 == plcRequest.getValueInt() && 1 == mesSend.getValueInt()) { log.info("1.发送字置零"); //发送字置0 String send = HexUtil.intTo2ByteHex(0); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesSend.getAddressStart() / 2)); log.info("发送字 清空成功;内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesSend.getAddressStart())); modbusTcp1.close(); return; } if (0 == plcReport.getValueInt() && 0 != mesConfirm.getValueInt()) { log.info("2.确认字置零"); //发送字置0 String send = HexUtil.intTo2ByteHex(0); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); log.info("任务完成 清空成功;内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } if (1 == plcReport.getValueInt() && 0 == mesConfirm.getValueInt()) { int finishCount = taskingService.finishMachineTask(machine); log.info("3、任务完成"); 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; } if (4 == plcReport.getValueInt() && 0 == mesConfirm.getValueInt()) { int finishCount = taskingService.glassDownLineOne(machine); if (finishCount > 0) {//有任务 log.info("4、人工拿走"); String send = HexUtil.intTo2ByteHex(4); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); log.info("人工拿走发送报文内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } String send = HexUtil.intTo2ByteHex(4); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); log.info("人工拿走异常 发送报文内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } if (2 == plcReport.getValueInt() && 0 == mesConfirm.getValueInt()) { int finishCount = taskingService.loseMachineTask(machine); if (finishCount > 0) {//有任务 log.info("2、重发"); String send = HexUtil.intTo2ByteHex(2); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); log.info("重发发送报文内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } else { log.info("2、异常重发"); String send = HexUtil.intTo2ByteHex(2); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); log.info("异常重发发送报文内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } } if (3 == plcReport.getValueInt() && 0 == mesConfirm.getValueInt()) { int finishCount = taskingService.finishMachineTask(machine); if (finishCount > 0) {//有任务 log.info("3、设备上人工点破损"); String send = HexUtil.intTo2ByteHex(3); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); log.info("人工点破损发送报文内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); return; } else { //是否自动清除破损 log.info("3、无效破损 (没有找到此ID的玻璃)"); String send = HexUtil.intTo2ByteHex(3); modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); log.info("发送报文内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); modbusTcp1.close(); //modbusTcp1.close(); return; } } List taskingCount = taskingService.findMachineWorkStateTask(machine, "正在工作"); if ((1 == plcRequest.getValueInt() && 0 == mesSend.getValueInt()) && "开工".equals(machine.getState()) && taskingCount.size() < machine.getMaxTaskCount()) { Tasking tasking = taskingService.startMachineTask(machine); if (tasking != null) { log.info("4、发送任务 任务数据:{}, 设备状态:{}, ", machine, tasking); String send = HexUtil.intTo2ByteHex(1) + HexUtil.intTo2ByteHex(tasking.getTaskSequence().intValue())+ HexUtil.intTo2ByteHex(tasking.getJPZX()) + HexUtil.intTo2ByteHex(tasking.getThickness().intValue()) + HexUtil.intTo2ByteHex(tasking.getWidth().intValue()) + // side1 下边 = 宽度 HexUtil.intTo2ByteHex(tasking.getLength().intValue()) + // side2 右边 = 长度 HexUtil.intTo2ByteHex(tasking.getWidth().intValue()) + // side3 上边 = 宽度 HexUtil.intTo2ByteHex(tasking.getLength().intValue()) + // side4 左边 = 长度 HexUtil.intTo2ByteHex((int) ((tasking.getR_1_1() != null ? tasking.getR_1_1() : 0.0) * 10)) + HexUtil.intTo2ByteHex((int) ((tasking.getR_1_2() != null ? tasking.getR_1_2() : 0.0) * 10)) + HexUtil.intTo2ByteHex((int) ((tasking.getR_2_1() != null ? tasking.getR_2_1() : 0.0) * 10)) + HexUtil.intTo2ByteHex((int) ((tasking.getR_2_2() != null ? tasking.getR_2_2() : 0.0) * 10)) + HexUtil.intTo2ByteHex((int) ((tasking.getR_3_1() != null ? tasking.getR_3_1() : 0.0) * 10)) + HexUtil.intTo2ByteHex((int) ((tasking.getR_3_2() != null ? tasking.getR_3_2() : 0.0) * 10)) + HexUtil.intTo2ByteHex((int) ((tasking.getR_4_1() != null ? tasking.getR_4_1() : 0.0) * 10)) + HexUtil.intTo2ByteHex((int) ((tasking.getR_4_2() != null ? tasking.getR_4_2() : 0.0) * 10)) ; modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesSend.getAddressStart() / 2)); log.info("发送任务发送报文内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesSend.getAddressStart())); modbusTcp1.close(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String sendRecord = df.format(new Date()) + " " + tasking.getGlassId() + "-" + tasking.getLength() + "-" + tasking.getWidth() + "-" + tasking.getThickness() + "-" + tasking.getR_1_1() + "-" + tasking.getR_1_2() + "-" + tasking.getR_2_1() + "-" + tasking.getR_2_2() + "-" + tasking.getR_3_1() + "-" + tasking.getR_3_2() + "-" + tasking.getR_4_1() + "-" + tasking.getR_4_2() + "-" + tasking.getJPZX(); 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(); //log.info("无可执行的条件"); } @Override public void run() { while (this != null) { try { Thread.sleep(1000); plcStart(); } catch (InterruptedException e) { e.printStackTrace(); } } } }