zjj
2024-05-10 9aefce26355af7cd43bc958c045b196b355693b8
#一楼rgv
13个文件已修改
337 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/WrkMastSta.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 161 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvModeType.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvStatusType.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/RgvSlave.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/RgvCommand.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastStaMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -123,6 +123,13 @@
    @TableField("wrk_crn")
    private Integer wrkCrn;
    @ApiModelProperty(value= "")
    @TableField("matnr1")
    private Integer matnr1;
    @ApiModelProperty(value= "")
    @TableField("matnr2")
    private Integer matnr2;
    public WrkMastSta() {}
    public WrkMastSta(Long wrkNo,Integer wrkStart,Integer wrkEnd,Integer staStart,Integer staEnd,Date createTime,Date updateTime,Integer type,Integer wrkSts,Integer lineNumber,Integer wrkType,Date bignTime,Integer wrkCrn) {
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2507,6 +2507,8 @@
                short sta1 = 0;
                short souSta2 = 0;
                short sta2 = 0;
                short matnr = 0;
                short matnr2 = 0;
                //工位一任务
                for (RgvSlave.Sta inStn :  rgvSlave.getInStn()){
@@ -2534,9 +2536,19 @@
                        }
                        workNo1 = workNo++;
                        souSta1 = Utils.getRgvStaNo(rgvSlave.getId(),inStn.getSourceStaNo());
                        sta1 = Utils.getRgvStaNo(rgvSlave.getId(),inStn.getStaNo());
                        if (inStn.getSourceStaNo() == 4007 && staProtocol.getTongType() == 1){
                            sta1 = Utils.getRgvStaNo(rgvSlave.getId(),2103);
                        } else if (inStn.getSourceStaNo() == 4007 && staProtocol.getTongType() == 2) {
                            sta1 = Utils.getRgvStaNo(rgvSlave.getId(),2002);
                        }else {
                            sta1 = Utils.getRgvStaNo(rgvSlave.getId(),inStn.getStaNo());
                        }
                        work1 = true;
                        if (inStn.getSourcePlcId() == 4){
                            matnr = staProtocol.getMatnr();
                        }
                        devpThread.setPakMk(inStn.getSourceStaNo(),false);
                        break;
                    }
                }
@@ -2573,6 +2585,9 @@
                        souSta2 = inStn.getSourceStaNo().shortValue();
                        sta2 = inStn.getStaNo().shortValue();
                        work2 = true;
                        if (inStn.getSourcePlcId() == 4){
                            matnr2 = staProtocol.getMatnr();
                        }
                        devpThread.setPakMk(inStn.getSourceStaNo(),false);
                        break;
                    }
@@ -2594,12 +2609,15 @@
                    command.setDestinationStaNo2(sta2);  // 目标站
                    command.setAckFinish2(false);  // 任务完成确认位
                    command.setMatnr(matnr);
                    command.setMatnr2(matnr2);
                    if (workNo1 == 0 && workNo2 !=0){
                        command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 任务模式: 取放货
                        command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 任务模式: 2取放货
                    } else if (workNo1 != 0 && workNo2 ==0) {
                        command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 任务模式: 取放货
                        command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 任务模式: 1取放货
                    }else {
                        command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 任务模式: 取放货
                        command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 任务模式: all取放货
                    }
                    command.setCommand(false);
                    rgvTaskSave(command);
@@ -2627,23 +2645,24 @@
            }
            //工位一任务完成
            if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING && rgvProtocol.getLoaded1() == 1) {
            if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING && rgvProtocol.getLoaded1() == 0) {
                WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1());
                if (Cools.isEmpty(wrkMastSta)){
                    log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1());
                    continue;
                }
                for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getSourcePlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(outStn.getSourceStaNo());
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getStaPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(outStn.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading()  && staProtocol.isPakMk()){
//                        staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
//                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                        staProtocol.setWorkNo(wrkMastSta.getWrkNo().shortValue());
                        staProtocol.setStaNo(wrkMastSta.getWrkEnd().shortValue());
                        if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) {
                            continue;
                        }
@@ -2656,15 +2675,15 @@
            }
            //工位二任务完成
            if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING2 && rgvProtocol.getLoaded1() == 1) {
                WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo2());
            if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING2 && rgvProtocol.getLoaded1() == 0) {
                WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo2(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo2());
                if (Cools.isEmpty(wrkMastSta)){
                    log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo2());
                    continue;
                }
                for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getSourcePlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(outStn.getSourceStaNo());
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getStaPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(outStn.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
@@ -2672,16 +2691,122 @@
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading()  && staProtocol.isPakMk()){
//                        staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
//                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                        if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) {
                            continue;
                        }
////                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
//                        if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) {
//                            continue;
//                        }
                    }
                }
                MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(4,new RgvCommand()));
                log.info("{}号rgv工位二工作完成复位,工作号:{}",rgvSlave.getId(),wrkMastSta.getWrkNo2());
            }
        }
    }
    //二号rgv输送线命令下发
    public synchronized void RGV2Taskput() {
        for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
            if (rgvSlave.getId() !=2){
                continue;
            }
            ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (Cools.isEmpty(rgvProtocol)){
                continue;
            }else {
                rgvProtocol = rgvProtocol.clone();
            }
            //工位一任务完成
            if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.OUTSTN1 && rgvProtocol.getLoaded1() == 1) {
                WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1());
                if (Cools.isEmpty(wrkMastSta)){
                    log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1());
                    continue;
                }
                for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getStaPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(outStn.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (outStn.getStaPlcId() == 2){
                        if (staProtocol.isAutoing() && !staProtocol.isLoading()  && staProtocol.isPakMk()){
                            staProtocol.setWorkNo(wrkMastSta.getWrkNo().shortValue());
                            staProtocol.setStaNo((short) 2106);
                            staProtocol.setMatnr(wrkMastSta.getMatnr1().shortValue());
                            if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) {
                                continue;
                            }
                        }
                    }
                }
            }
            //工位二任务完成
            if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.OUTSTN8 && rgvProtocol.getLoaded1() == 1) {
                WrkMastSta wrkMastSta = wrkMastStaService.selectByRgvNoandWrkNo(rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo2());
                if (Cools.isEmpty(wrkMastSta)){
                    log.error("未查询到rgv工作任务,rgv编号{},工作号{}",rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo2());
                    continue;
                }
                for (RgvSlave.Sta outStn :rgvSlave.getOutStn()){
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, outStn.getStaPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(outStn.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (outStn.getStaPlcId() == 2){
                        if (staProtocol.isAutoing() && !staProtocol.isLoading()  && staProtocol.isPakMk()){
                            staProtocol.setWorkNo(wrkMastSta.getWrkNo2().shortValue());
                            staProtocol.setStaNo((short) 2106);
                            staProtocol.setMatnr(wrkMastSta.getMatnr2().shortValue());
                            if (!MessageQueue.offer(SlaveType.Devp, outStn.getStaPlcId(), new Task(2, staProtocol))) {
                                continue;
                            }
                        }
                    }
                }
            }
        }
    }
    public synchronized void RGV2TaskOver() {
        for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
            if (rgvSlave.getId() !=2){
                continue;
            }
            ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (Cools.isEmpty(rgvProtocol)){
                continue;
            }else {
                rgvProtocol = rgvProtocol.clone();
            }
            //工位一任务完成
            if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING && rgvProtocol.getLoaded1() == 0) {
                MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(3,new RgvCommand()));
                log.info("{}号rgv工位一工作完成复位,工作号:{}",rgvSlave.getId(),rgvProtocol.getTaskNo1());
            }
            //工位二任务完成
            if (rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getStatusType() == RgvStatusType.WAITING2 && rgvProtocol.getLoaded1() == 0) {
                MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(4,new RgvCommand()));
                log.info("{}号rgv工位二工作完成复位,工作号:{}",rgvSlave.getId(),rgvProtocol.getTaskNo2());
            }
        }
    }
@@ -2705,6 +2830,8 @@
        wrkMastSta.setUpdateTime(now);
        wrkMastSta.setWrkCrn(command.getRgvNo());
        wrkMastSta.setWrkType(command.getTaskMode().intValue());
        wrkMastSta.setMatnr1(command.getMatnr().intValue());
        wrkMastSta.setMatnr2(command.getMatnr2().intValue());
        return wrkMastStaService.insert(wrkMastSta);
    }
src/main/java/com/zy/asrs/utils/Utils.java
@@ -40,7 +40,8 @@
    public static short getRgvEndStaNo(Integer rgvNo,Integer staNo){
        Map<Integer, Integer> rgv1Map = new HashMap<>();
        Map<Integer, Integer> rgv2Map = new HashMap<>();
        rgv2Map.put(4007,2103);
        rgv2Map.put(4002,4001); rgv2Map.put(4011,4010);
        rgv2Map.put(2101,2102);
        Map<Integer, Integer> rgv3Map = new HashMap<>();
        switch (rgvNo){
            case 1:
src/main/java/com/zy/core/MainProcess.java
@@ -75,8 +75,11 @@
//                    mainService.crn5StnToOutStn();
                    //rgv任务
                    mainService.RGVTaskPut();
                    //rgv任务完成
                    //rgv1,3任务完成
                    mainService.RGVTaskOver();
                    //rgv2任务完成
                    mainService.RGV2Taskput();
                    mainService.RGV2TaskOver();
                } catch (Exception e) {
src/main/java/com/zy/core/enums/RgvModeType.java
@@ -10,6 +10,8 @@
    HAND(1, "手动"),
    HALF_AUTO(2, "半自动"),
    AUTO(3, "自动"),
    OUTSTN1(7,"工作位1请求出站"),
    OUTSTN8(8,"工作位1请求出站"),
    AUTO2(100, "其它"),
    ;
src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -11,8 +11,9 @@
    PICK_WAIT((short) 2, "取货等待"),
    PICK_WORKING((short) 3, "取货中"),
    RELEASE_WALK((short) 4, "放货走行"),
    RELEASE_WAIT((short) 5, "放货等待"),
    RELEASE_WORKING((short) 6, "放货中"),
    OUTSTN1((short)5,"工作位1请求出站"),
    OUTSTN8((short)6,"工作位2请求出站"),
    WALKING((short) 9, "走行中"),
    WAITING((short) 90, "工位一任务完成等待WCS确认"),
    WAITING2((short) 91, "工位二任务完成等待WCS确认"),
src/main/java/com/zy/core/model/RgvSlave.java
@@ -24,6 +24,8 @@
        private Integer sourceStaNo;//源站
        private Integer sourcePlcId;
        private Integer staNo;//目标站
        private Integer staPlcId;
src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -53,6 +53,10 @@
    @JSONField(serialize = false)
    private RgvTaskModeType taskModeType;
    private Short matnr;
    private Short matnr2;
    //**************工位2**************
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -11,7 +11,7 @@
import java.util.Map;
@Data
public class RgvProtocol {
public class RgvProtocol implements Cloneable{
    private Integer RgvNo;
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -22,6 +22,10 @@
    private Short staNo;
    // ----------------------------------------------------------------
    // 物料代码
    private Short matnr;
    // ----------------------------------------------------------------
    // 自动
    private boolean autoing;
@@ -87,6 +91,7 @@
    private boolean force = false;
    private short amount = 0;
    private Short tongType = 0;
    public Boolean isErr(){
        if (frontErr || backErr || highErr || leftErr || rightErr || weightErr || barcodeErr){
@@ -107,7 +112,7 @@
        basDevp.setLocType1((short) 0);  // 高低类型{0:未知,1:低库位,2:高库位}
        basDevp.setLocType2((short) 0);  // 宽窄类型{0:未知,1:窄库位,2:宽库位}
        basDevp.setLocType3((short) 0);  // 轻重类型{0:未知,1:轻库位,2:重库位}
        basDevp.setLocType1(high != low && high ? (short) 2 : (short) 1);
        basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2);
//        basDevp.
        return basDevp;
    }
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -205,8 +205,9 @@
                    case 1:
                        switch (slave.getId()){
                            case 1:
                            case 2:
                                read();break;
                            case 2:
                                read10();break;
                            case 3:
                                read30();break;
                            case 4:
@@ -216,7 +217,16 @@
                        break;
                    // 写数据 ID+目标站
                    case 2:
                        write((StaProtocol)task.getData());
                        switch (slave.getId()){
                            case 1:
                            case 3:
                                write((StaProtocol)task.getData());
                            case 2:
                                write10((StaProtocol)task.getData());break;
                        }
                        break;
                    default:
                        break;
@@ -359,6 +369,95 @@
        }
    }
    private void read10() throws InterruptedException {
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (getStaNo().size() * 10));
        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.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, i * 10));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*10 + 4 ));   // 目标站
                staProtocol.setMatnr(siemensS7Net.getByteTransform().TransInt16(result.Content, i*10 + 6 ));   // 目标站
            }
        }
        Thread.sleep(200);
        OperateResultExOne<byte[]> result1 = null;
        result1 = siemensS7Net.Read("DB101.0", (short) (getStaNo().size() * 10));
        if (result1.IsSuccess) {
            for (int i = 0; i < staNoSize; i++) {
                Integer siteId = staNos.get(i); // 站点编号
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result1.Content, i*10+8, 2);
                StaProtocol staProtocol = station.get(siteId);
                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]);      // 低库位
                staProtocol.setEmptyOutPalletRequire(status[8]);      // 空托盘可出需求信号
                staProtocol.setEmptyInPalletRequire(status[9]);      // 空托盘可入需求信号
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
            }
        }
        // 条码扫描器
        if(slave.getId() == 1) {
            Thread.sleep(200);
            OperateResultExOne<byte[]> result2 = null;
            result2 = siemensS7Net.Read("DB101.208.0", (short) (barcodeSize * 8));
            if (result2.IsSuccess) {
                for (int i = 0; i < barcodeSize; i++) {
                    String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8");
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1);
                    if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                        barcodeThread.setBarcode(barcode);
                    }
                }
            }
        }
        if (result.IsSuccess && !Cools.isEmpty(result1) && result1.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
            // 根据实时信息更新数据库
            try {
                List<BasDevp> basDevps = new ArrayList<>();
                for (Integer siteId : staNos) {
                    StaProtocol staProtocol = station.get(siteId);
                    basDevps.add(staProtocol.toSqlModel());
                }
                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
                if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
                    throw new Exception("更新数据库数据失败");
                }
            } catch (Exception e) {
                e.printStackTrace();
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
                log.error("更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            }
        } else {
            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()));
//            log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
        }
    }
    private void read30() throws InterruptedException {
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
@@ -440,7 +539,9 @@
                staProtocol.setAutoing(status[0]);  // 自动
                staProtocol.setLoading(status[1]);  // 有物
                staProtocol.setInEnable(status[2]); // 可入
                staProtocol.setAmount(matnr);
                staProtocol.setMatnr(matnr);
                staProtocol.setTongType(tongType);
                staProtocol.setLow(true);
@@ -505,6 +606,32 @@
    }
    /**
     * 写入 ID+目标站 =====> 单站点写入
     */
    private void write10(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        ArrayList<Integer> staNos = getWriteStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        OperateResult write = siemensS7Net.Write("DB100." + index*8, staProtocol.getWorkNo().intValue());    // 工作号
        OperateResult write1 = siemensS7Net.Write("DB100." + (index*8+4), staProtocol.getStaNo());    // 目标站
        OperateResult write2 = siemensS7Net.Write("DB100." + (index*8+6), staProtocol.getMatnr());    // 目标站
        if (!write.IsSuccess || !write1.IsSuccess || !write2.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)));
            log.error("写入输送线站点数据失败。输送线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)));
            log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    /**
     * 心跳
     */
    private void heartbeat(){
src/main/resources/application.yml
@@ -258,6 +258,10 @@
      sourcePlcId: 4
      staNo: 2103
      staPlcId: 2
    inStn[1]:
      sourceStaNo: 2003
      sourcePlcId: 4
    outStn[0]:
      staNo: 2103
      staPlcId: 2
src/main/resources/mapper/WrkMastStaMapper.xml
@@ -19,6 +19,8 @@
        <result column="bign_time" property="bignTime" />
        <result column="wrk_crn" property="wrkCrn" />
        <result column="wrk_no2" property="wrkNo2"/>
        <result column="matnr1" property="matnr1"/>
        <result column="matnr2" property="matnr2"/>
    </resultMap>
    <select id="selectByRgvNoandWrkNo" resultMap="BaseResultMap">