#
whycq
2024-06-30 0a71eb4f8fce7f3dd4ac87e6735ff540a50266a2
#
1个文件已修改
196 ■■■■■ 已修改文件
src/main/java/com/zy/core/thread/SiemensDevpThread.java 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -332,32 +332,200 @@
        ArrayList<Integer> staNos = getStaNo();
        OperateResult write = null;
        OperateResult write1 = null;
        // 写2号输送线
        int index = staNos.indexOf(staProtocol.getSiteId());
        //// 写2号输送线
        //if (slave.getId() == 1) {
        //
        //    //Thread.sleep(500);
        //    //write1 = siemensS7Net.Write("DB100." + (4 * index + 2), staProtocol.getStaNo());    // 目标站e
        //} else {
        //    write = siemensS7Net.Write("DB100." + index * 6, staProtocol.getWorkNo().intValue());    // 工作号
        //    Thread.sleep(200);
        //    write1 = siemensS7Net.Write("DB100." + (index * 6 + 4), staProtocol.getStaNo());    // 目标站
        //}
        if (slave.getId() == 1) {
            int index = staNos.indexOf(staProtocol.getSiteId());
            write = siemensS7Net.Write("DB100." + index * 4, staProtocol.getWorkNo());    // 工作号
            Thread.sleep(500);
            write1 = siemensS7Net.Write("DB100." + (4 * index + 2), staProtocol.getStaNo());    // 目标站e
            short[] array = new short[2];
            array[0] = staProtocol.getWorkNo();
            array[1] = staProtocol.getStaNo();
            //write = siemensS7Net.Write("DB100." + index * 4, array);    // 工作号
            OperateResult writeResult;
            //任务下发次数
            int writeCount = 0;
            //任务下发成功标识
            boolean writeFlag = false;
            while(writeCount < 5){
                // 写2号输送线
                write = siemensS7Net.Write("DB100." + index * 4, array);    // 工作号、目标
                if(write.IsSuccess){
                    Thread.sleep(200);
                    OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*4, (short)4);
                    //OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB1000." + index*4, (short)4);
                    if(readResult.IsSuccess){
                        short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0);
                        short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 2);
                        if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){
                            //任务命令写入成功
                            writeFlag = true;
                            log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                            break;
                        } else {//返回结果是成功了,但是真实值不相同
                            writeCount++;
                            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={1},站点数据={2},写入次数={3}",
                                    slave.getId(), JSON.toJSON(staProtocol),writeCount));
                            log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                        }
        } else {
            int index = staNos.indexOf(staProtocol.getSiteId());
            write1 = siemensS7Net.Write("DB100." + (index * 6 + 4), staProtocol.getStaNo());    // 目标站
            Thread.sleep(500);
            write = siemensS7Net.Write("DB100." + index * 6, staProtocol.getWorkNo().intValue());    // 工作号
                        writeCount++;
                        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后读取失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                                slave.getId(), JSON.toJSON(staProtocol), writeCount));
                        log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                    }
                } else {
                    writeCount++;
                    OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                            slave.getId(), JSON.toJSON(staProtocol),writeCount));
                    log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                }
                Thread.sleep(200);
        }
        if (!write.IsSuccess || !write1.IsSuccess) {
            //写命令尝试了5次还是失败了
            if(!writeFlag){
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() == 0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            News.error("SiemensDevp" + " - 4" + " - 写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
                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;
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            News.info("SiemensDevp" + " - 5" + " - 输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol));
                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));
                Integer siteId = staProtocol.getSiteId();
                staProtocol = station.get(siteId);
                if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
                    staProtocol.setPakMk(true);
        }
    }
        } else {//PLC2
            OperateResult writeResult;
            //任务下发次数
            int writeCount = 0;
            //任务下发成功标识
            boolean writeFlag = false;
            while(writeCount < 5){
                // 写2号输送线
                write = siemensS7Net.Write("DB100." + index * 6, staProtocol.getWorkNo().intValue());    // 工作号
                Thread.sleep(200);
                write1 = siemensS7Net.Write("DB100." + (index * 6 + 4), staProtocol.getStaNo());    // 目标站
                if(write.IsSuccess){
                    Thread.sleep(200);
                    OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*6, (short)4);
                    Thread.sleep(200);
                    OperateResultExOne<byte[]> readResult1 = siemensS7Net.Read("DB100." + index*6+4, (short)2);
                    //OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB1000." + index*4, (short)4);
                    if(readResult.IsSuccess && readResult1.IsSuccess){
                        short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0);
                        short staNo = siemensS7Net.getByteTransform().TransInt16(readResult1.Content, 2);
                        if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){
                            //任务命令写入成功
                            writeFlag = true;
                            log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                            break;
                        } else {//返回结果是成功了,但是真实值不相同
                            writeCount++;
                            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={1},站点数据={2},写入次数={3}",
                                    slave.getId(), JSON.toJSON(staProtocol),writeCount));
                            log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                        }
                    } else {
                        writeCount++;
                        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后读取失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                                slave.getId(), JSON.toJSON(staProtocol), writeCount));
                        log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                    }
                } else {
                    writeCount++;
                    OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                            slave.getId(), JSON.toJSON(staProtocol),writeCount));
                    log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                }
                Thread.sleep(200);
            }
            //写命令尝试了5次还是失败了
            if(!writeFlag){
                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;
            } else {
                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));
                Integer siteId = staProtocol.getSiteId();
                staProtocol = station.get(siteId);
                if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
                    staProtocol.setPakMk(true);
                }
            }
        }
   }
    ///**
    // * 写入 ID+目标站 =====> 单站点写入
    // */
    //private void write(StaProtocol staProtocol) throws InterruptedException {
    //    if (null == staProtocol) {
    //        return;
    //    }
    //    ArrayList<Integer> staNos = getStaNo();
    //    OperateResult write = null;
    //    OperateResult write1 = null;
    //    // 写2号输送线
    //    if (slave.getId() == 1) {
    //        int index = staNos.indexOf(staProtocol.getSiteId());
    //        write = siemensS7Net.Write("DB100." + index * 4, staProtocol.getWorkNo());    // 工作号
    //        Thread.sleep(500);
    //        write1 = siemensS7Net.Write("DB100." + (4 * index + 2), staProtocol.getStaNo());    // 目标站e
    //    } else {
    //        int index = staNos.indexOf(staProtocol.getSiteId());
    //        write1 = siemensS7Net.Write("DB100." + (index * 6 + 4), staProtocol.getStaNo());    // 目标站
    //        Thread.sleep(500);
    //        write = siemensS7Net.Write("DB100." + index * 6, staProtocol.getWorkNo().intValue());    // 工作号
    //    }
    //
    //    if (!write.IsSuccess || !write1.IsSuccess) {
    //        staProtocol = station.get(staProtocol.getSiteId());
    //        if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() == 0) {
    //            staProtocol.setPakMk(true);
    //        }
    //        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
    //        News.error("SiemensDevp" + " - 4" + " - 写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
    //    } else {
    //        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
    //        News.info("SiemensDevp" + " - 5" + " - 输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol));
    //    }
    //}
    // 更新入出库模式
    private void updateIoMode() throws InterruptedException {
        if (this.ioModeOf2F != IoModeType.NONE) {