| | |
| | | STATION_RUN_BLOCK_REROUTE_STATE_("station_run_block_reroute_state_"), |
| | | STATION_RUN_BLOCK_TASK_LOOP_STATE_("station_run_block_task_loop_state_"), |
| | | CHECK_STATION_IDLE_RECOVER_LIMIT_("check_station_idle_recover_limit_"), |
| | | STATION_COMMAND_DISPATCH_DEDUP_("station_command_dispatch_dedup_"), |
| | | CHECK_SHALLOW_LOC_STATUS_LIMIT("check_shallow_loc_status_limit_"), |
| | | GENERATE_ENABLE_IN_STATION_DATA_LIMIT("generate_enable_in_station_data_limit_"), |
| | | GENERATE_STATION_BACK_LIMIT("generate_station_back_limit_"), |
| | |
| | | return commandResponse; |
| | | } |
| | | |
| | | if (isDuplicateStationCommand(statusEntity, command)) { |
| | | log.info("输送线命令重复,已跳过当前站点命令。任务号={},站点号={},目标站={},taskWriteIdx={},currentTaskNo={},currentTargetStaNo={}", |
| | | command.getTaskNo(), |
| | | command.getStationId(), |
| | | command.getTargetStaNo(), |
| | | taskWriteIdx, |
| | | statusEntity == null ? null : statusEntity.getTaskNo(), |
| | | statusEntity == null ? null : statusEntity.getTargetStaNo()); |
| | | commandResponse.setResult(true); |
| | | commandResponse.setMessage("命令重复,已跳过下发"); |
| | | return commandResponse; |
| | | } |
| | | |
| | | Integer duplicateSlotIdx = findDuplicateTaskAreaSlot(stationIdx, command); |
| | | if (duplicateSlotIdx != null) { |
| | | log.info("输送线命令重复,已跳过任务写入区重复命令。任务号={},站点号={},目标站={},taskWriteIdx={},duplicateSlotIdx={}", |
| | | command.getTaskNo(), |
| | | command.getStationId(), |
| | | command.getTargetStaNo(), |
| | | taskWriteIdx, |
| | | duplicateSlotIdx); |
| | | commandResponse.setResult(true); |
| | | commandResponse.setMessage("任务区已有相同命令,已跳过下发"); |
| | | return commandResponse; |
| | | } |
| | | |
| | | int useTaskWriteIdx = getTaskWriteIdx(stationIdx, taskWriteIdx); |
| | | if (useTaskWriteIdx == -1) { |
| | | commandResponse.setMessage("命令下发超时,无法找到可用下发区域"); |
| | |
| | | } |
| | | } |
| | | return useIdx; |
| | | } |
| | | |
| | | private boolean isDuplicateStationCommand(ZyStationStatusEntity statusEntity, StationCommand command) { |
| | | if (statusEntity == null || command == null) { |
| | | return false; |
| | | } |
| | | return command.getTaskNo() != null |
| | | && command.getTargetStaNo() != null |
| | | && command.getTaskNo().equals(statusEntity.getTaskNo()) |
| | | && command.getTargetStaNo().equals(statusEntity.getTargetStaNo()); |
| | | } |
| | | |
| | | private Integer findDuplicateTaskAreaSlot(int stationIdx, StationCommand command) { |
| | | if (stationIdx < 0 || command == null || command.getTaskNo() == null || command.getTargetStaNo() == null) { |
| | | return null; |
| | | } |
| | | OperateResultExOne<byte[]> resultTask = siemensNet.Read("DB13." + (stationIdx * TASK_AREA_LENGTH), (short) TASK_AREA_LENGTH); |
| | | if (!resultTask.IsSuccess || resultTask.Content == null) { |
| | | return null; |
| | | } |
| | | for (int slotIdx = 1; slotIdx <= TASK_AREA_SLOT_COUNT; slotIdx++) { |
| | | int offset = slotIdx * TASK_AREA_SLOT_SIZE; |
| | | int taskNo = siemensNet.getByteTransform().TransInt32(resultTask.Content, offset); |
| | | int targetPoint = siemensNet.getByteTransform().TransInt16(resultTask.Content, offset + 6); |
| | | if (command.getTaskNo().equals(taskNo) |
| | | && command.getTargetStaNo().equals(targetPoint)) { |
| | | return slotIdx; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private byte[] readTaskBufferRaw() { |
| | |
| | | e.printStackTrace(); |
| | | } finally { |
| | | BasStationOptService optService = SpringUtils.getBean(BasStationOptService.class); |
| | | if (optService == null) { |
| | | return commandResponse; |
| | | } |
| | | List<ZyStationStatusEntity> statusListEntity = zyStationConnectDriver.getStatus(); |
| | | ZyStationStatusEntity matched = null; |
| | | if (statusListEntity != null) { |
| | |
| | | null, |
| | | JSON.toJSONString(command), |
| | | JSON.toJSONString(matched), |
| | | 1, |
| | | commandResponse != null && Boolean.TRUE.equals(commandResponse.getResult()) ? 1 : 0, |
| | | JSON.toJSONString(commandResponse) |
| | | ); |
| | | if (optService != null) { |
| | | optService.save(basStationOpt); |
| | | } |
| | | optService.save(basStationOpt); |
| | | } |
| | | return commandResponse; |
| | | } |
| | |
| | | e.printStackTrace(); |
| | | } finally { |
| | | BasStationOptService optService = SpringUtils.getBean(BasStationOptService.class); |
| | | if (optService == null) { |
| | | return commandResponse; |
| | | } |
| | | List<ZyStationStatusEntity> statusListEntity = zyStationConnectDriver.getStatus(); |
| | | ZyStationStatusEntity matched = null; |
| | | if (statusListEntity != null) { |
| | |
| | | null, |
| | | JSON.toJSONString(command), |
| | | JSON.toJSONString(matched), |
| | | 1, |
| | | commandResponse != null && Boolean.TRUE.equals(commandResponse.getResult()) ? 1 : 0, |
| | | JSON.toJSONString(commandResponse) |
| | | ); |
| | | if (optService != null) { |
| | | optService.save(basStationOpt); |
| | | } |
| | | optService.save(basStationOpt); |
| | | } |
| | | return commandResponse; |
| | | } |
| | |
| | | public class StationOperateProcessUtils { |
| | | private static final int LOOP_LOAD_RESERVE_EXPIRE_SECONDS = 120; |
| | | private static final int OUT_ORDER_DISPATCH_LIMIT_SECONDS = 2; |
| | | private static final int STATION_COMMAND_DISPATCH_DEDUP_SECONDS = 10; |
| | | private static final int STATION_IDLE_RECOVER_SECONDS = 10; |
| | | private static final int STATION_IDLE_RECOVER_LIMIT_SECONDS = 30; |
| | | private static final int STATION_IDLE_TRACK_EXPIRE_SECONDS = 60 * 60; |
| | |
| | | wrkMast.setModiTime(now); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | wrkAnalysisService.markInboundStationStart(wrkMast, now); |
| | | MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command)); |
| | | offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "stationInExecute"); |
| | | News.info("输送站点入库命令下发成功,站点号={},工作号={},命令数据={}", stationId, wrkMast.getWrkNo(), JSON.toJSONString(command)); |
| | | redisUtil.set(RedisKeyType.STATION_IN_EXECUTE_LIMIT.key + stationId, "lock", 5); |
| | | loadGuardState.reserveLoopTask(loopHitResult.getLoopNo()); |
| | |
| | | wrkMast.setModiTime(now); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | wrkAnalysisService.markOutboundStationStart(wrkMast, now); |
| | | MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command)); |
| | | offerDevpCommandWithDedup(stationObjModel.getDeviceNo(), command, "crnStationOutExecute"); |
| | | News.info("输送站点出库命令下发成功,站点号={},工作号={},命令数据={}", stationProtocol.getStationId(), wrkMast.getWrkNo(), JSON.toJSONString(command)); |
| | | redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_LIMIT.key + stationProtocol.getStationId(), "lock", 5); |
| | | redisUtil.del(RedisKeyType.CRN_OUT_TASK_COMPLETE_STATION_INFO.key + wrkMast.getWrkNo()); |
| | |
| | | wrkMast.setSystemMsg(""); |
| | | wrkMast.setIoTime(new Date()); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command)); |
| | | offerDevpCommandWithDedup(stationObjModel.getDeviceNo(), command, "dualCrnStationOutExecute"); |
| | | notifyUtils.notify(String.valueOf(SlaveType.Devp), stationObjModel.getDeviceNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.STATION_OUT_TASK_RUN, null); |
| | | News.info("输送站点出库命令下发成功,站点号={},工作号={},命令数据={}", stationProtocol.getStationId(), wrkMast.getWrkNo(), JSON.toJSONString(command)); |
| | | redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_LIMIT.key + stationProtocol.getStationId(), "lock", 5); |
| | |
| | | } |
| | | |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command)); |
| | | offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "checkStationRunBlock_direct"); |
| | | } |
| | | } else { |
| | | News.error("请求WMS接口失败!!!response:{}", response); |
| | |
| | | continue; |
| | | } |
| | | |
| | | MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command)); |
| | | offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "checkStationRunBlock_reroute"); |
| | | syncOutOrderWatchState(wrkMast, stationProtocol.getStationId(), outOrderStationIds, dispatchDecision, command); |
| | | News.info("输送站点堵塞后重新计算路径命令下发成功,站点号={},工作号={},命令数据={}", stationProtocol.getStationId(), wrkMast.getWrkNo(), JSON.toJSONString(command)); |
| | | } |
| | |
| | | continue; |
| | | } |
| | | syncOutOrderWatchState(wrkMast, stationProtocol.getStationId(), outOrderStationIds, dispatchDecision, command); |
| | | MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command)); |
| | | offerDevpCommandWithDedup(stationObjModel.getDeviceNo(), command, "checkStationOutOrder"); |
| | | News.info(dispatchDecision.isCircle() ? "{}任务进行绕圈" : "{}任务直接去目标点", wrkMast.getWrkNo()); |
| | | } |
| | | } |
| | |
| | | continue; |
| | | } |
| | | syncOutOrderWatchState(wrkMast, stationProtocol.getStationId(), outOrderList, dispatchDecision, command); |
| | | MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command)); |
| | | offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "watchCircleStation"); |
| | | } |
| | | } |
| | | } |
| | |
| | | return; |
| | | } |
| | | |
| | | MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command)); |
| | | offerDevpCommandWithDedup(basDevp.getDevpNo(), command, "checkStationIdleRecover"); |
| | | syncOutOrderWatchState(wrkMast, stationProtocol.getStationId(), outOrderList, dispatchDecision, command); |
| | | saveStationTaskIdleTrack(new StationTaskIdleTrack(wrkMast.getWrkNo(), stationProtocol.getStationId(), System.currentTimeMillis())); |
| | | News.info("输送站点任务停留{}秒未运行,已重新计算路径并重启运行,站点号={},目标站={},工作号={},清理旧分段命令数={},命令数据={}", |
| | |
| | | return count; |
| | | } |
| | | |
| | | private boolean offerDevpCommandWithDedup(Integer deviceNo, StationCommand command, String scene) { |
| | | if (deviceNo == null || command == null) { |
| | | return false; |
| | | } |
| | | String dedupKey = buildStationCommandDispatchDedupKey(deviceNo, command); |
| | | if (redisUtil != null) { |
| | | Object lock = redisUtil.get(dedupKey); |
| | | if (lock != null) { |
| | | News.info("输送站点命令短时重复派发,已跳过。scene={},deviceNo={},taskNo={},stationId={},targetStaNo={},commandType={}", |
| | | scene, |
| | | deviceNo, |
| | | command.getTaskNo(), |
| | | command.getStationId(), |
| | | command.getTargetStaNo(), |
| | | command.getCommandType()); |
| | | return false; |
| | | } |
| | | redisUtil.set(dedupKey, "lock", STATION_COMMAND_DISPATCH_DEDUP_SECONDS); |
| | | } |
| | | boolean offered = MessageQueue.offer(SlaveType.Devp, deviceNo, new Task(2, command)); |
| | | if (!offered && redisUtil != null) { |
| | | redisUtil.del(dedupKey); |
| | | } |
| | | return offered; |
| | | } |
| | | |
| | | private String buildStationCommandDispatchDedupKey(Integer deviceNo, StationCommand command) { |
| | | return RedisKeyType.STATION_COMMAND_DISPATCH_DEDUP_.key |
| | | + command.getTaskNo() + "_" |
| | | + command.getStationId(); |
| | | } |
| | | |
| | | private int clearIssuedMoveCommandsDuringIdleStay(StationTaskIdleTrack idleTrack, |
| | | Integer taskNo, |
| | | Integer stationId) { |