| src/main/java/com/zy/asrs/controller/CrnController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/thread/SiemensCrnThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/thread/SiemensDevpThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/webapp/static/js/console.map.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -142,15 +142,15 @@ @PostMapping("/table/crn/msg") @ManagerAuth(memo = "堆垛机数据表") public R crnMsgTable(){ Config crnSearchDetectTaskCountConfig = configService.selectOne(new EntityWrapper<Config>() .eq("code", "crnSearchDetectTaskCount") ); int crnSearchDetectTaskCount = Integer.parseInt(crnSearchDetectTaskCountConfig.getValue()); Config applyInTaskTotalCountConfig = configService.selectOne(new EntityWrapper<Config>() .eq("code", "applyInTaskTotalCount") ); int applyInTaskTotalCount = Integer.parseInt(applyInTaskTotalCountConfig.getValue()); // Config crnSearchDetectTaskCountConfig = configService.selectOne(new EntityWrapper<Config>() // .eq("code", "crnSearchDetectTaskCount") // ); // int crnSearchDetectTaskCount = Integer.parseInt(crnSearchDetectTaskCountConfig.getValue()); // // Config applyInTaskTotalCountConfig = configService.selectOne(new EntityWrapper<Config>() // .eq("code", "applyInTaskTotalCount") // ); // int applyInTaskTotalCount = Integer.parseInt(applyInTaskTotalCountConfig.getValue()); List<CrnMsgTableVo> list = new ArrayList<>(); List<BasCrnp> crnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().orderBy("crn_no")); @@ -189,8 +189,8 @@ vo.setYdistance(crnProtocol.getYDistance()); // 升降距离(Km) vo.setXduration(crnProtocol.getXDuration()); // 走行时长(H) vo.setYduration(crnProtocol.getYDuration()); // 升降时长(H) vo.setCrnSearchDetectTaskCount(crnSearchDetectTaskCount); vo.setApplyInTaskTotalCount(applyInTaskTotalCount); // vo.setCrnSearchDetectTaskCount(crnSearchDetectTaskCount); // vo.setApplyInTaskTotalCount(applyInTaskTotalCount); List<WrkMast> inWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() .eq("crn_no", basCrnp.getCrnNo()) src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -158,9 +158,6 @@ private void readStatus(){ try { short len = 56; if (slave.getId() == 1) { len = 58; } OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", len); if (result.IsSuccess) { if (null == crnProtocol) { @@ -188,9 +185,6 @@ crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 44)); crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48)); crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 52)); if (slave.getId() == 1) { crnProtocol.setCrnLane((int) siemensNet.getByteTransform().TransInt16(result.Content, 56)); } OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); @@ -273,23 +267,6 @@ News.error("SiemensCrn"+" - 6"+" - 堆垛机写入命令为空"); return false; } int writeAck = 0; do { OperateResult resultAck = siemensNet.Write("DB100.0", (short) 0); if (resultAck.IsSuccess){ Thread.sleep(200); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 2); short ack = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0); if (ack != 0) { writeAck++; }else { News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), "ack复位完成"); break; } } }while (writeAck <5); // convertRow(command); command.setCrnNo(slave.getId()); short[] array = new short[10]; @@ -305,58 +282,14 @@ // array[9] = command.getSourceStaNo(); // array[10] = command.getDestinationStaNo(); array[9] = command.getCommand(); OperateResult result = null; int idx = 0; do { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20); if (resultRead.IsSuccess) { if (command.getAckFinish() == 0) { short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2); short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4); short sourcePosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 6); short sourcePosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 8); short sourcePosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 10); short destinationPosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 12); short destinationPosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 14); short destinationPosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 16); if(taskNo == 0 || taskMode == 0 || sourcePosX == 0 || sourcePosY == 0 || sourcePosZ == 0 || destinationPosX == 0 || destinationPosY == 0 || destinationPosZ == 0) { result = siemensNet.Write("DB100.0", array); }else { break; } }else { short ackFinish = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0); if(ackFinish != command.getAckFinish()) { result = siemensNet.Write("DB100.0", array); }else { break; } } } idx++; Thread.sleep(500L); } while (idx < 5); OperateResult result = siemensNet.Write("DB100.0", array); if (command.getAckFinish() == 0) { short commandFinish = 1; int i = 0; do { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 4); OperateResultExOne<byte[]> resultReadConfirm = siemensNet.Read("DB100.18", (short) 2); if (resultRead.IsSuccess && resultReadConfirm.IsSuccess) { short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2); short confirm = siemensNet.getByteTransform().TransInt16(resultReadConfirm.Content, 0); if(taskNo != 0 && confirm == 0) { result = siemensNet.Write("DB100.18", commandFinish); } } i++; Thread.sleep(500L); } while (i < 5); Thread.sleep(100L); result = siemensNet.Write("DB100.18", commandFinish); } this.crnProtocol.setLastCommandTime(System.currentTimeMillis()); try { // 日志记录 BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -44,16 +44,21 @@ private short heartBeatVal = 1; /** * 条码数量 */ private int barcodeSize = 3; /** * 日志采集时间 */ private Long deviceDataLogTime = System.currentTimeMillis(); public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ add(301);add(302);add(303);add(304);add(305);add(306); add(301);add(302);add(303);add(304);add(305);add(306);add(307); }}; public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{ add(307); }}; @@ -197,7 +202,7 @@ // updateIoMode(); ArrayList<Integer> staNos = getStaNo(); int staNoSize = staNos.size(); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize * 18)); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize*8)); if (result.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 @@ -207,40 +212,19 @@ staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setSiteId(siteId); staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 18))); // 工作号 staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 18) + 4)); // 目标站 staProtocol.setWorkNo((short)siemensS7Net.getByteTransform().TransInt32(result.Content, i*8)); // 工作号 short locHeight = siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 18) + 8);//库位高度 if (locHeight == 2) {//high staProtocol.setHigh(true); staProtocol.setLow(false); }else {//low staProtocol.setHigh(false); staProtocol.setLow(true); } staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4)); // 目标站 staProtocol.setError(siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 18) + 10)); // 报警 boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, (i * 18) + 12, 1); boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 2); staProtocol.setAutoing(status[0]); // 自动 staProtocol.setLoading(status[1]); // 有物 staProtocol.setInEnable(status[2]); // 可入 staProtocol.setOutEnable(status[3]);// 可出 staProtocol.setEmptyMk(status[4]); // 空板信号 staProtocol.setFullPlt(status[5]); // 满托盘 boolean[] statusError = siemensS7Net.getByteTransform().TransBool(result.Content, (i * 18) + 13, 1); staProtocol.setFrontError(statusError[0]); // 前超报警 staProtocol.setBackError(statusError[1]); // 后超报警 staProtocol.setHighError(statusError[2]); // 超高报警 staProtocol.setLeftError(statusError[3]);// 左高报警 staProtocol.setRightError(statusError[4]); // 右高报警 staProtocol.setWeightError(statusError[5]); // 超重报警 staProtocol.setBarcodeError(statusError[6]); // 扫码报警 short emptyInType = siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 18) + 14);//预留1-空托入库类型,1:立库方向 2:产线方向 staProtocol.setEmptyInType(emptyInType); staProtocol.setHigh(status[6]); // 高库位 staProtocol.setLow(status[7]); // 低库位 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); @@ -248,40 +232,57 @@ } } //条码扫描器 Thread.sleep(200); ArrayList<Integer> barcodeList = getBarcode(); int barcodeSize = barcodeList.size(); OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB103.0", (short) (barcodeSize * 8)); if (result2.IsSuccess) { for (int i = 0; i < barcodeSize; i++) { String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8"); Integer barcodeId = barcodeList.get(i); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId); if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)){ barcodeThread.setBarcode(barcode); } //外形检测 Integer[] arr={301,304,307}; OperateResultExOne<byte[]> resultErr1 = siemensS7Net.Read("DB101.702.0", (short) (arr.length*6)); for (int i = 0; i < arr.length; i++) { StaProtocol staProtocol1 = station.get(arr[i]); if(resultErr1.IsSuccess){ boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultErr1.Content, i*6, 1); staProtocol1.setFrontError(status1[0]); staProtocol1.setBackError(status1[1]); staProtocol1.setHighError(status1[2]); staProtocol1.setLeftError(status1[3]); staProtocol1.setRightError(status1[4]); staProtocol1.setWeightError(status1[5]); staProtocol1.setBarcodeError(status1[6]); } } if (System.currentTimeMillis() - deviceDataLogTime > 1000 * 1) { //采集时间超过5s,保存一次数据记录 //保存数据记录 DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class); DeviceDataLog deviceDataLog = new DeviceDataLog(); deviceDataLog.setOriginData(Base64.getEncoder().encodeToString(result.Content)); deviceDataLog.setWcsData(JSON.toJSONString(station)); deviceDataLog.setType("devp"); deviceDataLog.setDeviceNo(slave.getId()); deviceDataLog.setCreateTime(new Date()); deviceDataLogService.insert(deviceDataLog); //更新采集时间 deviceDataLogTime = System.currentTimeMillis(); Thread.sleep(200); if(slave.getId()==1) { OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.602.0", (short) (barcodeSize * 8)); if (result2.IsSuccess) { for (int i = 0; i < barcodeSize; i++) { String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8"); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1); if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { barcodeThread.setBarcode(barcode); } } } } if (result.IsSuccess) { if (System.currentTimeMillis() - deviceDataLogTime > 1000 * 1) { //采集时间超过5s,保存一次数据记录 //保存数据记录 DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class); DeviceDataLog deviceDataLog = new DeviceDataLog(); deviceDataLog.setOriginData(Base64.getEncoder().encodeToString(result.Content)); deviceDataLog.setWcsData(JSON.toJSONString(station)); deviceDataLog.setType("devp"); deviceDataLog.setDeviceNo(slave.getId()); deviceDataLog.setCreateTime(new Date()); deviceDataLogService.insert(deviceDataLog); if (result.IsSuccess && result2.IsSuccess) { //更新采集时间 deviceDataLogTime = System.currentTimeMillis(); } } if (result.IsSuccess) { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); // 根据实时信息更新数据库 @@ -317,57 +318,24 @@ } ArrayList<Integer> staNos = getStaNo(); int index = staNos.indexOf(staProtocol.getSiteId()); int[] array = new int[3]; array[0] = staProtocol.getWorkNo().intValue(); array[1] = staProtocol.getStaNo().intValue(); array[2] = staProtocol.getPalletSize().intValue(); short[] array = new short[2]; OperateResult writeResult1 = siemensS7Net.Write("DB100." + index*6, staProtocol.getWorkNo().intValue()); // 工作号 OperateResult writeResult2 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo()); // 目标站 OperateResult write = siemensS7Net.Write("DB102." + index * 16, array); // OperateResult write = siemensS7Net.Write("DB100.0" + index*4, staProtocol.getWorkNo()); // 工作号 // Thread.sleep(500); // OperateResult write1 = siemensS7Net.Write("DB100.2" + index*4+2, staProtocol.getStaNo()); // 目标站 // OperateResult write = null; // OperateResult write1 = null; // //任务下发次数 // int writeCount = 0; // do { // write = siemensS7Net.Write("DB100." + index*2, staProtocol.getWorkNo()); // 工作号 // Thread.sleep(500); // write1 = siemensS7Net.Write("DB101." + index*2, staProtocol.getStaNo()); // 目标站 // if(write.IsSuccess || write1.IsSuccess){ // Thread.sleep(200); // OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*2, (short) 2); // OperateResultExOne<byte[]> readResult1 = siemensS7Net.Read("DB101." + index*2, (short) 2); // if(readResult.IsSuccess && readResult1.IsSuccess){ // short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0); // short staNo = siemensS7Net.getByteTransform().TransInt16(readResult1.Content, 0); // if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){ // //任务命令写入成功 // log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); // break; // } else {//返回结果是成功了,但是真实值不相同 // writeCount++; // log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); // } // } else { // writeCount++; // log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); // } // } // else { // writeCount++; // log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); // } // }while (writeCount<5); if (!write.IsSuccess) { if (!writeResult1.IsSuccess&&!writeResult2.IsSuccess) { staProtocol = station.get(staProtocol.getSiteId()); if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) { staProtocol.setPakMk(true); } OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol))); News.error("SiemensDevp"+" - 4"+" - 写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol)); log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol)); } else { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol))); News.info("SiemensDevp"+" - 5"+" - 输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol)); log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol)); } } src/main/resources/application.yml
@@ -1,5 +1,5 @@ server: port: 9092 port: 9093 servlet: context-path: /@pom.build.finalName@ @@ -8,7 +8,7 @@ name: @pom.build.finalName@ datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://127.0.0.1:1433;databasename=shhtgcasrs url: jdbc:sqlserver://127.0.0.1:1433;databasename=jnejc-ljqwms username: sa password: sa@123 mvc: @@ -55,7 +55,7 @@ # 堆垛机1 crn[0]: id: 1 ip: 172.17.60.10 ip: 172.26.1.131 port: 102 rack: 0 slot: 0 @@ -90,144 +90,10 @@ row: 1 bay: 16 lev: 1 # 堆垛机出库站点 # crnOutStn[1]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1016 # row: 5 # bay: 120 # lev: 1 # 堆垛机2 # crn[1]: # id: 2 # ip: 172.17.60.20 # port: 102 # rack: 0 # slot: 0 # # 偏移量,当堆垛机站点列号=1时,偏移量=2 # offset: 2 # demo: false # # 堆垛机入库站点 # crnInStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1023 # row: 8 # bay: 1 # lev: 1 # # 堆垛机出库站点 # crnOutStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1026 # row: 9 # bay: 1 # lev: 1 # 堆垛机3 # crn[2]: # id: 3 # ip: 172.17.60.30 # port: 102 # rack: 0 # slot: 0 # 偏移量,当堆垛机站点列号=1时,偏移量=2 # offset: 2 # demo: false # 堆垛机入库站点 # crnInStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1029 # row: 12 # bay: 1 # lev: 1 # 堆垛机出库站点 # crnOutStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1032 # row: 13 # bay: 1 # lev: 1 # 堆垛机4 # crn[3]: # id: 4 # ip: 172.17.60.40 # port: 102 # rack: 0 # slot: 0 # # 偏移量,当堆垛机站点列号=1时,偏移量=2 # offset: 2 # demo: false # # 堆垛机入库站点 # crnInStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1036 # row: 16 # bay: 1 # lev: 1 # # 堆垛机出库站点 # crnOutStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1039 # row: 17 # bay: 1 # lev: 1 # # 堆垛机5 # crn[4]: # id: 5 # ip: 172.17.60.50 # port: 102 # rack: 0 # slot: 0 # # 偏移量,当堆垛机站点列号=1时,偏移量=2 # offset: 2 # demo: false # # 堆垛机入库站点 # crnInStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1042 # row: 20 # bay: 1 # lev: 1 # # 堆垛机出库站点 # crnOutStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1045 # row: 21 # bay: 1 # lev: 1 # # 堆垛机6 # crn[5]: # id: 6 # ip: 172.17.60.60 # port: 102 # rack: 0 # slot: 0 # # 偏移量,当堆垛机站点列号=1时,偏移量=2 # offset: 2 # demo: false # # 堆垛机入库站点 # crnInStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1049 # row: 24 # bay: 1 # lev: 1 # # 堆垛机出库站点 # crnOutStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 1052 # row: 25 # bay: 1 # lev: 1 # RGV穿梭车1 # rgv[0]: # id: 1 # ip: 172.17.60.82 # port: 502 # rack: 0 # slot: 0 # 输送线1 devp[0]: id: 1 ip: 172.17.60.100 ip: 172.26.1.141 port: 102 rack: 0 slot: 0 src/main/webapp/static/js/console.map.js
@@ -1,7 +1,7 @@ mapInfo = {"mapName":"WCS","rackCount":16,"crnCount":4,"stbCount":16,"hpPosition":1,"minBayNo":2,"floors":1,"racks":[ {"type":"rack","id":"rack11","top":287,"left":400,"width":1100,"height":18,"minBayNo":2,"maxBayNo":24}, {"type":"rack","id":"rack13","top":341,"left":400,"width":1100,"height":20,"minBayNo":2,"maxBayNo":24}, {"type":"rack","id":"rack12","top":302,"left":400,"width":1100,"height":20,"minBayNo":2,"maxBayNo":24}, {"type":"rack","id":"rack11","top":287,"left":400,"width":1100,"height":18,"minBayNo":2,"maxBayNo":13}, {"type":"rack","id":"rack13","top":341,"left":400,"width":1100,"height":20,"minBayNo":2,"maxBayNo":13}, {"type":"rack","id":"rack12","top":302,"left":400,"width":1100,"height":20,"minBayNo":2,"maxBayNo":13}, ], "crns":[ {"type":"track","id":"lb_track4","text":"","top":333,"left":400,"width":1100,"height":1},