src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -12,13 +12,11 @@ import com.zy.asrs.domain.enums.SiteStatusType; import com.zy.asrs.domain.param.SystemSwitchParam; import com.zy.asrs.domain.vo.*; import com.zy.asrs.entity.BasCrnError; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.entity.*; import com.zy.asrs.mapper.BasCrnErrorMapper; import com.zy.asrs.mapper.LocMastMapper; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.BasRgvMapService; import com.zy.asrs.service.BasRgvService; import com.zy.asrs.service.WrkMastService; import com.zy.common.CodeRes; @@ -66,6 +64,8 @@ private BasCrnErrorMapper basCrnErrorMapper; @Autowired private BasRgvService basRgvService; @Autowired private BasRgvMapService basRgvMapService; @PostMapping("/system/running/status") @ManagerAuth(memo = "系统运行状态") @@ -113,8 +113,31 @@ StaProtocol staProtocol = entry.getValue(); vo.setSiteId(String.valueOf(entry.getKey())); // 站点编号 for (BasRgv basRgv: basRgvs){ if (basRgv.getRgvNo().equals(entry.getKey()) ){ staProtocol.setWorkNo(basRgv.getWrkNo1()); BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo(basRgv.getRgvNo()); if(basRgv.getRgvNo() == 1 ){ if(entry.getKey() == 1){ staProtocol.setWorkNo(basRgv.getWrkNo1()); staProtocol.setNearbySta(String.valueOf(basRgvMap.getNowRoute())); staProtocol.setAutoing(basRgv.getStatus() == 1); staProtocol.setLoading(staProtocol.getWorkNo()>0); }else if(entry.getKey() == 2){ staProtocol.setWorkNo(basRgv.getWrkNo2()); staProtocol.setNearbySta(String.valueOf(basRgvMap.getNowRoute())); staProtocol.setAutoing(basRgv.getStatus() == 1); staProtocol.setLoading(staProtocol.getWorkNo()>0); } }else if(basRgv.getRgvNo() == 2){ if(entry.getKey() == 3){ staProtocol.setWorkNo(basRgv.getWrkNo1()); staProtocol.setNearbySta(String.valueOf(basRgvMap.getNowRoute())); staProtocol.setAutoing(basRgv.getStatus() == 1); staProtocol.setLoading(staProtocol.getWorkNo()>0); }else if(entry.getKey() == 4){ staProtocol.setWorkNo(basRgv.getWrkNo2()); staProtocol.setNearbySta(String.valueOf(basRgvMap.getNowRoute())); staProtocol.setAutoing(basRgv.getStatus() == 1); staProtocol.setLoading(staProtocol.getWorkNo()>0); } } } vo.setWorkNo(staProtocol.getWorkNo()); // 工作号 src/main/java/com/zy/asrs/controller/SiteController.java
@@ -71,6 +71,9 @@ // 持久数据 List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>().orderBy("dev_no")); for (BasDevp devp : basDevps) { if(devp.getDevNo() <5){ continue; } SiteTableVo vo = new SiteTableVo(); vo.setDevNo(devp.getDevNo()); // 站点编号 vo.setWorkNo(devp.getWrkNo()); src/main/java/com/zy/asrs/mapper/BasRgvMapper.java
@@ -2,11 +2,14 @@ import com.baomidou.mybatisplus.mapper.BaseMapper; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.entity.BasRgvMap; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @Mapper @Repository public interface BasRgvMapper extends BaseMapper<BasRgv> { BasRgv selectByRgvNo(@Param("rgvNo") Integer rgvNo); } src/main/java/com/zy/asrs/service/BasRgvService.java
@@ -2,8 +2,10 @@ import com.baomidou.mybatisplus.service.IService; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.entity.BasRgvMap; import com.zy.common.utils.RedisUtil; public interface BasRgvService extends IService<BasRgv> { BasRgv selectByRgvNo(Integer rgvNo); } src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java
@@ -2,11 +2,15 @@ import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.zy.asrs.entity.BasRgv; import com.zy.asrs.entity.BasRgvMap; import com.zy.asrs.mapper.BasRgvMapper; import com.zy.asrs.service.BasRgvService; import org.springframework.stereotype.Service; @Service("basRgvService") public class BasRgvServiceImpl extends ServiceImpl<BasRgvMapper, BasRgv> implements BasRgvService { @Override public BasRgv selectByRgvNo(Integer rgvNo) { return this.baseMapper.selectByRgvNo(rgvNo); } } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1079,7 +1079,7 @@ //mark - 3 - .... this.locToLoc(crn, crnProtocol,mark); //预调度 // this.crnRebackHp(crnProtocol, crnThread); this.crnRebackHp(crnProtocol, crnThread); } // News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); @@ -1095,11 +1095,11 @@ } int x=1; switch (crnProtocol.getCrnNo()){ case 1: x =1; break; case 2: x =3; break; case 3: x =5; break; case 4: x =7; break; case 5: x =9; break; case 1: x =2; break; case 2: x =6; break; case 3: x =11; break; case 4: x =14; break; case 5: x =18; break; } // 已经存在吊车执行任务时,则过滤3,12 @@ -1124,7 +1124,7 @@ crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.X_MOVE); // 任务模式: 回原点 crnCommand.setSourcePosX((short) x); // 源库位排 crnCommand.setSourcePosY((short) 1); // 源库位列 crnCommand.setSourcePosY((short) 52); // 源库位列 crnCommand.setSourcePosZ((short) 1); // 源库位层 crnCommand.setDestinationPosX((short) 0); // 目标库位排 crnCommand.setDestinationPosY((short) 0); // 目标库位列 @@ -1900,31 +1900,33 @@ News.warnNoLog("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo()); crnThread.setResetFlag(true); } } else if (crnProtocol.getTaskNo() == 9996) {//盘点入库衔接 // 状态:等待确认 并且 任务完成位 = 1 if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo()); // 获取入库待确认工作档 WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue()); // 入库 + 库位转移 ==> 4.入库完成 if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) { wrkMast.setWrkSts(4L); } else { continue; } Date now = new Date(); wrkMast.setCrnEndTime(now); wrkMast.setModiTime(now); // 修改成功后复位堆垛机 if (wrkMastMapper.updateById(wrkMast) > 0) { // 堆垛机复位 log.error(wrkMast.getWrkNo() + "任务修改状态4成功,复位堆垛机={}", crnThread.getCrnProtocol().getCrnNo()); News.warnNoLog("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo()); crnThread.setResetFlag(true); } } }else{ } // else if (crnProtocol.getTaskNo() == 9996) {//盘点入库衔接 // // 状态:等待确认 并且 任务完成位 = 1 // if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { // News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo()); // // // 获取入库待确认工作档 // WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue()); // // 入库 + 库位转移 ==> 4.入库完成 // if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) { // wrkMast.setWrkSts(4L); // } else { // continue; // } // Date now = new Date(); // wrkMast.setCrnEndTime(now); // wrkMast.setModiTime(now); // // 修改成功后复位堆垛机 // if (wrkMastMapper.updateById(wrkMast) > 0) { // // 堆垛机复位 // log.error(wrkMast.getWrkNo() + "任务修改状态4成功,复位堆垛机={}", crnThread.getCrnProtocol().getCrnNo()); // News.warnNoLog("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo()); // crnThread.setResetFlag(true); // } // } // } else{ // 状态:等待确认 并且 任务完成位 = 1 if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo()); @@ -2218,7 +2220,12 @@ } // 获取工作档数据 WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo()); if (null == wrkMast) { continue; } if (null == wrkMast) { if(staProtocol.getWorkNo() > 9999){ //异常退出 MessageQueue.offer(SlaveType.Led, 2, new Task(3, "异常退出")); } continue; } wrkMasts.add(wrkMast); // 组装命令 LedCommand ledCommand = new LedCommand(); @@ -2268,13 +2275,13 @@ total = locDetl.getAnfme(); } if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) { ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); } if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) { ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); } if (wrkMast.getIoType() == 107) { ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); } }); } @@ -3322,7 +3329,7 @@ continue; } BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 Integer workNo = 0; if(rgvProtocol.getTaskNo2() > 9999|| rgvProtocol.getTaskNo1() > 9999){ workNo = rgvProtocol.getTaskNo1() !=0 ? rgvProtocol.getTaskNo1() : rgvProtocol.getTaskNo2(); @@ -3388,7 +3395,7 @@ continue; } BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 Integer workNo = 0; if(basRgv.getPakToCrn().equals("1")){ workNo = rgvProtocol.getTaskNo1() !=0 ? rgvProtocol.getTaskNo1():rgvProtocol.getTaskNo2(); //正常情况出库放货优先工位1放 @@ -3639,7 +3646,7 @@ case 1: route = RouteUtils.getRouteOne();break; case 2: route = RouteUtils.getRouteTwo();break; } basRgvMap.setNowRoute(rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 basRgvMapService.updateById(basRgvMap); WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 if( null == wrkMastSta ) { @@ -3765,7 +3772,7 @@ case 1: route = RouteUtils.getRouteOne();break; case 2: route = RouteUtils.getRouteTwo();break; } basRgvMap.setNowRoute(rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 basRgvMapService.updateById(basRgvMap); WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 if( null == wrkMastSta ) { @@ -3900,7 +3907,7 @@ case 1: route = RouteUtils.getRouteOne();break; case 2: route = RouteUtils.getRouteTwo();break; } basRgvMap.setNowRoute(rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 basRgvMapService.updateById(basRgvMap); WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 if( null == wrkMastSta ) { src/main/java/com/zy/common/model/MatDto.java
@@ -18,6 +18,16 @@ private String specs; //单据编号 private String orderNo; //客户PO private String supp; //条码UPC private String sku; // 客户信息 private String manu; @@ -42,6 +52,16 @@ this.total = total; } public MatDto(String matnr, String maknx, String orderNo, String supp, String sku,Double count, Double total) { this.matnr = matnr; this.maknx = maknx; this.orderNo = orderNo; this.supp = supp; this.sku = sku; this.count = count; this.total = total; } public MatDto(String matNo, String maknx, Double count) { this.matnr = matNo; this.maknx = maknx; src/main/java/com/zy/core/MainProcess.java
@@ -86,7 +86,7 @@ // 入库 ===>> 空栈板初始化入库,叉车入库站放货 mainService.storeEmptyPlt(8); // 出库 ===>> 工作档信息写入led显示器 // mainService.ledExecute(9); mainService.ledExecute(9); // 其他 ===>> LED显示器复位,显示默认信息 mainService.ledReset(); //堆垛机衔接任务生成 @@ -103,32 +103,6 @@ } i++; // 其他 ===>> 入出库模式切换 // i++; // if (i > 1) { // mainService.ioConvert(); // i = 0; // } /////////////////////////////////////RGV调度///////////////////////////////////// // //完成小车任务 // mainService.rgvCompleteWrkMastSta(); // //执行小车空板搬运任务 // mainService.rgvRunWrkMastEmptyStaPut();//放 // mainService.rgvRunWrkMastEmptyStaTake();//取 // if (rgcWrk){ // //执行小车货物搬运任务 // mainService.rgvRunWrkMastFullSta(); // rgcWrk = false; // }else { // mainService.rgvRunWrkMastEmptyStaAvoidance();//避让 // rgcWrk = true; // } /////////////////////////////////////RGV调度///////////////////////////////////// /////////////////////////////////////RGV调度///////////////////////////////////// k++; @@ -146,9 +120,6 @@ // //完成小车任务 mainService.rgvTaskComplete(); //工位移动 // mainService.rgvStaMove(); /////////////////////////////////////RGV调度///////////////////////////////////// } catch (Exception e) { e.printStackTrace(); src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -430,7 +430,7 @@ return map.get(RgvPos); } public Integer getRgvPosI2() { public Integer getRgvPosI1() { // key: 站点号 value: 基准物理位置 Map<Integer, Integer> posMap = new HashMap<>(); posMap.put(1004, 6534); @@ -442,6 +442,25 @@ posMap.put(1024, 219684); posMap.put(1028, 246724); posMap.put(1031, 288194); posMap.put(1035, 314954); int tolerance = 200; // 允许误差范围 for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) { int site = entry.getKey(); int basePos = entry.getValue(); if (Math.abs(RgvPos - basePos) <= tolerance) { return site; } } return 0; // 没匹配到站点 } public Integer getRgvPosI2() { // key: 站点号 value: 基准物理位置 Map<Integer, Integer> posMap = new HashMap<>(); posMap.put(2003, 314954); posMap.put(2006, 288094); posMap.put(2009, 246574); @@ -452,8 +471,6 @@ posMap.put(2024, 75174); posMap.put(2027, 33748); posMap.put(2030, 6449); int tolerance = 200; // 允许误差范围 for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) { src/main/java/com/zy/core/thread/RgvThread.java
@@ -279,7 +279,6 @@ if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); rgvProtocol.setRgvNo(siemensNet.getByteTransform().TransInt16(result.Content, 0)); } rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 2)); rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt32(result.Content, 4)); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -10,6 +10,8 @@ import com.core.common.SpringUtils; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.mapper.BasRgvMapMapper; import com.zy.asrs.mapper.BasRgvMapper; import com.zy.asrs.service.*; import com.zy.common.utils.News; import com.zy.core.DevpThread; @@ -24,6 +26,7 @@ import com.zy.core.model.protocol.StaProtocol; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import java.nio.charset.StandardCharsets; import java.text.MessageFormat; @@ -37,7 +40,8 @@ @Data @Slf4j public class SiemensDevpThread implements Runnable, DevpThread { private BasRgvMapMapper basRgvMapMapper; private BasRgvMapper basRgvMapper; private DevpSlave slave; private SiemensS7Net siemensS7Net; private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>(); @@ -47,6 +51,7 @@ // // }}; public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ add(1);add(2);//小车站点 add(1001);add(1002);add(1004); add(1005);add(1007); add(1008);add(1010); @@ -67,6 +72,7 @@ }}; public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{ add(3);add(4); add(2001);add(2003); add(2004);add(2006); add(2007);add(2009); @@ -442,7 +448,7 @@ OperateResultExOne<byte[]> result4 = null;//1054-1079 OperateResultExOne<byte[]> result5 = null;//1080-1110 OperateResultExOne<byte[]> resultErr = null; if(staNoSize == 100){ if(staNoSize == 102){ result1 = siemensS7Net.Read("DB100.0", (short) (2768));//1001-1028 result2 = siemensS7Net.Read("DB101.0", (short) (1268));//1029-1037 result3 = siemensS7Net.Read("DB104.0", (short) (1268));//1042-1053 @@ -470,7 +476,7 @@ station.put(siteId, staProtocol); } staProtocol.setSiteId(siteId); if (staNoSize == 100) { if (staNoSize == 102) { if (siteId < 1029) { result = result1; } else if (siteId < 1042) { @@ -491,152 +497,168 @@ result = result3; } } // 获取该站点对应的偏移量 Integer offset = siteOffsetMap.get(siteId); if (offset == null) { continue; // 如果没定义偏移量,跳过 } Integer offset2 = getOffsetBySiteId(siteId);//特殊偏移量计算 Integer offset3 = getOffsetBySiteId2(siteId); Integer offsetSign = siteOffsetMapSign.get(siteId); if(siteId == 1040){ boolean[] full = siemensS7Net.getByteTransform().TransBool(result.Content, offset, 2); staProtocol.setFull(full[0]); } staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2)); // 工作号 staProtocol.setStaNo((short)siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 12)); // 目标站 staProtocol.setBarcode(String.valueOf(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 16))); //条码 // if(siteId < 5){ // int rgvNo = 2; // if(siteId<3){ // rgvNo = 1; // } //// BasRgv basRgv = basRgvMapper.selectByRgvNo(rgvNo); // BasRgvMap basRgvMap = basRgvMapMapper.selectByRgvNo(rgvNo); // if(siteId%2 != 0){ //// staProtocol.setWorkNo(basRgv.getWrkNo1()); // }else{ //// staProtocol.setWorkNo(basRgv.getWrkNo2()); // } // // }else{ // 获取该站点对应的偏移量 Integer offset = siteOffsetMap.get(siteId); if (offset == null) { continue; // 如果没定义偏移量,跳过 } Integer offset2 = getOffsetBySiteId(siteId);//特殊偏移量计算 Integer offset3 = getOffsetBySiteId2(siteId); Integer offsetSign = siteOffsetMapSign.get(siteId); if(siteId == 1040){ boolean[] full = siemensS7Net.getByteTransform().TransBool(result.Content, offset, 2); staProtocol.setFull(full[0]); } staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2)); // 工作号 staProtocol.setStaNo((short)siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 12)); // 目标站 staProtocol.setBarcode(String.valueOf(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 16))); //条码 if(specialSites2.contains(siteId)){ staProtocol.setStaNo((short)siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 48)); // 目标站 staProtocol.setBarcode(String.valueOf(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 52))); //条码 } if(staNosErrList.contains(siteId)){ Integer offsetErr = siteErrOffsetMap.get(siteId); boolean[] statusErr = siemensS7Net.getByteTransform().TransBool(resultErr.Content, offsetErr, 2); staProtocol.setFrontErr(statusErr[2]); staProtocol.setBackErr(statusErr[3]); staProtocol.setHighErr(statusErr[5]); staProtocol.setLeftErr(statusErr[11]); staProtocol.setRightErr(statusErr[12]); if(specialSites2.contains(siteId)){ staProtocol.setStaNo((short)siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 48)); // 目标站 staProtocol.setBarcode(String.valueOf(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 52))); //条码 } if(staNosErrList.contains(siteId)){ Integer offsetErr = siteErrOffsetMap.get(siteId); boolean[] statusErr = siemensS7Net.getByteTransform().TransBool(resultErr.Content, offsetErr, 2); staProtocol.setFrontErr(statusErr[2]); staProtocol.setBackErr(statusErr[3]); staProtocol.setHighErr(statusErr[5]); staProtocol.setLeftErr(statusErr[11]); staProtocol.setRightErr(statusErr[12]); // 取出454~458位置的5个字节 byte[] bytes = Arrays.copyOfRange(resultErr.Content, (offsetErr + 14), (offsetErr + 19)); byte[] bytes = Arrays.copyOfRange(resultErr.Content, (offsetErr + 14), (offsetErr + 19)); // 转换成字符串(S7里CHAR是单字节编码,直接ASCII即可) String plcStr = new String(bytes, StandardCharsets.US_ASCII).trim(); String plcStr = new String(bytes, StandardCharsets.US_ASCII).trim(); // 判断是否等于 "error" staProtocol.setBarcodeErr("error".equalsIgnoreCase(plcStr)); } staProtocol.setBarcodeErr("error".equalsIgnoreCase(plcStr)); } boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3, 1); staProtocol.setAutoing(!status[0]); // 自动 boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3 - 4, 3); boolean[] statusErr = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3 - 8, 3); boolean[] statusSign = siemensS7Net.getByteTransform().TransBool(resultErr.Content, offsetSign, 3); boolean loading = false; if(!status1[0]) { loading = true; } staProtocol.setLoading(loading); // 有物 boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3, 1); staProtocol.setAutoing(!status[0]); // 自动 boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3 - 4, 3); boolean[] statusErr = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3 - 8, 3); boolean[] statusSign = siemensS7Net.getByteTransform().TransBool(resultErr.Content, offsetSign, 3); boolean loading = false; if(!status1[0]) { loading = true; } staProtocol.setLoading(loading); // 有物 staProtocol.setInEnable(status1[2]); // 可入 staProtocol.setOutEnable(status1[2]);// 可出 staProtocol.setErr(status1[6]); staProtocol.setInEnable(status1[2]); // 可入 staProtocol.setOutEnable(status1[2]);// 可出 staProtocol.setErr(status1[6]); //报警 staProtocol.setPassTimeOut(statusErr[0]); staProtocol.setObjectNoIdError(statusErr[1]); staProtocol.setIdNoObjectError(statusErr[2]); staProtocol.setLmfrError(statusErr[3]); staProtocol.setLiftError(statusErr[4]); staProtocol.setDlfrError(statusErr[5]); staProtocol.setDmfrError(statusErr[6]); staProtocol.setVfdError(statusErr[7]); staProtocol.setSrvError(statusErr[8]); staProtocol.setRes1(statusErr[9]); staProtocol.setRes2(statusErr[10]); staProtocol.setRes3(statusErr[11]); staProtocol.setCommunicationTimeOut(statusErr[12]); staProtocol.setParameterIncompleteError(statusErr[13]); staProtocol.setDataNotClear(statusErr[14]); staProtocol.setSetParameterError(statusErr[15]); staProtocol.setRes4(statusErr[16]); staProtocol.setRes5(statusErr[17]); staProtocol.setDataError(statusErr[18]); //报警 staProtocol.setPassTimeOut(statusErr[0]); staProtocol.setObjectNoIdError(statusErr[1]); staProtocol.setIdNoObjectError(statusErr[2]); staProtocol.setLmfrError(statusErr[3]); staProtocol.setLiftError(statusErr[4]); staProtocol.setDlfrError(statusErr[5]); staProtocol.setDmfrError(statusErr[6]); staProtocol.setVfdError(statusErr[7]); staProtocol.setSrvError(statusErr[8]); staProtocol.setRes1(statusErr[9]); staProtocol.setRes2(statusErr[10]); staProtocol.setRes3(statusErr[11]); staProtocol.setCommunicationTimeOut(statusErr[12]); staProtocol.setParameterIncompleteError(statusErr[13]); staProtocol.setDataNotClear(statusErr[14]); staProtocol.setSetParameterError(statusErr[15]); staProtocol.setRes4(statusErr[16]); staProtocol.setRes5(statusErr[17]); staProtocol.setDataError(statusErr[18]); //信号 staProtocol.setSensorGArrive(statusSign[0]); staProtocol.setSensorGDec(statusSign[1]); staProtocol.setSensorGArrive2(statusSign[2]); staProtocol.setSensorLimit(statusSign[3]); staProtocol.setEmergency(statusSign[4]); staProtocol.setSensorGLeave(statusSign[5]); staProtocol.setSensorGLeave2(statusSign[6]); staProtocol.setSensorCUp(statusSign[7]); staProtocol.setSensorCDown(statusSign[8]); staProtocol.setLiftMotorFr(statusSign[9]); staProtocol.setLineMotorFr(statusSign[10]); staProtocol.setTranMotorFr(statusSign[11]); staProtocol.setRst1(statusSign[12]); staProtocol.setRst2(statusSign[13]); staProtocol.setRst3(statusSign[14]); staProtocol.setRst4(statusSign[15]); staProtocol.setSensorArriveD(statusSign[16]); staProtocol.setSensorDecD(statusSign[17]); staProtocol.setSensorArriveL(statusSign[18]); staProtocol.setSensorDecL(statusSign[19]); staProtocol.setSensorArriveR(statusSign[20]); staProtocol.setSensorDecR(statusSign[21]); //信号 staProtocol.setSensorGArrive(statusSign[0]); staProtocol.setSensorGDec(statusSign[1]); staProtocol.setSensorGArrive2(statusSign[2]); staProtocol.setSensorLimit(statusSign[3]); staProtocol.setEmergency(statusSign[4]); staProtocol.setSensorGLeave(statusSign[5]); staProtocol.setSensorGLeave2(statusSign[6]); staProtocol.setSensorCUp(statusSign[7]); staProtocol.setSensorCDown(statusSign[8]); staProtocol.setLiftMotorFr(statusSign[9]); staProtocol.setLineMotorFr(statusSign[10]); staProtocol.setTranMotorFr(statusSign[11]); staProtocol.setRst1(statusSign[12]); staProtocol.setRst2(statusSign[13]); staProtocol.setRst3(statusSign[14]); staProtocol.setRst4(statusSign[15]); staProtocol.setSensorArriveD(statusSign[16]); staProtocol.setSensorDecD(statusSign[17]); staProtocol.setSensorArriveL(statusSign[18]); staProtocol.setSensorDecL(statusSign[19]); staProtocol.setSensorArriveR(statusSign[20]); staProtocol.setSensorDecR(statusSign[21]); if( (staProtocol.getPassTimeOut() || staProtocol.getObjectNoIdError() || staProtocol.getIdNoObjectError() || staProtocol.getLmfrError() || staProtocol.getLiftError() || staProtocol.getDlfrError() || staProtocol.getDmfrError() || staProtocol.getVfdError() || staProtocol.getSrvError() || staProtocol.getRes1() || staProtocol.getRes2() || staProtocol.getRes3() || staProtocol.getCommunicationTimeOut() || staProtocol.getParameterIncompleteError() || staProtocol.getDataNotClear() || staProtocol.getSetParameterError() || staProtocol.getDataError()) && staProtocol.isWriteMk() ){ staProtocol.setErrorMk(true);//若存在异常触发写入 } if( (staProtocol.getPassTimeOut() || staProtocol.getObjectNoIdError() || staProtocol.getIdNoObjectError() || staProtocol.getLmfrError() || staProtocol.getLiftError() || staProtocol.getDlfrError() || staProtocol.getDmfrError() || staProtocol.getVfdError() || staProtocol.getSrvError() || staProtocol.getRes1() || staProtocol.getRes2() || staProtocol.getRes3() || staProtocol.getCommunicationTimeOut() || staProtocol.getParameterIncompleteError() || staProtocol.getDataNotClear() || staProtocol.getSetParameterError() || staProtocol.getDataError()) && staProtocol.isWriteMk() ){ staProtocol.setErrorMk(true);//若存在异常触发写入 } if( !staProtocol.getPassTimeOut() && !staProtocol.getObjectNoIdError() && !staProtocol.getIdNoObjectError() && !staProtocol.getLmfrError() && !staProtocol.getLiftError() && !staProtocol.getDlfrError() && !staProtocol.getDmfrError() && !staProtocol.getVfdError() && !staProtocol.getSrvError() && !staProtocol.getRes1() && !staProtocol.getRes2() && !staProtocol.getRes3() && !staProtocol.getCommunicationTimeOut() && !staProtocol.getParameterIncompleteError() && !staProtocol.getDataNotClear() && !staProtocol.getSetParameterError() && !staProtocol.getDataError() ){ staProtocol.setWriteMk(true);//无异常后才能继续写入 staProtocol.setErrorMk(false);//若存在异常触发写入 if( !staProtocol.getPassTimeOut() && !staProtocol.getObjectNoIdError() && !staProtocol.getIdNoObjectError() && !staProtocol.getLmfrError() && !staProtocol.getLiftError() && !staProtocol.getDlfrError() && !staProtocol.getDmfrError() && !staProtocol.getVfdError() && !staProtocol.getSrvError() && !staProtocol.getRes1() && !staProtocol.getRes2() && !staProtocol.getRes3() && !staProtocol.getCommunicationTimeOut() && !staProtocol.getParameterIncompleteError() && !staProtocol.getDataNotClear() && !staProtocol.getSetParameterError() && !staProtocol.getDataError() ){ staProtocol.setWriteMk(true);//无异常后才能继续写入 staProtocol.setErrorMk(false);//若存在异常触发写入 } } if (!staProtocol.isPakMk() && (!staProtocol.isLoading() || staProtocol.getWorkNo()==0)) { staProtocol.setPakMk(true); } if (!staProtocol.isPakMk() && (!staProtocol.isLoading() || staProtocol.getWorkNo()==0)) { staProtocol.setPakMk(true); } // } } } //条码扫描器 @@ -705,6 +727,8 @@ } if (result1.IsSuccess && result2.IsSuccess) { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); src/main/resources/application.yml
@@ -590,35 +590,28 @@ # LED4 led[3]: id: 4 ip: 10.10.10.216 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 1047 # LED4 led[4]: id: 5 ip: 10.10.10.215 port: 5005 devpPlcId: ${wcs-slave.devp[1].id} staArr: 2037 # LED5 led[4]: id: 5 ip: 10.10.10.216 port: 5005 devpPlcId: ${wcs-slave.devp[1].id} staArr: 4001 # LED6 led[5]: id: 6 ip: 10.10.10.217 port: 5005 devpPlcId: ${wcs-slave.devp[1].id} staArr: 4006 staArr: 4001 # LED6 led[6]: id: 7 ip: 10.10.10.218 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 160,159 # LED6 led[7]: id: 8 ip: 10.10.10.219 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 160,159 devpPlcId: ${wcs-slave.devp[1].id} staArr: 4006 src/main/resources/mapper/BasRgvMapper.xml
@@ -20,5 +20,8 @@ <result column="memo" property="memo" /> </resultMap> <select id="selectByRgvNo" resultMap="BaseResultMap"> select * from asr_bas_rgv where rgv_no = #{rgvNo} </select> </mapper> src/main/resources/mapper/WrkDetlMapper.xml
@@ -27,7 +27,7 @@ </resultMap> <select id="findByWorkNo" resultMap="BaseResultMap"> select wrk_no, matnr, maktx, anfme ,specs from asr_wrk_detl where 1=1 and wrk_no = #{workNo} select * from asr_wrk_detl where 1=1 and wrk_no = #{workNo} </select> <update id="updateIoTime"> src/main/webapp/views/console.html
@@ -1,7 +1,7 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta charset="UTF-8" > <title>自动仓库wcs系统</title> <link rel="stylesheet" href="../static/css/render.css"> <script src="../static/js/jquery/jquery-3.3.1.min.js"></script> @@ -10,8 +10,6 @@ <script src="../static/js/console.map.js"></script> <script src="../static/js/console.js"></script> <script src="../static/js/common.js"></script> </head> <body> <div id="main"> @@ -19,6 +17,7 @@ <div class="head-left"> <h1>自动仓库WCS监控图</h1> <h6>AUTOMATIC WAREHOUSE WCS MONITORING DIAGRAM</h6> <button class="zoom-btn" id="zoomBtn">缩小网页比例</button> </div> <div class="head-right"> <img src="../static/images/zy-logo.png" alt="中扬" height="44" width="80"> @@ -327,6 +326,7 @@ </div> </div> </body> </html> @@ -544,7 +544,7 @@ }); } // 输送设备实时数据获取 // 输送设备实时数据获取csxit function getSitesInfo() { $.ajax({ url: baseUrl + "/console/latest/data/site", @@ -562,7 +562,7 @@ siteEl.html(sites[i].siteId); } if (sites[i].siteId === '1' || sites[i].siteId === '2' || sites[i].siteId === '3') { if (sites[i].siteId === '1' || sites[i].siteId === '2' || sites[i].siteId === '3'|| sites[i].siteId === '4') { carAnimate(Number(sites[i].siteId), Number(sites[i].nearbySta)); } @@ -693,43 +693,67 @@ function carAnimate(id, target) { // debugger var targetTop = 0; if (id === 1 || id === '1' || id === '2' || id === 2 || id === '3' || id === 3) { if (id === 1 || id === '1' || id === '2' || id === 2 || id === '3' || id === 3 ||id === '4' || id === 4) { switch (target) { case 1: targetTop += 792; case 1004: targetTop += 84; break; case 2: targetTop += 771; case 1007: targetTop += 128; break; case 3: targetTop += 727; break; case 4: targetTop += 706; break; case 5: targetTop += 662; break; case 6: targetTop += 620; break; case 7: targetTop += 578; break; case 8: targetTop += 530; break; case 9: case 1010: targetTop += 190; break; case 10: targetTop += 147; case 1014: targetTop += 240; break; case 11: targetTop += 107; case 1018: targetTop += 300; break; case 12: targetTop += 63; case 1021: targetTop += 350; break; case 1024: targetTop += 415; break; case 1028: targetTop += 465; break; case 1031: targetTop += 530; break; case 1035: targetTop += 580; break; case 2003: targetTop += 84; break; case 2006: targetTop += 128; break; case 2009: targetTop += 19.; break; case 2012: targetTop += 240; break; case 2015: targetTop += 300; break; case 2018: targetTop += 350; break; case 2021: targetTop += 415; break; case 2024: targetTop += 465; break; case 2027: targetTop += 530; break; case 2030: targetTop += 580; break; default: return; @@ -738,8 +762,56 @@ return; } $("#site-" + id).animate({top: targetTop + 'px'}, 1000); $("#site-" + id).animate({top: targetTop + 'px'}, 0); } // 检查 URL 中是否包含 fullscreen=true 参数 function checkFullscreen() { const urlParams = new URLSearchParams(window.location.search); const fullscreen = urlParams.get('fullscreen'); if (fullscreen === 'true') { enterFullscreen(); } } // 进入全屏模式 function enterFullscreen() { if (!document.fullscreenElement) { if (document.documentElement.requestFullscreen) { document.documentElement.requestFullscreen(); } else if (document.documentElement.mozRequestFullScreen) { // Firefox document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullscreen) { // Chrome, Safari, Opera document.documentElement.webkitRequestFullscreen(); } else if (document.documentElement.msRequestFullscreen) { // IE/Edge document.documentElement.msRequestFullscreen(); } } } // 按钮点击事件,触发缩放 document.getElementById('zoomBtn').addEventListener('click', function() { simulateCtrlWheelZoomOut(); }); // 模拟 Ctrl + 滚轮下滑来缩小网页 function simulateCtrlWheelZoomOut() { let scale = 1; // 默认缩放比例 // 获取当前页面的缩放比例 let currentScale = window.getComputedStyle(document.body).transform; if (currentScale !== 'none') { scale = parseFloat(currentScale.match(/matrix\((.*)\)/)[1].split(',')[0]); } // 计算新的缩放比例,模拟缩小 let newScale = scale * 0.9; // 每次点击缩小10% // 应用新的缩放比例 document.body.style.transform = 'scale(' + newScale + ')'; document.body.style.transformOrigin = 'top left'; // 设置缩放原点 } </script>