|  |  | 
 |  |  | import com.zy.asrs.framework.common.SpringUtils; | 
 |  |  | import com.zy.asrs.wcs.core.entity.BasConveyor; | 
 |  |  | import com.zy.asrs.wcs.core.entity.BasConveyorSta; | 
 |  |  | import com.zy.asrs.wcs.core.entity.DeviceBarcode; | 
 |  |  | import com.zy.asrs.wcs.core.service.BasConveyorService; | 
 |  |  | import com.zy.asrs.wcs.core.service.BasConveyorStaService; | 
 |  |  | import com.zy.asrs.wcs.core.service.DeviceBarcodeService; | 
 |  |  | import com.zy.asrs.wcs.core.utils.RedisUtil; | 
 |  |  | import com.zy.asrs.wcs.rcs.News; | 
 |  |  | import com.zy.asrs.wcs.rcs.cache.OutputQueue; | 
 |  |  | import com.zy.asrs.wcs.rcs.cache.SlaveConnection; | 
 |  |  | import com.zy.asrs.wcs.rcs.entity.Device; | 
 |  |  | import com.zy.asrs.wcs.rcs.model.dto.WorkModeTypeDto; | 
 |  |  | import com.zy.asrs.wcs.rcs.model.enums.SlaveType; | 
 |  |  | import com.zy.asrs.wcs.rcs.model.enums.WorkModeType; | 
 |  |  | import com.zy.asrs.wcs.rcs.model.protocol.StaProtocol; | 
 |  |  | import com.zy.asrs.wcs.rcs.thread.BarcodeThread; | 
 |  |  | import com.zy.asrs.wcs.rcs.thread.DevpThread; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  |  | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     private int barcodeSize = 2; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入出库模式 | 
 |  |  |      * 0:未知 | 
 |  |  |      * 1:入库启动中 | 
 |  |  |      * 2.入库模式 | 
 |  |  |      * 3.出库启动中 (不能生成入库工作档) | 
 |  |  |      * 4.出库模式 | 
 |  |  |      */ | 
 |  |  |     private Map<Integer, WorkModeTypeDto> workModeTypes = new ConcurrentHashMap<>(); | 
 |  |  |  | 
 |  |  |     public SuopaiSiemensDevpThread(Device device, RedisUtil redisUtil) { | 
 |  |  |         this.device = device; | 
 |  |  |         this.redisUtil = redisUtil; | 
 |  |  |  | 
 |  |  |         workModeTypes.put(101, new WorkModeTypeDto(101, WorkModeType.NONE, "DB1001.120")); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private ArrayList<BasConveyorSta> getStaNo() { | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void read() throws InterruptedException { | 
 |  |  |         updateWorkMode(); | 
 |  |  |         ArrayList<BasConveyorSta> staNos = getStaNo(); | 
 |  |  |         int staNoSize = staNos.size(); | 
 |  |  |         OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize*8)); | 
 |  |  |         OperateResultExOne<byte[]> result = siemensS7Net.Read("DB1000.100", (short) (staNoSize * 40)); | 
 |  |  |         if (result.IsSuccess) { | 
 |  |  |             for (int i = 0; i < staNoSize; i++) { | 
 |  |  |                 BasConveyorSta siteStation = staNos.get(i); | 
 |  |  | 
 |  |  |                     staProtocol.setSiteId(siteId); | 
 |  |  |                     station.put(siteId, staProtocol); | 
 |  |  |                 } | 
 |  |  |                 staProtocol.setStaNo( siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4 ));   // 目标站 | 
 |  |  |                 Thread.sleep(300); | 
 |  |  |                 staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, i * 8));     // 工作号 | 
 |  |  |                 staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 2));     // 工作号 | 
 |  |  |                 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 4));   // 目标站 | 
 |  |  |                 staProtocol.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 6) == 2);  // 自动 | 
 |  |  |                 staProtocol.setLoading(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 32) == 1);  // 有物 | 
 |  |  |                 staProtocol.setInEnable(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 14) == 1); // 可入 | 
 |  |  |                 staProtocol.setOutEnable(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 14) == 2);// 可出 | 
 |  |  |                 staProtocol.setWorkMode((int) siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 8));// 工作模式 | 
 |  |  |  | 
 |  |  |                 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]);  // 满托盘 | 
 |  |  |                 staProtocol.setHigh(status[6]);     // 高库位 | 
 |  |  |                 staProtocol.setLow(status[7]);      // 低库位 | 
 |  |  |                 String barcode = siemensS7Net.getByteTransform().TransString(result.Content,58,8, "UTF-8");// 条码 | 
 |  |  |                 BasConveyorStaService basConveyorStaService = SpringUtils.getBean(BasConveyorStaService.class); | 
 |  |  |                 DeviceBarcodeService deviceBarcodeService = SpringUtils.getBean(DeviceBarcodeService.class); | 
 |  |  |                 BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, siteId)); | 
 |  |  |                 if (basConveyorSta != null) { | 
 |  |  |                     DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId()); | 
 |  |  |                     if (deviceBarcode != null) { | 
 |  |  |                         BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId())); | 
 |  |  |                         if (barcodeThread != null) { | 
 |  |  |                             barcodeThread.setBarcode(barcode); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | //                staProtocol.setEmptyMk(status[4]);  // 空板信号 | 
 |  |  | //                staProtocol.setFullPlt(status[5]);  // 满托盘 | 
 |  |  | //                staProtocol.setHigh(status[6]);     // 高库位 | 
 |  |  | //                staProtocol.setLow(status[7]);      // 低库位 | 
 |  |  |  | 
 |  |  |                 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { | 
 |  |  |                     staProtocol.setPakMk(true); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Thread.sleep(200); | 
 |  |  |         ArrayList<BasConveyorSta> errorStaNo = getStaNo(); | 
 |  |  |         OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB101.800.0", (short) (errorStaNo.size() * 4)); | 
 |  |  |         if (result3.IsSuccess) { | 
 |  |  |             for (int i = 0; i < errorStaNo.size(); i++) { | 
 |  |  |                 BasConveyorSta siteStation = errorStaNo.get(i); | 
 |  |  |                 Integer siteId = siteStation.getSiteNo(); // 站点编号 | 
 |  |  |                 StaProtocol staProtocol = station.get(siteId); | 
 |  |  |                 boolean[] status = siemensS7Net.getByteTransform().TransBool(result3.Content, (i * 4 + 2), 2); | 
 |  |  |                 staProtocol.setFrontErr(status[0]);//前超限 | 
 |  |  |                 staProtocol.setBackErr(status[1]);//后超限 | 
 |  |  |                 staProtocol.setHighErr(status[2]);//超高 | 
 |  |  |                 staProtocol.setLeftErr(status[3]);//左超限 | 
 |  |  |                 staProtocol.setRightErr(status[4]);//右超限 | 
 |  |  |                 staProtocol.setWeightErr(status[5]);//超重 | 
 |  |  |                 staProtocol.setBarcodeErr(status[6]);//扫码失败 | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  | 
 |  |  |     public boolean writeWorkNo(int siteId, short workNo) { | 
 |  |  |         int index = findStaNosIndex(siteId); | 
 |  |  |  | 
 |  |  |         OperateResult write = siemensS7Net.Write("DB100." + index*6, workNo);    // 工作号 | 
 |  |  |         OperateResult write = siemensS7Net.Write("DB1001." + (index * 20 + 100 + 2), workNo);    // 工作号 | 
 |  |  |  | 
 |  |  |         if (!write.IsSuccess) { | 
 |  |  |             StaProtocol staProtocol = station.get(siteId); | 
 |  |  | 
 |  |  |     public boolean writeStaNo(int siteId,short staNo) { | 
 |  |  |         int index = findStaNosIndex(siteId); | 
 |  |  |  | 
 |  |  |         OperateResult write = siemensS7Net.Write("DB100." + (index*6+4), staNo);    // 目标站 | 
 |  |  |         OperateResult write = siemensS7Net.Write("DB1001." + (index * 20 + 100 + 4), staNo);    // 目标站 | 
 |  |  |  | 
 |  |  |         if (!write.IsSuccess) { | 
 |  |  |             StaProtocol staProtocol = station.get(siteId); | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean writeWorkSta(int siteId, short staNo, short workNo) { | 
 |  |  |     public boolean writeWorkSta(int siteId, short workNo, short staNo) { | 
 |  |  |         int index = findStaNosIndex(siteId); | 
 |  |  |  | 
 |  |  |         OperateResult write1 = siemensS7Net.Write("DB100." + index*6, workNo);    // 工作号 | 
 |  |  |         OperateResult write2 = siemensS7Net.Write("DB100." + (index*6+4), staNo);    // 目标站 | 
 |  |  |         String workNoAddress = "DB1001." + (index * 20 + 100 + 2); | 
 |  |  |         String staNoAddress = "DB1001." + (index * 20 + 100 + 4); | 
 |  |  |         OperateResult write1 = null;    // 工作号 | 
 |  |  |         OperateResult write2 = null;     // 目标站 | 
 |  |  |  | 
 |  |  |         if (!(write1.IsSuccess && write2.IsSuccess)) { | 
 |  |  |             StaProtocol staProtocol = station.get(siteId); | 
 |  |  |             if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) { | 
 |  |  |                 staProtocol.setPakMk(true); | 
 |  |  |         //任务下发次数 | 
 |  |  |         int writeCount = 0; | 
 |  |  |         do { | 
 |  |  |             write1 = siemensS7Net.Write(workNoAddress, workNo);    // 工作号 | 
 |  |  |             write2 = siemensS7Net.Write(staNoAddress, staNo);    // 目标站 | 
 |  |  |             if ((write1.IsSuccess && write2.IsSuccess)) { | 
 |  |  |                 OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB1000." + (index * 40 + 100 + 2), (short) 4); | 
 |  |  |                 if (readResult.IsSuccess) { | 
 |  |  |                     short workNo2 = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0); | 
 |  |  |                     short staNo2 = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 2); | 
 |  |  |                     if (workNo == workNo2 && staNo == staNo2) { | 
 |  |  |                         //任务命令写入成功 | 
 |  |  |                         log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},{},写入次数={}", siteId, JSON.toJSON(workNo), JSON.toJSON(staNo), writeCount); | 
 |  |  |                         return true; | 
 |  |  |                     } else {//返回结果是成功了,但是真实值不相同 | 
 |  |  |                         writeCount++; | 
 |  |  |                         log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},{},写入次数={}", siteId, JSON.toJSON(workNo), JSON.toJSON(staNo), writeCount); | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     writeCount++; | 
 |  |  |                     log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},{},写入次数={}", siteId, JSON.toJSON(workNo), JSON.toJSON(staNo), writeCount); | 
 |  |  |                 } | 
 |  |  |             }else { | 
 |  |  |                 writeCount++; | 
 |  |  |             } | 
 |  |  |             OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", device.getId(), JSON.toJSON(staProtocol))); | 
 |  |  |             log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", device.getId(), JSON.toJSON(staProtocol)); | 
 |  |  |         } else { | 
 |  |  |             OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), device.getId(), JSON.toJSON(staNo))); | 
 |  |  |             log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}",  device.getId(), JSON.toJSON(staNo)); | 
 |  |  |             return true; | 
 |  |  |         }while (writeCount < 5) ; | 
 |  |  |         StaProtocol staProtocol = station.get(siteId); | 
 |  |  |         if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) { | 
 |  |  |             staProtocol.setPakMk(true); | 
 |  |  |         } | 
 |  |  |         OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", device.getId(), JSON.toJSON(staProtocol))); | 
 |  |  |         log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", device.getId(), JSON.toJSON(staProtocol)); | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |             staProtocol.setPakMk(pakMk); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void updateWorkMode() { | 
 |  |  |         for (Map.Entry<Integer, WorkModeTypeDto> entry : workModeTypes.entrySet()) { | 
 |  |  |             WorkModeTypeDto workModeTypeDto = entry.getValue(); | 
 |  |  |             WorkModeType workModeType = workModeTypeDto.getWorkModeType(); | 
 |  |  |             if (workModeType != WorkModeType.NONE) { | 
 |  |  |                 if (!siemensS7Net.Write(workModeTypeDto.getAddress(), workModeType.id).IsSuccess) { | 
 |  |  |                     OutputQueue.DEVP.offer(MessageFormat.format("写入输送线{}入出库模式失败。输送线编号={}", workModeTypeDto.getSiteId(), device.getId())); | 
 |  |  |                     log.error("写入输送线{}入出库模式失败。输送线编号={}", workModeTypeDto.getSiteId(), device.getId()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean switchWorkMode(int siteId, int workMode) { | 
 |  |  |         WorkModeTypeDto workModeTypeDto = workModeTypes.get(siteId); | 
 |  |  |         if(workModeTypeDto == null) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         workModeTypeDto.setWorkModeType(WorkModeType.get((short) workMode)); | 
 |  |  |         workModeTypes.put(siteId, workModeTypeDto); | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  | } |