From e377f0ffba61c38f4f171d99e9ab6c3591f1d1b7 Mon Sep 17 00:00:00 2001 From: Junjie <xjj@123> Date: 星期日, 27 四月 2025 13:50:50 +0800 Subject: [PATCH] # --- src/main/java/com/zy/core/thread/SiemensDevpThread.java | 248 +++++++++++++++++++++++++++++++++++-------------- 1 files changed, 175 insertions(+), 73 deletions(-) diff --git a/src/main/java/com/zy/core/thread/SiemensDevpThread.java b/src/main/java/com/zy/core/thread/SiemensDevpThread.java index a8f5b06..8f98ead 100644 --- a/src/main/java/com/zy/core/thread/SiemensDevpThread.java +++ b/src/main/java/com/zy/core/thread/SiemensDevpThread.java @@ -9,21 +9,17 @@ import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.core.exception.CoolException; -import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.entity.BasDevp; -import com.zy.asrs.entity.CommandInfo; -import com.zy.asrs.entity.CommandInfoLog; -import com.zy.asrs.entity.TaskWrk; import com.zy.asrs.service.*; import com.zy.core.DevpThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; -import com.zy.core.enums.CommandStatusType; import com.zy.core.enums.IoModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.DevpSlave; import com.zy.core.model.Task; +import com.zy.core.model.protocol.Cycle; import com.zy.core.model.protocol.StaProtocol; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -48,12 +44,11 @@ private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>(); private short heartBeatVal = 1; public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ - add(100);add(101);add(102);add(103);add(104); - add(105);add(106);add(107);add(108);add(109); - add(110);add(111);add(112);add(113);add(114); - add(115);add(116);add(117);add(118);add(119); - add(120);add(121);add(122);add(123);add(124); - add(125);add(1001);add(1002);add(1003);add(1004); + add(101);add(102);add(103);add(104); + add(105);add(106);add(107);add(108); + add(201);add(202);add(203);add(204);add(205); + add(206);add(207);add(208);add(209);add(210); + add(211);add(212); }}; /*public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{ add(200);add(201);add(202);add(203); @@ -132,7 +127,7 @@ break; // 鍐欐暟鎹� ID+鐩爣绔� case 4: - writeAgvOk((StaProtocol)task.getData()); + writeCycle((StaProtocol)task.getData()); read(); break; /* case 3: @@ -493,78 +488,185 @@ } private void write(StaProtocol staProtocol) throws InterruptedException { - if (null == staProtocol) { + if (staProtocol == null) { return; } - ArrayList<Integer> staNos = getStaNo(); + ArrayList<Integer> staNos = getStaNo(); int index = staNos.indexOf(staProtocol.getSiteId()); - OperateResult writeResult; - //浠诲姟涓嬪彂娆℃暟 - int writeCount = 0; - //浠诲姟涓嬪彂鎴愬姛鏍囪瘑 - boolean writeFlag = false; - while(writeCount < 5){ - OperateResult writeResult1 = siemensS7Net.Write("DB100." + index*6, staProtocol.getWorkNo().intValue()); // 宸ヤ綔鍙� - OperateResult writeResult2 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo()); // 鐩爣绔� - if(writeResult1.IsSuccess && writeResult2.IsSuccess){ - Thread.sleep(200); - OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*6, (short)6); - if(readResult.IsSuccess){ - Integer workNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0); - short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4); - if(workNo.equals(staProtocol.getWorkNo().intValue()) && staProtocol.getStaNo().equals(staNo)){ - //浠诲姟鍛戒护鍐欏叆鎴愬姛 - writeFlag = true; - log.info("鍐欏叆杈撻�佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝骞朵笖鍥炶鎴愬姛銆傝緭閫佺嚎plc缂栧彿={}锛寋}锛屽啓鍏ユ鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); - break; - } else {//杩斿洖缁撴灉鏄垚鍔熶簡锛屼絾鏄湡瀹炲�间笉鐩稿悓 - writeCount++; - OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝浣嗘槸璇诲彇浠诲姟鍊间笉涓�鑷淬�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}", - slave.getId(), JSON.toJSON(staProtocol),writeCount)); - log.error("鍐欏叆杈撻�佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝浣嗘槸璇诲彇浠诲姟鍊间笉涓�鑷淬�傝緭閫佺嚎plc缂栧彿={}锛寋}锛屽啓鍏ユ鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); - } - } else { - writeCount++; - OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护鍚庤鍙栧け璐ャ�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}", - slave.getId(), JSON.toJSON(staProtocol), writeCount)); - log.error("鍐欏叆杈撻�佺嚎鍛戒护鍚庤鍙栧け璐ャ�傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); + if (index == -1) { + log.error("绔欑偣缂栧彿 {} 涓嶅湪宸茬煡鍒楄〃涓紝鏃犳硶鍐欏叆浠诲姟锛�", staProtocol.getSiteId()); + return; + } + + int writeCount = 0; // 浠诲姟涓嬪彂灏濊瘯娆℃暟 + boolean writeFlag = false; // 浠诲姟涓嬪彂鎴愬姛鏍囪 + String plcAddressWorkNo = "DB100." + index * 6; + String plcAddressStaNo = "DB100." + (index * 6 + 4); + + while (writeCount < 5) { + // **璇诲彇褰撳墠PLC鐘舵�侊紝閬垮厤涓嶅繀瑕佺殑鍐欏叆** + OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6); + if (readResult.IsSuccess) { + int currentWorkNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0); + short currentStaNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4); + + if (currentWorkNo == staProtocol.getWorkNo().intValue() && currentStaNo == staProtocol.getStaNo()) { + log.info("绔欑偣 {} 褰撳墠鐘舵�佸凡鍖归厤锛屾棤闇�閲嶅鍐欏叆", staProtocol.getSiteId()); + return; } - } else { + } + + // **娓呴浂骞剁‘璁�** + if (!clearPLCData(plcAddressWorkNo, plcAddressStaNo, staProtocol.getSiteId())) { writeCount++; - OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护澶辫触銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}", - slave.getId(), JSON.toJSON(staProtocol),writeCount)); - log.error("鍐欏叆杈撻�佺嚎鍛戒护澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); + continue; // 閲嶆柊灏濊瘯娓呴浂 } - Thread.sleep(200); + + // **鍐欏叆鏂颁换鍔�** + if (writeTaskToPLC(plcAddressWorkNo, plcAddressStaNo, staProtocol)) { + writeFlag = true; + log.info("杈撻�佺嚎鍛戒护鍐欏叆鎴愬姛锛孭LC缂栧彿={}锛岀珯鐐规暟鎹�={}锛屽皾璇曟鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); + break; + } + + log.warn("杈撻�佺嚎鍛戒护鍐欏叆澶辫触锛孭LC缂栧彿={}锛岀珯鐐规暟鎹�={}锛屽皾璇曟鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); + writeCount++; } - //鍐欏懡浠ゅ皾璇曚簡5娆¤繕鏄け璐ヤ簡 - if(!writeFlag){ - staProtocol = station.get(staProtocol.getSiteId()); - if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) { - staProtocol.setPakMk(true); - } - OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护灏濊瘯5娆″け璐ャ�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}", slave.getId(), JSON.toJSON(staProtocol))); - log.error("鍐欏叆杈撻�佺嚎鍛戒护灏濊瘯5娆″け璐ャ�傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}", slave.getId(), JSON.toJSON(staProtocol)); - -// //閲嶆柊娣诲姞鏁版嵁鍒颁换鍔¢槦鍒� -// boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol)); -// read();//璇诲彇1娆¤澶囩姸鎬� - } else { - OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆� 杈撻�佺嚎鍛戒护涓嬪彂鎴愬姛 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol))); - log.info("杈撻�佺嚎鍛戒护涓嬪彂 [id:{}] >>>>> 鍛戒护涓嬪彂鎴愬姛锛� {}", slave.getId(), JSON.toJSON(staProtocol)); - -// Integer siteId = staProtocol.getSiteId(); -// staProtocol = station.get(siteId); -// if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) { -// staProtocol.setPakMk(true); -// } - } - - + // **鍐欏叆澶辫触澶勭悊** + handleWriteFailure(staProtocol, writeFlag); } + + private void writeCycle(StaProtocol staProtocol) throws InterruptedException { + if (staProtocol == null) { + return; + } + + ArrayList<Integer> staNos = getStaNo(); + int index = staNos.indexOf(staProtocol.getSiteId()); + + if (index == -1) { + log.error("绔欑偣缂栧彿 {} 涓嶅湪宸茬煡鍒楄〃涓紝鏃犳硶鍐欏叆浠诲姟锛�", staProtocol.getSiteId()); + return; + } + + int writeCount = 0; // 浠诲姟涓嬪彂灏濊瘯娆℃暟 + boolean writeFlag = false; // 浠诲姟涓嬪彂鎴愬姛鏍囪 + String plcAddressWorkNo = ""; + String plcAddressStaNo = "" ; + switch (staProtocol.getSiteId()){ + case 105: + plcAddressWorkNo = "DB73." + 0; + plcAddressStaNo = "DB73." + 4; + break; + case 106: + plcAddressWorkNo = "DB73." + 6; + plcAddressStaNo = "DB73." + (6 + 4); + break; + case 108: + plcAddressWorkNo = "DB73." + 2 * 6; + plcAddressStaNo = "DB73." + (2 * 6 + 4); + break; + case 110: + plcAddressWorkNo = "DB73." + 3 * 6; + plcAddressStaNo = "DB73." + (3 * 6 + 4); + break; + case 112: + plcAddressWorkNo = "DB73." + 4 * 6; + plcAddressStaNo = "DB73." + (4 * 6 + 4); + break; + } + + + // **鍐欏叆鏂颁换鍔�** + if (writeTaskToPLC(plcAddressWorkNo, plcAddressStaNo, staProtocol)) { + writeFlag = true; + log.info("杈撻�佺嚎鍛戒护鍐欏叆鎴愬姛锛孭LC缂栧彿={}锛岀珯鐐规暟鎹�={}锛屽皾璇曟鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); + } + + // **鍐欏叆澶辫触澶勭悊** + handleWriteFailure(staProtocol, writeFlag); + } + + /** + * 娓呴浂 PLC 鏁版嵁骞堕獙璇佹竻闆舵槸鍚︽垚鍔� + */ + private boolean clearPLCData(String plcAddressWorkNo, String plcAddressStaNo, int siteId) throws InterruptedException { + siemensS7Net.Write(plcAddressWorkNo, 0); + siemensS7Net.Write(plcAddressStaNo, (short) 0); + Thread.sleep(100); // 绛夊緟PLC璇嗗埆 + + OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6); + if (readResult.IsSuccess) { + int readWorkNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0); + short readStaNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4); + if (readWorkNo == 0 && readStaNo == 0) { + return true; // 娓呴浂鎴愬姛 + } + } + + log.warn("绔欑偣 {} 娓呴浂澶辫触锛屽皾璇曢噸鏂版竻闆�...", siteId); + return false; + } + + /** + * 鍐欏叆鏂颁换鍔″埌 PLC 骞堕獙璇佹槸鍚︽垚鍔� + */ + private boolean writeTaskToPLC(String plcAddressWorkNo, String plcAddressStaNo, StaProtocol staProtocol) throws InterruptedException { + OperateResult writeResult2 = siemensS7Net.Write(plcAddressStaNo, staProtocol.getStaNo()); + + OperateResult writeResult1 = siemensS7Net.Write(plcAddressWorkNo, staProtocol.getWorkNo().intValue()); + + if (writeResult1.IsSuccess && writeResult2.IsSuccess) { + Thread.sleep(200); // 绛夊緟 PLC 璇嗗埆鏂板�� + OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6); + if (readResult.IsSuccess) { + int workNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0); + short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4); + return workNo == staProtocol.getWorkNo().intValue() && staNo == staProtocol.getStaNo(); + } + } + return false; + } + + private boolean writeTaskToPLC(String plcAddressWorkNo, String plcAddressStaNo, Cycle cycle) throws InterruptedException { + OperateResult writeResult1 = siemensS7Net.Write(plcAddressWorkNo, cycle.getWorkNo().intValue()); + OperateResult writeResult2 = siemensS7Net.Write(plcAddressStaNo, cycle.getStaNo()); + + if (writeResult1.IsSuccess && writeResult2.IsSuccess) { + Thread.sleep(200); // 绛夊緟 PLC 璇嗗埆鏂板�� + OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6); + if (readResult.IsSuccess) { + int workNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0); + short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4); + return workNo == cycle.getWorkNo().intValue() && staNo == cycle.getStaNo(); + } + } + return false; + } + + /** + * 澶勭悊鍐欏叆澶辫触鐨勬儏鍐� + */ + private void handleWriteFailure(StaProtocol staProtocol, boolean writeFlag) { + if (!writeFlag) { + StaProtocol currentStaProtocol = station.get(staProtocol.getSiteId()); + if (currentStaProtocol.getWorkNo() == 0 && currentStaProtocol.getStaNo() == 0) { + currentStaProtocol.setPakMk(true); + } + OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戣緭閫佺嚎鍛戒护灏濊瘯5娆″け璐ャ�侾LC缂栧彿={1}锛岀珯鐐规暟鎹�={2}", + slave.getId(), JSON.toJSON(currentStaProtocol))); + log.error("杈撻�佺嚎鍛戒护灏濊瘯5娆″け璐ワ紝PLC缂栧彿={}锛岀珯鐐规暟鎹�={}", slave.getId(), JSON.toJSON(currentStaProtocol)); + } else { + OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戣緭閫佺嚎鍛戒护鎴愬姛 [id:{1}] >>>>> {2}", + DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol))); + log.info("杈撻�佺嚎鍛戒护鎴愬姛 [id:{}] >>>>> {}", slave.getId(), JSON.toJSON(staProtocol)); + } + } + + private void write2(StaProtocol staProtocol) throws InterruptedException { if (null == staProtocol) { return; -- Gitblit v1.9.1