zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/Slave.java
@@ -16,7 +16,7 @@ private Integer port; private Integer barcodeSize; private List<Integer> barcodeNumber; private List<Integer> staNos; zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcConstant.java
@@ -3,11 +3,9 @@ public interface PlcConstant { public static final Integer STATION_STATUS_LENGTH = 10; public static final String ADDRESS_CONCATENATION = "."; public static final Integer TASK_LENGTH = 12; } zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/StationStatusField.java
@@ -5,6 +5,7 @@ * 站点状态字段枚举(对应 §2.1) */ public enum StationStatusField { ALL("DB100", 0, 12), TASK_NUMBER("DB100", 0, 4), // 任务号,偏移0,4字节 FINAL_TARGET("DB100", 4, 2), // 最终目标站,偏移4,2字节 STATUS_WORD("DB100", 6, 2), // 状态字,偏移6,2字节 @@ -23,15 +24,13 @@ /** * 根据 DB 块编号和站点偏移生成具体地址 * * @param dbBlock DB块编号 * @param stationBaseOffset 站点基址偏移(站点号*站点长度) * @return PLC4X 地址字符串,如 "DB100.DBD0" * @return PLC4X 地址字符串,如 "DB100.D0" */ public String buildAddress(int dbBlock, int stationBaseOffset) { int finalOffset = stationBaseOffset + offset; return String.format(addressPattern, dbBlock, finalOffset); public String buildAddress() { return addressPattern+PlcConstant.ADDRESS_CONCATENATION+ offset; } public String getAddressPattern() { return addressPattern; } zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/TaskField.java
@@ -5,10 +5,11 @@ * 任务下发字段枚举(对应 §2.4) */ public enum TaskField { ALL("DB13", 0, 12), TASK_NUMBER("DB13", 0, 4), START_STATION("DB13", 4, 2), DEST_STATION("DB13", 6, 2), DIRECTION("DB13", 8, 1), DIRECTION("DB13", 8, 2), ROUTE_NUMBER("DB13", 10, 2); private final String addressPattern; zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/S7DevpThread.java
@@ -93,7 +93,7 @@ private void read() throws InterruptedException { List<Integer> staNos = slave.getStaNos(); int staNoSize = staNos.size(); byte[] stationStatus = s7PLC.readByte(StationStatusField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + StationStatusField.TASK_NUMBER.getOffset(), StationStatusField.TASK_NUMBER.getOffset() + staNoSize * PlcConstant.STATION_STATUS_LENGTH); byte[] stationStatus = s7PLC.readByte(StationStatusField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + StationStatusField.TASK_NUMBER.getOffset(), StationStatusField.TASK_NUMBER.getOffset() + staNoSize * StationStatusField.ALL.getByteLength()); for (int i = 0; i < staNoSize; i++) { // 站点编号 Integer siteId = staNos.get(i); @@ -103,9 +103,9 @@ staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setWorkNo((int) ByteUtils.getLong(stationStatus, StationStatusField.TASK_NUMBER.getOffset() + i * PlcConstant.STATION_STATUS_LENGTH)); staProtocol.setStaNo((int) ByteUtils.getShort(stationStatus, StationStatusField.FINAL_TARGET.getOffset() + i * PlcConstant.STATION_STATUS_LENGTH)); boolean[] status = ByteUtils.getBooleans(stationStatus, StationStatusField.STATUS_WORD.getOffset() + i * PlcConstant.STATION_STATUS_LENGTH, StationStatusField.STATUS_WORD.getByteLength()); staProtocol.setWorkNo((int) ByteUtils.getLong(stationStatus, StationStatusField.TASK_NUMBER.getOffset() + i * StationStatusField.ALL.getByteLength())); staProtocol.setStaNo((int) ByteUtils.getShort(stationStatus, StationStatusField.FINAL_TARGET.getOffset() + i * StationStatusField.ALL.getByteLength())); boolean[] status = ByteUtils.getBooleans(stationStatus, StationStatusField.STATUS_WORD.getOffset() + i * StationStatusField.ALL.getByteLength(), StationStatusField.STATUS_WORD.getByteLength()); staProtocol.setAutoing(status[0]); // 自动 staProtocol.setLoading(status[1]); // 有物 staProtocol.setInEnable(status[2]); // 可入 @@ -118,11 +118,11 @@ staProtocol.setPakMk(true); } } byte[] deviceField = s7PLC.readByte(DeviceField.BARCODE.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + DeviceField.BARCODE.getOffset(), DeviceField.BARCODE.getOffset() + DeviceField.BARCODE.getByteLength() * slave.getBarcodeSize()); for (int i = 0; i < slave.getBarcodeSize(); i++) { List<Integer> barcodeNumber = slave.getBarcodeNumber(); byte[] deviceField = s7PLC.readByte(DeviceField.BARCODE.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + DeviceField.BARCODE.getOffset(), DeviceField.BARCODE.getOffset() + DeviceField.BARCODE.getByteLength() * barcodeNumber.size()); for (int i = 0; i < barcodeNumber.size(); i++) { String barcode = ByteUtils.getString(deviceField, i * DeviceField.BARCODE.getByteLength(), DeviceField.BARCODE.getByteLength()); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeNumber.get(i)); if (Cools.isEmpty(barcode)) { barcodeThread.clearBarcode(); } else { @@ -167,9 +167,9 @@ List<Integer> staNos = slave.getStaNos(); int index = staNos.indexOf(staProtocol.getSiteId()); s7PLC.writeInt32(TaskField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + (TaskField.DEST_STATION.getOffset() + index * PlcConstant.TASK_LENGTH), staProtocol.getWorkNo()); // 工作号 s7PLC.writeInt32(TaskField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + (TaskField.DEST_STATION.getOffset() + index * TaskField.ALL.getByteLength()), staProtocol.getWorkNo()); // 工作号 Thread.sleep(100); s7PLC.writeInt16(TaskField.DEST_STATION.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + (index * PlcConstant.TASK_LENGTH + TaskField.DEST_STATION.getOffset() + TaskField.DEST_STATION.getAddressPattern()), staProtocol.getStaNo().shortValue()); // 目标站 s7PLC.writeInt16(TaskField.DEST_STATION.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + (index * TaskField.ALL.getByteLength() + TaskField.DEST_STATION.getOffset() + TaskField.DEST_STATION.getAddressPattern()), staProtocol.getStaNo().shortValue()); // 目标站 OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol))); News.error("SiemensDevp" + " - 4" + " - 写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol)); zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/SiemensDevpThread.java
@@ -10,6 +10,7 @@ import com.zy.acs.conveyor.core.cache.MessageQueue; import com.zy.acs.conveyor.core.cache.OutputQueue; import com.zy.acs.conveyor.core.cache.SlaveConnection; import com.zy.acs.conveyor.core.constant.StationStatusField; import com.zy.acs.conveyor.core.enums.SlaveType; import com.zy.acs.conveyor.core.enums.TaskType; import com.zy.acs.conveyor.core.model.Task; @@ -40,45 +41,16 @@ public class SiemensDevpThread implements Runnable, DevpThread { private DevpSlave slave; private SiemensS7Net siemensS7Net; private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>(); private short heartBeatVal = 1; public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ add(1001); add(1002); add(1003); add(1004); add(1005); add(1006); add(1007); }}; public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{ add(1); }}; /** * 条码数量 */ private int barcodeSize = 1; public SiemensDevpThread(DevpSlave slave) { this.slave = slave; } private ArrayList<Integer> getStaNo() { switch (slave.getId()) { case 1: return staNos1; default: throw new CoolException("服务器异常"); } } @Override @SuppressWarnings("InfiniteLoopStatement") @@ -103,8 +75,6 @@ default: break; } // 心跳 // heartbeat(); Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); @@ -117,7 +87,7 @@ * 初始化站点状态 */ private void initSite() { ArrayList<Integer> staNos = getStaNo(); List<Integer> staNos = slave.getStaNos(); // 站点编号 for (Integer siteId : staNos) { StaProtocol staProtocol = station.get(siteId); @@ -164,10 +134,9 @@ * 读取状态 ====> 整块plc */ private void read() throws InterruptedException { ArrayList<Integer> staNos = getStaNo(); List<Integer> staNos = slave.getStaNos(); int staNoSize = staNos.size(); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize * 2)); OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100.0", (short) (staNoSize * 4)); OperateResultExOne<byte[]> result = siemensS7Net.Read(StationStatusField.ALL.buildAddress(), (short) (staNoSize * StationStatusField.ALL.getByteLength())); if (result.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 @@ -177,13 +146,9 @@ staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } boolean[] status = null; if (i < 7) { short i1 = siemensS7Net.getByteTransform().TransInt16(result2.Content, i * 4 + 2); staProtocol.setWorkNo((int) siemensS7Net.getByteTransform().TransInt16(result2.Content, i * 4)); staProtocol.setStaNo((int) siemensS7Net.getByteTransform().TransInt16(result2.Content, i * 4 + 2)); } status = siemensS7Net.getByteTransform().TransBool(result.Content, i * 2, 2); staProtocol.setWorkNo((int) siemensS7Net.getByteTransform().TransUInt32(result.Content, i * StationStatusField.ALL.getByteLength())); staProtocol.setStaNo((int) siemensS7Net.getByteTransform().TransInt16(result.Content, i * StationStatusField.ALL.getByteLength() + 4)); boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i * StationStatusField.ALL.getByteLength()+6, 2); staProtocol.setAutoing(status[0]); // 自动 staProtocol.setLoading(status[1]); // 有物 staProtocol.setInEnable(status[2]); // 可入 @@ -201,7 +166,7 @@ //条码扫描器 ArrayList<Integer> barcodeList = BarcodeList; List<Integer> barcodeList = slave.getBarcodeNumber(); OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB101.102", (short) (barcodeList.size() * 8)); if (result5.IsSuccess) { for (int i = 0; i < barcodeList.size(); i++) { @@ -215,6 +180,53 @@ barcodeThread.setBarcode(barcode); log.info("料箱码:{}", barcode); } } } } OperateResultExOne<byte[]> resultError = siemensS7Net.Read("DB103.0", (short) (staNoSize * 2)); if (resultError.IsSuccess) { ArrayList<Integer> staNoError = new ArrayList<Integer>() {{ add(102); add(201); add(211); }}; for (int i = 0; i < staNoError.size(); i++) { Integer siteId = staNoError.get(i); // 站点编号 StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } boolean[] status = siemensS7Net.getByteTransform().TransBool(resultError.Content, i * 2, 1); staProtocol.setFrontErr(status[0]);// 前超限 staProtocol.setBackErr(status[1]);// 后超限 staProtocol.setHighErr(status[2]);// 高超限 staProtocol.setLeftErr(status[3]);// 左超限 staProtocol.setRightErr(status[4]);// 右超限 staProtocol.setWeightErr(status[5]); // 超重 staProtocol.setBarcodeErr(status[6]);// 扫码失败 } } //plc故障 OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB25.0", (short) (staNoSize * 4)); if (resultErr2.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i * 4, 2); StaProtocol staProtocol = station.get(siteId); if (staProtocol != null) { staProtocol.setBreakerErr(status[0]); staProtocol.setInfraredErr(status[1]); staProtocol.setOutTimeErr(status[2]); staProtocol.setSeizeSeatErr(status[3]); staProtocol.setWrkYgoodsN(status[4]); staProtocol.setInverterErr(status[5]); staProtocol.setContactErr(status[6]); staProtocol.setUpcontactErr(status[7]); } } } @@ -254,7 +266,7 @@ if (null == staProtocol) { return; } ArrayList<Integer> staNos = getStaNo(); List<Integer> staNos = slave.getStaNos(); int index = staNos.indexOf(staProtocol.getSiteId()); OperateResult write = null; zy-asc-conveyor/src/main/resources/application.yml
@@ -79,7 +79,8 @@ port: 102 rack: 0 slot: 0 barcodeSize: 1 barcodeNumber: - 1 staNos: - 1001 - 1002