Ver código fonte

添加AGV取货卸货安全握

zhifei 1 ano atrás
pai
commit
c0da603ce0

+ 1 - 1
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/AciService.java

@@ -38,7 +38,7 @@ public class AciService {
 
     private static final int BUFF_SIZE = 2048;
 
-    private static final String IP_ADDR = "192.168.1.48";
+    private static final String IP_ADDR = "192.168.2.51";
 
     private static final int IP_PORT = 30002;
 

+ 1 - 1
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/StatusUpdateService.java

@@ -13,7 +13,7 @@ public interface StatusUpdateService {
      * @param id    amstaskid
      * @param carNo 车号(只有取货完成后才会有反馈)
      */
-    void updateStatus(Long id, Integer carNo);
+    void updateStatus(Long id, Integer carNo) throws InterruptedException;
 
 
     /**

+ 10 - 3
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/SocketBufferServiceImpl.java

@@ -170,7 +170,11 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                     //任务状态回调
                     long taskId_85 = taskBean.getId().longValue();
                     executorService.execute(() -> {
-                        statusUpdateService.updateStatus(taskId_85, icarNo);
+                        try {
+                            statusUpdateService.updateStatus(taskId_85, icarNo);
+                        } catch (InterruptedException e) {
+                            log.error("An exception occurred in the task update,msg,{}",e.getMessage());
+                        }
                     });
                     break;
                 case 86://user event Order Receive              任务开始
@@ -198,7 +202,11 @@ public class SocketBufferServiceImpl implements SocketBufferService {
 
                         long taskId = taskBean.getId().longValue();
                         executorService.execute(() -> {
-                            statusUpdateService.updateStatus(taskId, icarNo);
+                            try {
+                                statusUpdateService.updateStatus(taskId, icarNo);
+                            } catch (InterruptedException e) {
+                                log.error("An exception occurred in the task update,msg,{}",e.getMessage());
+                            }
                         });
                     }
                     break;
@@ -273,7 +281,6 @@ public class SocketBufferServiceImpl implements SocketBufferService {
                 case 126:
                     break;
                 case 127:
-
                     break;
                 case 134:
                     break;

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

@@ -1,22 +1,34 @@
 package com.ruoyi.ams.agv.ndc.service.impl;
 
 import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
 import com.ruoyi.ams.agv.ndc.domain.AmsTask;
 import com.ruoyi.ams.agv.ndc.entity.CallbackResult;
 import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
 import com.ruoyi.ams.agv.ndc.service.StatusUpdateService;
 import com.ruoyi.ams.business.BusinessServiceImpl;
 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.base.constant.Constant;
+import com.ruoyi.base.domain.BaseLocationInfo;
+import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
 import com.ruoyi.hard.modbus.tcp.AutoDoorClient;
+import com.ruoyi.system.enums.CnveyorBeltsPlcEnum;
+import com.ruoyi.system.init.PlcConnectServiceRunner;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
 
+import static com.ruoyi.ams.agv.ndc.service.impl.StatusUpdateServiceImpl.AGV_ACTION.UNLOAD;
+
 @Slf4j
 @Component
 public class StatusUpdateServiceImpl implements StatusUpdateService {
@@ -30,6 +42,18 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
     @Autowired
     private AutoDoorClient autoDoorClient;
 
+    @Autowired
+    private WcsTaskMapper wcsTaskMapper;
+
+    @Autowired
+    PlcConnectServiceRunner plcConnectServiceRunner;
+
+    @Autowired
+    IBaseLocationInfoService iBaseLocationInfoService;
+
+    @Autowired
+    ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
     public enum AGV_ACTION {
         /***
          * 取货
@@ -52,7 +76,7 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
 
 
     @Override
-    public void updateStatus(Long id, Integer carNo) {
+    public void updateStatus(Long id, Integer carNo) throws InterruptedException {
         AmsTask amsTask = amsTaskService.selectAmsTaskById(id);
         if (amsTask != null) {
             log.info("任务回调-------------------------》" + amsTask.getTaskNo());
@@ -69,18 +93,36 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
 //            } else if (null != amsTask.getSystemStatus() && amsTask.getSystemStatus() == 4) {
 //                result.setState(7);
             } else {
+                WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByTaskNo(amsTask.getTaskNo());
                 switch (amsTask.getEvent().intValue()) {
                     case 86:
                         result.setState(1);
                         break;
                     case 90:
+
                         result.setState(2);
                         break;
                     case 91:
                         result.setState(4);
+                        threadPoolTaskExecutor.execute(()->{
+                            try {
+                                endOfMissionSecurity(wcsTask);
+                            } catch (InterruptedException e) {
+                                log.error("The security judgment execution is abnormal,msg:{}",e.getMessage());
+                            }
+
+                        });
                         break;
                     case 92:
                         result.setState(6);
+                        threadPoolTaskExecutor.execute(()->{
+                            try {
+                                endOfMissionSecurity(wcsTask);
+                            } catch (Exception e) {
+                                log.error("The security judgment execution is abnormal,msg:{}",e.getMessage());
+                            }
+
+                        });
                         break;
                     case 85:
                         result.setState(7);
@@ -101,11 +143,35 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
         }
     }
 
+    private void endOfMissionSecurity(WcsTask wcsTask) throws InterruptedException {
+        S7PLC conveyorBeltsPlc = plcConnectServiceRunner.getPlcServer("conveyorBeltsPlc");
+        byte command = 24;
+        byte initial = 0;
+        byte submit = 1;
+        if("102102".equals(wcsTask.getLocationTo())){
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(),command);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_1.getMetadata(),submit);
+            Thread.sleep(3000);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_1.getMetadata(),initial);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_1.getMetadata(),initial);
+        }else {
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_4.getMetadata(),command);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_4.getMetadata(),submit);
+            Thread.sleep(3000);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.TO_COMMAND_4.getMetadata(),initial);
+            conveyorBeltsPlc.writeByte(CnveyorBeltsPlcEnum.ACK_4.getMetadata(),initial);
+        }
+    }
+
     @Override
     public synchronized void confirmAnalysis(String taskNo, Integer aciIndex, String type, Integer carNo) {
         AmsTask amsTask = new AmsTask();
         amsTask.setTaskNo(taskNo);
         amsTask = amsTaskService.selectAmsTaskByModel(amsTask);
+        //添加取货卸货前安全握
+        if (AGVUnloadOrPickUpSafetyJudgment(taskNo,type)){
+            return;
+        }
         if (amsTask != null) {
             AmsTask addTaskForm = new AmsTask();
             addTaskForm.setTaskNo(System.currentTimeMillis() + "");
@@ -234,4 +300,41 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
             feedbackTS(doorNo);
         }
     }
+
+    public boolean AGVUnloadOrPickUpSafetyJudgment(String taskNo,String type) {
+        WcsTask wcsTask = wcsTaskMapper.selectWcsTaskByTaskNo(taskNo);
+        if (ObjectUtil.isNull(wcsTask)){
+            throw  new ServiceException("The AGV feedback task does not exist,Security judgment cannot be made!!!");
+        }
+        S7PLC conveyorBeltsPlc = plcConnectServiceRunner.getPlcServer("conveyorBeltsPlc");
+        if (type.equals(UNLOAD.getValue())){
+            BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoById(Long.parseLong( wcsTask.getLocationTo()));
+            if (baseLocationInfo.getZoneId().equals(10005L)){
+                if("102102".equals(wcsTask.getLocationTo())){
+                    if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.MOVE_1.getMetadata()) ==3){
+                        return true;
+                    }
+                }else {
+                    if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.MOVE_4.getMetadata()) ==3){
+                        return true;
+                    }
+                }
+            }
+        }else {
+            BaseLocationInfo baseLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoById(Long.parseLong( wcsTask.getLocationFrom()));
+            if (baseLocationInfo.getZoneId().equals(10005L)) {
+                if ("102103".equals(wcsTask.getLocationTo())) {
+                    if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.MOVE_1.getMetadata()) != 3) {
+                        return true;
+                    }
+                } else {
+                    if (conveyorBeltsPlc.readByte(CnveyorBeltsPlcEnum.MOVE_4.getMetadata()) != 3) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
 }

+ 1 - 1
warewms-ams/src/main/java/com/ruoyi/ams/locationView/service/LocationViewService.java

@@ -117,7 +117,7 @@ public class LocationViewService {
             BasLocationGuiExtDTO basLocationGuiExtDTO = new BasLocationGuiExtDTO();
             basLocationGuiExtDTO.setZoneName(basZone.getZoneName());
             //根据库区查询出库存信息
-            String sort = StringUtils.isEmpty(basZone.getUserdefine3()) ? "2" : basZone.getUserdefine3();
+            String sort = StringUtils.isEmpty(basZone.getUserdefine3()) ? "row_no + 0,row_index,col_no + 0,col_index,shift_no + 0,shift_index" : basZone.getUserdefine3();
             List<BaseLocationGuiDTO> locList = baseLocationInfoMapper
                     .queryByListAllInvLotAttView(basZone.getZoneId().toString(), sort);
 

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

@@ -349,7 +349,7 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
             return AjaxResult.error("agv回传没有任务记录------------->");
         }
 
-        if (state > 1 && state != 7) {
+        if (state >= 1 && state != 7) {
             wcsTask.setAgvNo(carNo + "");
         }