From 64f4079a20eb4499845182a5b91abbbbcf1b44fc Mon Sep 17 00:00:00 2001 From: Junjie <xjj@123> Date: 星期日, 27 四月 2025 15:17:24 +0800 Subject: [PATCH] # --- src/main/java/com/zy/core/thread/SiemensDevpThread.java | 370 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 340 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/zy/core/thread/SiemensDevpThread.java b/src/main/java/com/zy/core/thread/SiemensDevpThread.java index 5e9dc63..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,7 +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(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); @@ -73,7 +73,7 @@ /** * 鏉$爜鏁伴噺 */ - private int barcodeSize = 7; + private int barcodeSize = 1; /** * 鍏ュ嚭搴撴ā寮� @@ -123,6 +123,11 @@ // 鍐欐暟鎹� ID+鐩爣绔� case 2: write((StaProtocol)task.getData()); + read(); + break; + // 鍐欐暟鎹� ID+鐩爣绔� + case 4: + writeCycle((StaProtocol)task.getData()); read(); break; /* case 3: @@ -229,13 +234,79 @@ } } +// OperateResultExOne<byte[]> resultAgvAndPlc = siemensS7Net.Read("DB102.0", (short) 30); +// if (resultAgvAndPlc.IsSuccess) { +// for (int i = 0; i < staNoSize; i++) { +// int sign =(i+2)/2-1; +// if ((i+2)%2!=0){ +// Integer siteId = staNos.get(i); // 绔欑偣缂栧彿 +// StaProtocol staProtocol = station.get(siteId); +// if (null == staProtocol) { +// staProtocol = new StaProtocol(); +// staProtocol.setSiteId(siteId); +// station.put(siteId, staProtocol); +// } +// staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6+4)); // 鍏佽鍙栬揣 +// staProtocol.setAgvStartPlace((short)0); // 鍏佽鏀捐揣 +// continue; +// } +// Integer siteId = staNos.get(i); // 绔欑偣缂栧彿 +// StaProtocol staProtocol = station.get(siteId); +// if (null == staProtocol) { +// staProtocol = new StaProtocol(); +// staProtocol.setSiteId(siteId); +// station.put(siteId, staProtocol); +// } +// staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6)); // 鍏佽鍙栬揣 +// staProtocol.setAgvStartPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6 + 2)); // 鍏佽鏀捐揣 +// } +// } + +// OperateResultExOne<byte[]> resultAgvAndPlcOk = siemensS7Net.Read("DB132.0", (short) 30); +// if (resultAgvAndPlcOk.IsSuccess) { +// for (int i = 0; i < staNoSize; i++) { +// int sign =(i+2)/2-1; +// if ((i+2)%2!=0){ +// Integer siteId = staNos.get(i); // 绔欑偣缂栧彿 +// StaProtocol staProtocol = station.get(siteId); +// if (null == staProtocol) { +// staProtocol = new StaProtocol(); +// staProtocol.setSiteId(siteId); +// station.put(siteId, staProtocol); +// } +// staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6+4)); // 鍏佽鍙栬揣 +// staProtocol.setAgvTargetPlace((short)0); // 鍏佽鏀捐揣 +// continue; +// } +// Integer siteId = staNos.get(i); // 绔欑偣缂栧彿 +// StaProtocol staProtocol = station.get(siteId); +// if (null == staProtocol) { +// staProtocol = new StaProtocol(); +// staProtocol.setSiteId(siteId); +// station.put(siteId, staProtocol); +// } +// try{ +// staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6)); // 鍙栬揣瀹屾垚 +// if (staProtocol.getAgvTargetPick()!=0){ +// System.out.println(staProtocol.getAgvTargetPick()); +// } +// staProtocol.setAgvTargetPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6 + 2)); // 鏀捐揣瀹屾垚 +// if (staProtocol.getAgvTargetPlace()!=0){ +// System.out.println(staProtocol.getAgvTargetPlace()); +// } +// }catch (Exception e){ +// log.error(""+e); +// } +// } +// } + if (slave.getId() == 1) { //鏉$爜 //Thread.sleep(200); - OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.840.0", (short) 32); + OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.848.0", (short) 8); if (result2.IsSuccess) { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 1; i++) { String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8"); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1); if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { @@ -244,8 +315,19 @@ } } + //澶栧舰妫�娴� + OperateResultExOne<byte[]> resultErr1 = siemensS7Net.Read("DB101.810.0", (short) (barcodeSize*1)); + StaProtocol staProtocol1 = station.get(116); + boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultErr1.Content, 0, 1); + staProtocol1.setFrontErr(status1[0]); + staProtocol1.setBackErr(status1[1]); + staProtocol1.setHighErr(status1[2]); + staProtocol1.setLeftErr(status1[3]); + staProtocol1.setRightErr(status1[4]); + staProtocol1.setWeightErr(status1[5]); + staProtocol1.setBarcodeErr(status1[6]); - OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB13.2", (short) (staNoSize * 4)); + OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.922.0", (short) (staNoSize * 4)); if (resultErr.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 绔欑偣缂栧彿 @@ -324,39 +406,267 @@ /** * 鍐欏叆 ID+鐩爣绔� =====> 鍗曠珯鐐瑰啓鍏� */ - private void write(StaProtocol staProtocol) throws InterruptedException { + private void writeAgvOk(StaProtocol staProtocol) throws InterruptedException { if (null == staProtocol) { return; } ArrayList<Integer> staNos = getStaNo(); - int index = staNos.indexOf(staProtocol.getSiteId()); - short[] array = new short[2]; - array[0] = staProtocol.getWorkNo(); - array[1] = staProtocol.getStaNo(); -// OperateResult write = siemensS7Net.Write("DB100." + index*4, array); + if (staProtocol.getAgvTypeSign()==0 || staProtocol.getAgvTypeSign()==2 ){ //0鍙栬揣 + switch (staProtocol.getSiteId()){ + case 100: + index=32; + break; + case 101: + index=34; + break; + case 102: + index=38; + break; + case 103: + index=40; + break; + case 104: + index=44; + break; + case 105: + index=46; + break; + case 106: + index=50; + break; + case 107: + index=52; + break; + default: + return; + } + }else { + switch (staProtocol.getSiteId()){ + case 100: + index=30; + break; + case 102: + index=36; + break; + case 104: + index=42; + break; + case 106: + index=48; + break; + default: + return; + } + } - OperateResult writeResult; + OperateResult write = null; //浠诲姟涓嬪彂娆℃暟 int writeCount = 0; - //浠诲姟涓嬪彂鎴愬姛鏍囪瘑 - boolean writeFlag = false; - OperateResult writeResult1 = siemensS7Net.Write("DB100." + index*6, (int) staProtocol.getWorkNo()); // 宸ヤ綔鍙� - OperateResult writeResult2 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo()); // 鐩爣绔� - if(writeResult1.IsSuccess&&writeResult2.IsSuccess){ - //鏇存柊浠诲姟姝ュ簭 - TaskWrkService taskWrkService = SpringUtils.getBean(TaskWrkService.class); - TaskWrk taskWrk = taskWrkService.selectByWrkNo((int) staProtocol.getWorkNo()); - if (taskWrk != null) { - taskWrk.setCommandStep(taskWrk.getCommandStep() + 1);//鏇存柊鎸囦护姝ュ簭 - taskWrkService.updateById(taskWrk); - }else{ - log.error("杈撻�佺嚎鍐欏叆澶辫触"+staProtocol+"++++++++++++++++++++++++++++++++++++++"); + do { + short textWrite = 1;// 浠诲姟瀹屾垚 + if (staProtocol.getAgvTypeSign()>1){ + textWrite = 0;// 浠诲姟澶嶄綅 } + write = siemensS7Net.Write("DB102." + index, textWrite); + if(write.IsSuccess){ + writeCount=6; + }else { + writeCount++; + log.error("鍐欏叆杈撻�佺嚎鍙栨斁璐у畬鎴愬懡浠ゅ悗璇诲彇澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); + } + }while (writeCount<5); + + if (!write.IsSuccess) { + OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}", slave.getId(), JSON.toJSON(staProtocol))); + log.error("鍐欏叆杈撻�佺嚎鍙栨斁璐у畬鎴愮珯鐐规暟鎹け璐ャ�傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}", slave.getId(), JSON.toJSON(staProtocol)); + } 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 write(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 = "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; + } + } + + // **娓呴浂骞剁‘璁�** + if (!clearPLCData(plcAddressWorkNo, plcAddressStaNo, staProtocol.getSiteId())) { + writeCount++; + continue; // 閲嶆柊灏濊瘯娓呴浂 + } + + // **鍐欏叆鏂颁换鍔�** + 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++; + } + + // **鍐欏叆澶辫触澶勭悊** + 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