#
Junjie
2025-05-15 cadb481188032daabaabbda2259b98afead2c41b
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -5,6 +5,7 @@
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
@@ -14,7 +15,7 @@
import com.zy.core.DevpThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.DevpType.DevpWorkType;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.IoModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
@@ -42,8 +43,9 @@
    private SiemensS7Net siemensS7Net;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
    public static boolean is = true;
//    public static final ArrayList<Integer> staNos = new ArrayList<Integer>() {{
//
//    }};
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        add(101);add(102);add(103);add(104);
        add(105);add(106);add(107);add(108);
@@ -51,16 +53,21 @@
        add(206);add(207);add(208);add(209);add(210);
        add(211);add(212);
    }};
//    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
//       add(1040);add(1041);add(1042);add(1043);add(1044);add(1045);add(1046);add(1047);
//       add(2010);add(2011);add(2012);add(2013);add(2014);add(2015);add(2016);add(2017);
//       add(3010);add(3011);add(3012);add(3013);add(3014);add(3015);add(3016);add(3017);
//    }};
    public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{
        add(0);add(1);add(2);add(3);
        add(4);add(5);add(6);add(7);
    }};
    public static final ArrayList<Integer> staNosErrList = new ArrayList<Integer>() {{
        add(102);add(104);add(106);add(108);
        add(203);add(206);add(209);add(212);
    }};
    /**
     * 条码数量
     */
    private int barcodeSize = 8;
    private int barcodeSize = 6;
    /**
     * 入出库模式
@@ -83,8 +90,6 @@
        switch (slave.getId()) {
            case 1:
                return staNos1;
//            case 2:
//                return staNos2;
            default:
                throw new CoolException("服务器异常");
        }
@@ -108,8 +113,8 @@
                        break;
                    // 写数据 ID+目标站
                    case 2:
                        writeD((StaProtocol)task.getData(),1);
//                        log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo());
                        write((StaProtocol)task.getData());
                        log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo());
                        break;
                    default:
                        break;
@@ -136,18 +141,15 @@
                staProtocol.setSiteId(siteId);
                station.put(siteId, staProtocol);
            }
            staProtocol.setWorkNo((short) 0);     // 工作号
            staProtocol.setStaNo((short) 0);   // 目标站
            staProtocol.setState((short) 0);  // 模式状态 0停机,=1手动,=2自动,=3故障
            staProtocol.setWorkIo((short) 0);
            staProtocol.setRequestIo((short) 0);
            staProtocol.setTrayIo((short) 0);
            staProtocol.setLocIo((short) 0);
            staProtocol.setBarcode("-");
            staProtocol.setWeightIo(0.0);
            staProtocol.setMode((short) 0);
            staProtocol.setWorkNo(0);    // ID
            staProtocol.setAutoing(false);      // 自动
            staProtocol.setLoading(false);      // 有物
            staProtocol.setInEnable(false);     // 可入
            staProtocol.setOutEnable(false);    // 可出
            staProtocol.setEmptyMk(false);      // 空板信号
            staProtocol.setStaNo((short) 0);     // 目标站
            if (!staProtocol.isPakMk() && staProtocol.workType == DevpWorkType.IDLE) {
            if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                staProtocol.setPakMk(true);
            }
        }
@@ -181,35 +183,102 @@
//        updateIoMode();
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100.0", (short) (staNoSize*66));
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize*2));
        if (result.IsSuccess) {
            for (int i = 0; i < staNoSize; i++) {
                Integer siteId = staNos.get(i); // 站点编号
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setSiteId(siteId);
                staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, i*66 + 8));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 12));   // 目标站
                staProtocol.setState(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 14));  // 模式状态 0停机,=1手动,=2自动,=3故障
                staProtocol.setWorkIo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 16));
                staProtocol.setRequestIo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 18));
                staProtocol.setTrayIo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 20));
                staProtocol.setLocIo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 22));
                staProtocol.setBarcode(siemensS7Net.getByteTransform().TransString(result.Content,i*66 + 24,16, "UTF-8").trim());
//                staProtocol.setWeightIo(siemensS7Net.getByteTransform().TransDouble(result.Content,i*66 + 40));
                staProtocol.setMode(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 44));
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*2, 2);
                staProtocol.setAutoing(status[0]);  // 自动
                staProtocol.setLoading(status[1]);  // 有物
                staProtocol.setInEnable(status[2]); // 可入
                staProtocol.setOutEnable(status[3]);// 可出
                staProtocol.setEmptyMk(status[4]);  // 空板信号
                staProtocol.setFullPlt(status[5]);  // 满托盘
                staProtocol.setHigh(status[6]);     // 高库位
                staProtocol.setLow(status[7]);      // 低库位
                if (!staProtocol.isPakMk() && (staProtocol.workType == DevpWorkType.IDLE  || staProtocol.isPakReset())) {
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
            }
        }
        OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.0", (short) (staNoSize*4));
        if (result1.IsSuccess) {
            for (int i = 0; i < staNoSize; i++) {
                Integer siteId = staNos.get(i); // 站点编号
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setWorkNo((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, i*4));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result1.Content, i*4 + 2));   // 目标站
            }
        }
        //条码扫描器
        ArrayList<Integer> barcodeList = BarcodeList;
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.100", (short) (barcodeList.size() * 10));
        if (result2.IsSuccess) {
            for (int i = 0; i < barcodeList.size(); i++) {
                Integer barcodeId = barcodeList.get(i);
                String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*10+2,8, "UTF-8");
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1);
                if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                    barcodeThread.setBarcode(barcode);
                }
            }
        }
        //外形检测
        ArrayList<Integer> staNoErrs = staNosErrList;
        int staNoErrsSize = staNoErrs.size();
        OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.180", (short) (staNoErrsSize*8));
        if (resultErr.IsSuccess){
            for (int i = 0;i<3;i++){
                Integer siteId = staNoErrs.get(i); // 站点编号
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*4+2, 1);
                StaProtocol staProtocol = station.get(siteId);
                staProtocol.setFrontErr(status[0]);
                staProtocol.setBackErr(status[1]);
                staProtocol.setHighErr(status[2]);
                staProtocol.setLeftErr(status[3]);
                staProtocol.setRightErr(status[4]);
                staProtocol.setWeightErr(status[5]);
                staProtocol.setBarcodeErr(status[6]);
            }
        }
//        OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB13.2", (short) (staNoSize*4));
//        if (resultErr2.IsSuccess) {
//            for (int i = 0; i < staNoSize; i++) {
//                Integer siteId = staNos.get(i); // 站点编号
//                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i*4, 1);
//                StaProtocol staProtocol = station.get(siteId);
//                staProtocol.setBreakerErr(status[0]);
//                staProtocol.setInfraredErr(status[1]);
//                staProtocol.setOutTimeErr(status[2]);
//                staProtocol.setSeizeSeatErr(status[3]);
//                staProtocol.setWrkYgoodsN(status[4]);
//                staProtocol.setInverterErr(status[5]);
//                staProtocol.setContactErr(status[6]);
//                staProtocol.setUpcontactErr(status[7]);
//
//            }
//        }
        if (result.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
            // 根据实时信息更新数据库
            try {
                List<BasDevp> basDevps = new ArrayList<>();
@@ -217,6 +286,7 @@
                    StaProtocol staProtocol = station.get(siteId);
                    basDevps.add(staProtocol.toSqlModel());
                }
                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
                if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
                    throw new Exception("更新数据库数据失败");
@@ -244,15 +314,16 @@
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        OperateResult write = null;
        OperateResult write1 = null;
        OperateResult write2 = null;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100." + index*66, staProtocol.getWorkNo());    // 工作号
            Thread.sleep(200);
            write1 = siemensS7Net.Write("DB100." + (index*66+4), staProtocol.getStaNo());    // 目标站
            if(write.IsSuccess && write1.IsSuccess){
            short[] data = new short[2];
            data[0] = staProtocol.getWorkNo().shortValue();
            data[1] = staProtocol.getStaNo();
            write = siemensS7Net.Write("DB100." + index*4, data);
            if(write.IsSuccess){
                log.error("写入输送线命令成功。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                break;
            }
            else {
@@ -274,114 +345,15 @@
        }
    }
    private void writeD(StaProtocol staProtocol,Integer count)throws InterruptedException{
        boolean reset = true;
        if (null == staProtocol) {
            return;
        }
        staProtocol = staProtocol.clone();
        short oriWrkNo = staProtocol.getWorkNo();
        short oriStaNo = staProtocol.getStaNo();
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        if(writeWrk(staProtocol,1)){
            int whileCount = 0;
            OperateResult write3 = siemensS7Net.Write("DB100." + (index*66+6), (short) 1);
            if (write3.IsSuccess){
                News.info("输送线命令下发[id:"+slave.getId()+"] >>>>>"+"["+1+"]");
                Thread.sleep(100);
                do {
                    OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100." + (index * 66 + 6), (short) 2);
                    short mk = siemensS7Net.getByteTransform().TransInt16(result2.Content, 0);
                    if (mk == 2) {
                        OperateResult write5 = siemensS7Net.Write("DB100." + index * 66, 0);    // 工作号
                        Thread.sleep(100);
                        OperateResult write6 = siemensS7Net.Write("DB100." + (index * 66 + 4), (short) 0);    // 目标站
                        Thread.sleep(100);
                        OperateResult write4 = siemensS7Net.Write("DB100." + (index * 66 + 6), (short) 0);
                        reset = false;
                        if (write4.IsSuccess && write5.IsSuccess && write6.IsSuccess) {
                            News.info("输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + "0,0,0" + "]");
                            OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100." + (index * 66), (short) 8);
                            Integer wrkNo1 = siemensS7Net.getByteTransform().TransInt32(result1.Content, 0);
                            short staNo1 = siemensS7Net.getByteTransform().TransInt16(result1.Content, 4);
                            short mk1 = siemensS7Net.getByteTransform().TransInt16(result1.Content, 6);
                            if (wrkNo1 != 0 || staNo1 != 0 || mk1 != 0) {
                                whileCount++;
                                News.info("复位失败,输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + "0,0,0" + "]");
                            } else {
                                News.info("输送线复位完成");
                                break;
                            }
                        }
                    } else if (reset && mk == 0) {
                        OperateResult write7 = siemensS7Net.Write("DB100." + (index * 66 + 6), (short) 1);
                        News.info("回读1失败,输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + "1" + "]");
                        Thread.sleep(100);
                        whileCount++;
                    } else {
                        whileCount++;
                    }
                } while (whileCount < 10);
    // 更新入出库模式
    private void updateIoMode() throws InterruptedException {
        if (this.ioModeOf2F != IoModeType.NONE) {
            if (!siemensS7Net.Write("DB107.180", this.ioModeOf2F.id).IsSuccess) {
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线2F入出库模式失败。输送线plc编号={1}", slave.getId()));
                News.error("SiemensDevp"+" - 6"+" - 写入输送线2F入出库模式失败。输送线plc编号={}", slave.getId());
            }
        }else {
            log.error("输送命令下发失败"+JSON.toJSONString(staProtocol));
        }
    }
    private boolean writeWrk(StaProtocol staProtocol,Integer count)throws InterruptedException {
        if (null == staProtocol) {
            return false;
        }
        short oriWrkNo = staProtocol.getWorkNo();
        short oriStaNo = staProtocol.getStaNo();
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        do {
            log.info("输送递归次数:" + count);
            OperateResult write1 = siemensS7Net.Write("DB100." + index * 66, staProtocol.getWorkNo().intValue());    // 工作号
            Thread.sleep(100);
            OperateResult write2 = siemensS7Net.Write("DB100." + (index * 66 + 4), staProtocol.getStaNo());    // 目标站
            if (write1.IsSuccess && write2.IsSuccess) {
                News.info("输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo() + "]");
                OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100." + (index * 66), (short) 6);
                Integer wrkNo = siemensS7Net.getByteTransform().TransInt32(result.Content, 0);
                short staNo = siemensS7Net.getByteTransform().TransInt16(result.Content, 4);
                if (!(oriWrkNo == wrkNo) || oriStaNo != staNo) {
                    if (count >= 5) {
                        log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), count);
                        return false;
                    }
                    count++;
                }else {
                    return true;
                }
            }
        }while (count <=5);
        return true;
    }
//    // 更新入出库模式
//    private void updateIoMode() throws InterruptedException {
//        if (this.ioModeOf2F != IoModeType.NONE) {
//            if (!siemensS7Net.Write("DB100.180", this.ioModeOf2F.id).IsSuccess) {
//                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线2F入出库模式失败。输送线plc编号={1}", slave.getId()));
//                News.error("SiemensDevp"+" - 6"+" - 写入输送线2F入出库模式失败。输送线plc编号={}", slave.getId());
//            }
//        }
//    }
    /**
     * 心跳