#
LSH
2023-07-10 495b677051e2cbb6a26c0f1e55d9b7f85c5cb9f3
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -9,6 +9,7 @@
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.mapper.BasDevpMapper;
import com.zy.asrs.service.BasDevpService;
import com.zy.common.utils.News;
import com.zy.core.DevpThread;
@@ -88,7 +89,8 @@
                        break;
                    // 写数据 ID+目标站
                    case 2:
                        write((StaProtocol)task.getData(), 0);
//                        write((StaProtocol)task.getData(), 0);
                        write((StaProtocol)task.getData());
                        Thread.sleep(300);
                        read();
                        break;
@@ -120,7 +122,7 @@
            OutputQueue.DEVP.offer(MessageFormat.format( "【{0}】输送线plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]  [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            News.error("输送线plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
        siemensS7Net.ConnectClose();
//        siemensS7Net.ConnectClose();
        return result;
    }
@@ -175,12 +177,18 @@
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }else if (staProtocol.getSiteId().equals(300)){
                    BasDevpMapper basDevpMapper = SpringUtils.getBean(BasDevpMapper.class);
                    BasDevp basDevp = basDevpMapper.selectByDevNo(300);
                    if (!basDevp.getWrkNo().equals(basDevp.getWrkNo1())){
                        staProtocol.setPakMk(true);
                    }
                }
            }
        }
        //读条码
        Thread.sleep(100);
        Thread.sleep(200);
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100.100",(short)(barcodeSize*8));
        if (result2.IsSuccess) {
            for (int i = 0; i < barcodeSize; i++) {
@@ -194,7 +202,7 @@
        }
        // 充电信号位
        Thread.sleep(100);
        Thread.sleep(200);
        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB102.50", (short)1);
        if (result3.IsSuccess) {
            boolean[] status = siemensS7Net.getByteTransform().TransBool(result3.Content, 0, 1);
@@ -232,8 +240,122 @@
    /**
     * 写入 ID+目标站 =====> 单站点写入
     */
    private void write(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        int index = staNos.indexOf(staProtocol.getSiteId());
        OperateResult writeId,writeDest;
//        //任务ID下发次数
        int idCount = 0;
        boolean idFlag = false;
        while(idCount < 5){
            writeId = siemensS7Net.Write("DB100." + index*2, staProtocol.getWorkNo());    // 工作号
            if(writeId.IsSuccess){
                Thread.sleep(200);
                OperateResultExOne<byte[]> readId = siemensS7Net.Read("DB100." + index*2, (short)2);
                if(readId.IsSuccess){
                    short workNo = siemensS7Net.getByteTransform().TransInt16(readId.Content, 0);
                    if(staProtocol.getWorkNo().equals(workNo)){
                        //工作号写入成功
                        idFlag = true;
                        break;
                    } else {//返回结果是成功了,但是真实值不相同
                        idCount++;
                        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线工作号后返回成功,但是读取工作号值不一致。输送线plc编号={1},站点数据={2},写入次数={3}",
                                slave.getId(), JSON.toJSON(staProtocol),idCount));
                        log.error("写入输送线工作号后返回成功,但是读取工作号值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), idCount);
                    }
                } else {
                    idCount++;
                    OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线工作号后读取工作号失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                            slave.getId(), JSON.toJSON(staProtocol), idCount));
                    log.error("写入输送线工作号后读取工作号失败{}。输送线plc编号={},站点数据={},写入次数={}", readId.Message, slave.getId(), JSON.toJSON(staProtocol), idCount);
                }
            } else {
                idCount++;
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线工作号失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                        slave.getId(), JSON.toJSON(staProtocol),idCount));
                log.error("写入输送线工作号失败{}。输送线plc编号={},站点数据={},写入次数={}", writeId.Message, slave.getId(), JSON.toJSON(staProtocol), idCount);
            }
            Thread.sleep(200);
        }
        //写ID尝试了5次还是失败了
        if(!idFlag){
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线工作号尝试5次失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线工作号尝试5次失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
            //重新添加数据到任务队列
            boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol));
//            read();//读取1次设备状态
            return;
        }
        //任务目标站下发次数
        int destCount = 0;
        boolean destFlag = false;
        while(destCount < 5){
            writeDest = siemensS7Net.Write("DB101." + index*2, staProtocol.getStaNo());    // 目标站
            if(writeDest.IsSuccess){
                Thread.sleep(200);
                OperateResultExOne<byte[]> readDest = siemensS7Net.Read("DB101." + index*2, (short)2);
                if(readDest.IsSuccess){
                    short staNo = siemensS7Net.getByteTransform().TransInt16(readDest.Content, 0);
                    if(staProtocol.getStaNo().equals(staNo)){
                        //目标站写入成功
                        destFlag = true;
                        break;
                    } else {//返回结果是成功了,但是真实值不相同
                        destCount++;
                        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线目标站后返回成功,但是读取目标站值不一致。输送线plc编号={1},站点数据={2},写入次数={3}",
                                slave.getId(), JSON.toJSON(staProtocol),destCount));
                        log.error("写入输送线目标站后返回成功,但是读取目标站值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), destCount);
                    }
                } else {
                    destCount++;
                    OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线目标站后读取目标站失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                            slave.getId(), JSON.toJSON(staProtocol), destCount));
                    log.error("写入输送线目标站后读取目标站失败{}。输送线plc编号={},站点数据={},写入次数={}", readDest.Message, slave.getId(), JSON.toJSON(staProtocol), destCount);
                }
            } else {
                destCount++;
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线目标站失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                        slave.getId(), JSON.toJSON(staProtocol),destCount));
                log.error("写入输送线目标站失败{}。输送线plc编号={},站点数据={},写入次数={}", writeDest.Message, slave.getId(), JSON.toJSON(staProtocol), destCount);
            }
            Thread.sleep(200);
        }
        //写目标站尝试了5次还是失败了
        if(!destFlag){
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线目标站尝试5次失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线目标站尝试5次失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
            //重新添加数据到任务队列
            boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol));
//            read();//读取1次设备状态
            return;
        }
        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发成功 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
        log.info("输送线命令下发 [id:{}] >>>>> 命令下发成功: {}",  slave.getId(), JSON.toJSON(staProtocol));
    }
    /**
     * 写入 ID+目标站 =====> 单站点写入
     */
    private void write(StaProtocol staProtocol, int times) throws InterruptedException {
        if (null == staProtocol || times > 2) {
        if (null == staProtocol || times > 3) {
            return;
        }
        int index = staNos.indexOf(staProtocol.getSiteId());
@@ -242,9 +364,9 @@
        OperateResult write1 = siemensS7Net.Write("DB101." + index*2, staProtocol.getStaNo());    // 目标站
        if (!write.IsSuccess || !write1.IsSuccess) {
            MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol));
//            MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol));
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            News.error("写入输送线站点数据失败,重新添加任务到队列。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
            News.error("写入输送线站点数据失败==>>{}--{},重新添加任务到队列。输送线plc编号={},站点数据={}", write.Message, write1.Message, slave.getId(), JSON.toJSON(staProtocol));
            times++;
            write(staProtocol, times);
//            staProtocol = station.get(staProtocol.getSiteId());
@@ -327,16 +449,7 @@
        slave.setRack(0);
        slave.setSlot(0);
        SiemensDevpThread devpThread = new SiemensDevpThread(slave);
        SiemensS7Net siemensS7Net = devpThread.getSiemensS7Net();
        siemensS7Net.setRack(slave.getRack().byteValue());
        siemensS7Net.setSlot(slave.getSlot().byteValue());
        OperateResult connect = siemensS7Net.ConnectServer();
        if(connect.IsSuccess){
            News.info("输送线plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        } else {
            News.error("输送线plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
        siemensS7Net.ConnectClose();
        devpThread.connect();
        // 写
//        StaProtocol staProtocol = devpThread.getStation().get(1);
//        staProtocol.setWorkNo((short) 232);