From 5496a3a7b476135208d46dee279f506f9d69a234 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期四, 08 一月 2026 10:54:04 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/core/plugin/NormalProcess.java | 160 ++++++++++++++++++++++++++++++++++++++++
src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java | 49 ++++++++++--
src/main/java/com/zy/core/enums/WrkIoType.java | 2
src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java | 4
src/main/java/com/zy/asrs/controller/BasMapController.java | 14 +++
src/main/java/com/zy/core/enums/RedisKeyType.java | 1
src/main/resources/application.yml | 2
src/main/java/com/zy/core/model/StationObjModel.java | 2
8 files changed, 220 insertions(+), 14 deletions(-)
diff --git a/src/main/java/com/zy/asrs/controller/BasMapController.java b/src/main/java/com/zy/asrs/controller/BasMapController.java
index fbfd4db..7506271 100644
--- a/src/main/java/com/zy/asrs/controller/BasMapController.java
+++ b/src/main/java/com/zy/asrs/controller/BasMapController.java
@@ -218,8 +218,20 @@
Integer isBarcodeStation = value.getInteger("isBarcodeStation");
if (isBarcodeStation != null && isBarcodeStation == 1) {
+ StationObjModel barcodeStationModel = new StationObjModel();
+ barcodeStationModel.setDeviceNo(deviceNo);
+ barcodeStationModel.setStationId(value.getInteger("stationId"));
+
+ if (value.getInteger("backStation") != null) {
+ StationObjModel backStation = new StationObjModel();
+ barcodeStationModel.setBackStation(backStation);
+
+ backStation.setDeviceNo(value.getInteger("backStationDeviceNo"));
+ backStation.setStationId(value.getInteger("backStation"));
+ }
+
List<StationObjModel> barcodeStationList = barcodeStationMap.getOrDefault(deviceNo, new ArrayList<>());
- barcodeStationList.add(stationObjModel);
+ barcodeStationList.add(barcodeStationModel);
barcodeStationMap.put(deviceNo, barcodeStationList);
}
diff --git a/src/main/java/com/zy/core/enums/RedisKeyType.java b/src/main/java/com/zy/core/enums/RedisKeyType.java
index da4641c..1154b8f 100644
--- a/src/main/java/com/zy/core/enums/RedisKeyType.java
+++ b/src/main/java/com/zy/core/enums/RedisKeyType.java
@@ -39,6 +39,7 @@
STATION_OUT_EXECUTE_COMPLETE_LIMIT("station_out_execute_complete_limit_"),
CHECK_STATION_RUN_BLOCK_LIMIT_("check_station_run_block_limit_"),
CHECK_SHALLOW_LOC_STATUS_LIMIT("check_shallow_loc_status_limit_"),
+ GENERATE_ENABLE_IN_STATION_DATA_LIMIT("generate_enable_in_station_data_limit_"),
DUAL_CRN_PICK_WAIT_NEXT_TASK("dual_crn_pick_wait_next_task_"),
DUAL_CRN_OUT_TASK_STATION_INFO("dual_crn_out_task_station_info_"),
diff --git a/src/main/java/com/zy/core/enums/WrkIoType.java b/src/main/java/com/zy/core/enums/WrkIoType.java
index f25d00a..ecde168 100644
--- a/src/main/java/com/zy/core/enums/WrkIoType.java
+++ b/src/main/java/com/zy/core/enums/WrkIoType.java
@@ -7,8 +7,6 @@
IN(1, "鍏ュ簱"),
OUT(101, "鍑哄簱"),
LOC_MOVE(201, "绉诲簱浠诲姟"),
- PREVIEW_LIFT_MOVE(98, "鎻愬崌鏈洪璋冨害绉诲姩浠诲姟"),
- MANUAL(99, "鎵嬪姩浠诲姟"),
FAKE_TASK_NO(9999, "浠跨湡闅忔満宸ヤ綔鍙�"),
;
diff --git a/src/main/java/com/zy/core/model/StationObjModel.java b/src/main/java/com/zy/core/model/StationObjModel.java
index 0d160ba..4f047cb 100644
--- a/src/main/java/com/zy/core/model/StationObjModel.java
+++ b/src/main/java/com/zy/core/model/StationObjModel.java
@@ -19,4 +19,6 @@
private StationObjModel barcodeStation;
+ private StationObjModel backStation;
+
}
diff --git a/src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java b/src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java
index 8f0af83..4bc50fc 100644
--- a/src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyStationV3RealConnect.java
@@ -50,7 +50,7 @@
@Override
public boolean connect() {
boolean connected = false;
- siemensNet = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
+ siemensNet = new SiemensS7Net(SiemensPLCS.S1500, deviceConfig.getIp());
OperateResult connect = siemensNet.ConnectServer();
if (connect.IsSuccess) {
connected = true;
@@ -66,6 +66,7 @@
News.error("杈撻�佺珯plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]",
deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort());
}
+// siemensNet.ConnectClose();
return connected;
}
@@ -97,6 +98,10 @@
if (barcodeStatusList != null) {
barcodeStatusList.sort(Comparator.comparing(ZyStationStatusEntity::getStationId));
}
+ }
+
+ if (siemensNet == null) {
+ return statusList;
}
OperateResultExOne<byte[]> result = siemensNet.Read("DB100.0", (short) (statusList.size() * 8));
@@ -146,10 +151,12 @@
return commandResponse;
}
+ int maxTryCount = 999;
+ int tryCount = 0;
if (command.getCommandType().equals(StationCommandType.MOVE)) {
int enableCommandIdx = -1;
while (true) {
- enableCommandIdx = getEnableCommandIdx();
+ enableCommandIdx = getEnableCommandIdx(command.getTaskNo());
if(enableCommandIdx == -1) {
try {
Thread.sleep(300);
@@ -157,11 +164,16 @@
}else {
break;
}
+ tryCount++;
+ if (tryCount > maxTryCount) {
+ commandResponse.setMessage("鍛戒护涓嬪彂瓒呮椂锛屾棤娉曟壘鍒板彲鐢ㄤ笅鍙戝尯鍩�");
+ return commandResponse;
+ }
}
List<Integer> pathList = command.getNavigatePath();
- short[] data = new short[22];
+ short[] data = new short[21];
data[0] = command.getTargetStaNo().shortValue();
int dataIdx = 1;
@@ -169,9 +181,18 @@
data[dataIdx++] = path.shortValue();
}
- OperateResult writeTask = siemensNet.Write("DB23." + enableCommandIdx * taskAddressLength, command.getTaskNo());
- OperateResult writeData = siemensNet.Write("DB23." + enableCommandIdx * taskAddressLength + 4, data);
- if(writeTask.IsSuccess && writeData.IsSuccess) {
+ OperateResult writeTask = siemensNet.Write("DB23." + (enableCommandIdx * taskAddressLength), command.getTaskNo());
+ try {
+ Thread.sleep(50);
+ }catch (Exception e) {}
+
+ OperateResult writeData = siemensNet.Write("DB23." + (enableCommandIdx * taskAddressLength + 4), data);
+ try {
+ Thread.sleep(200);
+ }catch (Exception e) {}
+ OperateResult writeConfirm = siemensNet.Write("DB23." + (enableCommandIdx * taskAddressLength + 46), (short) 1);
+
+ if(writeTask.IsSuccess && writeData.IsSuccess && writeConfirm.IsSuccess) {
log.error("鍐欏叆杈撻�佺嚎鍛戒护鎴愬姛銆備换鍔″彿={}锛岀珯鐐规暟鎹�={}", command.getTaskNo(), JSON.toJSON(command));
commandResponse.setResult(true);
}else {
@@ -219,11 +240,21 @@
return null;
}
- private int getEnableCommandIdx() {
+ private int getEnableCommandIdx(int taskNo) {
int useIdx = -1;
for (int i = 0; i < taskAddressLimit; i++) {
- OperateResultExOne<byte[]> result = siemensNet.Read("DB23." + i * taskAddressLength, (short) taskAddressLength);
- int taskStatus = siemensNet.getByteTransform().TransInt16(result.Content, i * taskAddressLength + 46);
+ OperateResultExOne<byte[]> resultTask = siemensNet.Read("DB23." + (i * taskAddressLength + 0), (short) 2);
+ OperateResultExOne<byte[]> resultStatus = siemensNet.Read("DB23." + (i * taskAddressLength + 46), (short) 2);
+ if(resultTask.IsSuccess && resultStatus.IsSuccess) {
+ continue;
+ }
+
+ int commandAreaTaskNo = siemensNet.getByteTransform().TransInt32(resultTask.Content, 0);
+ if(commandAreaTaskNo == taskNo) {
+ return -1;
+ }
+
+ int taskStatus = siemensNet.getByteTransform().TransInt16(resultStatus.Content, 0);
if (taskStatus == 1) {
continue;
}
diff --git a/src/main/java/com/zy/core/plugin/NormalProcess.java b/src/main/java/com/zy/core/plugin/NormalProcess.java
index afd310b..3792035 100644
--- a/src/main/java/com/zy/core/plugin/NormalProcess.java
+++ b/src/main/java/com/zy/core/plugin/NormalProcess.java
@@ -1,11 +1,39 @@
package com.zy.core.plugin;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
+import com.zy.asrs.domain.param.CreateInTaskParam;
+import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.BasDevpService;
+import com.zy.asrs.service.WrkMastService;
+import com.zy.common.model.StartupDto;
+import com.zy.common.service.CommonService;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.News;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.RedisKeyType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.enums.StationCommandType;
+import com.zy.core.enums.WrkIoType;
+import com.zy.core.model.StationObjModel;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.StationCommand;
+import com.zy.core.model.protocol.StationProtocol;
import com.zy.core.plugin.api.MainProcessPluginApi;
+import com.zy.core.thread.StationThread;
import com.zy.core.utils.CrnOperateProcessUtils;
import com.zy.core.utils.StationOperateProcessUtils;
+import com.zy.core.utils.WmsOperateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
@Slf4j
@Component
@@ -15,9 +43,24 @@
private CrnOperateProcessUtils crnOperateUtils;
@Autowired
private StationOperateProcessUtils stationOperateProcessUtils;
+ @Autowired
+ private CommonService commonService;
+ @Autowired
+ private BasDevpService basDevpService;
+ @Autowired
+ private WrkMastService wrkMastService;
+ @Autowired
+ private RedisUtil redisUtil;
+ @Autowired
+ private WmsOperateUtils wmsOperateUtils;
@Override
public void run() {
+ //璇锋眰鐢熸垚鍏ュ簱浠诲姟
+ generateStoreWrkFile();
+ //妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞跺惎鍔ㄥ叆搴�
+ checkInStationHasTask();
+
//鎵ц鍫嗗灈鏈轰换鍔�
crnOperateUtils.crnIoExecute();
//鍫嗗灈鏈轰换鍔℃墽琛屽畬鎴�-鍏峰浠跨湡鑳藉姏
@@ -30,4 +73,121 @@
stationOperateProcessUtils.stationOutExecuteFinish();
}
+ /**
+ * 璇锋眰鐢熸垚鍏ュ簱浠诲姟
+ * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
+ */
+ public synchronized void generateStoreWrkFile() {
+ List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
+ for (BasDevp basDevp : basDevps) {
+ StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
+ if(stationThread == null){
+ continue;
+ }
+
+ Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
+
+ List<StationObjModel> list = basDevp.getBarcodeStationList$();
+ for (StationObjModel entity : list) {
+ Integer stationId = entity.getStationId();
+ if(!stationMap.containsKey(stationId)){
+ continue;
+ }
+
+ StationProtocol stationProtocol = stationMap.get(stationId);
+ if (stationProtocol == null) {
+ continue;
+ }
+
+ //婊¤冻鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙凤紝鐢熸垚鍏ュ簱鏁版嵁
+ if (stationProtocol.isAutoing()
+ && stationProtocol.isLoading()
+ && stationProtocol.getTaskNo() > 0
+ ) {
+ if (Cools.isEmpty(stationProtocol.getBarcode())) {
+ continue;
+ }
+
+ //妫�娴嬩换鍔℃槸鍚︾敓鎴�
+ List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("barcode", stationProtocol.getBarcode()));
+ if (!wrkMasts.isEmpty()) {
+ continue;
+ }
+
+ Object lock = redisUtil.get(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId);
+ if (lock != null) {
+ continue;
+ }
+ redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
+
+ String response = wmsOperateUtils.applyInTask(stationProtocol.getBarcode(), stationProtocol.getStationId(), stationProtocol.getPalletHeight());
+ if (response == null) {
+ News.error("璇锋眰WMS鍏ュ簱鎺ュ彛澶辫触锛屾帴鍙f湭鍝嶅簲锛侊紒锛乺esponse锛歿}", response);
+ continue;
+ }
+ JSONObject jsonObject = JSON.parseObject(response);
+ if (jsonObject.getInteger("code").equals(200)) {
+ StartupDto dto = jsonObject.getObject("data", StartupDto.class);
+
+ CreateInTaskParam taskParam = new CreateInTaskParam();
+ taskParam.setTaskNo(dto.getTaskNo());
+ taskParam.setLocNo(dto.getLocNo());
+ taskParam.setTaskPri(dto.getTaskPri());
+ taskParam.setBarcode(stationProtocol.getBarcode());
+ WrkMast wrkMast = commonService.createInTask(taskParam);
+
+ StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO, wrkMast.getWrkNo(), stationId, stationId, 0);
+ if(command == null){
+ News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
+ continue;
+ }
+ MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
+ }
+ }
+ }
+ }
+ }
+
+ //妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞跺惎鍔ㄥ叆搴�
+ private synchronized void checkInStationHasTask() {
+ List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
+ for (BasDevp basDevp : basDevps) {
+ StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
+ if(stationThread == null){
+ continue;
+ }
+
+ Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
+
+ List<StationObjModel> list = basDevp.getInStationList$();
+ for (StationObjModel entity : list) {
+ Integer stationId = entity.getStationId();
+ if(!stationMap.containsKey(stationId)){
+ continue;
+ }
+
+ StationProtocol stationProtocol = stationMap.get(stationId);
+ if (stationProtocol == null) {
+ continue;
+ }
+
+ Object lock = redisUtil.get(RedisKeyType.GENERATE_ENABLE_IN_STATION_DATA_LIMIT.key + stationId);
+ if(lock != null){
+ continue;
+ }
+
+ //婊¤冻鑷姩銆佹棤鐗┿�佸伐浣滃彿0锛岀敓鎴愬叆搴撴暟鎹�
+ if (stationProtocol.isAutoing()
+ && stationProtocol.isLoading()
+ && stationProtocol.getTaskNo() == 0
+ && stationProtocol.isEnableIn()
+ ) {
+ StationCommand command = stationThread.getCommand(StationCommandType.MOVE, commonService.getWorkNo(WrkIoType.FAKE_TASK_NO.id), stationId, entity.getBarcodeStation().getStationId(), 0);
+ MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
+ redisUtil.set(RedisKeyType.GENERATE_ENABLE_IN_STATION_DATA_LIMIT.key + stationId, "lock", 10);
+ }
+ }
+ }
+ }
+
}
diff --git a/src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java b/src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java
index 70a0cde..bb7fbd8 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationV3Thread.java
@@ -217,7 +217,8 @@
CommandResponse commandResponse = null;
try {
commandResponse = zyStationConnectDriver.sendCommand(command);
- return commandResponse;
+ } catch (Exception e) {
+ e.printStackTrace();
} finally {
BasStationOptService optService = SpringUtils.getBean(BasStationOptService.class);
List<ZyStationStatusEntity> statusListEntity = zyStationConnectDriver.getStatus();
@@ -249,6 +250,7 @@
optService.insert(basStationOpt);
}
}
+ return commandResponse;
}
@Override
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index cc1b962..c056164 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -78,7 +78,7 @@
expireDays: 7
llm:
- platform: python
+ platform: java
pythonPlatformUrl: http://127.0.0.1:9000/ai/diagnose/askStream
# base-url: https://api.siliconflow.cn/v1
# api-key: sk-sxdtebtquwrugzrmaqqqkzdzmrgzhzmplwwuowysdasccent
--
Gitblit v1.9.1