#
whycq
2023-06-28 cf2e4086d44e51bcd7407133d460dda498b45eff
src/main/java/com/zy/core/thread/SteThread.java
@@ -67,6 +67,8 @@
                    // 写入数据
                    case 2:
                        write((SteCommand) task.getData());
//                        Thread.sleep(200);
//                        readStatus();
                        break;
                    default:
                        break;
@@ -89,7 +91,7 @@
            steProtocol = new SteProtocol();
        }
        steProtocol.setSteNo(slave.getId().shortValue());
        steProtocol.setMode((short) 0);
        steProtocol.setMode((short) -1);
        steProtocol.setStatus(SteStatusType.OFF_LINE);
        steProtocol.setTaskNo((short) 0);
        steProtocol.setExecute(false);
@@ -120,7 +122,7 @@
    /**
     * 读取状态
     */
    private void readStatus(){
    private synchronized void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensS7Net.Read("V800", (short) 70);
            if (result.IsSuccess) {
@@ -181,13 +183,15 @@
                // 复位信号
                if (steProtocol.getWaiting()) {
                    News.error("-------------------------------------------第一步、[穿梭车号:{}, 工作号:{}]==>> 状态为3,等待WCS确认!!",
                            slave.getId(),steProtocol.getTaskNo());
                    News.info("-------------第一步、[穿梭车号:{}, 工作号:{}]==>> 状态为{},等待WCS确认!!{}",
                            slave.getId(),steProtocol.getTaskNo(),steProtocol.getStatus(), resetFlag);
                    if (resetFlag) {
                        SteCommand steCommand = new SteCommand();
                        steCommand.setComplete(true);
                        if (write(steCommand) && confirmPos()) {
                            resetFlag = false;
                            News.info("第二步、发送复位命令成功 resetFlag = false,[穿梭车号:{}, 工作号:{}]==>> 状态为{},等待WCS确认!!{}",
                                    slave.getId(),steProtocol.getTaskNo(),steProtocol.getStatus(), resetFlag);
                        }
                    }
                }
@@ -225,7 +229,7 @@
    /**
     * 写入数据
     */
    private boolean write(SteCommand command){
    private synchronized boolean write(SteCommand command){
        if (null == command) {
            News.error("穿梭车写入命令为空");
            return false;
@@ -235,8 +239,8 @@
        // 开始任务
        if (!command.getComplete()) {
            //组织任务前,先清空写任务确认位,以及任务完成确认位
            siemensS7Net.Write("V2000.0", false);
            siemensS7Net.Write("V2000.1", false);
            OperateResult result01 = siemensS7Net.Write("V2000.0", false);
            OperateResult result02 = siemensS7Net.Write("V2000.1", false);
            // 1.任务号
            OperateResult result0 = siemensS7Net.Write("V998", command.getTaskNo().shortValue());
            try {
@@ -331,15 +335,21 @@
            if (result1.IsSuccess) {
                short taskNo = siemensS7Net.getByteTransform().TransInt16(result1.Content, 0);
                short taskType = siemensS7Net.getByteTransform().TransInt16(result1.Content, 2);
                readStatus();
//                readStatus();
                News.info("穿梭板任务下发成功后休眠200ms立即回读写入数据,穿梭板ID={}, 任务号={}, 作业类型={}",slave.getId(), taskNo, taskType);
                News.info("穿梭板任务下发成功后休眠200ms立即回读穿梭板状态,穿梭板ID={}, 任务号={}, 穿梭板状态={}",slave.getId(), steProtocol.getTaskNo(),steProtocol.getStatus());
            }
            resetFlag = false;
            return true;
        } else {
            OutputQueue.STE.offer(MessageFormat.format("【{0}】写入穿梭车plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            News.error("写入穿梭车plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            //写入失败后,重新添加commanddao 任务队列中,并立即回读一次设备状态
//            MessageQueue.offer(SlaveType.Ste, slave.getId(), new Task(2, command));
//            readStatus();
            initSte();
            return false;
        }
    }