From 6c5963052282dfe4ae2f20d2e18012d1cff93c85 Mon Sep 17 00:00:00 2001
From: pjb <pjb123456>
Date: 星期一, 23 六月 2025 08:54:51 +0800
Subject: [PATCH] rgv调度优化
---
src/main/java/com/zy/core/enums/RgvStatusType.java | 1
src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java | 7 -
src/main/java/com/zy/asrs/controller/RgvController.java | 4
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 157 ++++++++++++++++++++++++++++++++++++++-
src/main/webapp/views/index.html | 20 +++-
src/main/java/com/zy/asrs/entity/WrkMast.java | 8 ++
src/main/resources/mapper/WrkMastMapper.xml | 3
src/main/java/com/zy/core/MainProcess.java | 19 +++-
src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java | 9 +-
9 files changed, 200 insertions(+), 28 deletions(-)
diff --git a/src/main/java/com/zy/asrs/controller/RgvController.java b/src/main/java/com/zy/asrs/controller/RgvController.java
index 8e951c1..35fe0b3 100644
--- a/src/main/java/com/zy/asrs/controller/RgvController.java
+++ b/src/main/java/com/zy/asrs/controller/RgvController.java
@@ -430,7 +430,8 @@
// @ManagerAuth(memo = "浣滀笟淇℃伅")
public R ringThroughTaskWrkMast(){
List<RgvWrkMastParam> result = new ArrayList<>();
- List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts",9,10));
+ List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts",9,10).orderBy("wrk_sts",false)
+ .orderBy("rgv_no",true));
for (WrkMast wrkMast : wrkMasts){
RgvWrkMastParam rgvWrkMastParam = new RgvWrkMastParam(wrkMast);
if (Cools.isEmpty(rgvWrkMastParam.getRgvNo())){
@@ -466,6 +467,7 @@
RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
if (rgvProtocol != null) {
rgvCircularShuttleParam.setPosition(rgvProtocol.getRgvPos());
+ rgvCircularShuttleParam.setTaskNo(rgvProtocol.taskNo1);
if (rgvCircularShuttleParam.getStatus()==0){
rgvCircularShuttleParam.setStatus$(rgvProtocol.statusType.desc);
}
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java b/src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
index f5e29d4..bc1ca9e 100644
--- a/src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
@@ -1,11 +1,6 @@
package com.zy.asrs.domain.param;
-import com.baomidou.mybatisplus.annotations.TableField;
-import com.baomidou.mybatisplus.annotations.TableId;
-import com.baomidou.mybatisplus.enums.IdType;
import com.zy.asrs.entity.BasCircularShuttle;
-import com.zy.asrs.entity.WrkMast;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
@@ -21,6 +16,8 @@
private Integer rgvNo;
+ private short taskNo;
+
/**
* 0:姝e父锛�1锛氱鐢�
*/
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java b/src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java
index b454541..fe4a429 100644
--- a/src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java
@@ -1,11 +1,7 @@
package com.zy.asrs.domain.param;
-import com.core.common.Cools;
import com.zy.asrs.entity.WrkMast;
-import com.zy.asrs.utils.TimeCalculatorUtils;
import lombok.Data;
-
-import java.util.Date;
/**
* Created by vincent on 2020-06-02
@@ -21,6 +17,8 @@
private Long wrkSts;
private String wrkSts$;
// 宸ヤ綅1鐩爣绔�
+ private Integer rgvDstaNo;
+ // 鏈�缁堢洰鏍囩珯
private Integer staNo;
// 宸ヤ綅1婧愮珯
private Integer sourceStaNo;
@@ -36,7 +34,8 @@
public RgvWrkMastParam(WrkMast wrkMast){
this.wrkNo = wrkMast.getWrkNo();
this.rgvNo = wrkMast.getRgvNo();
- this.sourceStaNo = wrkMast.getSourceStaNo();
+ this.sourceStaNo = wrkMast.getRgvSstaNo();
+ this.rgvDstaNo = wrkMast.getRgvDstaNo();
this.staNo = wrkMast.getStaNo();
this.wrkSts = wrkMast.getWrkSts();
this.wrkSts$ = wrkMast.getWrkSts$();
diff --git a/src/main/java/com/zy/asrs/entity/WrkMast.java b/src/main/java/com/zy/asrs/entity/WrkMast.java
index 64f7e78..6c4efa8 100644
--- a/src/main/java/com/zy/asrs/entity/WrkMast.java
+++ b/src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -134,6 +134,14 @@
@TableField("rgv_dsta_no")
private Integer rgvDstaNo;
+ @ApiModelProperty(value= "rgv鍛戒护涓嬪彂鏃堕棿")
+ @TableField("rgv_create_time")
+ private Date rgvCreateTime;
+
+ @ApiModelProperty(value= "rgv浠诲姟瀹屾垚鏃堕棿")
+ @TableField("rgv_finish_time")
+ private Date rgvFinishTime;
+
@ApiModelProperty(value= "")
@TableField("loc_sts")
private String locSts;
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 86f45c2..8bcef14 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -32,9 +32,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
/**
* 绔嬩綋浠撳簱WCS绯荤粺涓绘祦绋嬩笟鍔�
@@ -358,6 +356,117 @@
}
}
+ public synchronized void rgvTheHandlingTaskIsIssued() {
+ try {
+ List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", 0).eq("wrk_sts", 9)
+ .orderBy("io_pri", false)
+ .orderBy("modi_time", true));
+ if (wrkMasts.isEmpty()) {
+ return;
+ }
+
+ LinkedList<RgvProtocol> rgvProtocolList = new LinkedList<>();
+ for (int i = 1; i <= 5; i++) {
+ RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, i);
+ RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+ if (rgvProtocol == null) {
+ continue;
+ }
+ rgvProtocolList.add(rgvProtocol);
+ }
+
+ runRgv:
+ for (WrkMast wrkMast : wrkMasts) {
+ BasDevpPosition basDevpPositions = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast.getRgvSstaNo())); // 绔欑偣
+ long position = basDevpPositions.getPlcPosition(); // 璧峰绔欎綅缃�
+ TreeMap<Long, RgvProtocol> map = new TreeMap<>();
+ for (RgvProtocol rgvProtocol : rgvProtocolList) {
+ long distance;
+ if (rgvProtocol.getRgvPos() <= position) {
+ distance = position - rgvProtocol.getRgvPos();
+ } else {
+ distance = position + (perimeter - rgvProtocol.getRgvPos());
+ }
+ map.put(distance, rgvProtocol);
+ }
+ log.info("鍙栬揣绔欑偣锛歿}锛屽悗闈㈠皬杞︽帓搴�", basDevpPositions.getDevNo());
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) {
+ RgvProtocol rgvProtocol = rgvProtocolMap.getValue();
+ sb.append("[").append(rgvProtocol.getRgvNo()).append(",").append(rgvProtocol.getStatusType().desc).append("]");
+ }
+ log.info(sb.toString());
+
+ for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) {
+ RgvProtocol rgvProtocol = rgvProtocolMap.getValue(); // 鏈�杩戣窛绂诲皬杞�
+// log.info("鍙栬揣绔欑偣锛歿}锛屽悗闈㈡渶杩戝皬杞︼細{},鐘舵��:{}", basDevpPositions.getDevNo(), rgvProtocol.getRgvNo(), rgvProtocol.getStatusType().desc);
+ int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("rgv_no", rgvProtocol.getRgvNo()).eq("wrk_sts", 10));
+ if(wrkMast.getIoType() == 10 || wrkMast.getIoType() == 110 || wrkMast.getSourceStaNo() == 1034) {
+ if (count != 0) {
+ continue;
+ }
+ if (rgvProtocol.modeType == RgvModeType.AUTO
+ && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM)
+ && rgvProtocol.getTaskNo1() == 0
+ && rgvProtocol.getAlarm() == 0) {
+ RgvCommand rgvCommand = new RgvCommand();
+ rgvCommand.setRgvNo(rgvProtocol.getRgvNo());
+ rgvCommand.setAckFinish1((short) 0); // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+ rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());
+ rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 宸ヤ綅1浠诲姟妯″紡: 鍙栨斁璐�
+ rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue()); //宸ヤ綅1璧风偣
+ rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue()); //宸ヤ綅1鐩爣绔欑偣
+ rgvCommand.setCommand((short) 1); //宸ヤ綅1浠诲姟纭
+ if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
+ log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
+ break runRgv;
+ }
+ log.info("RGV鍛戒护涓嬪彂鎴愬姛锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
+ Date now = new Date();
+ wrkMast.setRgvNo(rgvProtocol.getRgvNo());
+ wrkMast.setWrkSts(10L);
+ wrkMast.setRgvCreateTime(now);
+ wrkMastService.updateById(wrkMast);
+ break runRgv;
+ }
+ } else {
+ if (count != 0) {
+ break;
+ }
+ if (rgvProtocol.modeType == RgvModeType.AUTO
+ && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM)
+ && rgvProtocol.getTaskNo1() == 0
+ && rgvProtocol.getAlarm() == 0) {
+ RgvCommand rgvCommand = new RgvCommand();
+ rgvCommand.setRgvNo(rgvProtocol.getRgvNo());
+ rgvCommand.setAckFinish1((short) 0); // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+ rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());
+ rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 宸ヤ綅1浠诲姟妯″紡: 鍙栨斁璐�
+ rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue()); //宸ヤ綅1璧风偣
+ rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue()); //宸ヤ綅1鐩爣绔欑偣
+ rgvCommand.setCommand((short) 1); //宸ヤ綅1浠诲姟纭
+ if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
+ log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
+ break runRgv;
+ }
+ log.info("RGV鍛戒护涓嬪彂鎴愬姛锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
+ Date now = new Date();
+ wrkMast.setRgvNo(rgvProtocol.getRgvNo());
+ wrkMast.setWrkSts(10L);
+ wrkMast.setRgvCreateTime(now);
+ wrkMastService.updateById(wrkMast);
+ break runRgv;
+ } else {
+ break ; // 鍙湅鏈�杩戠殑绗竴涓皬杞�
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("鑷姩涓嬪彂灏忚溅鍙栨斁浠诲姟澶辫触锛屽紓甯革細" + e);
+ }
+ }
+
//浠诲姟瀹屾垚
public synchronized void rgvCompleteWrkMastSta(int[] autoZ) {
try {
@@ -394,7 +503,47 @@
}
wrkMast.setWrkSts(2L);
Date now = new Date();
- wrkMast.setModiTime(now);
+ wrkMast.setRgvFinishTime(now);
+ wrkMastService.updateById(wrkMast);
+ }
+ }
+ } catch (Exception e) {
+ log.error("灏忚溅澶嶄綅绾跨▼鎶ラ敊锛�" + e);
+ }
+ }
+
+ // 灏忚溅鍙栬揣瓒婁綅,浠诲姟鍙栨秷
+ public synchronized void rgvTaskCancel() {
+ try {
+ for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
+ RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+ RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+ if (rgvProtocol == null) {
+ continue;
+ }
+
+ // 鍙湁褰揜GV绛夊緟WCS纭銆佽嚜鍔�
+ if (rgvProtocol.getStatusType() == RgvStatusType.PICK_UP_OFFSIDE
+ && rgvProtocol.getModeType() == RgvModeType.AUTO
+ && rgvProtocol.getTaskNo1() != 0
+ ) {
+ log.info("{}鍙峰皬杞﹀皬杞﹀彇璐ц秺浣嶏紝鐘舵�亄}锛屽弬鏁皗}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
+ WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", rgvProtocol.getTaskNo1().longValue()));
+ if (Cools.isEmpty(wrkMast)) {
+ log.error("鏈煡鍒板皬杞︽墽琛屼换鍔★紒" + rgvProtocol.getTaskNo1());
+ continue;
+ } else if(wrkMast.getWrkSts() != 10) {
+ log.error("鎵ц浠诲姟鐘舵�佷笉绗﹀悎锛�" + rgvProtocol.getTaskNo1());
+ continue;
+ }
+ boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
+ if (!rgvComplete) {
+ log.error("灏忚溅鍙栬揣瓒婁綅,浠诲姟鍙栨秷,澶嶄綅澶辫触锛屽皬杞﹀彿{}锛�", rgvProtocol.getRgvNo());
+ break;
+ }
+ wrkMast.setWrkSts(9L);
+ wrkMast.setRgvNo(0);
+ wrkMast.setRgvCreateTime(new Date());
wrkMastService.updateById(wrkMast);
}
}
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index b7e5d18..ff6b6ee 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -48,7 +48,7 @@
while (!Thread.currentThread().isInterrupted()) {
try {
// 闂撮殧
- Thread.sleep(200);
+ Thread.sleep(500);
// 绯荤粺杩愯鐘舵�佸垽鏂�
// if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
@@ -56,15 +56,22 @@
// }
//鏇存柊灏忚溅鎺掑簭
- mainService.updateStePositionNearby();
- //鏇存柊浣嶇疆淇℃伅
- mainService.updateStePosition();
+// mainService.updateStePositionNearby();
+// //鏇存柊浣嶇疆淇℃伅
+// mainService.updateStePosition();
+// // 浠诲姟涓嬪彂
+// mainService.DevpTaskNoRun();
+
+ // 灏忚溅鍙栬揣瓒婁綅,浠诲姟鍙栨秷
+ mainService.rgvTaskCancel();
+
// 浠诲姟涓嬪彂
- mainService.DevpTaskNoRun();
+ mainService.rgvTheHandlingTaskIsIssued();
+
// 浠诲姟瀹屾垚
mainService.rgvCompleteWrkMastSta(autoZ);
//鏇存柊浣嶇疆淇℃伅
- mainService.updateStePosition();
+// mainService.updateStePosition();
} catch (Exception e) {
e.printStackTrace();
diff --git a/src/main/java/com/zy/core/enums/RgvStatusType.java b/src/main/java/com/zy/core/enums/RgvStatusType.java
index be1b7ba..6c93c3a 100644
--- a/src/main/java/com/zy/core/enums/RgvStatusType.java
+++ b/src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -12,6 +12,7 @@
Outbound_request(6, "鍑虹珯璇锋眰","#2196F3"),
Outbound_operation_in_progress(7, "鍑虹珯杩愯涓�","#2196F3"),
Outbound_completed(8, "鍑虹珯瀹屾垚","#2196F3"),
+ PICK_UP_OFFSIDE(9, "灏忚溅鍙栬揣瓒婁綅","#2196F3"),
ROAM(11, "婕父","#2196F3"),
WAITING(100, "浠诲姟鎵ц瀹屾垚绛夊緟纭","#2196F3"),
SOS110(110, "鎶ヨ","#2196F3"),
diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml
index a805e5e..0410542 100644
--- a/src/main/resources/mapper/WrkMastMapper.xml
+++ b/src/main/resources/mapper/WrkMastMapper.xml
@@ -63,7 +63,8 @@
<result column="ctn_no" property="ctnNo" />
<result column="full_plt" property="fullPlt" />
<result column="work_no_other" property="workNoOther" />
-
+ <result column="rgv_create_time" property="rgvCreateTime" />
+ <result column="rgv_finish_time" property="rgvFinishTime" />
</resultMap>
<select id="selectByLocNo" resultMap="BaseResultMap">
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 9a152eb..647f504 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -273,7 +273,11 @@
</el-table-column>
<el-table-column
prop="sourceStaNo"
- label="婧愮珯">
+ label="RGV婧愮珯">
+ </el-table-column>
+ <el-table-column
+ prop="rgvDstaNo"
+ label="RGV鐩爣绔�">
</el-table-column>
<el-table-column
prop="staNo"
@@ -325,16 +329,20 @@
:data="tableDataRight"
style="width: 100%"
:row-class-name="tableRowClassName">
- <el-table-column
- prop="rgvId"
- label="缂栧彿"
- width="80">
- </el-table-column>
+<!-- <el-table-column-->
+<!-- prop="rgvId"-->
+<!-- label="缂栧彿"-->
+<!-- width="80">-->
+<!-- </el-table-column>-->
<el-table-column
prop="rgvNo"
label="灏忚溅鍙�">
</el-table-column>
<el-table-column
+ prop="taskNo"
+ label="浠诲姟鍙�">
+ </el-table-column>
+ <el-table-column
prop="position"
label="浣嶇疆">
</el-table-column>
--
Gitblit v1.9.1