From f375928943ad4b9fe6d8508e151971dcdc23e982 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期一, 05 一月 2026 16:18:36 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java | 328 +++++++++++++++++++++++++++++++++++++----------------
1 files changed, 227 insertions(+), 101 deletions(-)
diff --git a/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java b/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
index 2df5438..43f5039 100644
--- a/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
@@ -1,39 +1,41 @@
package com.zy.core.thread.impl;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
-import com.zy.asrs.entity.BasDualCrnp;
-import com.zy.asrs.entity.BasDualCrnpOpt;
-import com.zy.asrs.entity.DeviceConfig;
-import com.zy.asrs.entity.DeviceDataLog;
+import com.zy.asrs.entity.*;
import com.zy.asrs.service.BasDualCrnpOptService;
import com.zy.asrs.service.BasDualCrnpService;
+import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.RedisUtil;
+import com.zy.core.News;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
-import com.zy.core.enums.CrnTaskModeType;
-import com.zy.core.enums.RedisKeyType;
-import com.zy.core.enums.SlaveType;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.*;
import com.zy.core.model.CommandResponse;
+import com.zy.core.model.StationObjModel;
import com.zy.core.model.Task;
import com.zy.core.model.command.DualCrnCommand;
import com.zy.core.model.protocol.DualCrnProtocol;
+import com.zy.core.model.protocol.StationProtocol;
import com.zy.core.network.DeviceConnectPool;
import com.zy.core.network.ZyDualCrnConnectDriver;
import com.zy.core.network.entity.ZyDualCrnStatusEntity;
import com.zy.core.thread.DualCrnThread;
+import com.zy.core.thread.StationThread;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.Date;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* 鍙屽伐浣嶅爢鍨涙満绾跨▼
@@ -47,10 +49,6 @@
private ZyDualCrnConnectDriver zyDualCrnConnectDriver;
private DualCrnProtocol crnProtocol;
private int deviceLogCollectTime = 200;
- private boolean resetFlag = false;
- private volatile boolean closed = false;
- private ScheduledExecutorService readExecutor;
- private ScheduledExecutorService processExecutor;
public ZySiemensDualCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
this.deviceConfig = deviceConfig;
@@ -62,53 +60,163 @@
public void run() {
this.connect();
this.initCrn();
- readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setName("DualCrnReader-" + deviceConfig.getDeviceNo());
- t.setDaemon(true);
- return t;
- }
- });
- readExecutor.scheduleAtFixedRate(() -> {
- if (closed || Thread.currentThread().isInterrupted()) {
- return;
- }
- try {
- deviceLogCollectTime = Utils.getDeviceLogCollectTime();
- readStatus();
- } catch (Exception e) {
- log.error("DualCrnThread Fail", e);
- }
- }, 0, 200, TimeUnit.MILLISECONDS);
- processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setName("DualCrnWriter-" + deviceConfig.getDeviceNo());
- t.setDaemon(true);
- return t;
+ Thread readThread = new Thread(() -> {
+ while (true) {
+ try {
+ deviceLogCollectTime = Utils.getDeviceLogCollectTime();
+ readStatus();
+ Thread.sleep(100);
+ } catch (Exception e) {
+ log.error("DualCrnThread Fail", e);
+ }
}
});
- processExecutor.scheduleAtFixedRate(() -> {
- if (closed || Thread.currentThread().isInterrupted()) {
- return;
- }
- try {
- int step = 1;
- Task task = MessageQueue.poll(SlaveType.DualCrn, deviceConfig.getDeviceNo());
- if (task != null) {
- step = task.getStep();
+ readThread.start();
+
+ Thread processThread = new Thread(() -> {
+ while (true) {
+ try {
+ int step = 1;
+ Task task = MessageQueue.poll(SlaveType.DualCrn, deviceConfig.getDeviceNo());
+ if (task != null) {
+ step = task.getStep();
+ }
+
+ if (step == 2) {
+ List<DualCrnCommand> commandList = (List<DualCrnCommand>) task.getData();
+ DualCrnCommand command = commandList.get(0);
+
+ HashMap<String, Object> map = new HashMap<>();
+ map.put("commands", commandList);
+ map.put("idx", 1);
+ redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + command.getTaskNo(), JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
+ sendCommand(command);
+ } else if (step == 3) {
+ sendCommand((DualCrnCommand) task.getData());
+ }
+
+ Thread.sleep(100);
+ } catch (Exception e) {
+ log.error("DualCrnProcess Fail", e);
}
- if (step == 2 && task != null) {
- sendCommand((DualCrnCommand) task.getData());
- }
- } catch (Exception e) {
- e.printStackTrace();
}
- }, 0, 200, TimeUnit.MILLISECONDS);
+ });
+ processThread.start();
+
+ Thread commandThread = new Thread(() -> {
+ while (true) {
+ try {
+ if(crnProtocol.getMode() != DualCrnModeType.AUTO.id) {
+ continue;
+ }
+
+ if(crnProtocol.getAlarm() != 0) {
+ continue;
+ }
+
+ if (crnProtocol.getLoaded() == 1 && crnProtocol.getLoadedTwo() == 1) {
+ Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+ if (wait != null) {
+ redisUtil.del(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+ }
+ }
+
+ if(crnProtocol.getTaskNo() > 0 && crnProtocol.getStatus() == DualCrnStatusType.IDLE.id) {
+ Integer taskNo = crnProtocol.getTaskNo();
+ Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo);
+ if (commandObj == null) {
+ News.error("鍙屽伐浣嶅爢鍨涙満锛屽伐浣�1绌洪棽绛夊緟涓嬪彂鍛戒护锛屼絾鏈壘鍒板懡浠ゃ�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crnProtocol.getCrnNo(), taskNo);
+ continue;
+ }
+
+ JSONObject commandMap = JSON.parseObject(commandObj.toString());
+ Integer idx = commandMap.getInteger("idx");
+ List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class);
+ if (idx >= commandList.size()) {
+ continue;
+ }
+ DualCrnCommand dualCommand = commandList.get(idx);
+
+ if (dualCommand.getTaskMode() == DualCrnTaskModeType.PUT.id.shortValue()) {
+ //绛夊緟涓嬩竴涓换鍔�
+ Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+ if (wait != null) {
+ continue;
+ }
+
+ Object outTaskStationInfoObj = redisUtil.get(RedisKeyType.DUAL_CRN_OUT_TASK_STATION_INFO.key + taskNo);
+ if (outTaskStationInfoObj != null) {
+ //妫�娴嬪嚭鍙g珯鏄惁鍙墽琛屾斁璐у姩浣�
+ StationObjModel stationObjModel = JSON.parseObject(outTaskStationInfoObj.toString(), StationObjModel.class);
+ StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
+ if (stationThread == null) {
+ continue;
+ }
+
+ Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap();
+ StationProtocol stationProtocol = statusMap.get(stationObjModel.getStationId());
+ if (stationProtocol == null) {
+ continue;
+ }
+
+ if (!stationProtocol.isAutoing()) {
+ continue;
+ }
+
+ if (stationProtocol.isLoading()) {
+ continue;
+ }
+
+ if (stationProtocol.getTaskNo() > 0) {
+ continue;
+ }
+ }
+ }
+
+ idx++;
+ commandMap.put("idx", idx);
+ sendCommand(dualCommand);
+ redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24);
+ }
+
+ if(crnProtocol.getTaskNoTwo() > 0 && crnProtocol.getStatusTwo() == DualCrnStatusType.IDLE.id) {
+ Integer taskNo = crnProtocol.getTaskNoTwo();
+ Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo);
+ if (commandObj == null) {
+ News.error("鍙屽伐浣嶅爢鍨涙満锛屽伐浣�2绌洪棽绛夊緟涓嬪彂鍛戒护锛屼絾鏈壘鍒板懡浠ゃ�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crnProtocol.getCrnNo(), taskNo);
+ continue;
+ }
+
+ JSONObject commandMap = JSON.parseObject(commandObj.toString());
+ Integer idx = commandMap.getInteger("idx");
+ List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class);
+ if (idx >= commandList.size()) {
+ continue;
+ }
+ DualCrnCommand dualCommand = commandList.get(idx);
+
+ if (dualCommand.getTaskMode() == DualCrnTaskModeType.PUT.id.shortValue()) {
+ //绛夊緟涓嬩竴涓换鍔�
+ Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+ if (wait != null) {
+ continue;
+ }
+ }
+
+ idx++;
+ commandMap.put("idx", idx);
+ sendCommand(dualCommand);
+ redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24);
+ }
+
+ Thread.sleep(100);
+ } catch (Exception e) {
+ log.error("DualCrnCommand Fail", e);
+ }
+ }
+ });
+ commandThread.start();
}
/**
@@ -129,6 +237,7 @@
crnProtocol.setForkPos(-1);
crnProtocol.setLoaded(0);
crnProtocol.setWalkPos(0);
+ crnProtocol.setLiftPos(0);
//宸ヤ綅2
crnProtocol.setTaskNoTwo(0);
@@ -138,6 +247,7 @@
crnProtocol.setForkPosTwo(-1);
crnProtocol.setLoadedTwo(0);
crnProtocol.setWalkPosTwo(0);
+ crnProtocol.setLiftPosTwo(0);
crnProtocol.setAlarm(0);
crnProtocol.setXSpeed(0);
@@ -166,27 +276,26 @@
OutputQueue.DUAL_CRN.offer(MessageFormat.format("銆恵0}銆戣鍙栧弻宸ヤ綅鍫嗗灈鏈簆lc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()));
return;
}
-
crnProtocol.setMode(crnStatus.getMode());
//宸ヤ綅1
crnProtocol.setTaskNo(crnStatus.getTaskNo());
crnProtocol.setStatus(crnStatus.getStatus());
- crnProtocol.setBay(crnStatus.getBay());
- crnProtocol.setLevel(crnStatus.getLevel());
crnProtocol.setForkPos(crnStatus.getForkPos());
crnProtocol.setLoaded(crnStatus.getLoaded());
- crnProtocol.setWalkPos(crnStatus.getWalkPos());
+ crnProtocol.setTaskReceive(crnStatus.getTaskReceive());
//宸ヤ綅2
crnProtocol.setTaskNoTwo(crnStatus.getTaskNoTwo());
crnProtocol.setStatusTwo(crnStatus.getStatusTwo());
- crnProtocol.setBayTwo(crnStatus.getBayTwo());
- crnProtocol.setLevelTwo(crnStatus.getLevelTwo());
crnProtocol.setForkPosTwo(crnStatus.getForkPosTwo());
crnProtocol.setLoadedTwo(crnStatus.getLoadedTwo());
- crnProtocol.setWalkPosTwo(crnStatus.getWalkPosTwo());
+ crnProtocol.setTaskReceiveTwo(crnStatus.getTaskReceiveTwo());
+ crnProtocol.setBay(crnStatus.getBay());
+ crnProtocol.setLevel(crnStatus.getLevel());
+ crnProtocol.setWalkPos(crnStatus.getWalkPos());
+ crnProtocol.setLiftPos(crnStatus.getLiftPos());
crnProtocol.setAlarm(crnStatus.getAlarm());
crnProtocol.setTemp1(crnStatus.getTemp1());
crnProtocol.setTemp2(crnStatus.getTemp2());
@@ -248,15 +357,6 @@
@Override
public void close() {
- closed = true;
- ScheduledExecutorService ex = readExecutor;
- if (ex != null) {
- try { ex.shutdownNow(); } catch (Exception ignore) {}
- }
- ScheduledExecutorService px = processExecutor;
- if (px != null) {
- try { px.shutdownNow(); } catch (Exception ignore) {}
- }
if (zyDualCrnConnectDriver != null) {
zyDualCrnConnectDriver.close();
}
@@ -271,16 +371,44 @@
public DualCrnCommand getPickAndPutCommand(String sourceLocNo, String targetLocNo, Integer taskNo, Integer crnNo, Integer station) {
DualCrnCommand crnCommand = new DualCrnCommand();
crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
- crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
- crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE.id.shortValue()); // 浠诲姟妯″紡: 搴撲綅绉昏浆
- crnCommand.setSourcePosX((short) Utils.getRow(sourceLocNo)); // 婧愬簱浣嶆帓
- crnCommand.setSourcePosY((short) Utils.getBay(sourceLocNo)); // 婧愬簱浣嶅垪
- crnCommand.setSourcePosZ((short) Utils.getLev(sourceLocNo)); // 婧愬簱浣嶅眰
- crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo)); // 鐩爣搴撲綅鎺�
- crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo)); // 鐩爣搴撲綅鍒�
- crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo)); // 鐩爣搴撲綅灞�
- crnCommand.setStation(station.shortValue());//宸ヤ綅
- crnCommand.setCommand((short) 1); // 浠诲姟纭
+ crnCommand.setTaskNo(taskNo); // 宸ヤ綔鍙�
+ crnCommand.setTaskMode(DualCrnTaskModeType.TRANSFER.id); // 浠诲姟妯″紡: 鍙栨斁璐�
+ crnCommand.setSourcePosX(Utils.getRow(sourceLocNo)); // 婧愬簱浣嶆帓
+ crnCommand.setSourcePosY(Utils.getBay(sourceLocNo)); // 婧愬簱浣嶅垪
+ crnCommand.setSourcePosZ(Utils.getLev(sourceLocNo)); // 婧愬簱浣嶅眰
+ crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // 鐩爣搴撲綅鎺�
+ crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // 鐩爣搴撲綅鍒�
+ crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // 鐩爣搴撲綅灞�
+ crnCommand.setStation(station);//宸ヤ綅
+ crnCommand.setCommand(1); // 浠诲姟纭
+ return crnCommand;
+ }
+
+ @Override
+ public DualCrnCommand getPickCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station) {
+ DualCrnCommand crnCommand = new DualCrnCommand();
+ crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
+ crnCommand.setTaskNo(taskNo); // 宸ヤ綔鍙�
+ crnCommand.setTaskMode(DualCrnTaskModeType.PICK.id); // 浠诲姟妯″紡: 鍙栬揣
+ crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // 鐩爣搴撲綅鎺�
+ crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // 鐩爣搴撲綅鍒�
+ crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // 鐩爣搴撲綅灞�
+ crnCommand.setStation(station);//宸ヤ綅
+ crnCommand.setCommand(1); // 浠诲姟纭
+ return crnCommand;
+ }
+
+ @Override
+ public DualCrnCommand getPutCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station) {
+ DualCrnCommand crnCommand = new DualCrnCommand();
+ crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
+ crnCommand.setTaskNo(taskNo); // 宸ヤ綔鍙�
+ crnCommand.setTaskMode(DualCrnTaskModeType.PUT.id); // 浠诲姟妯″紡: 鏀捐揣
+ crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // 鐩爣搴撲綅鎺�
+ crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // 鐩爣搴撲綅鍒�
+ crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // 鐩爣搴撲綅灞�
+ crnCommand.setStation(station);//宸ヤ綅
+ crnCommand.setCommand(1); // 浠诲姟纭
return crnCommand;
}
@@ -288,13 +416,12 @@
public DualCrnCommand getMoveCommand(String targetLocNo, Integer taskNo, Integer crnNo) {
DualCrnCommand crnCommand = new DualCrnCommand();
crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
- crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
- crnCommand.setAckFinish((short) 0); // 浠诲姟瀹屾垚纭浣�
- crnCommand.setTaskMode(CrnTaskModeType.CRN_MOVE.id.shortValue()); // 浠诲姟妯″紡: 鍫嗗灈鏈虹Щ鍔�
- crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo)); // 鐩爣搴撲綅鎺�
- crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo)); // 鐩爣搴撲綅鍒�
- crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo)); // 鐩爣搴撲綅灞�
- crnCommand.setCommand((short) 1); // 浠诲姟纭
+ crnCommand.setTaskNo(taskNo); // 宸ヤ綔鍙�
+ crnCommand.setTaskMode(DualCrnTaskModeType.MOVE.id); // 浠诲姟妯″紡: 鍫嗗灈鏈虹Щ鍔�
+ crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // 鐩爣搴撲綅鎺�
+ crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // 鐩爣搴撲綅鍒�
+ crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // 鐩爣搴撲綅灞�
+ crnCommand.setCommand(1); // 浠诲姟纭
return crnCommand;
}
@@ -302,17 +429,16 @@
public DualCrnCommand getResetCommand(Integer crnNo, Integer station) {
DualCrnCommand crnCommand = new DualCrnCommand();
crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
- crnCommand.setTaskNo((short) 0); // 宸ヤ綔鍙�
- crnCommand.setAckFinish((short) 1); // 浠诲姟瀹屾垚纭浣�
- crnCommand.setTaskMode(CrnTaskModeType.NONE.id.shortValue()); // 浠诲姟妯″紡
- crnCommand.setSourcePosX((short)0); // 婧愬簱浣嶆帓
- crnCommand.setSourcePosY((short)0); // 婧愬簱浣嶅垪
- crnCommand.setSourcePosZ((short)0); // 婧愬簱浣嶅眰
- crnCommand.setDestinationPosX((short)0); // 鐩爣搴撲綅鎺�
- crnCommand.setDestinationPosY((short)0); // 鐩爣搴撲綅鍒�
- crnCommand.setDestinationPosZ((short)0); // 鐩爣搴撲綅灞�
- crnCommand.setStation(station.shortValue());//宸ヤ綅
- crnCommand.setCommand((short) 1); // 浠诲姟纭
+ crnCommand.setTaskNo(0); // 宸ヤ綔鍙�
+ crnCommand.setTaskMode(DualCrnTaskModeType.CONFIRM.id); // 浠诲姟妯″紡: 纭
+ crnCommand.setSourcePosX(0); // 婧愬簱浣嶆帓
+ crnCommand.setSourcePosY(0); // 婧愬簱浣嶅垪
+ crnCommand.setSourcePosZ(0); // 婧愬簱浣嶅眰
+ crnCommand.setDestinationPosX(0); // 鐩爣搴撲綅鎺�
+ crnCommand.setDestinationPosY(0); // 鐩爣搴撲綅鍒�
+ crnCommand.setDestinationPosZ(0); // 鐩爣搴撲綅灞�
+ crnCommand.setStation(station);//宸ヤ綅
+ crnCommand.setCommand(1); // 浠诲姟纭
return crnCommand;
}
--
Gitblit v1.9.1