Explorar o código

编写AGV取卸货安全握交互逻辑

zhifei hai 1 ano
pai
achega
5305627ab8

+ 4 - 0
ruoyi-admin/pom.xml

@@ -94,6 +94,10 @@
             <groupId>com.ruoyi</groupId>
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-dongfangyaiye</artifactId>
             <artifactId>ruoyi-dongfangyaiye</artifactId>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
 <!--    <build>-->
 <!--    <build>-->

+ 4 - 4
ruoyi-admin/src/main/java/com/ruoyi/init/StartService.java

@@ -40,16 +40,16 @@ public class StartService implements CommandLineRunner {
     @Override
     @Override
     public void run(String... args) throws Exception {
     public void run(String... args) throws Exception {
         //自动下发任务
         //自动下发任务
-        /*if (initTaskConfig.getAutoSend()) {
+        if (initTaskConfig.getAutoSend()) {
             Thread thread = new Thread(new AutoTaskThread(businessService));
             Thread thread = new Thread(new AutoTaskThread(businessService));
             thread.start();
             thread.start();
-        }*/
+        }
 
 
         //ndc下发
         //ndc下发
-        /*if (initTaskConfig.getAciService()) {
+        if (initTaskConfig.getAciService()) {
             Thread thread = new Thread(new AciServiceThread(aciService));
             Thread thread = new Thread(new AciServiceThread(aciService));
             thread.start();
             thread.start();
-        }*/
+        }
     }
     }
 
 
 
 

+ 3 - 3
ruoyi-admin/src/main/resources/application-dev.yml

@@ -6,9 +6,9 @@ spring:
         druid:
         druid:
             # 主库数据源
             # 主库数据源
             master:
             master:
-                url: jdbc:mysql://localhost/warewms-dongfangtaiye?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
-                username: root
-                password: 123456
+                url: jdbc:mysql://47.100.220.92:3306/warewms_dongfangtaiye?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
+                username: warewms
+                password: warewms123
             # 从库数据源
             # 从库数据源
             slave:
             slave:
                 # 从数据源开关/默认关闭
                 # 从数据源开关/默认关闭

+ 6 - 50
ruoyi-admin/src/main/resources/application-prod.yml

@@ -65,81 +65,37 @@ logging:
 
 
 # 是否开启服务
 # 是否开启服务
 init-task:
 init-task:
-    autosend: true # 自动下发任务
-    aciservice: true # ndc通讯
+    autosend: false # 自动下发任务
+    aciservice: false # ndc通讯
 
 
-modbus:
-    tcp-master:
-        first: # 自动门(靠马路)
-            open: false
-            host: 192.168.42.201
-            port: 9000
-        second: # 自动门(靠里面)
-            open: false
-            host: 192.168.42.202
-            port: 9000
-        sixth: # 自动门(靠马路-第二层)
-            open: false
-            host: 192.168.42.210
-            port: 9000
-        seventh: # 卷帘门
-            open: false
-            host: 192.168.42.211
-            port: 9000
-        third: # 按钮盒
-            open: false
-            host: 192.168.42.205
-            port: 9000
-        fourth: # 充电机(三向车)
-            open: false
-            host: 192.168.42.208
-            port: 8899
-        fifth: # 充电机(迷你堆垛)
-            open: false
-            host: 192.168.42.209
-            port: 8899
 
 
 
 
-rfid:
-    first: # 靠马路
-        open: false
-        host: 192.168.42.203
-        port: 5084
-        number-of-tags: 3 # 一次读取标签的数量
-        timeout-milliseconds: 5000
-    second: # 靠里面
-        open: false
-        host: 192.168.42.204
-        port: 5084
-        number-of-tags: 3 # 一次读取标签的数量
-        timeout-milliseconds: 5000
-
     # plc连接配置
     # plc连接配置
 plc:
 plc:
     plcList[0]:
     plcList[0]:
         ip: 192.68.100.101
         ip: 192.68.100.101
-        enable: false
+        enable: true
         name: packingMachine_1Plc
         name: packingMachine_1Plc
         ePlcType: S1200
         ePlcType: S1200
         heartbeat: DB5000.2
         heartbeat: DB5000.2
         confirmTheStatus:
         confirmTheStatus:
     plcList[1]:
     plcList[1]:
         ip: 192.68.100.102
         ip: 192.68.100.102
-        enable: false
+        enable: true
         name: packingMachine_2Plc
         name: packingMachine_2Plc
         ePlcType: S1200
         ePlcType: S1200
         heartbeat: DB5000.2
         heartbeat: DB5000.2
         confirmTheStatus:
         confirmTheStatus:
     plcList[2]:
     plcList[2]:
         ip: 192.68.100.103
         ip: 192.68.100.103
-        enable: false
+        enable: true
         name: packingMachine_3Plc
         name: packingMachine_3Plc
         ePlcType: S1200
         ePlcType: S1200
         heartbeat: DB5000.2
         heartbeat: DB5000.2
         confirmTheStatus:
         confirmTheStatus:
     plcList[3]:
     plcList[3]:
         ip: 192.68.100.104
         ip: 192.68.100.104
-        enable: false
+        enable: true
         name: stackingMachinePlc
         name: stackingMachinePlc
         ePlcType: S1200
         ePlcType: S1200
         heartbeat: DB5000.2
         heartbeat: DB5000.2

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -59,7 +59,7 @@ spring:
     # 数据库索引
     # 数据库索引
     database: 0
     database: 0
     # 密码
     # 密码
-    password: 123456
+#    password: 123456
     # 连接超时时间
     # 连接超时时间
     timeout: 10s
     timeout: 10s
     lettuce:
     lettuce:

+ 2 - 2
ruoyi-system/src/main/java/com/ruoyi/system/init/PlcConnectServiceRunner.java

@@ -33,7 +33,7 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
     private PlcProperties plcProperties;
     private PlcProperties plcProperties;
 
 
     @Resource
     @Resource
-    ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
 
 
 
 
 
@@ -136,7 +136,7 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
      */
      */
     public S7PLC getPlcServer(String pclName) {
     public S7PLC getPlcServer(String pclName) {
         S7PLC s7PLC = plcToolsMap.get(pclName);
         S7PLC s7PLC = plcToolsMap.get(pclName);
-        if(ObjectUtil.isNull(s7PLC)){
+        if(ObjectUtil.isNull(s7PLC) || reTryPlc.contains(pclName) ){
             throw new ServiceException("The device is not connected");
             throw new ServiceException("The device is not connected");
         }
         }
         return plcToolsMap.get(pclName);
         return plcToolsMap.get(pclName);

+ 61 - 0
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/StatusUpdateServiceImpl.java

@@ -7,16 +7,23 @@ import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
 import com.ruoyi.ams.agv.ndc.service.StatusUpdateService;
 import com.ruoyi.ams.agv.ndc.service.StatusUpdateService;
 import com.ruoyi.ams.business.BusinessServiceImpl;
 import com.ruoyi.ams.business.BusinessServiceImpl;
 import com.ruoyi.ams.business.IBusinessService;
 import com.ruoyi.ams.business.IBusinessService;
+import com.ruoyi.ams.task.domain.WcsTask;
+import com.ruoyi.ams.task.mapper.WcsTaskMapper;
 import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
 import com.ruoyi.hard.modbus.tcp.AutoDoorClient;
 import com.ruoyi.hard.modbus.tcp.AutoDoorClient;
+import com.ruoyi.system.enums.PLCConnectNameEnum;
+import com.ruoyi.system.enums.PLCEnum;
+import com.ruoyi.system.init.PlcConnectServiceRunner;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import java.util.List;
 import java.util.List;
 
 
+import static com.ruoyi.ams.agv.ndc.service.impl.StatusUpdateServiceImpl.AGV_ACTION.PICKUP;
+
 @Slf4j
 @Slf4j
 @Component
 @Component
 public class StatusUpdateServiceImpl implements StatusUpdateService {
 public class StatusUpdateServiceImpl implements StatusUpdateService {
@@ -29,6 +36,10 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
     private IBusinessService businessService;
     private IBusinessService businessService;
     @Autowired
     @Autowired
     private AutoDoorClient autoDoorClient;
     private AutoDoorClient autoDoorClient;
+    @Autowired
+    private WcsTaskMapper wcsTaskMapper;
+    @Autowired
+    private PlcConnectServiceRunner plcConnectServiceRunner;
 
 
     public enum AGV_ACTION {
     public enum AGV_ACTION {
         /***
         /***
@@ -107,6 +118,11 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
         amsTask.setTaskNo(taskNo);
         amsTask.setTaskNo(taskNo);
         amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
         amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
         if (amsTask != null) {
         if (amsTask != null) {
+            // 进行安全握
+            if (!AGVUnloadOrPickUpSafetyJudgment(amsTask, type)) {
+                log.error("取货或卸货不被允许进入!");
+                return;
+            }
             AmsTask addTaskForm = new AmsTask();
             AmsTask addTaskForm = new AmsTask();
             addTaskForm.setTaskNo(System.currentTimeMillis() + "");
             addTaskForm.setTaskNo(System.currentTimeMillis() + "");
             addTaskForm.setBusinessType(Constant.TASK_BUSINESS_TYPE.TASK_m.getValue());
             addTaskForm.setBusinessType(Constant.TASK_BUSINESS_TYPE.TASK_m.getValue());
@@ -139,6 +155,51 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
         }
         }
     }
     }
 
 
+    private boolean AGVUnloadOrPickUpSafetyJudgment(AmsTask amsTask, String type) {
+        WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByTaskNo(amsTask.getTaskNo());
+        if (Constant.FLOW_CONFIG_ID.M_EP.name().equals(wcsTask.getTaskType())) {
+            return true;
+        }
+        boolean b = false;
+        if (AGV_ACTION.UNLOAD.getValue().equals(type)) {
+            if ("PM_L".equals(wcsTask.getTaskType().substring(0, 4))) {
+                b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).readBoolean(PLCEnum.STACKING_MACHINE_FEEDING_ENTER.getMetadata());
+                log.info("叠包机允许进入信号,{}", b);
+                return b;
+            }
+            switch (wcsTask.getTaskType()) {
+                case "PM_UP_1":
+                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_1.getMetadata());
+                    log.info("一号打包机允许进入上空托区域信号,{}", b);
+                    break;
+                case "PM_UP_2":
+                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_2.getMetadata());
+                    log.info("二号打包机允许进入上空托区域信号,{}", b);
+                    break;
+                case "PM_UP_3":
+                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_ENTER_3.getMetadata());
+                    log.info("三号打包机允许进入上空托区域信号,{}", b);
+                    break;
+            }
+        } else {
+            switch (wcsTask.getTaskType()) {
+                case "PM_L_1":
+                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_1.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_1.getMetadata());
+                    log.info("一号打包机允许进入下料区域信号,{}", b);
+                    break;
+                case "PM_L_2":
+                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_2.getMetadata());
+                    log.info("二号打包机允许进入下料区域信号,{}", b);
+                    break;
+                case "PM_L_3":
+                    b = plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).readBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_ENTER_3.getMetadata());
+                    log.info("三号号打包机允许进入下料区域信号,{}", b);
+                    break;
+            }
+        }
+        return b;
+    }
+
     @Override
     @Override
     public synchronized void confirmAnalysis(String taskNo, Integer aciIndex, Integer carNo
     public synchronized void confirmAnalysis(String taskNo, Integer aciIndex, Integer carNo
             , String updateLocation, String updateValue) {
             , String updateLocation, String updateValue) {

+ 2 - 29
warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java

@@ -398,25 +398,14 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                             log.info("不能重复放货," + taskNo);
                             log.info("不能重复放货," + taskNo);
                             return AjaxResult.error("不能重复放货," + taskNo);
                             return AjaxResult.error("不能重复放货," + taskNo);
                         }
                         }
-                        if (wcsTask.getState() == 6) {
-                            // 修改任务状态
-                            wcsTask.setState(state.longValue());
-                            wcsTask.setUpdateDate(new Date());
-                            wcsTaskService.updateWcsTask(wcsTask);
-                            return AjaxResult.error("不能重复放货," + taskNo);
-                        }
                         wcsTask.setEndTime(new Date());
                         wcsTask.setEndTime(new Date());
                         // 解锁终点库位
                         // 解锁终点库位
                         baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
                         baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationTo())
                                 , Constant.WAREHOUSE_ID, updateBy);
                                 , Constant.WAREHOUSE_ID, updateBy);
                         // 将中间缓存位库存移动到终点
                         // 将中间缓存位库存移动到终点
                         moveMiddleCacheToDestination(wcsTask);
                         moveMiddleCacheToDestination(wcsTask);
-                        //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                        }
                         //叠包机
                         //叠包机
-                        if (wcsTask.getTaskType().substring(0, 4).equals("PM_L")) {
+                        if ("PM_L".equals(wcsTask.getTaskType().substring(0, 4))) {
                             plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeBoolean(PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata(), true);
                             plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.STACKING_MACHINE.getMetadata()).writeBoolean(PLCEnum.STACKING_MACHINE_FEEDING_FINISH.getMetadata(), true);
                         }
                         }
                         if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_1.name())) {
                         if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_1.name())) {
@@ -428,8 +417,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                         if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_3.name())) {
                         if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_UP_3.name())) {
                             plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_3.getMetadata(), true);
                             plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_2.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UP_EMPTY_Leave_3.getMetadata(), true);
                         }
                         }
-
-
                         break;
                         break;
                     case 3:
                     case 3:
                         break;
                         break;
@@ -449,7 +436,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                                 , Constant.WAREHOUSE_ID, updateBy);
                                 , Constant.WAREHOUSE_ID, updateBy);
                         // 将起始点库存移动到中间缓存位
                         // 将起始点库存移动到中间缓存位
                         moveStartingPointToMiddleCache(wcsTask);
                         moveStartingPointToMiddleCache(wcsTask);
-
                         //释放redis锁
                         //释放redis锁
                         if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                         if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                             redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
                             redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());
@@ -463,7 +449,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                         if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_3.name())) {
                         if (wcsTask.getTaskType().equals(Constant.FLOW_CONFIG_ID.PM_L_3.name())) {
                             plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_3.getMetadata(), true);
                             plcConnectServiceRunner.getPlcServer(PLCConnectNameEnum.PACKING_MACHINE_3.getMetadata()).writeBoolean(PLCEnum.PACKING_MACHINE_UNLOADING_Leave_3.getMetadata(), true);
                         }
                         }
-
                         break;
                         break;
                     case 5:
                     case 5:
                         break;
                         break;
@@ -486,10 +471,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                                 , Constant.WAREHOUSE_ID, updateBy);
                                 , Constant.WAREHOUSE_ID, updateBy);
                         // 将中间缓存位库存移动到终点
                         // 将中间缓存位库存移动到终点
                         moveMiddleCacheToDestination(wcsTask);
                         moveMiddleCacheToDestination(wcsTask);
-                        //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                        }
                         break;
                         break;
                     case 7://取消
                     case 7://取消
                         wcsTask.setEndTime(new Date());
                         wcsTask.setEndTime(new Date());
@@ -503,10 +484,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                             baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), Long.parseLong(wcsTask.getLocationTo())
                             baseLocationInfoService.unLockLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), Long.parseLong(wcsTask.getLocationTo())
                                     , Constant.WAREHOUSE_ID, updateBy);
                                     , Constant.WAREHOUSE_ID, updateBy);
                         }
                         }
-                        //释放redis锁
-                        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                        }
                         // 取消任务删除中间缓存库存
                         // 取消任务删除中间缓存库存
 //                        cancelTaskDelMiddleCache(wcsTask);
 //                        cancelTaskDelMiddleCache(wcsTask);
                         break;
                         break;
@@ -519,10 +496,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
             } catch (Exception e) {
             } catch (Exception e) {
                 log.info(wcsTask.getTaskNo() + "-----" + "回调状态:" + state + "异常", e);
                 log.info(wcsTask.getTaskNo() + "-----" + "回调状态:" + state + "异常", e);
                 wcsTask.setRemark("回调状态:" + state + "异常");
                 wcsTask.setRemark("回调状态:" + state + "异常");
-                //释放redis锁
-                if (!StringUtils.isEmpty(wcsTask.getExt8())) {
-                    redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
-                }
                 throw new RuntimeException();
                 throw new RuntimeException();
             }
             }
         } else {
         } else {
@@ -656,7 +629,7 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
         WcsTask wcsTask1 = new WcsTask();
         WcsTask wcsTask1 = new WcsTask();
         wcsTask1.setTaskNo(System.currentTimeMillis() + "");
         wcsTask1.setTaskNo(System.currentTimeMillis() + "");
         wcsTask1.setState(9L);
         wcsTask1.setState(9L);
-        wcsTask1.setTaskType("M_EP");
+        wcsTask1.setTaskType(Constant.FLOW_CONFIG_ID.M_EP.name());
         wcsTask1.setBusinessType("01");
         wcsTask1.setBusinessType("01");
         wcsTask1.setAreaFrom(formAddress.getZoneId().toString());
         wcsTask1.setAreaFrom(formAddress.getZoneId().toString());
         wcsTask1.setLocationFrom(formAddress.getId().toString());
         wcsTask1.setLocationFrom(formAddress.getId().toString());

+ 5 - 1
warewms-base/src/main/java/com/ruoyi/base/constant/Constant.java

@@ -52,7 +52,11 @@ public class Constant {
         /**
         /**
          * 三号包装机上空托
          * 三号包装机上空托
          */
          */
-        PM_UP_3(31L);
+        PM_UP_3(31L),
+        /**
+         * 叠包机空托搬运
+         */
+        M_EP(32L);
 
 
         private Long flowId;
         private Long flowId;