src/main/java/com/zy/asrs/controller/RgvController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/WrkMast.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/MainProcess.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/enums/RgvStatusType.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/WrkMastMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/index.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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); } 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:正常,1:禁用 */ 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$(); 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; 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命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); break runRgv; } log.info("RGV命令下发成功,RGV号={},任务数据={}", 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命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); break runRgv; } log.info("RGV命令下发成功,RGV号={},任务数据={}", 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; } // 只有当RGV等待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); } } 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(); 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"), 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"> 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>