#
zwl
2026-02-09 ad79ba405b2d1ac96423f88f4e8a76c584b9d38a
src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
@@ -30,6 +30,9 @@
import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import com.zy.core.utils.WmsOperateUtils;
import com.zy.asrs.entity.BasCrnpErrLog;
import com.zy.asrs.service.BasCrnpErrLogService;
@@ -45,6 +48,7 @@
    private ZyCrnConnectDriver zyCrnConnectDriver;
    private CrnProtocol crnProtocol;
    private int deviceLogCollectTime = 200;
    private List<Integer> lastReportedIndices = new ArrayList<>();
    public ZySiemensCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
        this.deviceConfig = deviceConfig;
@@ -81,6 +85,16 @@
                    if (step == 2) {
                        sendCommand((CrnCommand) task.getData());
                    }
                    if (step == 3) {
                        sendCommand1((CrnCommand) task.getData());
                    }
                    if (step == 4) {
                        sendCommand2((CrnCommand) task.getData());
                    }
                    if (step == 5) {
                        sendCommand3((CrnCommand) task.getData());
                    }
                    Thread.sleep(100);
                } catch (Exception e) {
@@ -178,6 +192,33 @@
        crnProtocol.setYDistance(crnStatus.getYDistance());
        crnProtocol.setXDuration(crnStatus.getXDuration());
        crnProtocol.setYDuration(crnStatus.getYDuration());
        crnProtocol.setWeight(crnStatus.getWeight());
        crnProtocol.setDb110Data(crnStatus.getDb110Data());
        // 上报堆垛机DB110状态数据
        short[] db110Data = crnProtocol.getDb110Data();
        List<Integer> currentIndices = new ArrayList<>();
        if (db110Data != null) {
            for (int i = 0; i < db110Data.length; i++) {
                if (db110Data[i] == 1) {
                    currentIndices.add(i);
                }
            }
        }
        //!currentIndices.equals(lastReportedIndices)
        boolean changed = true;
        if (changed) {
            try {
                WmsOperateUtils wmsOperateUtils = SpringUtils.getBean(WmsOperateUtils.class);
                if (wmsOperateUtils != null) {
                    wmsOperateUtils.reportCrnDb110Status(crnProtocol.getCrnNo(), currentIndices);
                    lastReportedIndices = new ArrayList<>(currentIndices);
                }
            } catch (Exception e) {
                log.error("Report Crn Db110 Status Fail", e);
            }
        }
        OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), deviceConfig.getDeviceNo()));
@@ -256,15 +297,15 @@
    public CrnCommand getPickAndPutCommand(String sourceLocNo, String targetLocNo, Integer taskNo, Integer crnNo) {
        CrnCommand crnCommand = new CrnCommand();
        crnCommand.setCrnNo(crnNo); // 堆垛机编号
        crnCommand.setTaskNo(taskNo.shortValue()); // 工作号
        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE.id.shortValue()); // 任务模式:  库位移转
        crnCommand.setSourcePosX((short) Utils.getRow(sourceLocNo));     // 源库位排
        crnCommand.setSourcePosY((short) Utils.getBay(sourceLocNo));     // 源库位列
        crnCommand.setSourcePosZ((short) Utils.getLev(sourceLocNo));     // 源库位层
        crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 目标库位排
        crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 目标库位列
        crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 目标库位层
        crnCommand.setCommand((short) 1);     // 任务确认
        crnCommand.setTaskNo(taskNo); // 工作号
        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE.id); // 任务模式:  库位移转
        crnCommand.setSourcePosX(Utils.getRow(sourceLocNo));     // 源库位排
        crnCommand.setSourcePosY(Utils.getBay(sourceLocNo));     // 源库位列
        crnCommand.setSourcePosZ(Utils.getLev(sourceLocNo));     // 源库位层
        crnCommand.setDestinationPosX(Utils.getRow(targetLocNo));     // 目标库位排
        crnCommand.setDestinationPosY(Utils.getBay(targetLocNo));     // 目标库位列
        crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo));     // 目标库位层
        crnCommand.setCommand(1);     // 任务确认
        return crnCommand;
    }
@@ -272,13 +313,13 @@
    public CrnCommand getMoveCommand(String targetLocNo, Integer taskNo, Integer crnNo) {
        CrnCommand crnCommand = new CrnCommand();
        crnCommand.setCrnNo(crnNo); // 堆垛机编号
        crnCommand.setTaskNo(taskNo.shortValue()); // 工作号
        crnCommand.setAckFinish((short) 0);  // 任务完成确认位
        crnCommand.setTaskMode(CrnTaskModeType.CRN_MOVE.id.shortValue()); // 任务模式:  堆垛机移动
        crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 目标库位排
        crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 目标库位列
        crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 目标库位层
        crnCommand.setCommand((short) 1);     // 任务确认
        crnCommand.setTaskNo(taskNo); // 工作号
        crnCommand.setAckFinish(0);  // 任务完成确认位
        crnCommand.setTaskMode(CrnTaskModeType.CRN_MOVE.id); // 任务模式:  堆垛机移动
        crnCommand.setDestinationPosX(Utils.getRow(targetLocNo));     // 目标库位排
        crnCommand.setDestinationPosY(Utils.getBay(targetLocNo));     // 目标库位列
        crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo));     // 目标库位层
        crnCommand.setCommand(1);     // 任务确认
        return crnCommand;
    }
@@ -286,16 +327,16 @@
    public CrnCommand getResetCommand(Integer crnNo) {
        CrnCommand crnCommand = new CrnCommand();
        crnCommand.setCrnNo(crnNo); // 堆垛机编号
        crnCommand.setTaskNo((short) 0); // 工作号
        crnCommand.setAckFinish((short) 1);  // 任务完成确认位
        crnCommand.setTaskMode(CrnTaskModeType.NONE.id.shortValue()); // 任务模式
        crnCommand.setSourcePosX((short)0);     // 源库位排
        crnCommand.setSourcePosY((short)0);     // 源库位列
        crnCommand.setSourcePosZ((short)0);     // 源库位层
        crnCommand.setDestinationPosX((short)0);     // 目标库位排
        crnCommand.setDestinationPosY((short)0);     // 目标库位列
        crnCommand.setDestinationPosZ((short)0);     // 目标库位层
        crnCommand.setCommand((short) 1);     // 任务确认
        crnCommand.setTaskNo(0); // 工作号
        crnCommand.setAckFinish(1);  // 任务完成确认位
        crnCommand.setTaskMode(CrnTaskModeType.NONE.id); // 任务模式
        crnCommand.setSourcePosX(0);     // 源库位排
        crnCommand.setSourcePosY(0);     // 源库位列
        crnCommand.setSourcePosZ(0);     // 源库位层
        crnCommand.setDestinationPosX(0);     // 目标库位排
        crnCommand.setDestinationPosY(0);     // 目标库位列
        crnCommand.setDestinationPosZ(0);     // 目标库位层
        crnCommand.setCommand(1);     // 任务确认
        return crnCommand;
    }
@@ -331,4 +372,119 @@
            }
        }
    }
    @Override
    public synchronized CommandResponse sendCommand1(CrnCommand command) {
        this.crnProtocol.setLastCommandTime(System.currentTimeMillis());
        CommandResponse response = null;
        try {
            response = zyCrnConnectDriver.sendCommand1(command);
            return response;
        } finally {
            String sourceLocNo = Utils.getLocNo(command.getSourcePosX(), command.getSourcePosY(), command.getSourcePosZ());
            String targetLocNo = Utils.getLocNo(command.getDestinationPosX(), command.getDestinationPosY(), command.getDestinationPosZ());
            BasCrnpOptService bean = SpringUtils.getBean(BasCrnpOptService.class);
            ZyCrnStatusEntity statusEntity = zyCrnConnectDriver.getStatus();
            BasCrnpOpt basCrnpOpt = new BasCrnpOpt(
                    command.getTaskNo().intValue(),
                    command.getCrnNo(),
                    new Date(),
                    String.valueOf(command.getTaskMode()),
                    sourceLocNo,
                    targetLocNo,
                    null,
                    null,
                    null,
                    JSON.toJSONString(command),
                    JSON.toJSONString(statusEntity),
                    1,
                    JSON.toJSONString(response)
            );
            if (bean != null) {
                bean.insert(basCrnpOpt);
            }
        }
    }
    /**
     * 管理站点的白灯情况
     * 1(亮,闪烁,上位下发任务)
     * 默认0(暗)
     * @param command
     * @return
     */
    @Override
    public synchronized CommandResponse sendCommand2(CrnCommand command) {
        this.crnProtocol.setLastCommandTime(System.currentTimeMillis());
        CommandResponse response = null;
        try {
            response = zyCrnConnectDriver.sendCommand2(command);
            return response;
        } finally {
            String sourceLocNo = Utils.getLocNo(command.getSourcePosX(), command.getSourcePosY(), command.getSourcePosZ());
            String targetLocNo = Utils.getLocNo(command.getDestinationPosX(), command.getDestinationPosY(), command.getDestinationPosZ());
            BasCrnpOptService bean = SpringUtils.getBean(BasCrnpOptService.class);
            ZyCrnStatusEntity statusEntity = zyCrnConnectDriver.getStatus();
            BasCrnpOpt basCrnpOpt = new BasCrnpOpt(
                    command.getTaskNo().intValue(),
                    command.getCrnNo(),
                    new Date(),
                    String.valueOf(command.getTaskMode()),
                    sourceLocNo,
                    targetLocNo,
                    null,
                    null,
                    null,
                    JSON.toJSONString(command),
                    JSON.toJSONString(statusEntity),
                    1,
                    JSON.toJSONString(response)
            );
            if (bean != null) {
                bean.insert(basCrnpOpt);
            }
        }
    }
    /**
     * 管理站点的黄色按钮状态及颜色
     * 1:人工按按钮确认
     * 2:上位机接收完成,运行给
     * 0:任务结束上位机清除状态
     * @param command
     * @return
     */
    @Override
    public synchronized CommandResponse sendCommand3(CrnCommand command) {
        this.crnProtocol.setLastCommandTime(System.currentTimeMillis());
        CommandResponse response = null;
        try {
            response = zyCrnConnectDriver.sendCommand3(command);
            return response;
        } finally {
            String sourceLocNo = Utils.getLocNo(command.getSourcePosX(), command.getSourcePosY(), command.getSourcePosZ());
            String targetLocNo = Utils.getLocNo(command.getDestinationPosX(), command.getDestinationPosY(), command.getDestinationPosZ());
            BasCrnpOptService bean = SpringUtils.getBean(BasCrnpOptService.class);
            ZyCrnStatusEntity statusEntity = zyCrnConnectDriver.getStatus();
            BasCrnpOpt basCrnpOpt = new BasCrnpOpt(
                    command.getTaskNo().intValue(),
                    command.getCrnNo(),
                    new Date(),
                    String.valueOf(command.getTaskMode()),
                    sourceLocNo,
                    targetLocNo,
                    null,
                    null,
                    null,
                    JSON.toJSONString(command),
                    JSON.toJSONString(statusEntity),
                    1,
                    JSON.toJSONString(response)
            );
            if (bean != null) {
                bean.insert(basCrnpOpt);
            }
        }
    }
}