From 9540c4904147cb4baf037892447d6f85dc004646 Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期四, 27 三月 2025 13:31:20 +0800
Subject: [PATCH] #输送线循环BUG修复
---
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 65 ++++++++++---
src/main/java/com/zy/core/cache/MessageQueue.java | 15 +++
src/main/java/com/zy/core/thread/SiemensDevpThread.java | 161 ++++++++++++++++++++------------
src/main/resources/application.yml | 2
4 files changed, 166 insertions(+), 77 deletions(-)
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index 3303ad3..ba7e4f9 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -158,10 +158,30 @@
if (staProtocol.getSiteId() == 107 || staProtocol.getSiteId() == 109) {
StaProtocol staProtocol5 = getClonedStation(devpThread, staProtocol.getSiteId() - 1);
if (staProtocol5 != null && (staProtocol5.isLoading() && (staProtocol5.getStaNo() == 107 || staProtocol5.getStaNo() == 109))) {
+ short workNo = staProtocol5.getWorkNo();
+
+ // **鍏堟竻闆讹紝绛夊緟 100ms**
+ staProtocol5.setWorkNo((short) 0);
+ staProtocol5.setStaNo((short) 0);
+ MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol5));
+ Thread.sleep(100);
+
+ // **鍐嶅啓鍏ョ洰鏍囧��**
+ staProtocol5.setWorkNo(workNo);
staProtocol5.setStaNo((short) 112);
MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol5));
}
} else {
+ short workNo = staProtocol.getWorkNo();
+
+ // **鍏堟竻闆讹紝绛夊緟 100ms**
+ staProtocol.setWorkNo((short) 0);
+ staProtocol.setStaNo((short) 0);
+ MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+ Thread.sleep(100);
+
+ // **鍐嶅啓鍏ョ洰鏍囧��**
+ staProtocol.setWorkNo(workNo);
staProtocol.setStaNo((short) 112);
MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
}
@@ -181,35 +201,50 @@
return (staProtocol != null) ? staProtocol.clone() : null;
}
- //112寰幆绔欑偣鑷冲嚭搴撶珯
- public synchronized void shiftCyclePointToTarget() throws IOException, InterruptedException{
- try{
+ // 112寰幆绔欑偣鑷冲嚭搴撶珯
+ public synchronized void shiftCyclePointToTarget() throws IOException, InterruptedException {
+ try {
for (DevpSlave devp : slaveProperties.getDevp()) {
DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
+ if (devpThread == null) {
+ continue;
+ }
+
StaProtocol staProtocol = devpThread.getStation().get(112);
- if (staProtocol == null) {
- continue;
- } else {
- staProtocol = staProtocol.clone();
- }
- if(staProtocol.getWorkNo() == 0){
+ if (staProtocol == null || staProtocol.getWorkNo() == 0) {
continue;
}
+
+ // 鏌ヨ浠诲姟淇℃伅
TaskWrk taskWrk = taskWrkMapper.selectStaWorking(Integer.valueOf(staProtocol.getWorkNo()));
- if(taskWrk != null && taskWrk.getWrkNo() < 9001 && taskWrk.getWrkNo() > 6000){
- staProtocol.setStaNo(Short.valueOf(taskWrk.getTargetPoint()));
- MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+ if (taskWrk == null || taskWrk.getWrkNo() < 6001 || taskWrk.getWrkNo() > 9000) {
+ continue;
}
+
+ // 鍏堟竻闆�
+ short workNo = staProtocol.getWorkNo();
+ short oldStaNo = staProtocol.getStaNo();
+ staProtocol.setWorkNo((short) 0);
+ staProtocol.setStaNo((short) 0);
+ MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+ Thread.sleep(100); // 璁� PLC 璇嗗埆鍙樺寲
+
+ // 鍐嶅啓鍏ョ洰鏍囩珯鐐�
+ staProtocol.setWorkNo(workNo);
+ staProtocol.setStaNo(Short.valueOf(taskWrk.getTargetPoint()));
+ MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+
+ log.info("Shifted from cycle station 112 to target {}, workNo: {}", taskWrk.getTargetPoint(), workNo);
}
- }catch (Exception e) {
- log.error("generateStoreWrkFile e", e);
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ } catch (Exception e) {
+ log.error("shiftCyclePointToTarget error", e);
}
}
+
public synchronized void generateStoreWrkFile1() throws IOException, InterruptedException {
try {
// 鏍规嵁杈撻�佺嚎plc閬嶅巻
diff --git a/src/main/java/com/zy/core/cache/MessageQueue.java b/src/main/java/com/zy/core/cache/MessageQueue.java
index b98b430..7c63158 100644
--- a/src/main/java/com/zy/core/cache/MessageQueue.java
+++ b/src/main/java/com/zy/core/cache/MessageQueue.java
@@ -150,5 +150,20 @@
break;
}
}
+ public static boolean offer(SlaveType type, Integer devpId, Task task, Runnable callback) {
+ boolean result = offer(type, devpId, task); // 鍏堟墽琛屽師鏈変换鍔¢�昏緫
+ if (result && callback != null) {
+ new Thread(() -> {
+ try {
+ Thread.sleep(200); // 妯℃嫙浠诲姟鎵ц鏃堕棿
+ callback.run();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }).start();
+ }
+ return result;
+ }
+
}
diff --git a/src/main/java/com/zy/core/thread/SiemensDevpThread.java b/src/main/java/com/zy/core/thread/SiemensDevpThread.java
index a8f5b06..d731d3a 100644
--- a/src/main/java/com/zy/core/thread/SiemensDevpThread.java
+++ b/src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -493,78 +493,117 @@
}
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);
}
+
+ /**
+ * 娓呴浂 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 writeResult1 = siemensS7Net.Write(plcAddressWorkNo, staProtocol.getWorkNo().intValue());
+ OperateResult writeResult2 = siemensS7Net.Write(plcAddressStaNo, staProtocol.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 == staProtocol.getWorkNo().intValue() && staNo == staProtocol.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;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index b3b8512..b72601d 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -8,7 +8,7 @@
name: @pom.build.finalName@
datasource:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
- url: jdbc:sqlserver://127.0.0.1:1433;databasename=rywxasrs
+ url: jdbc:sqlserver://10.10.10.220:1433;databasename=rywxasrs
username: sa
password: sa@123
mvc:
--
Gitblit v1.9.1