package com.zy.core.thread; import HslCommunication.Core.Types.OperateResult; import HslCommunication.Core.Types.OperateResultExOne; import HslCommunication.Profinet.Siemens.SiemensPLCS; import HslCommunication.Profinet.Siemens.SiemensS7Net; import com.zy.core.ThreadHandler; import com.zy.core.cache.MessageQueue; import com.zy.core.enums.SlaveType; import com.zy.core.model.CrnSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.protocol.CrnProtocol; import lombok.Data; import lombok.extern.slf4j.Slf4j; /** * 堆垛机线程 * Created by vincent on 2020/8/4 */ @Data @Slf4j public class CrnThread implements Runnable, ThreadHandler { private SiemensS7Net siemensNet; private CrnSlave slave; private CrnProtocol crnProtocol; public CrnThread(CrnSlave slave) { this.slave = slave; } @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { while (true) { try { int step = 1; Task task = MessageQueue.poll(SlaveType.Devp, slave.getId()); if (task != null) { step = task.getStep(); } switch (step) { // 读数据 case 1: readStatus(); // 读取状态 break; case 2: CrnCommand command = (CrnCommand) task.getData(); break; case 3: break; // 复位 case 4: break; default: break; } Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); } } } @Override public boolean connect() { boolean result = false; siemensNet = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp()); siemensNet.setRack(slave.getRack().byteValue()); siemensNet.setSlot(slave.getSlot().byteValue()); OperateResult connect = siemensNet.ConnectServer(); if(connect.IsSuccess){ result = true; log.info("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } else { log.info("堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } siemensNet.ConnectClose(); return result; } /** * 读取状态 */ private void readStatus(){ OperateResultExOne result = siemensNet.Read("DB8.18", (short) 10); if (result.IsSuccess) { if (null == crnProtocol) { crnProtocol = new CrnProtocol(); } crnProtocol.setMode(siemensNet.ReadInt16("D2231").Content); // crnProtocol.setEStop(siemensNet.ReadInt16("D2232").Content); crnProtocol.setTaskNo(siemensNet.ReadInt16("D2233").Content); crnProtocol.setStatus(siemensNet.ReadInt16("D2234").Content); crnProtocol.setBay(siemensNet.ReadInt16("D2235").Content); crnProtocol.setLevel(siemensNet.ReadInt16("D2236").Content); crnProtocol.setForkPos(siemensNet.ReadInt16("D2237").Content); crnProtocol.setLiftPos(siemensNet.ReadInt16("D2238").Content); crnProtocol.setWalkPos(siemensNet.ReadInt16("D2239").Content); crnProtocol.setTaskFinish(siemensNet.ReadInt16("D2240").Content); crnProtocol.setLoaded(siemensNet.ReadInt16("D2241").Content); crnProtocol.setAlarm(siemensNet.ReadInt16("D2242").Content); crnProtocol.setXDistance(siemensNet.ReadInt32("D2251").Content); crnProtocol.setYDistance(siemensNet.ReadInt32("D2253").Content); crnProtocol.setDuration(siemensNet.ReadInt32("D2255").Content); } else { log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } /** * 写入数据 */ private void write(){ } @Override public void close() { } public CrnProtocol getCrnProtocol(){ if (crnProtocol == null) { readStatus(); } return this.crnProtocol; } }