src/main/java/com/zy/common/model/CanningLineInLocParam.java
New file @@ -0,0 +1,23 @@ package com.zy.common.model; import lombok.Data; /** * @author pang.jiabao * @description 罐装完成,申请入成品库 * @createDate 2025/4/24 10:13 */ @Data public class CanningLineInLocParam { /** * 任务号 */ private Integer wrkNo; /** * 源站点 */ private Integer sourceStaNo; } src/main/java/com/zy/common/model/CombParam.java
New file @@ -0,0 +1,54 @@ package com.zy.common.model; import lombok.Data; import java.util.List; /** * Created by vincent on 2020/6/28 */ @Data public class CombParam { // 单据编号 private String orderNo; // 托盘条码 private String barcode; // 库位编号 private String locNo; private List<CombMat> combMats; @Data public static class CombMat { private String orderNo; // 物料编号 private String matnr = ""; // 序列码 private String batch = ""; private String brand = ""; private String standby1 = ""; private String standby2 = ""; private String standby3 = ""; private String boxType1 = "1"; private String boxType2 = "1"; private String boxType3 = "1"; // 物料数量 private Double anfme; // 商品名称 private String maktx; // 规格 private String specs; } } src/main/java/com/zy/common/model/LocTypeDto.java
@@ -1,6 +1,5 @@ package com.zy.common.model; import com.core.exception.CoolException; import com.zy.core.model.protocol.StaProtocol; import lombok.Data; @@ -34,11 +33,11 @@ // if (staProtocol.isHigh() == staProtocol.isLow()) { // throw new CoolException("plc高低检测异常"); // } if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){ this.locType1 = 2; // 高库位 }else { // if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){ // this.locType1 = 2; // 高库位 // }else { this.locType1 = 1; // 低库位 } // } } /** src/main/java/com/zy/common/model/SearchLocParam.java
@@ -3,6 +3,9 @@ import com.alibaba.fastjson.JSON; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * Created by vincent on 2020/10/30 */ @@ -18,6 +21,23 @@ // 库位规格( 0:未知, 1:低库位, 2:中库位, 3:高库位 ) private Short locType1; /** * 库区类型 1.成品库,2.空桶库 */ private int locArea; // 入库桶编号 private String bucketType; // 入库桶数量 private int bucketCount; // 尾托标识 private boolean tailSupportFlag; // 罐装线要桶 罐装线号-桶类型 private Map<Integer,String> wantBucketFlag = new HashMap<>(); public static void main(String[] args) { SearchLocParam searchLocParam = new SearchLocParam(); searchLocParam.setIoType(1); src/main/java/com/zy/controller/OpenController.java
File was deleted src/main/java/com/zy/core/MainProcess.java
@@ -41,12 +41,22 @@ continue; } // 托盘到达rgv接驳站点,更改工作档状态为9.呼叫RGV,环穿程序调度rgv mainService.callRgv(); // 入库 ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档 mainService.generateStoreWrkFile(1); // 组托 Thread.sleep(500); // 生成 空子/母托盘任务 // 生成 空子/母托盘出库任务 mainService.generateEmptyPalletStoreWrk(); // 入库 ===>> 空子托盘入库 mainService.storeEmptyPlt(); // 入库 ===>> 母空托盘叠满入库 mainService.autoEmptyIn(); // 出库 ===>> 堆垛机出库站到出库站 mainService.crnStnToOutStn(4); @@ -57,6 +67,9 @@ // 入库 ===>> 执行对工作档的完成操作 mainService.storeFinished(6); // 空桶罐装完成到达罐装线rgv口 完成直供罐装线任务和空桶出库任务,创建成品桶入库任务 mainService.canningLineTaskFinish(); // 堆垛机异常信息记录 mainService.recCrnErr(7); src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -58,6 +58,26 @@ //lfd入库印记 当stamp>=2时才入库 private Integer stamp = 0; /** * 入库桶编号/物料号 */ private String bucketType; /** * 入库桶数量,托盘上有几个桶 */ private int bucketCount; /** * 尾托标识 0不是尾托,1是尾托 */ private boolean tailSupportFlag; /** * 清除要桶信号 0.不用清除,123清除相应要桶信号 */ private int clearBucketSignal; // 外形检测 ------------------------------------------------------------------------ // 前超限 @@ -97,14 +117,6 @@ private Boolean contactErr = false; //电机接触器故障 private Boolean upcontactErr = false; //顶升电机接触器故障 private Boolean ifOpenDoor = false; // 是否打开 private Boolean ifCloseDoor = false; // 是否关闭 private Boolean openAskDoor = false; // 请求开门 private Boolean closeAskDoor = false; // 请求关门 public BasDevp toSqlModel(){ BasDevp basDevp = new BasDevp(); src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -278,16 +278,10 @@ array[7] = command.getDestinationPosY(); // 目标位置列号 array[8] = command.getDestinationPosZ(); // 目标位置层号 array[9] = command.getCommand(); // array[10] = 0; //备用1 // boolean[] array2 = new boolean[1]; // array2[0] = command.isTraySize(); OperateResult result = siemensNet.Write("DB100.0", array); // OperateResult result2 = siemensNet.Write("DB100.22", array2); News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array); // if(!result.IsSuccess || !result2.IsSuccess){ if(!result.IsSuccess){ if(!result.IsSuccess){ News.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command)); Thread.sleep(100); @@ -372,14 +366,6 @@ } } // if (command.getAckFinish() == 0) { // short commandFinish = 1; // Thread.sleep(200L); // result = siemensNet.Write("DB100.18", commandFinish); // log.info("堆垛机commandFinish下发[id:{}] >>>>> {}", slave.getId(), commandFinish); //// result = siemensNet.Write("DB100.22", commandFinish); // } try { // 日志记录 BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class); @@ -403,7 +389,7 @@ bean.insert(basCrnOpt); } catch (Exception ignore) {} if (result != null && result.IsSuccess) { if (result.IsSuccess) { this.readStatus(); News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -43,10 +43,15 @@ private short heartBeatVal = 1; private StaError1 staError1; public static final ArrayList<Integer> staNos = new ArrayList<Integer>() {{ add(1002);add(1020);add(1035);add(103); add(104);add(105);add(106);add(107); add(200);add(201);add(202);add(203);add(210); add(300);add(301);add(302);add(303);add(304);add(305); add(1001);add(1002);add(1004);add(1005);add(1006);add(1007);add(1008);add(1009);add(1010);add(1011);add(1012); add(1041);add(1042);add(1043);add(1013);add(1014);add(1015);add(1016);add(1017);add(1018);add(1019);add(1020); add(1034);add(1035);add(1036);add(1038);add(1039);add(1040); add(1022);add(1023);add(1024);add(1025);add(1026);add(1027);add(1028);add(1030);add(1031);add(1032);add(1033); add(1044);add(1045);add(1046);add(1047);add(1049);add(1050);add(1051);add(1052);add(1053);add(1054);add(1056);add(1057); add(1061);add(1063);add(1064);add(1065);add(1066);add(1067);add(1068);add(1073);add(1074);add(1075);add(1077);add(1078);add(1079); add(1081);add(1082);add(1083);add(1084);add(1085);add(1086);add(1087);add(1088);add(1089);add(1090); add(1091);add(1092);add(1093);add(1094);add(1095);add(1096);add(1097);add(1098);add(1099);add(1100);add(1101);add(1102);add(1103);add(1104); add(1105);add(1106);add(1107); }}; public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{ @@ -55,6 +60,9 @@ public static final ArrayList<Integer> staNosErrList = new ArrayList<Integer>() {{ add(101); add(103); }}; // 罐装线要桶标识 private volatile Map<Integer,String> wantBucketFlag = new HashMap<>(); /** * 条码数量 @@ -105,10 +113,6 @@ write((StaProtocol)task.getData()); // log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo()); break; // 写开门 case 3: write2((Integer) task.getData()); break; default: break; } @@ -119,44 +123,6 @@ e.printStackTrace(); } } } private void write2(int flag) throws InterruptedException { if (flag == 0) { OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1); if (readOpenResult.IsSuccess) { boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1); booleans[1] = true; // 关门信号 booleans[0] = false; siemensS7Net.Write("DB100.826",booleans); log.info("下发关门信号成功:" + Arrays.toString(booleans)); } } else if(flag == 1) { OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1); if (readOpenResult.IsSuccess) { boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1); booleans[0] = true; // 开门信号 booleans[1] = false; siemensS7Net.Write("DB100.826",booleans); log.info("下发开门信号成功:" + Arrays.toString(booleans)); } } Thread.sleep(500); OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1); if (readOpenResult.IsSuccess) { boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1); StaProtocol staProtocol = station.get(305); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(305); station.put(305, staProtocol); } staProtocol.setOpenAskDoor(booleans[0]); staProtocol.setCloseAskDoor(booleans[1]); staProtocol.setIfOpenDoor(booleans[2]); staProtocol.setIfCloseDoor(booleans[3]); log.info("下发开关门后回读:" + Arrays.toString(booleans)); } } @@ -211,10 +177,10 @@ * 读取状态 ====> 整块plc */ private void read() throws InterruptedException { // // 更新入出库模式 // updateIoMode(); // ArrayList<Integer> staNos = getStaNo(); // int staNoSize = staNos.size(); wantBucketFlag.clear(); //todo 读取罐装线PLC要桶标识 wantBucketFlag.put(1,"IBC"); // 读一楼连续8个站点 OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (8*8)); if (result.IsSuccess) { @@ -245,112 +211,6 @@ } } } // 读二楼连续4个站点 OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.800", (short) (4*8)); if (result2.IsSuccess) { for (int i = 8; i < 12; i++) { Integer siteId = staNos.get(i); // 站点编号 StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result2.Content, (i-8)*8)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result2.Content, (i-8)*8 + 4)); // 目标站 boolean[] status = siemensS7Net.getByteTransform().TransBool(result2.Content, (i-8)*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]); // 满托盘 staProtocol.setHigh(status[6]); // 高库位 staProtocol.setLow(status[7]); // 低库位 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } } } // 读二楼210 OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB101.880", (short) (8)); if (result3.IsSuccess) { Integer siteId = staNos.get(12); // 站点编号210 StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result3.Content, 0)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result3.Content, 4)); // 目标站 boolean[] status = siemensS7Net.getByteTransform().TransBool(result3.Content, 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]); // 满托盘 staProtocol.setHigh(status[6]); // 高库位 staProtocol.setLow(status[7]); // 低库位 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } } // 读二楼3区 OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB101.1600", (short) (6*8)); if (result2.IsSuccess) { for (int i = 13; i < staNos.size(); i++) { Integer siteId = staNos.get(i); // 站点编号 StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result4.Content, (i-13)*8)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result4.Content, (i-13)*8 + 4)); // 目标站 boolean[] status = siemensS7Net.getByteTransform().TransBool(result4.Content, (i-13)*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]); // 满托盘 staProtocol.setHigh(status[6]); // 高库位 staProtocol.setLow(status[7]); // 低库位 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } } } // BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class); //RGV小车1 // Thread.sleep(100); // OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB50.200",(short)10); // if (result3.IsSuccess) { // BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result3.Content, 0)); // if (!Cools.isEmpty(basRgvMap)){ // Integer siteId = 1; // StaProtocol staProtocol = station.get(siteId); // if (null == staProtocol) { // staProtocol = new StaProtocol(); // staProtocol.setSiteId(siteId); // station.put(siteId, staProtocol); // } // staProtocol.setAutoing(true); // staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8))); // } // } // 条码扫描器 OperateResultExOne<byte[]> barcodeResult = siemensS7Net.Read("DB101.1672", (short) ((BarcodeList.size()+1) * 8)); // 不连续 @@ -396,145 +256,6 @@ } } // 读二楼连续4个站点,故障信息反馈 OperateResultExOne<byte[]> resultErr3 = siemensS7Net.Read("DB101.3512", (short) (4*2)); if (resultErr3.IsSuccess) { for (int i = 8; i < 12; i++) { boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr3.Content, (i-8) * 2 + 1, 1); StaProtocol staProtocol = station.get(staNos.get(i)); // 站点编号 staProtocol.setBreakerErr(status[0]); staProtocol.setInfraredErr(status[1]); staProtocol.setOutTimeErr(status[2]); staProtocol.setSeizeSeatErr(status[3]); staProtocol.setWrkYgoodsN(status[4]); staProtocol.setInverterErr(status[5]); staProtocol.setContactErr(status[6]); staProtocol.setUpcontactErr(status[7]); } } // 读三区故障信息反馈 OperateResultExOne<byte[]> resultErr4 = siemensS7Net.Read("DB101.2096", (short) (6*2)); if (resultErr4.IsSuccess) { for (int i = 13; i < staNos.size(); i++) { boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr4.Content, (i-13) * 2 + 1, 1); StaProtocol staProtocol = station.get(staNos.get(i)); // 站点编号 staProtocol.setBreakerErr(status[0]); staProtocol.setInfraredErr(status[1]); staProtocol.setOutTimeErr(status[2]); staProtocol.setSeizeSeatErr(status[3]); staProtocol.setWrkYgoodsN(status[4]); staProtocol.setInverterErr(status[5]); staProtocol.setContactErr(status[6]); staProtocol.setUpcontactErr(status[7]); } } // 一楼出入库模式切换 // OperateResultExOne<byte[]> ioModeResult = siemensS7Net.Read("DB101.3724", (short) 1); // if (ioModeResult.IsSuccess) { // boolean[] ioModelBooleans = siemensS7Net.getByteTransform().TransBool(ioModeResult.Content, 0, 1); //// log.info("读取出入库模式:" + Arrays.toString(ioModelBooleans)); // WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class); // if (ioModelBooleans[0]) { // 100切入库 // if (ioModeOf101 == IoModeType.PAKOUT_MODE) { // int outCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101) // .eq("sta_no", 100).in("wrk_sts", 12, 13, 14)); // if (outCount == 0) { // boolean[] booleans = new boolean[8]; // booleans[0]=true; // ioModeOf101 = IoModeType.PAKIN_MODE; // siemensS7Net.Write("DB100.824",booleans); // log.info("101切换入库模式成功"); // } // } // } // if (ioModelBooleans[1]) { // 100切出库 // if (ioModeOf101 == IoModeType.PAKIN_MODE) { // int inCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1) // .eq("sta_no", 101).in("wrk_sts", 2, 3, 4)); // if (inCount == 0) { // boolean[] booleans = new boolean[8]; // booleans[0]=true; // ioModeOf101 = IoModeType.PAKOUT_MODE; // siemensS7Net.Write("DB100.824",booleans); // log.info("101切换出库模式成功"); // } // } // } // if (ioModelBooleans[2]) { // 102切入库 // if (ioModeOf103 == IoModeType.PAKOUT_MODE) { // int outCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101) // .eq("sta_no", 102).in("wrk_sts", 12, 13, 14)); // if (outCount == 0) { // boolean[] booleans = new boolean[8]; // booleans[1]=true; // ioModeOf103 = IoModeType.PAKIN_MODE; // siemensS7Net.Write("DB100.824",booleans); // log.info("103切换入库模式成功"); // } // } // } // if (ioModelBooleans[3]) { // 102切出库 // if (ioModeOf103 == IoModeType.PAKIN_MODE) { // int inCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1) // .eq("sta_no", 103).in("wrk_sts", 2, 3, 4)); // if (inCount == 0) { // boolean[] booleans = new boolean[8]; // booleans[1]=true; // ioModeOf103 = IoModeType.PAKOUT_MODE; // siemensS7Net.Write("DB100.824",booleans); // log.info("103切换出库模式成功"); // } // } // } // } // 读开门信号 // OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1); // if (readOpenResult.IsSuccess) { // boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1); // StaProtocol staProtocol = station.get(305); // if (null == staProtocol) { // staProtocol = new StaProtocol(); // staProtocol.setSiteId(305); // station.put(305, staProtocol); // } // staProtocol.setOpenAskDoor(booleans[0]); // staProtocol.setCloseAskDoor(booleans[1]); // staProtocol.setIfOpenDoor(booleans[2]); // staProtocol.setIfCloseDoor(booleans[3]); //// log.info("开门信号:" + Arrays.toString(booleans)); // } //// OperateResultExOne<byte[]> resultErr3 = siemensS7Net.Read("DB13.400", (short) 3); //// if (resultErr3.IsSuccess) { //// if (staError1 == null){ //// staError1 = new StaError1(); // } // boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr3.Content, 0, 3); // staError1.setEMERGENCY_Stop_Core(status[0]); // staError1.setEMERGENCY_STOP1(status[1]); // staError1.setEMERGENCY_STOP2(status[2]); // staError1.setEMERGENCY_STOP3(status[3]); // staError1.setEMERGENCY_STOP4(status[4]); // // staError1.setDoor_EMERGENCY_STOP1(status[5]); // staError1.setDoor_EMERGENCY_STOP2(status[6]); // staError1.setDoor_EMERGENCY_STOP3(status[7]); // staError1.setDoor_EMERGENCY_STOP4(status[8]); // staError1.setDoor_EMERGENCY_STOP5(status[9]); // staError1.setDoor_EMERGENCY_STOP6(status[10]); // // staError1.setDoor_Open_Err1(status[11]); // staError1.setDoor_Open_Err1(status[12]); // staError1.setDoor_Open_Err1(status[13]); // staError1.setDoor_Open_Err1(status[14]); // staError1.setDoor_Open_Err1(status[15]); // staError1.setDoor_Open_Err1(status[16]); // // } if (result.IsSuccess) { @@ -629,16 +350,6 @@ } } // 更新入出库模式 private void updateIoMode() throws InterruptedException { // if (this.ioModeOf2F != IoModeType.NONE) { // if (!siemensS7Net.Write("DB100.180", this.ioModeOf2F.id).IsSuccess) { // OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线2F入出库模式失败。输送线plc编号={1}", slave.getId())); // News.error("SiemensDevp"+" - 6"+" - 写入输送线2F入出库模式失败。输送线plc编号={}", slave.getId()); // } // } } /** * 心跳 */ @@ -675,7 +386,6 @@ slave.setIp("10.10.10.18"); SiemensDevpThread devpThread = new SiemensDevpThread(slave); devpThread.connect(); devpThread.write2(0); devpThread.read(); // // 写 // StaProtocol staProtocol = devpThread.getStation().get(1); src/main/java/com/zy/entity/WrkMast.java
@@ -301,6 +301,15 @@ @TableField("ctn_no") private String ctnNo; @TableField("rgv_no") private Integer rgvNo; @TableField("rgv_ssta_no") private Integer rgvSstaNo; @TableField("rgv_dsta_no") private Integer rgvDstaNo; /** * 满板 */ src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -6,10 +6,7 @@ import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.common.model.LocTypeDto; import com.zy.common.model.MatDto; import com.zy.common.model.SearchLocParam; import com.zy.common.model.StartupDto; import com.zy.common.model.*; import com.zy.common.service.CommonService; import com.zy.core.CrnThread; import com.zy.core.DevpThread; @@ -53,12 +50,41 @@ public static final long COMMAND_TIMEOUT = 5 * 1000; // 空拖出库站点 // 空拖出库站点,区分子母空托盘 public static final Map<Integer,String> emptyPalletSiteMap = new HashMap<>(); // 初始化空托盘出库站点 M空母托盘,Z空子托盘 // 母托盘叠盘站点 public static final List<Integer> stackingSite = new ArrayList<>(); // rgv接驳站点 public static final List<Integer> rgvConnectionSiteList = new ArrayList<>(); // 工作档对应目标站点转换为rgv目标站点 public static final Map<Integer,Integer> taskStaNoToRgvStaNoMap = new HashMap<>(); // 罐装完成rgv接驳站点 public static final List<Integer> canningLineRgvConnectionSiteList = new ArrayList<>(); static { emptyPalletSiteMap.put(1002,"M");emptyPalletSiteMap.put(1020,"M");emptyPalletSiteMap.put(1035,"Z"); emptyPalletSiteMap.put(1002,"M"); emptyPalletSiteMap.put(1020,"M");emptyPalletSiteMap.put(1035,"Z"); stackingSite.add(1027);stackingSite.add(1020); rgvConnectionSiteList.add(1012);rgvConnectionSiteList.add(1006);rgvConnectionSiteList.add(1001);rgvConnectionSiteList.add(1018); rgvConnectionSiteList.add(1019);rgvConnectionSiteList.add(1041);rgvConnectionSiteList.add(1034);rgvConnectionSiteList.add(1033); rgvConnectionSiteList.add(1026);rgvConnectionSiteList.add(1022);rgvConnectionSiteList.add(1044); rgvConnectionSiteList.add(1083);rgvConnectionSiteList.add(1086);rgvConnectionSiteList.add(1089);rgvConnectionSiteList.add(1090); rgvConnectionSiteList.add(1105);rgvConnectionSiteList.add(1100);rgvConnectionSiteList.add(1097);rgvConnectionSiteList.add(1094); rgvConnectionSiteList.add(1091); taskStaNoToRgvStaNoMap.put(1050,1044);taskStaNoToRgvStaNoMap.put(1079,1044);taskStaNoToRgvStaNoMap.put(1065,1044);taskStaNoToRgvStaNoMap.put(1072,1044);taskStaNoToRgvStaNoMap.put(1093,1094); taskStaNoToRgvStaNoMap.put(1104,1100);taskStaNoToRgvStaNoMap.put(1102,1100);taskStaNoToRgvStaNoMap.put(1090,1090);taskStaNoToRgvStaNoMap.put(1002,1001);taskStaNoToRgvStaNoMap.put(1016,1018); taskStaNoToRgvStaNoMap.put(1020,1019);taskStaNoToRgvStaNoMap.put(1024,1022);taskStaNoToRgvStaNoMap.put(1035,1034);taskStaNoToRgvStaNoMap.put(1040,1033);taskStaNoToRgvStaNoMap.put(1043,1041); canningLineRgvConnectionSiteList.add(1083);canningLineRgvConnectionSiteList.add(1086); canningLineRgvConnectionSiteList.add(1089); } @Autowired @@ -129,14 +155,7 @@ // 尺寸检测异常 boolean back = false; String errMsg = ""; // if ((staProtocol.getSiteId() == 101 && devpThread.ioModeOf101 == IoModeType.PAKOUT_MODE) // ||(staProtocol.getSiteId() == 103 && devpThread.ioModeOf103 == IoModeType.PAKOUT_MODE) // ||(staProtocol.getSiteId() == 305 && devpThread.ioModeOf305 == IoModeType.PAKOUT_MODE)) { // errMsg = "当前为出库模式"; // back = true; // } // if (!back && staProtocol.isFrontErr()) { if (staProtocol.isFrontErr()) { if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; } @@ -166,7 +185,6 @@ } // 退回 if (back) { // News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg)); if (!staProtocol.isLoading()){ @@ -225,6 +243,12 @@ param.setIoType(1); param.setSourceStaNo(inSta.getStaNo()); param.setLocType1(locTypeDto.getLocType1()); param.setLocArea(2);// 入空桶库标识 param.setBucketType(staProtocol.getBucketType()); param.setBucketCount(staProtocol.getBucketCount()); param.setTailSupportFlag(staProtocol.isTailSupportFlag()); param.setWantBucketFlag(devpThread.getWantBucketFlag()); String response = new HttpHandler.Builder() .setUri(wmsUrl) .setPath("/rpc/pakin/loc/v1") @@ -236,6 +260,11 @@ if (jsonObject.getInteger("code").equals(200)) { StartupDto dto = jsonObject.getObject("data", StartupDto.class); barcodeThread.setBarcode(""); // 目标站点是直供罐装线 if (dto.getStaNo() == 1079 || dto.getStaNo() == 1065 || dto.getStaNo() == 1072) { devpThread.getWantBucketFlag().remove(dto.getCrnNo()); // 移除输送线要桶信号 staProtocol.setClearBucketSignal(dto.getCrnNo()); // 清除要桶信号标识 } staProtocol.setWorkNo(dto.getWorkNo()); staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(),dto.getSourceStaNo())); devpThread.setPakMk(staProtocol.getSiteId(), false); @@ -253,28 +282,21 @@ staProtocol.setStaNo(inSta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); // // if (ledThread != null) { if (ledThread != null) { String errorMsg = jsonObject.getString("msg"); if (!Cools.isEmpty(errorMsg)) { MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); } // } // News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); } News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } } } // News.infoNoLog(""+mark+" - 0"+" - 组托 ===》执行完成"); } @@ -522,40 +544,34 @@ if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue()) && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.forkPosType == CrnForkPosType.HOME) { // News.error("堆垛机出库完成 - 开始执行"); // 命令下发区 -------------------------------------------------------------------------- // 更新工作档状态为14失败 // 下发站点信息 if (wrkMast.getSourceStaNo() == 106 && wrkMast.getWrkSts() == 12L) { wrkMast.setWrkSts(16L); wrkMast.setCrnNo(1); if (wrkMast.getStaNo() == 107) { wrkMast.setSourceStaNo(107); } else if(wrkMast.getStaNo()==104) { wrkMast.setSourceStaNo(105); } staProtocol.setStaNo((short) 106); log.info("----------106移库标识---------"); }else if(wrkMast.getSourceStaNo() == 105 && wrkMast.getWrkSts() == 16L) { staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); log.info("106移库完成,输送线发送105到104,源站为:" + staProtocol.getSiteId()); wrkMast.setWrkSts(14L); }else { staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); wrkMast.setWrkSts(14L); } staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); staProtocol.setWorkNo(wrkMast.getWrkNo()); if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { continue; } wrkMast.setWrkSts(14L); wrkMast.setCrnEndTime(new Date()); if (wrkMastMapper.updateById(wrkMast) != 0) { // 空桶出库完成库位组任务 if (wrkMast.getSourceStaNo() == 1056) { WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_sta_no", 1056).eq("wrk_sts", 12)); if (wrkMast1 != null) { StaProtocol staProtocol1 = devpThread.getStation().get(1057); if (staProtocol1 != null) { staProtocol1 = staProtocol1.clone(); staProtocol1.setStaNo(wrkMast1.getStaNo().shortValue()); staProtocol1.setWorkNo(wrkMast1.getWrkNo()); if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol1))) { log.error("空桶出库完成库位组任务推送输送线命令队列失败"); } wrkMast1.setWrkSts(14L); wrkMast1.setCrnEndTime(new Date()); if (wrkMastMapper.updateById(wrkMast1) != 0) { } } } } // 复位堆垛机 log.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo()); crnThread.setResetFlag(true); @@ -578,6 +594,142 @@ } /** * 空子托盘入库 */ public synchronized void storeEmptyPlt() { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 for (DevpSlave.Sta inSta : devp.getEmptyInSta()) { // 获取条码扫描仪信息 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (barcodeThread == null) { continue; } String barcode = barcodeThread.getBarcode(); // 尺寸检测异常 boolean back = false; String errMsg = ""; if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; } if (!back && staProtocol.isBackErr()) { errMsg = "后超限"; back = true; } if (!back && staProtocol.isHighErr()) { errMsg = "高超限"; back = true; } if (!back && staProtocol.isLeftErr()) { errMsg = "左超限"; back = true; } if (!back && staProtocol.isRightErr()) { errMsg = "右超限"; back = true; } if (!back && staProtocol.isWeightErr()) { errMsg = "超重"; back = true; } if (!back && staProtocol.isBarcodeErr()) { errMsg = "扫码失败"; back = true; } // 退回 if (back) { MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg)); if (!staProtocol.isLoading()) { continue; } if (!staProtocol.isPakMk()) { continue; } staProtocol.setWorkNo(wrkNo); News.info("{}空托入库回退:{},任务号:{}", inSta.getStaNo(), errMsg, wrkNo); staProtocol.setStaNo(inSta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta()); return; } // 判断是否满足入库条件 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isEmptyMk() && staProtocol.isPakMk()) { if (Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) { News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); continue; } // 判断重复工作档 WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode); if (wrkMast != null) { continue; } try { LocTypeDto locTypeDto = new LocTypeDto(staProtocol); SearchLocParam param = new SearchLocParam(); param.setBarcode(barcode); param.setIoType(10); param.setSourceStaNo(inSta.getStaNo()); param.setLocType1(locTypeDto.getLocType1()); String response = new HttpHandler.Builder() .setUri(wmsUrl) .setPath("/rpc/pakin/loc/v1") .setJson(JSON.toJSONString(param)) .build() .doPost(); log.info("空子托盘入库请求wms原始返回:" + response); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { StartupDto dto = jsonObject.getObject("data", StartupDto.class); barcodeThread.setBarcode(""); staProtocol.setWorkNo(dto.getWorkNo()); staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(), dto.getSourceStaNo())); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发2:" + dto.getWorkNo() + "," + dto.getStaNo()); if (!result) { News.error(":更新plc站点信息失败"); throw new CoolException("更新plc站点信息失败"); } else { ledThread.errorReset(); } } else { staProtocol.setWorkNo(wrkNo); staProtocol.setStaNo(inSta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); String errorMsg = jsonObject.getString("msg"); if (!Cools.isEmpty(errorMsg)) { MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); } } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } } } } /** * 入出库 ===>> 堆垛机入出库作业下发 */ public synchronized void crnIoExecute(Integer mark) { @@ -594,11 +746,6 @@ News.error(""+mark+" - 1"+" - {}号堆垛机尚未在数据库进行维护!", crn.getId()); continue; } // //堆垛机回原点任务中 // if(crnThread.isBackHpFlag()){ // continue; // } // 只有当堆垛机空闲 并且 无任务时才继续执行 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO @@ -628,12 +775,8 @@ } } // 库位移转 //mark - 3 - .... this.locToLoc(crn, crnProtocol,mark); // this.crnRebackHp(crnProtocol, crnThread); } // News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); } /** @@ -761,18 +904,6 @@ News.error(""+mark+" - 1"+" - 16"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); } else { // long startTime = System.currentTimeMillis(); // while ((System.currentTimeMillis() - startTime) < COMMAND_TIMEOUT) { // // if (true) { // break; // } // // try{ // Thread.sleep(500); // }catch(Exception ignore){} // } // 修改工作档状态 2.设备上走 => 3.吊车入库中 Date now = new Date(); wrkMast.setWrkSts(3L); @@ -780,6 +911,21 @@ wrkMast.setModiTime(now); if (wrkMastMapper.updateById(wrkMast) == 0) { News.error(""+mark+" - 1"+" - 17"+" - 修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); } // 如果是1049则有两个任务,需要把1050改成吊车入库中 if (crnStn.getStaNo() == 1049) { BasDevp basDevp = basDevpService.selectById(1050); if (basDevp.getWrkNo() == 0) { log.error("取货点为1049,但是1050任务号为0"); } else { WrkMast wrkMast1 = wrkMastMapper.selectById(basDevp.getWrkNo()); wrkMast1.setWrkSts(3L); wrkMast1.setCrnStrTime(now); wrkMast1.setModiTime(now); if (wrkMastMapper.updateById(wrkMast1) == 0) { News.error(""+mark+" - 1"+" - 17"+" - 修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); } } } } } @@ -794,9 +940,7 @@ News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库"); for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { // 获取工作状态为11(生成出库ID)的出库工作档 // WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo()); List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo()); // todo 限制出库到305的工作档,如果配置outModel不等于Y,则跳过 for (WrkMast wrkMast : wrkMasts) { if (wrkMast == null) { continue; @@ -818,41 +962,22 @@ if (staProtocol == null) { News.infoNoLog(""+mark+" - 2"+" - 3"+" - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol="+staProtocol); break; // continue; } else { staProtocol = staProtocol.clone(); } // // 入出库模式判断 // if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; } // if (wrkMast.getStaNo() == 204 && devpThread.ioModeOf2F != IoModeType.PAKOUT_MODE) { // News.infoNoLog(""+mark+" - 2"+" - 4"+" - 入出库模式(此处出库方法,出库模式继续=="+devpThread.ioModeOf2F); // continue; // } // 入出库模式判断 // if ((staProtocol.getSiteId() == 101 && devpThread.ioModeOf101 != IoModeType.PAKOUT_MODE) // || (staProtocol.getSiteId() == 103 && devpThread.ioModeOf103 != IoModeType.PAKOUT_MODE) // || (staProtocol.getSiteId() == 305 && devpThread.ioModeOf305 != IoModeType.PAKOUT_MODE)) { // continue; // } // 查询站点详细信息 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); if (staDetl == null) { News.error(""+mark+" - 2"+" - 5"+" - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); break; // continue; } // 107无物才能出,其他有转运架才能出 boolean loading = (staProtocol.getSiteId() == 107) != staProtocol.isLoading(); // 判断堆垛机出库站状态 if (staProtocol.isAutoing() && loading && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") if (staProtocol.isAutoing() && staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { // 命令下发区 -------------------------------------------------------------------------- // log.warn("堆垛机出库命令下发:"+staProtocol.getWorkNo()+","+staProtocol.isOutEnable()+","+staProtocol.getSiteId()); // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { // continue; break; } @@ -908,11 +1033,39 @@ // 已经存在吊车执行任务时,则过滤 if (wrkMastMapper.selectWorking(slave.getId()) != null) { break; // return; } // if(crnStn.getStaNo() == 105) { // continue; // } WrkMast wrkMast1 = null; // 库位任务对应另一个库位任务 LocMast locMast = null; // 库位对应另一个库位 // 空桶库出库需要两个库位一起出 if(slave.getId() == 4) { Integer row = sourceSta.getRow1(); // 获取对应库位 String newLocNo = (row == 9 || row == 11 ? String.valueOf(row + 1) : row == 10 ? "09" : "11") + sourceSta.getLocNo().substring(2); locMast = locMastService.selectById(newLocNo); if (locMast == null) { log.error("空桶出库寻找{}对应库位组库位号{}错误",sourceSta.getLocNo(),newLocNo); break; } if (locMast.getLocSts().equals("R")) { wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo)); } else if(locMast.getLocSts().equals("F")) { log.error("空桶出库寻找{}对应库位组库位号{}库位状态错误F",sourceSta.getLocNo(),newLocNo); break; } } if (wrkMast1 != null) { // 判断给堆垛机发生命令的源库位 if (sourceSta.getRow1() == 10 || sourceSta.getRow1() == 11) { // 交换库位和任务 LocMast t1 = sourceSta; sourceSta = locMast; locMast = t1; WrkMast t2 = wrkMast1; wrkMast1 = wrkMast; wrkMast = t2; } } News.warnNoLog(""+mark+" - 2"+" - 12"+" - 命令下发 : 工作号={},源排={},源列={},源层={},目标排={},目标列={},目标层={}",wrkMast.getWrkNo().shortValue() ,sourceSta.getRow1().shortValue(),sourceSta.getBay1().shortValue(),sourceSta.getLev1().shortValue() @@ -941,6 +1094,15 @@ wrkMast.setModiTime(now); if (wrkMastMapper.updateById(wrkMast) == 0) { News.error(""+mark+" - 2"+" - 14"+" - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); } // 修改空桶库对应库位任务状态 if (wrkMast1 != null) { wrkMast1.setWrkSts(12L); wrkMast1.setCrnStrTime(now); wrkMast1.setModiTime(now); if (wrkMastMapper.updateById(wrkMast1) == 0) { News.error(""+mark+" - 2"+" - 14"+" - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); } } break; } @@ -1500,7 +1662,7 @@ } /** * 生成 空子/母托盘任务 * 生成 空子/母托盘出库任务 */ public synchronized void generateEmptyPalletStoreWrk() { Integer devpId = 1; @@ -1516,7 +1678,7 @@ // 自动&无物&可出 if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isOutEnable()) { // 判断是否已经生成任务 if (wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 110).eq("sta_no", entry.getKey())).size() > 0) { if (wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 111,112).eq("sta_no", entry.getKey())).size() > 0) { log.warn("{}站点已经存在空板出库任务", entry.getKey()); continue; } @@ -1544,4 +1706,165 @@ } } } /** * 托盘到达rgv接驳站点,更改工作档状态为9.呼叫RGV,环穿程序调度rgv */ public synchronized void callRgv() { // 输送线plc编号 Integer devpPlcId = 1; DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpPlcId); for (Integer site : rgvConnectionSiteList) { StaProtocol staProtocol = devpThread.getStation().get(site); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0) { // 查询工作档 WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo()); if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && wrkMast.getRgvNo() == null) { wrkMast.setRgvNo(0); wrkMast.setRgvSstaNo(site); wrkMast.setRgvDstaNo(taskStaNoToRgvStaNoMap.get(wrkMast.getStaNo())); wrkMast.setModiTime(new Date()); wrkMastMapper.updateById(wrkMast); log.info("任务号:{}已到达rgv接驳位,准备呼叫rgv...", wrkMast.getWrkNo()); } } } } /** * 母托盘叠满自动入库 */ public synchronized void autoEmptyIn() { for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历空板入库口 for (Integer site : stackingSite) { // 获取空板入库站信息 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(site); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (!staProtocol.isLoading()){ continue; } // 站点条件判断 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isEmptyMk() && staProtocol.isPakMk() && staProtocol.getWorkNo() == 0 ) { try { LocTypeDto locTypeDto = new LocTypeDto(staProtocol); SearchLocParam param = new SearchLocParam(); param.setIoType(10); param.setSourceStaNo(site); param.setLocType1(locTypeDto.getLocType1()); String response = new HttpHandler.Builder() .setUri(wmsUrl) .setPath("/rpc/pakin/loc/v1") .setJson(JSON.toJSONString(param)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { StartupDto dto = jsonObject.getObject("data", StartupDto.class); // 更新站点信息 且 下发plc命令 staProtocol.setWorkNo(dto.getWorkNo()); staProtocol.setStaNo(staProtocol.getSiteId().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发6:"+dto.getWorkNo()+","+staProtocol.getSiteId()); if (!result) { News.errorNoLog(""+" - 1"+" - 更新plc站点信息失败"); throw new CoolException("更新plc站点信息失败"); } } else { News.error(" - 3"+" - 母托叠盘入库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } else { News.errorNoLog(" - 母托叠盘入库站点信息不符合入库条件!!!"+" 自动信号:"+staProtocol.isAutoing()+"、可入信号:" + staProtocol.isInEnable() +"、空板信号:"+ staProtocol.isEmptyMk()+"、工作号:" + staProtocol.getWorkNo() +"、锁定标记"+ staProtocol.isPakMk()); } } } } /** * 空桶罐装完成到达罐装线rgv口 完成直供罐装线任务和空桶出库任务,创建成品桶入库任务 */ public synchronized void canningLineTaskFinish() { // 输送线plc编号 Integer devpPlcId = 1; DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpPlcId); for (Integer site : canningLineRgvConnectionSiteList) { StaProtocol staProtocol = devpThread.getStation().get(site); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.getWorkNo() != 0) { // 查询工作档 WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo()); if (wrkMast.getIoType() != 1) { try { CanningLineInLocParam param = new CanningLineInLocParam(); param.setWrkNo(wrkMast.getWrkNo()); param.setSourceStaNo(site); String response = new HttpHandler.Builder() .setUri(wmsUrl) .setPath("/rpc/pakin/CanningLine/loc/v1") .setJson(JSON.toJSONString(param)) .build() .doPost(); log.info("罐装线入库请求wms原始返回:" + response); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { StartupDto dto = jsonObject.getObject("data", StartupDto.class); staProtocol.setWorkNo(dto.getWorkNo()); staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(), dto.getSourceStaNo())); devpThread.setPakMk(staProtocol.getSiteId(), false); // 这里下发命令后,输送线要把该站点可入信号去除 boolean result = MessageQueue.offer(SlaveType.Devp, devpPlcId, new Task(2, staProtocol)); if (result) { log.info("罐装线入库推送输送线命令成功:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo()); News.info("罐装线入库推送输送线命令成功:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo()); } else { log.error("罐装线入库推送输送线命令失败:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo()); News.error("罐装线入库推送输送线命令失败:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo()); throw new CoolException("罐装线入库推送输送线命令失败:" + site); } } else { log.error("罐装线入库请求接口异常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response); News.error("罐装线入库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response); } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } } } } } src/main/resources/application.yml
@@ -41,7 +41,7 @@ # 双深 doubleDeep: true # 双深库位排号 doubleLocs: 1,4,5,8 doubleLocs: 1,4 # 一个堆垛机负责的货架排数 groupCount: 4 @@ -58,41 +58,17 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 103 row: 2 staNo: 1093 row: 3 bay: 1 lev: 1 crnInStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 203 row: 2 bay: 1 lev: 2 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 103 row: 2 staNo: 1093 row: 3 bay: 1 lev: 1 crnOutStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 105 row: 2 bay: 4 lev: 1 crnOutStn[2]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 107 row: 1 bay: 28 lev: 1 crnOutStn[3]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 203 row: 2 bay: 1 lev: 2 # 堆垛机2 crn[1]: id: 2 @@ -106,34 +82,16 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 101 staNo: 1104 row: 6 bay: 1 lev: 1 crnInStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 201 row: 6 bay: 1 lev: 2 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 101 row: 6 staNo: 1099 row: 5 bay: 1 lev: 1 crnOutStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 201 row: 6 bay: 1 lev: 2 crnOutStn[2]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 106 row: 6 bay: 28 lev: 1 # 堆垛机3 crn[2]: @@ -148,15 +106,15 @@ # 堆垛机入库站点 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 101 row: 6 staNo: 1102 row: 7 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 101 row: 6 staNo: 1107 row: 8 bay: 1 lev: 1 # 堆垛机4 @@ -169,18 +127,25 @@ # 偏移量,当堆垛机站点列号=1时,偏移量=2 offset: 2 demo: false # 堆垛机入库站点 # 堆垛机入库站点1 crnInStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 101 row: 6 staNo: 1050 row: 11 bay: 1 lev: 1 # 堆垛机入库站点2 crnInStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1049 row: 12 bay: 1 lev: 1 # 堆垛机出库站点 crnOutStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 101 row: 6 staNo: 1056 row: 9 bay: 1 lev: 1 @@ -193,26 +158,61 @@ slot: 0 # 入库口1 inSta[0]: staNo: 101 staNo: 1011 barcode: ${wcs-slave.barcode[0].id} backSta: 100 backSta: 1010 led: ${wcs-slave.led[0].id} # 入库口2 inSta[1]: staNo: 103 staNo: 1007 barcode: ${wcs-slave.barcode[1].id} backSta: 102 backSta: 1008 led: ${wcs-slave.led[1].id} # 入库口3 inSta[2]: staNo: 305 staNo: 1017 barcode: ${wcs-slave.barcode[1].id} backSta: 1016 led: ${wcs-slave.led[1].id} # 入库口4 inSta[3]: staNo: 1042 barcode: ${wcs-slave.barcode[1].id} backSta: 1043 led: ${wcs-slave.led[1].id} # 空板入库口1 emptyInSta[0]: staNo: 1042 barcode: ${wcs-slave.barcode[0].id} backSta: 1043 led: ${wcs-slave.led[2].id} # 空板入库口2 emptyInSta[1]: staNo: 1017 barcode: ${wcs-slave.barcode[1].id} backSta: 1016 led: ${wcs-slave.led[3].id} # 空板入库口3 emptyInSta[2]: staNo: 1007 barcode: ${wcs-slave.barcode[2].id} backSta: 1008 led: ${wcs-slave.led[4].id} # 出库口1 outSta[0]: staNo: 100 staNo: 1024 led: ${wcs-slave.led[0].id} # 出库口2 outSta[1]: staNo: 102 staNo: 1040 led: ${wcs-slave.led[1].id} # 出库口3 outSta[2]: staNo: 1043 led: ${wcs-slave.led[1].id} # 出库口4 outSta[3]: staNo: 1016 led: ${wcs-slave.led[1].id} # 条码扫描仪1 @@ -242,46 +242,46 @@ ip: 10.10.10.190 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 101 staArr: 1024 # LED2 led[1]: id: 2 ip: 10.10.10.191 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 102 staArr: 1040 # LED3 led[2]: id: 3 ip: 10.10.10.191 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 102 staArr: 1042,1043 # LED4 led[3]: id: 4 ip: 10.10.10.191 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 102 staArr: 1017,1016 # LED5 led[4]: id: 5 ip: 10.10.10.191 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 102 staArr: 1007 # LED6 led[5]: id: 6 ip: 10.10.10.191 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 102 staArr: 1011 # LED7 led[6]: id: 7 ip: 10.10.10.191 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 102 staArr: 1090 src/main/resources/mapper/WrkMastMapper.xml
@@ -59,6 +59,9 @@ <!-- <result column="Pdc_type" property="PdcType" />--> <result column="ctn_no" property="ctnNo" /> <result column="full_plt" property="fullPlt" /> <result column="rgv_no" property="rgvNo" /> <result column="rgv_ssta_no" property="rgvSstaNo" /> <result column="rgv_dsta_no" property="rgvDstaNo" /> </resultMap>