src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -36,6 +36,10 @@ @TableField("wrk_no") private Long wrkNo; @ApiModelProperty(value= "工作号") @TableField("wrk_no2") private Long wrkNo2; /** * 工作档开始位置 */ src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
@@ -9,4 +9,7 @@ @Repository public interface WrkMastStaMapper extends BaseMapper<WrkMastSta> { WrkMastSta selectByRgvNoandWrkNo(Integer rgvNo, Integer taskNo); WrkMastSta selectByRgvNoandWrkNo2(Integer rgvNo, Integer taskNo2); } src/main/java/com/zy/asrs/service/WrkMastStaService.java
@@ -5,4 +5,6 @@ public interface WrkMastStaService extends IService<WrkMastSta> { WrkMastSta selectByRgvNoandWrkNo(Integer rgvNo, Integer taskNo1); WrkMastSta selectByRgvNoandWrkNo2(Integer rgvNo, Integer taskNo2); } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -90,6 +90,8 @@ private BasCrnErrorMapper basCrnErrorMapper; @Autowired private EmptyBarrelInService emptyBarrelInService; @Autowired private WrkMastStaService wrkMastStaService; @Value("${wms.url}") private String wmsUrl; @@ -2299,7 +2301,7 @@ } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()) { // if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()) { // 查询工作档 WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(crnStn.getStaNo()); if (wrkMast == null) { @@ -2334,7 +2336,7 @@ } } // } } } } @@ -2491,11 +2493,14 @@ for (RgvSlave rgvSlave:slaveProperties.getRgv()){ ZyRgvThread rgvThread = (ZyRgvThread)SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol.getModeType() != RgvModeType.AUTO){ if (Cools.isEmpty(rgvProtocol)){ continue; }else { rgvProtocol = rgvProtocol.clone(); } if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getLoaded1() == 0){ boolean work1 = false; boolean work2 = false; int workNo1 = 0; int workNo2 = 0; short souSta1 = 0; @@ -2513,7 +2518,7 @@ } else { staProtocol = staProtocol.clone(); } if (staProtocol.isLoading() && staProtocol.isLoading() && staProtocol.isInEnable()){ if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()){ if (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9900){ WrkMast wrkMast = wrkMastService.selectByworkNo(staProtocol.getWorkNo()); if (Cools.isEmpty(wrkMast)){ @@ -2521,13 +2526,17 @@ continue; } workNo1 = wrkMast.getWrkNo(); souSta1 = inStn.getSourceStaNo().shortValue(); souSta1 = Utils.getRgvStaNo(rgvSlave.getId(),wrkMast.getSourceStaNo()); sta1 = Utils.getRgvEndStaNo(rgvSlave.getId(),wrkMast.getStaNo()); work1 = true; devpThread.setPakMk(inStn.getSourceStaNo(),false); break; } workNo1 = workNo++; souSta1 = inStn.getSourceStaNo().shortValue(); sta1 = inStn.getStaNo().shortValue(); souSta1 = Utils.getRgvStaNo(rgvSlave.getId(),inStn.getSourceStaNo()); sta1 = Utils.getRgvStaNo(rgvSlave.getId(),inStn.getStaNo()); work1 = true; devpThread.setPakMk(inStn.getSourceStaNo(),false); break; } } @@ -2546,7 +2555,7 @@ } else { staProtocol = staProtocol.clone(); } if (staProtocol.isLoading() && staProtocol.isLoading() && staProtocol.isInEnable()){ if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()&& staProtocol.isPakMk()){ if (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9900){ WrkMast wrkMast = wrkMastService.selectByworkNo(staProtocol.getWorkNo()); if (Cools.isEmpty(wrkMast)){ @@ -2556,15 +2565,20 @@ workNo2 = wrkMast.getWrkNo(); souSta2 = inStn.getSourceStaNo().shortValue(); sta2 = Utils.getRgvEndStaNo(rgvSlave.getId(),wrkMast.getStaNo()); work2 = true; devpThread.setPakMk(inStn.getSourceStaNo(),false); break; } workNo2 = workNo++; souSta2 = inStn.getSourceStaNo().shortValue(); sta2 = inStn.getStaNo().shortValue(); work2 = true; devpThread.setPakMk(inStn.getSourceStaNo(),false); break; } } if (work1 || work2){ //rgv任务下发-------------------------------------------------------------- RgvCommand command = new RgvCommand(); command.setRgvNo(rgvSlave.getId()); // RGV编号 @@ -2580,22 +2594,118 @@ command.setDestinationStaNo2(sta2); // 目标站 command.setAckFinish2(false); // 任务完成确认位 if (workNo1 != 0 && workNo2 ==0){ if (workNo1 == 0 && workNo2 !=0){ command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 任务模式: 取放货 } else if (workNo1 == 0 && workNo2 !=0) { } else if (workNo1 != 0 && workNo2 ==0) { command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 任务模式: 取放货 }else { command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 任务模式: 取放货 } command.setCommand(false); rgvTaskSave(command); MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(2, command)); log.info("rgv任务下发:"+JSON.toJSONString(command)); } } } } public synchronized void RGVTaskOver() { for (RgvSlave rgvSlave:slaveProperties.getRgv()) { ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (Cools.isEmpty(rgvProtocol)){ continue; }else { rgvProtocol = rgvProtocol.clone(); } //工位一任务完成 if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING && rgvProtocol.getLoaded1() == 1) { WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1()); if (Cools.isEmpty(wrkMastSta)){ log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1()); continue; } for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){ SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getSourcePlcId()); StaProtocol staProtocol = devpThread.getStation().get(outStn.getSourceStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isPakMk()){ // staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); // staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) { continue; } } } MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(3,new RgvCommand())); log.info("{}号rgv工位一工作完成复位,工作号:{}",rgvSlave.getId(),wrkMastSta.getWrkNo()); } //工位二任务完成 if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING2 && rgvProtocol.getLoaded1() == 1) { WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo2()); if (Cools.isEmpty(wrkMastSta)){ log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo2()); continue; } for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){ SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getSourcePlcId()); StaProtocol staProtocol = devpThread.getStation().get(outStn.getSourceStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isPakMk()){ // staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); // staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) { continue; } } } MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(4,new RgvCommand())); log.info("{}号rgv工位二工作完成复位,工作号:{}",rgvSlave.getId(),wrkMastSta.getWrkNo2()); } } } public boolean rgvTaskSave(RgvCommand command){ Wrapper<WrkMastSta> wrkMastStaWrapper = new EntityWrapper<WrkMastSta>().eq("wrk_crn", command.getRgvNo()).eq("wrk_no", command.getTaskNo1()); WrkMastSta wrkMastSta1 = wrkMastStaService.selectOne(wrkMastStaWrapper); if (!Cools.isEmpty(wrkMastSta1)){ wrkMastStaService.delete(wrkMastStaWrapper); } WrkMastSta wrkMastSta = new WrkMastSta(); wrkMastSta.setWrkNo(Long.valueOf(command.getTaskNo1())); wrkMastSta.setWrkNo2(Long.valueOf(command.getTaskNo2())); wrkMastSta.setWrkStart(command.getSourceStaNo1().intValue()); wrkMastSta.setWrkEnd(command.getDestinationStaNo1().intValue()); wrkMastSta.setStaStart(command.getSourceStaNo2().intValue()); wrkMastSta.setStaEnd(command.getDestinationStaNo2().intValue()); wrkMastSta.setWrkSts(1); Date now = new Date(); wrkMastSta.setCreateTime(now); wrkMastSta.setUpdateTime(now); wrkMastSta.setWrkCrn(command.getRgvNo()); wrkMastSta.setWrkType(command.getTaskMode().intValue()); return wrkMastStaService.insert(wrkMastSta); } } src/main/java/com/zy/asrs/service/impl/WrkMastStaServiceImpl.java
@@ -9,4 +9,13 @@ @Service("wrkMastStaService") public class WrkMastStaServiceImpl extends ServiceImpl<WrkMastStaMapper, WrkMastSta> implements WrkMastStaService { @Override public WrkMastSta selectByRgvNoandWrkNo(Integer rgvNo, Integer taskNo1) { return this.baseMapper.selectByRgvNoandWrkNo(rgvNo,taskNo1); } @Override public WrkMastSta selectByRgvNoandWrkNo2(Integer rgvNo, Integer taskNo2) { return this.baseMapper.selectByRgvNoandWrkNo2(rgvNo,taskNo2); } } src/main/java/com/zy/asrs/utils/Utils.java
@@ -17,9 +17,14 @@ private static final DecimalFormat fmt = new DecimalFormat("##0.00"); public static short getRgvEndStaNo(Integer rgvNo,Integer staNo){ public static short getRgvStaNo(Integer rgvNo,Integer staNo){ Map<Integer, Short> rgv1Map = new HashMap<>(); Map<Integer, Short> rgv2Map = new HashMap<>(); rgv2Map.put(4007, (short) 1);rgv2Map.put(4001, (short) 2); rgv2Map.put(2003, (short) 3);rgv2Map.put(2103, (short) 4); rgv2Map.put(4016, (short) 5);rgv2Map.put(4010, (short) 6); rgv2Map.put(2301, (short) 7);rgv2Map.put(2002, (short) 8); rgv2Map.put(2001, (short) 9); Map<Integer, Short> rgv3Map = new HashMap<>(); switch (rgvNo){ case 1: @@ -32,6 +37,22 @@ return 0; } public static short getRgvEndStaNo(Integer rgvNo,Integer staNo){ Map<Integer, Integer> rgv1Map = new HashMap<>(); Map<Integer, Integer> rgv2Map = new HashMap<>(); rgv2Map.put(4007,2103); Map<Integer, Integer> rgv3Map = new HashMap<>(); switch (rgvNo){ case 1: return getRgvStaNo(rgvNo,rgv1Map.get(staNo)); case 2: return getRgvStaNo(rgvNo,rgv2Map.get(staNo)); case 3: return getRgvStaNo(rgvNo,rgv3Map.get(staNo)); } return 0; } public static float scale(Float f){ if (f == null || f == 0f || Float.isNaN(f)) { return 0f; src/main/java/com/zy/core/MainProcess.java
@@ -67,12 +67,12 @@ mainService.autoEmptyOut(); //二期 //空桶库任务生成 mainService.crn5TaskCreate(); //空桶库入库 mainService.crn5InTask(); //空桶出库完成 mainService.crn5StnToOutStn(); // //空桶库任务生成 // mainService.crn5TaskCreate(); // //空桶库入库 // mainService.crn5InTask(); // //空桶出库完成 // mainService.crn5StnToOutStn(); //rgv任务 mainService.RGVTaskPut(); //rgv任务完成 src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -63,9 +63,7 @@ }}; public static final ArrayList<Integer> staNos4 = new ArrayList<Integer>() {{ add(3001);add(3002);add(3003);add(3004);add(3005); add(3006);add(3007);add(3008);add(3009);add(3010); add(3011);add(3012); add(4007); }}; public static final ArrayList<Integer> staNos5 = new ArrayList<Integer>() {{ @@ -205,10 +203,14 @@ switch (step) { // 读数据 case 1: if (slave.getId() ==3){ read30(); }else { read(); switch (slave.getId()){ case 1: case 2: read();break; case 3: read30();break; case 4: read33();break; } break; @@ -417,6 +419,65 @@ } } private void read33() throws InterruptedException { ArrayList<Integer> staNos = getStaNo(); int staNoSize = staNos.size(); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (getStaNo().size() * 8)); result = siemensS7Net.Read("DB101.0", (short) (getStaNo().size()*6)); if (result.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*4, 1); short tongType = siemensS7Net.getByteTransform().TransInt16(result.Content, i * 4 + 2); short matnr = siemensS7Net.getByteTransform().TransInt16(result.Content, i * 4 + 4); StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setAutoing(status[0]); // 自动 staProtocol.setLoading(status[1]); // 有物 staProtocol.setInEnable(status[2]); // 可入 staProtocol.setAmount(matnr); if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } } } if (result.IsSuccess) { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); // 根据实时信息更新数据库 try { List<BasDevp> basDevps = new ArrayList<>(); for (Integer siteId : staNos) { StaProtocol staProtocol = station.get(siteId); basDevps.add(staProtocol.toSqlModel()); } BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class); if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) { throw new Exception("更新数据库数据失败"); } } catch (Exception e) { e.printStackTrace(); OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); log.error("更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } else { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); // log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } /** * 写入 ID+目标站 =====> 单站点写入 */ src/main/resources/application.yml
@@ -8,7 +8,7 @@ name: @pom.build.finalName@ datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://10.10.10.212:1433;databasename=mdqdasrs url: jdbc:sqlserver://127.0.0.1:1433;databasename=mdqdasrs username: sa password: sa@123 mvc: @@ -34,7 +34,7 @@ enable: false wms: url: localhost:8082/mdqdwms url: localhost:8080/mdqdwms # 下位机配置 wcs-slave: @@ -47,7 +47,7 @@ # 堆垛机1 crn[0]: id: 1 ip: 10.10.10.100 ip: 10.10.10.200 port: 102 rack: 0 slot: 0 @@ -85,7 +85,7 @@ # 堆垛机2 crn[1]: id: 2 ip: 10.10.10.110 ip: 10.10.10.201 port: 102 rack: 0 slot: 0 @@ -248,7 +248,7 @@ # slot: 0 # # RGV1 rgv[0]: id: 1 id: 2 ip: 10.10.10.130 port: 102 rack: 0 @@ -259,8 +259,8 @@ staNo: 2103 staPlcId: 2 outStn[0]: sourceStaNo: 4007 sourcePlcId: 4 staNo: 2103 staPlcId: 2 # # RGV2 # rgv[1]: # id: 2 src/main/resources/mapper/WrkMastStaMapper.xml
@@ -18,7 +18,16 @@ <result column="wrk_type" property="wrkType" /> <result column="bign_time" property="bignTime" /> <result column="wrk_crn" property="wrkCrn" /> <result column="wrk_no2" property="wrkNo2"/> </resultMap> <select id="selectByRgvNoandWrkNo" resultMap="BaseResultMap"> select * from asr_wrk_mast_sta where wrk_crn = #{rgvNo} and wrk_no = #{taskNo} and wrk_sts = 1 </select> <select id="selectByRgvNoandWrkNo2" resultMap="BaseResultMap"> select * from asr_wrk_mast_sta where wrk_crn = #{rgvNo} and wrk_no2 = #{taskNo2} and wrk_sts = 1 </select> </mapper> src/main/webapp/static/images/RMLogo.png
src/main/webapp/views/console-old.html
@@ -22,7 +22,7 @@ <h6>AUTOMATIC WAREHOUSE WCS MONITORING DIAGRAM</h6> </div> <div class="head-right"> <img src="../static/images/zy-logo1.png" alt="中扬" height="44" width="80"> <img src="../static/images/RMLogo.png" alt="润美" height="44"> </div> </div> src/main/webapp/views/console.html
@@ -21,7 +21,7 @@ <h6>AUTOMATIC WAREHOUSE WCS MONITORING DIAGRAM</h6> </div> <div class="head-right"> <img src="../static/images/zy-logo.png" alt="中扬" height="44" width="80"> <img src="../static/images/RMLogo.png" alt="润美" height="44"> </div> </div> <div style="width: 1000px;height: 800px;overflow: hidden"> src/main/webapp/views/index.html
@@ -27,7 +27,7 @@ <!-- 主体内容 --> <iframe id="content" src="console.html"></iframe> <footer class="footer"> Copyright © 2015 All Rights Reserved. <a href="http://www.zoneyung.com" target="_blank">米多</a> 保留所有权利 Copyright © 2020 All Rights Reserved. <a href="http://www.lubmate.com/" target="_blank">中科润美(青岛)</a> 保留所有权利 </footer> </body> <script>