| | |
| | | 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() { |