#
Junjie
2025-05-02 22a4f862b33a02ed7baccf0da690ce2c52b756fe
#
15个文件已修改
10个文件已添加
2631 ■■■■■ 已修改文件
license.lic 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConsoleController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/SiteController.java 226 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/SiteStatusType.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/DeviceDataLogMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/News.java 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/AuthController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/DevpType/DevpLocType.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/DevpType/DevpModeType.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/DevpType/DevpRequestType.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/DevpType/DevpStateType.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/DevpType/DevpTrayType.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/DevpType/DevpWorkType.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 754 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread2.java 865 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/controller/LicenseCreatorController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/LicenseCheckListener.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/LicenseVerify.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/timer/LicenseTimer.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
license.lic
Binary files differ
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -28,6 +28,7 @@
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.CrnModeType;
import com.zy.core.enums.DevpType.DevpStateType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
@@ -117,7 +118,6 @@
            vo.setSiteId(String.valueOf(entry.getKey())); // 站点编号
            vo.setWorkNo(staProtocol.getWorkNo()); // 工作号
            vo.setSiteStatus(SiteStatusType.process(staProtocol));  // 状态
            vo.setNearbySta(staProtocol.getNearbySta());  //RGV位置
            vos.add(vo);
        }
        return R.ok().add(vos);
@@ -290,8 +290,8 @@
                        }
                    }
                    vo.setAutoing(staProtocol.isAutoing()?"Y":"N"); //  自动
                    vo.setLoading(staProtocol.isLoading()?"Y":"N"); //  有物
                    vo.setAutoing(staProtocol.stateType == DevpStateType.AUTO ? "Y" : "N"); //  自动
//                    vo.setLoading(staProtocol.isLoading()?"Y":"N"); //  有物
                    vo.setCanining(basDevp.getCanining());  //  能入
                    vo.setCanouting(basDevp.getCanouting());    //  能出
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -8,10 +8,13 @@
import com.zy.asrs.domain.vo.SiteTableVo;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.utils.CommandUtils;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.DevpType.DevpRequestType;
import com.zy.core.enums.DevpType.DevpStateType;
import com.zy.core.enums.DevpType.DevpTrayType;
import com.zy.core.enums.DevpType.DevpWorkType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
@@ -37,7 +40,6 @@
    @Autowired
    private BasDevpService basDevpService;
    @GetMapping("/io/mode/info/site")
    @ManagerAuth(memo = "入出库模式")
    public R ioMode(){
@@ -51,38 +53,6 @@
            res.add(map2);
        }
        return R.ok().add(res);
    }
    @PostMapping("/table/site")
    @ManagerAuth(memo = "站点信息表")
    public R siteTable(){
        List<SiteTableVo> list = new ArrayList<>();
        // 内存数据
        Map<Integer, StaProtocol> station = new HashMap<>();
        for (DevpSlave devp : slaveProperties.getDevp()) {
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
            station.putAll(devpThread.getStation());
        }
        // 持久数据
        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>().orderBy("dev_no"));
        for (BasDevp devp : basDevps) {
            SiteTableVo vo = new SiteTableVo();
            vo.setDevNo(devp.getDevNo());    // 站点编号
            list.add(vo);
            StaProtocol staProtocol = station.get(devp.getDevNo());
            if (null == staProtocol) { continue; }
            vo.setWorkNo(staProtocol.getWorkNo());   //  工作号
            vo.setAutoing(staProtocol.isAutoing()?"Y":"N");     //  自动
            vo.setLoading(staProtocol.isLoading()?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.isInEnable()?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.isOutEnable()?"Y":"N"); // 可出
            vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
            vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
            vo.setStaNo(staProtocol.getStaNo());                // 目标站
//            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
            vo.setLocType1(devp.getDevNo()==102 ? "高" : "低");
        }
        return R.ok().add(list);
    }
    @GetMapping("/list/auth")
@@ -104,16 +74,47 @@
            StaProtocol staProtocol = station.get(devp.getDevNo());
            if (null == staProtocol) { continue; }
            vo.setWorkNo(staProtocol.getWorkNo());   //  工作号
            vo.setAutoing(staProtocol.isAutoing()?"Y":"N");     //  自动
            vo.setLoading(staProtocol.isLoading()?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.isInEnable()?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.isOutEnable()?"Y":"N"); // 可出
            vo.setAutoing(staProtocol.stateType == DevpStateType.AUTO?"Y":"N");     //  自动
            vo.setLoading(staProtocol.workType == DevpWorkType.BUSY?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.requestType == DevpRequestType.IN?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.requestType == DevpRequestType.OUT?"Y":"N"); // 可出
            vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
            vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
            vo.setEmptyMk(staProtocol.trayType == DevpTrayType.EMPTY?"Y":"N");     // 空板信号
            vo.setStaNo(staProtocol.getStaNo());                // 目标站
//            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
            vo.setLocType1(devp.getDevNo()==102 ? "高" : "低");
            vo.setLocType1(staProtocol.locType.desc);
        }
        return R.ok().add(list);
    }
    @PostMapping("/table/site")
    @ManagerAuth(memo = "站点信息表")
    public R siteTable(){
        List<SiteTableVo> list = new ArrayList<>();
        // 内存数据
        Map<Integer, StaProtocol> station = new HashMap<>();
        for (DevpSlave devp : slaveProperties.getDevp()) {
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
            station.putAll(devpThread.getStation());
        }
        // 持久数据
        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>().orderBy("dev_no"));
        for (BasDevp devp : basDevps) {
            SiteTableVo vo = new SiteTableVo();
            vo.setDevNo(devp.getDevNo());    // 站点编号
            list.add(vo);
            StaProtocol staProtocol = station.get(devp.getDevNo());
            if (null == staProtocol) { continue; }
            vo.setAutoing(staProtocol.stateType == DevpStateType.AUTO?"Y":"N");     //  自动
            vo.setLoading(staProtocol.workType == DevpWorkType.BUSY?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.requestType == DevpRequestType.IN?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.requestType == DevpRequestType.OUT?"Y":"N"); // 可出
            vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
            vo.setEmptyMk(staProtocol.trayType == DevpTrayType.EMPTY?"Y":"N");     // 空板信号
            vo.setStaNo(staProtocol.getStaNo());                // 目标站
            vo.setLocType1(staProtocol.locType.desc);
        }
        return R.ok().add(list);
    }
@@ -163,15 +164,16 @@
                    StaProtocol staProtocol = entry.getValue();
                    vo.setDevNo(entry.getKey());    // 站点编号
                    vo.setWorkNo(staProtocol.getWorkNo());   //  工作号
                    vo.setAutoing(staProtocol.isAutoing()?"Y":"N");     //  自动
                    vo.setLoading(staProtocol.isLoading()?"Y":"N");     // 有物
                    vo.setInEnable(staProtocol.isInEnable()?"Y":"N");   // 可入
                    vo.setOutEnable(staProtocol.isOutEnable()?"Y":"N"); // 可出
                    vo.setAutoing(staProtocol.stateType == DevpStateType.AUTO?"Y":"N");     //  自动
                    vo.setLoading(staProtocol.workType == DevpWorkType.BUSY?"Y":"N");     // 有物
                    vo.setInEnable(staProtocol.requestType == DevpRequestType.IN?"Y":"N");   // 可入
                    vo.setOutEnable(staProtocol.requestType == DevpRequestType.OUT?"Y":"N"); // 可出
                    vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
                    vo.setEmptyMk(staProtocol.trayType == DevpTrayType.EMPTY?"Y":"N");     // 空板信号
                    vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 需求1
                    vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
                    vo.setEmptyMk(staProtocol.trayType == DevpTrayType.EMPTY?"Y":"N");     // 空板信号
                    vo.setStaNo(staProtocol.getStaNo());                // 目标站
                    vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
                    vo.setCar(staProtocol.isCar() ? "有": "无");
                    vo.setLocType1(staProtocol.locType.desc);     //高低库位
                    return R.ok().add(vo);
                }
            }
@@ -181,22 +183,15 @@
    @PostMapping("/detl/update")
    @ManagerAuth(memo = "修改站点数据")
    public R siteDetlUpdate(@RequestParam Integer devNo,
                            @RequestParam Short workNo,
    public R siteDetlUpdate(@RequestParam Integer siteId,
                            @RequestParam Integer workNo,
                            @RequestParam Short staNo,
                            @RequestParam(required = false) String pakMk,
                            @RequestParam(required = false) Boolean inEnable,
                            @RequestParam(required = false) Boolean outEnable
    ) {
        BasDevp basDevp = basDevpService.selectById(devNo);
        if (basDevp == null) {
            return R.error("站点不存在");
        }
                            @RequestParam String pakMk){
        for (DevpSlave devp : slaveProperties.getDevp()) {
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
            Map<Integer, StaProtocol> station = devpThread.getStation();
            for (Map.Entry<Integer, StaProtocol> entry : station.entrySet()) {
                if (devNo.equals(entry.getKey())) {
                if (siteId.equals(entry.getKey())) {
                    StaProtocol staProtocol = entry.getValue();
                    if (staProtocol == null) {
                        continue;
@@ -204,24 +199,16 @@
                        staProtocol = staProtocol.clone();
                    }
                    if (workNo != null) {
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setWorkNo(workNo.shortValue());
                    }
                    if (staNo != null) {
                        staProtocol.setStaNo(staNo);
                    }
                    if (pakMk != null) {
                        staProtocol.setPakMk(pakMk.equals("Y"));
//                        staProtocol.setPakMk(pakMk.equals("Y"));
                        devpThread.setPakMk(staProtocol.getSiteId(), pakMk.equals("Y"));
                    }
                    if (inEnable != null) {
                        staProtocol.setInEnable(inEnable);
                        basDevp.setInEnable(inEnable ? "Y" : "N");
                    }
                    if (outEnable != null) {
                        staProtocol.setOutEnable(outEnable);
                        basDevp.setOutEnable(outEnable ? "Y" : "N");
                    }
                    basDevpService.updateById(basDevp);
                    boolean result = CommandUtils.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    if (result) {
                        return R.ok();
                    } else {
@@ -230,95 +217,7 @@
                }
            }
        }
        return R.error("更新失败");
    }
    @PostMapping("/detl/out")
    @ManagerAuth(memo = "修改站点数据")
    public R siteDetlout(@RequestParam Integer devNo,
                            @RequestParam Short workNo,
                            @RequestParam Short staNo,
                            @RequestParam(required = false) String pakMk,
                            @RequestParam(required = false) Boolean inEnable,
                            @RequestParam(required = false) Boolean outEnable
    ) {
        BasDevp basDevp = basDevpService.selectById(devNo);
        if (basDevp == null) {
            return R.error("站点不存在");
        }
        for (DevpSlave devp : slaveProperties.getDevp()) {
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
            Map<Integer, StaProtocol> station = devpThread.getStation();
            for (Map.Entry<Integer, StaProtocol> entry : station.entrySet()) {
                if (devNo.equals(entry.getKey())) {
                    StaProtocol staProtocol = entry.getValue();
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (pakMk != null) {
                        staProtocol.setPakMk(pakMk.equals("Y"));
                    }
                    if (inEnable != null) {
                        staProtocol.setInEnable(inEnable);
                        basDevp.setInEnable(inEnable ? "Y" : "N");
                    }
                    if (outEnable != null) {
                        staProtocol.setOutEnable(outEnable);
                        basDevp.setOutEnable(outEnable ? "Y" : "N");
                    }
                    staProtocol.setWorkNo((short) 0);
                    staProtocol.setStaNo((short) 0);
                    basDevpService.updateById(basDevp);
                    boolean result = CommandUtils.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol), false);
                    if (result) {
                        return R.ok();
                    } else {
                        return R.error("下发命令失败");
                    }
                }
            }
        }
        return R.error("更新失败");
    }
    @PostMapping("/detl/in")
    @ManagerAuth(memo = "修改站点数据")
    public R siteDetlint(@RequestParam Integer devNo,
                         @RequestParam Short workNo,
                         @RequestParam Short staNo,
                         @RequestParam(required = false) String pakMk,
                         @RequestParam(required = false) Boolean inEnable,
                         @RequestParam(required = false) Boolean outEnable
    ) {
        BasDevp basDevp = basDevpService.selectById(devNo);
        if (basDevp == null) {
            return R.error("站点不存在");
        }
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历入库口
            for (DevpSlave.Sta inSta : devp.getInSta()) {
                if (!devNo.equals(inSta.getBackSta()) ){
                    continue;
                }
                // 获取入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getBackSta());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                staProtocol.setWorkNo((short) 9999);
                staProtocol.setStaNo(inSta.getStaNo().shortValue());
                boolean result = CommandUtils.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol), false);
                if (result) {
                    return R.ok();
                } else {
                    return R.error("下发命令失败");
                }
            }
        }
        return R.error("更新失败");
        return R.error("plc已掉线");
    }
    public List<PlcErrorTableVo> staPlcErr(Map.Entry<Integer, StaProtocol> entry){
@@ -384,6 +283,13 @@
            vo.setPlcDesc("顶升电机接触器故障");
            vo.setError("顶升电机接触器故障");
            /*
             * 宜科定制  150站点异常信息:大托盘目的站错误
             * */
            if (entry.getKey()==150){
                vo.setPlcDesc("150站点大托盘目的站错误");
                vo.setError("150站点大托盘目的站错误");
            }
            list.add(vo);
        }
        if (staProtocol.isFrontErr()){
src/main/java/com/zy/asrs/domain/enums/SiteStatusType.java
@@ -1,6 +1,8 @@
package com.zy.asrs.domain.enums;
import com.zy.core.enums.DevpType.DevpStateType;
import com.zy.core.enums.DevpType.DevpWorkType;
import com.zy.core.model.protocol.StaProtocol;
/**
@@ -25,19 +27,19 @@
        if (staProtocol == null) {
            return null;
        }
        if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0) {
        if (staProtocol.stateType == DevpStateType.AUTO && staProtocol.workType == DevpWorkType.BUSY && staProtocol.getWorkNo() > 0) {
            return SITE_AUTO_RUN_ID;
        }
        if (staProtocol.isAutoing() && staProtocol.isLoading()) {
        if (staProtocol.stateType == DevpStateType.AUTO && staProtocol.workType == DevpWorkType.BUSY) {
            return SITE_AUTO_RUN;
        }
        if (staProtocol.isAutoing() && staProtocol.getWorkNo() > 0) {
        if (staProtocol.stateType == DevpStateType.AUTO && staProtocol.getWorkNo() > 0) {
            return SITE_AUTO_ID;
        }
        if (staProtocol.isAutoing()) {
        if (staProtocol.stateType == DevpStateType.AUTO) {
            return SITE_AUTO;
        }
        if (!staProtocol.isAutoing()) {
        if (staProtocol.stateType != DevpStateType.AUTO) {
            return SITE_UNAUTO;
        }
        return null;
src/main/java/com/zy/asrs/mapper/DeviceDataLogMapper.java
@@ -10,7 +10,7 @@
@Repository
public interface DeviceDataLogMapper extends BaseMapper<DeviceDataLog> {
    @Delete("delete from wcs_device_data_log where create_time < FROM_UNIXTIME(UNIX_TIMESTAMP() - (3 * 24 * 60 * 60))")
    @Delete("delete from wcs_device_data_log where create_time < DATEADD(HOUR, -72, GETDATE())")
    int clearLog();
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -23,6 +23,10 @@
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.*;
import com.zy.core.enums.DevpType.DevpRequestType;
import com.zy.core.enums.DevpType.DevpStateType;
import com.zy.core.enums.DevpType.DevpTrayType;
import com.zy.core.enums.DevpType.DevpWorkType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
@@ -146,10 +150,12 @@
                        errMsg = "扫码失败";
                        back = true;
                    }
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && !staProtocol.isEmptyMk() && workNo >= 9790
                    if (staProtocol.stateType == DevpStateType.AUTO
                            && staProtocol.workType == DevpWorkType.BUSY
                            && staProtocol.requestType == DevpRequestType.IN
                            && staProtocol.trayType == DevpTrayType.FULL
                            && staProtocol.isPakMk()) {
                        // 获取条码扫描仪信息
                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
@@ -322,7 +328,11 @@
                        } else {
                            staProtocol = staProtocol.clone();
                        }
                        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
                        if (staProtocol.stateType == DevpStateType.AUTO
                                && staProtocol.workType == DevpWorkType.BUSY
                                && staProtocol.requestType == DevpRequestType.OUT
                                && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
                            // 查询工作档
                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), staDesc.getStnNo().toString());
                            if (taskWrk == null) {
@@ -431,8 +441,8 @@
                    log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    continue;
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                        && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                if (staProtocol.stateType == DevpStateType.AUTO && staProtocol.workType == DevpWorkType.BUSY && staProtocol.getWorkNo() > 0) {
                    flag = true;
                }
                if (!flag) {
@@ -554,8 +564,10 @@
                    }
                    // 判断堆垛机出库站状态
                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                            && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                    if (staProtocol.stateType == DevpStateType.AUTO
                            && staProtocol.workType == DevpWorkType.IDLE
                            && staProtocol.requestType == DevpRequestType.OUT
                            && staProtocol.getWorkNo() == 0) {
                        // 命令下发区 --------------------------------------------------------------------------
                        // 堆垛机控制过滤
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -10,6 +10,7 @@
@Data
public class LocTypeDto {
    // 高低类型{0:未知,1:低库位,2:高库位}
    private Short locType1;
@@ -19,18 +20,22 @@
    // 轻重类型{0:未知,1:轻库位,2:重库位}
    private Short locType3;
    private Integer siteId;
    public LocTypeDto() {
    }
    public LocTypeDto(Short locType1, Short locType2, Short locType3) {
        this.locType1 = locType1;
        this.locType2 = locType2;
        this.locType3 = locType3;
    }
    public LocTypeDto(StaProtocol staProtocol) {
        if (staProtocol.isHigh() == staProtocol.isLow()) {
        if (staProtocol.locType.id.shortValue()!=1 && staProtocol.locType.id.shortValue()!=2 && staProtocol.locType.id.shortValue()!=3) {
            throw new CoolException("plc高低检测异常");
        }
        if (staProtocol.isLow()) {
            this.locType1 = 1; // 低库位
        } else {
            this.locType1 = 2; // 高库位
        }
        this.locType1 = staProtocol.locType.id.shortValue();
    }
    /**
@@ -48,5 +53,4 @@
//        }
        return dto;
    }
}
src/main/java/com/zy/common/utils/News.java
New file
@@ -0,0 +1,194 @@
package com.zy.common.utils;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Array;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * news stories for zoneyung
 */
@Slf4j
public class News {
    public static void main(String[] args) {
        News.info("info{}", 1);
        News.warn("warn{}", 2);
        News.error("error{}", 3);
        System.out.println(News.print());
    }
    interface NewsSupport<T> { boolean execute(T t); }
    private static final NewsQueue<NewsDomain> NEWS_QUEUE = new NewsQueue<>(NewsDomain.class, 1024);
    @SuppressWarnings({"unchecked"})
    static class NewsQueue<T> {
        private final transient Class<T> cls;
        private final T[] arr;
        private final int capacity;
        private int head;
        private int tail;
        { this.head = 0; this.tail = 0; }
        public NewsQueue(Class<T> cls, int capacity) {
            this.cls = cls;
            this.arr = (T[]) Array.newInstance(cls, capacity);
            this.capacity = capacity;
        }
        public synchronized boolean offer(T t) {
            if (this.tail == this.capacity) {
                this.peek();
            }
            this.reform();
            this.arr[this.tail] = t;
            this.tail ++;
            return true;
        }
        public synchronized boolean put(T t) {
            if (this.tail == this.capacity) {
                return false;
            } else {
                this.reform();
            }
            this.arr[this.tail] = t;
            this.tail ++;
            return true;
        }
        public synchronized T peek() {
            if (this.head == this.tail) {
                return null;
            }
            T t = this.arr[this.head];
            this.head ++;
            this.reform();
            return t;
        }
        private void reform() {
            for (int i = this.head; i < this.tail; i++) {
                this.arr[i-this.head] = this.arr[i];
            }
            this.tail -= this.head;
            this.head = 0;
        }
        public synchronized int size() {
            return this.tail - this.head;
        }
        public synchronized List<T> data() {
            T[] ts = (T[]) Array.newInstance(this.cls, size());
            if (this.tail - this.head >= 0) {
                System.arraycopy(this.arr, this.head, ts, 0, this.tail - this.head);
            }
            return Arrays.asList(ts);
        }
    }
    public static void info(String format, Object... arguments) {
        log.info(format, arguments);
        offer(NewsLevel.INFO, format, arguments);
    }
    public static void warn(String format, Object... arguments) {
        log.warn(format, arguments);
        offer(NewsLevel.WARN, format, arguments);
    }
    public static void error(String format, Object... arguments) {
        log.error(format, arguments);
        offer(NewsLevel.ERROR, format, arguments);
    }
    public static void infoNoLog(String format, Object... arguments) {
        offer(NewsLevel.INFO, format, arguments);
    }
    public static void warnNoLog(String format, Object... arguments) {
        offer(NewsLevel.WARN, format, arguments);
    }
    public static void errorNoLog(String format, Object... arguments) {
        offer(NewsLevel.ERROR, format, arguments);
    }
    public static String printStr() {
        StringBuilder sb = new StringBuilder("[");
        List<NewsDomain> domains = NEWS_QUEUE.data();
        for (int i = 0; i < domains.size(); i++) {
            NewsDomain domain = domains.get(i);
            sb.append("{");
            sb.append("\"l\":").append(domain.level.idx).append(",");
            sb.append("\"v\":\"").append(domain.content).append("\"").append(",");
            sb.append("\"t\":\"").append(domain.date).append("\"");
            sb.append("}");
            if (i < domains.size() - 1) {
                sb.append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }
    public static List<Map<String, Object>> print() {
        List<Map<String, Object>> res = new ArrayList<>();
        for (NewsDomain datum : NEWS_QUEUE.data()) {
            Map<String, Object> map = new HashMap<>();
            map.put("l", datum.level.idx);
            map.put("v", datum.content);
            map.put("t", datum.date);
            res.add(map);
        }
        return res;
    }
    private static boolean offer(NewsLevel level, String msg, Object[] args) {
        return NEWS_QUEUE.offer(new NewsDomain(level, replace(msg, args), (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())));
    }
    private static String replace(String str, Object[] objs){
        if (null == objs || objs.length == 0 || null == str || "".equals(str.trim())) {
            return str;
        } else {
            StringBuilder sb = new StringBuilder(str);
            for (Object obj : objs) {
                int idx = sb.indexOf("{}");
                if (idx == -1) { break; }
                sb.replace(idx, idx + 2, String.valueOf(obj));
            }
            return sb.toString();
        }
    }
    static class NewsDomain {
        public NewsLevel level;
        public String content;
        public String date;
        public NewsDomain(NewsLevel level, String content, String date) {
            this.level = level;
            this.content = content;
            this.date = date;
        }
    }
    enum NewsLevel {
        INFO(1),
        WARN(2),
        ERROR(3),
        ;
        public int idx;
        NewsLevel(int idx) {
            this.idx = idx;
        }
    }
}
src/main/java/com/zy/common/web/AuthController.java
@@ -12,8 +12,8 @@
import com.zy.common.model.PowerDto;
import com.zy.common.utils.RandomValidateCodeUtil;
import com.zy.system.entity.*;
import com.zy.system.entity.license.LicenseVerify;
import com.zy.system.service.*;
import com.zy.system.timer.LicenseTimer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
@@ -49,14 +49,13 @@
    private RolePermissionService rolePermissionService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private LicenseTimer licenseTimer;
    @RequestMapping("/login.action")
    @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "登录")
    public R loginAction(String mobile, String password){
        //验证许可证是否有效
        LicenseVerify licenseVerify = new LicenseVerify();
        boolean verify = licenseVerify.verify();
        if (!verify) {//许可证已失效
        if (!licenseTimer.getSystemSupport()) {//许可证已失效
            return R.parse(CodeRes.SYSTEM_20001);
        }
        if (mobile.equals("super") && password.equals(Cools.md5(superPwd))) {
src/main/java/com/zy/core/MainProcess.java
@@ -43,6 +43,7 @@
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile1(); // 组托
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
src/main/java/com/zy/core/enums/DevpType/DevpLocType.java
New file
@@ -0,0 +1,40 @@
package com.zy.core.enums.DevpType;
public enum DevpLocType {
    NONE(0,"离线"),
    LOW(1,"低库位"),
    MIDDLE(2,"中库位"),
    HIGH(3,"高库位");
    public Integer id;
    public String desc;
    DevpLocType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static DevpLocType get(Short id) {
        if (null == id) {
            return null;
        }
        for (DevpLocType type : DevpLocType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return NONE;
    }
    public static DevpLocType get(DevpLocType type) {
        if (null == type) {
            return null;
        }
        for (DevpLocType devpLocType : DevpLocType.values()) {
            if (devpLocType == type) {
                return devpLocType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/DevpType/DevpModeType.java
New file
@@ -0,0 +1,38 @@
package com.zy.core.enums.DevpType;
public enum DevpModeType {
    NONE(-1,"离线"),
    IN_MODE(1,"入库"),
    OUT_MODE(2,"出库");
    public Integer id;
    public String desc;
    DevpModeType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static DevpModeType get(Short id) {
        if (null == id) {
            return null;
        }
        for (DevpModeType type : DevpModeType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return NONE;
    }
    public static DevpModeType get(DevpModeType type) {
        if (null == type) {
            return null;
        }
        for (DevpModeType devpModeType : DevpModeType.values()) {
            if (devpModeType == type) {
                return devpModeType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/DevpType/DevpRequestType.java
New file
@@ -0,0 +1,39 @@
package com.zy.core.enums.DevpType;
public enum DevpRequestType {
    NONE(-1,"离线"),
    IN(1,"可入"),
    OUT(2,"可出");
    public Integer id;
    public String desc;
    DevpRequestType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static DevpRequestType get(Short id) {
        if (null == id) {
            return null;
        }
        for (DevpRequestType type : DevpRequestType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return NONE;
    }
    public static DevpRequestType get(DevpRequestType type) {
        if (null == type) {
            return null;
        }
        for (DevpRequestType devpRequestType : DevpRequestType.values()) {
            if (devpRequestType == type) {
                return devpRequestType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/DevpType/DevpStateType.java
New file
@@ -0,0 +1,40 @@
package com.zy.core.enums.DevpType;
public enum DevpStateType {
    NONE(-1,"离线"),
    STOP(0,"停机"),
    HAND(1,"手动"),
    AUTO(2,"自动"),
    FAULT(3,"故障");
    public Integer id;
    public String desc;
    DevpStateType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static DevpStateType get(Short id) {
        if (null == id) {
            return null;
        }
        for (DevpStateType type : DevpStateType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return NONE;
    }
    public static DevpStateType get(DevpStateType type) {
        if (null == type) {
            return null;
        }
        for (DevpStateType devpModeType : DevpStateType.values()) {
            if (devpModeType == type) {
                return devpModeType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/DevpType/DevpTrayType.java
New file
@@ -0,0 +1,39 @@
package com.zy.core.enums.DevpType;
public enum DevpTrayType {
    NONE(-1,"离线"),
    EMPTY(1,"空托"),
    FULL(2,"满托");
    public Integer id;
    public String desc;
    DevpTrayType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static DevpTrayType get(Short id) {
        if (null == id) {
            return null;
        }
        for (DevpTrayType type : DevpTrayType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return NONE;
    }
    public static DevpTrayType get(DevpTrayType type) {
        if (null == type) {
            return null;
        }
        for (DevpTrayType devpTrayType : DevpTrayType.values()) {
            if (devpTrayType == type) {
                return devpTrayType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/DevpType/DevpWorkType.java
New file
@@ -0,0 +1,38 @@
package com.zy.core.enums.DevpType;
public enum DevpWorkType {
    NONE(-1,"离线"),
    IDLE(0,"空闲"),
    BUSY(1,"忙碌");
    public Integer id;
    public String desc;
    DevpWorkType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static DevpWorkType get(Short id) {
        if (null == id) {
            return null;
        }
        for (DevpWorkType type : DevpWorkType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return NONE;
    }
    public static DevpWorkType get(DevpWorkType type) {
        if (null == type) {
            return null;
        }
        for (DevpWorkType devpWorkType : DevpWorkType.values()) {
            if (devpWorkType == type) {
                return devpWorkType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -1,7 +1,7 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.CommandInfo;
import com.zy.core.enums.DevpType.*;
import lombok.Data;
import java.util.ArrayList;
@@ -25,33 +25,62 @@
    // 目标站
    private Short staNo;
    //指令ID
    private Integer commandId;
    // ----------------------------------------------------------------
    // 自动
    private boolean autoing;
    //模式
    private Short mode;
    public DevpModeType modeType;
    //状态
    private Short state;
    public DevpStateType stateType;
    //工作状态
    private Short workIo;
    public DevpWorkType workType;
    //请求信号
    private Short requestIo;
    public DevpRequestType requestType;
    //托盘状态
    private Short trayIo;
    public DevpTrayType trayType;
    //库位状态
    private Short locIo;
    public DevpLocType locType;
    //条码信息
    private String barcode;
    //重量信息
    private Double weightIo;
    //备用
    private Short spare;
    // 有物
    private boolean loading;
    public void setMode(Short mode) {
        this.mode = mode;
        this.modeType = DevpModeType.get(mode);
    }
    public void setState(Short state) {
        this.state = state;
        this.stateType = DevpStateType.get(state);
    }
    public void setWorkIo(Short workIo) {
        this.workIo = workIo;
        this.workType = DevpWorkType.get(workIo);
    }
    public void setRequestIo(Short requestIo) {
        this.requestIo = requestIo;
        this.requestType = DevpRequestType.get(requestIo);
    }
    public void setTrayIo(Short trayIo) {
        this.trayIo = trayIo;
        this.trayType = DevpTrayType.get(trayIo);
    }
    public void setLocIo(Short locIo) {
        this.locIo = locIo;
        this.locType = DevpLocType.get(locIo);
    }
    // 可入
    private boolean inEnable;
    // 可出
    private boolean outEnable;
    // 空板信号
    private boolean emptyMk;
    // 满托盘
    private boolean fullPlt;
    // 高
    private boolean high = false;
    // 低
    private boolean low;
    //agv
    private boolean car;
    // 锁定标记
    private boolean pakMk = true;
@@ -59,11 +88,9 @@
    // 入库暂存数
    private Short inQty;
    // 隔壁站点(台车位置)
    private String nearbySta;
    //指令ID
    private Integer commandId;
    // 外形检测 ------------------------------------------------------------------------
@@ -105,100 +132,34 @@
    private Boolean upcontactErr = false; //顶升电机接触器故障
    private Short agvStartPick; //允许取货
    private Short agvStartPlace; //允许放货
    private Short agvTypeSign; //允许放货
    private Short agvTargetPick; //取货完成
    private Short agvTargetPlace; //放货完成
    private Short agvTypeSignEnd; //放货完成
    private List<Integer> alarm;
    public List<Integer> getAlarm(){
        List<Integer> alarm = new ArrayList<>();
        if (breakerErr){
            alarm.add(1);
    public Boolean isErr(){
        if (frontErr || backErr || highErr || leftErr || rightErr || weightErr || barcodeErr){
            return true;
        }else {
            return false;
        }
        if (infraredErr){
            alarm.add(2);
        }
        if (outTimeErr){
            alarm.add(3);
        }
        if (seizeSeatErr){
            alarm.add(4);
        }
        if (wrkYgoodsN){
            alarm.add(5);
        }
        if (inverterErr){
            alarm.add(6);
        }
        if (contactErr){
            alarm.add(7);
        }
        if (upcontactErr){
            alarm.add(8);
        }
        return alarm;
    }
    public Boolean isPakReset(){
        if (workNo == 0 && workType == DevpWorkType.BUSY && requestType != DevpRequestType.IN){
            return true;
        }
        return false;
    }
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
        basDevp.setDevNo(siteId);
        basDevp.setWrkNo(workNo.intValue());
        basDevp.setAutoing(autoing?"Y":"N");
        basDevp.setLoading(loading?"Y":"N");
        if (frontErr){
            basDevp.setStaErr(11);
        }else if (backErr){
            basDevp.setStaErr(12);
        }else if (highErr){
            basDevp.setStaErr(13);
        }else if (leftErr){
            basDevp.setStaErr(14);
        }else if (rightErr){
            basDevp.setStaErr(15);
        }else if (weightErr){
            basDevp.setStaErr(16);
        }else if (barcodeErr){
            basDevp.setStaErr(17);
        }else if (breakerErr){
            basDevp.setStaErr(18);
        }else if (infraredErr){
            basDevp.setStaErr(19);
        }else if (outTimeErr){
            basDevp.setStaErr(110);
        }else if (seizeSeatErr){
            basDevp.setStaErr(111);
        }else if (wrkYgoodsN){
            basDevp.setStaErr(112);
        }else if (inverterErr){
            basDevp.setStaErr(113);
        }else if (contactErr){
            basDevp.setStaErr(114);
        }else if (upcontactErr){
            basDevp.setStaErr(115);
        }else {
            if (!loading){
                basDevp.setStaErr(0);
            }
        }
        basDevp.setInEnable(inEnable?"Y":"N");
        basDevp.setOutEnable(outEnable?"Y":"N");
        basDevp.setAutoing(stateType == DevpStateType.AUTO?"Y":"N");
        basDevp.setLoading(workType == DevpWorkType.BUSY?"Y":"N");
        basDevp.setInEnable(requestType == DevpRequestType.IN?"Y":"N");
        basDevp.setOutEnable(requestType == DevpRequestType.OUT?"Y":"N");
        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 && low ? (short) 1 : (short) 2);
        basDevp.setInQty(inQty !=null ?(int)inQty : 0);
//        basDevp.setAgvStartPick(agvStartPick.intValue());
//        basDevp.setAgvStartPlace(agvStartPlace.intValue());
        basDevp.setLocType1(DevpLocType.get(locIo).id.shortValue());
//        basDevp.setInQty(inQty !=null ?(int)inQty : 0);
        return basDevp;
    }
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -5,21 +5,20 @@
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;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.service.*;
import com.zy.asrs.service.BasDevpService;
import com.zy.common.utils.News;
import com.zy.core.DevpThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.DevpType.DevpWorkType;
import com.zy.core.enums.IoModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.Cycle;
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -43,6 +42,8 @@
    private SiemensS7Net siemensS7Net;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
    public static boolean is = true;
    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);
@@ -50,30 +51,16 @@
        add(206);add(207);add(208);add(209);add(210);
        add(211);add(212);
    }};
    /*public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
        add(200);add(201);add(202);add(203);
        add(204);add(205);add(206);add(207);
        add(208);add(209);add(210);add(211);
        add(212);add(213);add(214);add(215);
        add(216);add(217);add(218);add(219);
        add(220);add(221);add(222);add(223);
        add(224);add(225);add(226);add(227);
        add(228);add(229);add(230);add(231);
        add(232);add(233);add(234);add(235);
    }};
    public static final ArrayList<Integer> staNos3 = new ArrayList<Integer>() {{
        add(300);add(301);add(302);add(303);
        add(304);add(305);add(306);add(307);
    }};
    public static final ArrayList<Integer> staNos4 = new ArrayList<Integer>() {{
        add(400);add(401);add(402);add(403);
        add(404);add(405);add(406);add(407);
    }};*/
//    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);
//    }};
    /**
     * 条码数量
     */
    private int barcodeSize = 1;
    private int barcodeSize = 8;
    /**
     * 入出库模式
@@ -85,23 +72,22 @@
     */
    public IoModeType ioModeOf2F = IoModeType.NONE;
//    public IoModeType ioMode = IoModeType.NONE;
    public IoModeType ioModeOf4F = IoModeType.NONE;
//    public IoModeType ioMode = IoModeType.NONE;
    public SiemensDevpThread(DevpSlave slave) {
        this.slave = slave;
    }
    private ArrayList<Integer> getStaNo() {
        switch (slave.getId()) {
            case 1:
                return staNos1;
            /*case 2:
                return staNos2;
            case 3:
                return staNos3;
            case 4:
                return staNos4;*/
//            case 2:
//                return staNos2;
            default:
                throw new CoolException("服务器异常");
        }
    }
    public SiemensDevpThread(DevpSlave slave) {
        this.slave = slave;
    }
    @Override
@@ -122,31 +108,21 @@
                        break;
                    // 写数据 ID+目标站
                    case 2:
                        write((StaProtocol)task.getData());
                        read();
                        writeD((StaProtocol)task.getData(),1);
//                        log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo());
                        break;
                    // 写数据 ID+目标站
                    case 4:
                        writeCycle((StaProtocol)task.getData());
                        read();
                        break;
                   /* case 3:
                        write2((StaProtocol)task.getData());
                        read();
                        break;*/
                    default:
                        break;
                }
                // 心跳
//                heartbeat();
                Thread.sleep(400);
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 初始化站点状态
     */
@@ -160,15 +136,18 @@
                staProtocol.setSiteId(siteId);
                station.put(siteId, staProtocol);
            }
            staProtocol.setWorkNo((short) 0);    // ID
            staProtocol.setAutoing(false);      // 自动
            staProtocol.setLoading(false);      // 有物
            staProtocol.setInEnable(false);     // 可入
            staProtocol.setOutEnable(false);    // 可出
            staProtocol.setEmptyMk(false);      // 空板信号
            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);
            if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
            if (!staProtocol.isPakMk() && staProtocol.workType == DevpWorkType.IDLE) {
                staProtocol.setPakMk(true);
            }
        }
@@ -184,15 +163,13 @@
        if(connect.IsSuccess){
            result = true;
            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.info("输送线plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            News.info("SiemensDevp"+" - 1"+" - 输送线plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        } 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:{}]", slave.getId(), slave.getIp(), slave.getPort());
//            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
//            deviceErrorService.addDeviceError("devp", slave.getId(), "输送线plc连接失败");
            initSite();
            News.error("SiemensDevp"+" - 2"+" - 输送线plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
        siemensS7Net.ConnectClose();
        initSite();
        return result;
    }
@@ -204,177 +181,35 @@
//        updateIoMode();
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize*8));
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100.0", (short) (staNoSize*66));
        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*8));     // 工作号
                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));
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4));   // 目标站
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 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.isLoading()) {
                if (!staProtocol.isPakMk() && (staProtocol.workType == DevpWorkType.IDLE  || staProtocol.isPakReset())) {
                    staProtocol.setPakMk(true);
                }
            }
        }
//        OperateResultExOne<byte[]> resultAgvAndPlc = siemensS7Net.Read("DB102.0", (short) 30);
//        if (resultAgvAndPlc.IsSuccess) {
//            for (int i = 0; i < staNoSize; i++) {
//                int sign =(i+2)/2-1;
//                if ((i+2)%2!=0){
//                    Integer siteId = staNos.get(i); // 站点编号
//                    StaProtocol staProtocol = station.get(siteId);
//                    if (null == staProtocol) {
//                        staProtocol = new StaProtocol();
//                        staProtocol.setSiteId(siteId);
//                        station.put(siteId, staProtocol);
//                    }
//                    staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6+4));     // 允许取货
//                    staProtocol.setAgvStartPlace((short)0);   // 允许放货
//                    continue;
//                }
//                Integer siteId = staNos.get(i); // 站点编号
//                StaProtocol staProtocol = station.get(siteId);
//                if (null == staProtocol) {
//                    staProtocol = new StaProtocol();
//                    staProtocol.setSiteId(siteId);
//                    station.put(siteId, staProtocol);
//                }
//                staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6));     // 允许取货
//                staProtocol.setAgvStartPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6 + 2));   // 允许放货
//            }
//        }
//        OperateResultExOne<byte[]> resultAgvAndPlcOk = siemensS7Net.Read("DB132.0", (short) 30);
//        if (resultAgvAndPlcOk.IsSuccess) {
//            for (int i = 0; i < staNoSize; i++) {
//                int sign =(i+2)/2-1;
//                if ((i+2)%2!=0){
//                    Integer siteId = staNos.get(i); // 站点编号
//                    StaProtocol staProtocol = station.get(siteId);
//                    if (null == staProtocol) {
//                        staProtocol = new StaProtocol();
//                        staProtocol.setSiteId(siteId);
//                        station.put(siteId, staProtocol);
//                    }
//                    staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6+4));     // 允许取货
//                    staProtocol.setAgvTargetPlace((short)0);   // 允许放货
//                    continue;
//                }
//                Integer siteId = staNos.get(i); // 站点编号
//                StaProtocol staProtocol = station.get(siteId);
//                if (null == staProtocol) {
//                    staProtocol = new StaProtocol();
//                    staProtocol.setSiteId(siteId);
//                    station.put(siteId, staProtocol);
//                }
//                try{
//                    staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6));     // 取货完成
//                    if (staProtocol.getAgvTargetPick()!=0){
//                        System.out.println(staProtocol.getAgvTargetPick());
//                    }
//                    staProtocol.setAgvTargetPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6 + 2));   // 放货完成
//                    if (staProtocol.getAgvTargetPlace()!=0){
//                        System.out.println(staProtocol.getAgvTargetPlace());
//                    }
//                }catch (Exception e){
//                    log.error(""+e);
//                }
//            }
//        }
        if (slave.getId() == 1) {
            //条码
            //Thread.sleep(200);
            OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.848.0", (short) 8);
            if (result2.IsSuccess) {
                for (int i = 0; i < 1; 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);
                    }
                }
            }
            //外形检测
            OperateResultExOne<byte[]> resultErr1 = siemensS7Net.Read("DB101.810.0", (short) (barcodeSize*1));
            StaProtocol staProtocol1 = station.get(116);
            boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultErr1.Content, 0, 1);
            staProtocol1.setFrontErr(status1[0]);
            staProtocol1.setBackErr(status1[1]);
            staProtocol1.setHighErr(status1[2]);
            staProtocol1.setLeftErr(status1[3]);
            staProtocol1.setRightErr(status1[4]);
            staProtocol1.setWeightErr(status1[5]);
            staProtocol1.setBarcodeErr(status1[6]);
            OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.922.0", (short) (staNoSize * 4));
            if (resultErr.IsSuccess) {
                for (int i = 0; i < staNoSize; i++) {
                    Integer siteId = staNos.get(i); // 站点编号
                    boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.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]);
                }
            }
        }
//        //RGV台车位置
//        Thread.sleep(200);
//        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB100.0",(short)4);
//        if (result3.IsSuccess) {
//            for (int i = 0; i < 2; i++) {
//                Integer siteId = i==0 ? 1 : 2; // 站点编号
//                StaProtocol staProtocol = station.get(siteId);
//                if (null == staProtocol) {
//                    staProtocol = new StaProtocol();
//                    staProtocol.setSiteId(siteId);
//                    station.put(siteId, staProtocol);
//                }
//                staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, i*2)));
////                String aa = staProtocol.getNearbySta();
////                System.out.println(siteId + "===>>" + staProtocol.getNearbySta());
//            }
//        }
//        OperateResultExOne<Short> result2 = siemensS7Net.ReadInt16("DB200.0");
//        if (result2.IsSuccess) {
//            this.ioMode = IoModeType.get(result2.Content);
//        }
        if (result.IsSuccess ) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
            // 根据实时信息更新数据库
            try {
                List<BasDevp> basDevps = new ArrayList<>();
@@ -382,419 +217,171 @@
                    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) {
                initSite();
                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());
                News.error("SiemensDevp"+" - 3"+" - 更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            }
            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
            deviceErrorService.deleteDeviceError("devp", slave.getId());
        } 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());
            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
            deviceErrorService.addDeviceError("devp", slave.getId(), "读取输送线plc状态信息失败");
        }
    }
    /**
     * 写入 ID+目标站 =====> 单站点写入
     */
    private void writeAgvOk(StaProtocol staProtocol) throws InterruptedException {
    private void write(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        if (staProtocol.getAgvTypeSign()==0 || staProtocol.getAgvTypeSign()==2 ){  //0取货
            switch (staProtocol.getSiteId()){
                case 100:
                    index=32;
                    break;
                case 101:
                    index=34;
                    break;
                case 102:
                    index=38;
                    break;
                case 103:
                    index=40;
                    break;
                case 104:
                    index=44;
                    break;
                case 105:
                    index=46;
                    break;
                case 106:
                    index=50;
                    break;
                case 107:
                    index=52;
                    break;
                default:
                    return;
            }
        }else {
            switch (staProtocol.getSiteId()){
                case 100:
                    index=30;
                    break;
                case 102:
                    index=36;
                    break;
                case 104:
                    index=42;
                    break;
                case 106:
                    index=48;
                    break;
                default:
                    return;
            }
        }
        OperateResult write = null;
        OperateResult write1 = null;
        OperateResult write2 = null;
        //任务下发次数
        int writeCount = 0;
        do {
            short textWrite = 1;// 任务完成
            if (staProtocol.getAgvTypeSign()>1){
                textWrite = 0;// 任务复位
            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){
                break;
            }
            write = siemensS7Net.Write("DB102." + index, textWrite);
            if(write.IsSuccess){
                writeCount=6;
            }else {
            else {
                writeCount++;
                log.error("写入输送线取放货完成命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
        }while (writeCount<5);
        if (!write.IsSuccess) {
            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 write(StaProtocol staProtocol) throws InterruptedException {
        if (staProtocol == null) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        if (index == -1) {
            log.error("站点编号 {} 不在已知列表中,无法写入任务!", staProtocol.getSiteId());
            return;
        }
        int writeCount = 0; // 任务下发尝试次数
        boolean writeFlag = false; // 任务下发成功标记
        String plcAddressWorkNo = "DB100." + index * 6;
        String plcAddressStaNo = "DB100." + (index * 6 + 4);
        while (writeCount < 5) {
            // **读取当前PLC状态,避免不必要的写入**
            OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6);
            if (readResult.IsSuccess) {
                int currentWorkNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
                short currentStaNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
                if (currentWorkNo == staProtocol.getWorkNo().intValue() && currentStaNo == staProtocol.getStaNo()) {
                    log.info("站点 {} 当前状态已匹配,无需重复写入", staProtocol.getSiteId());
                    return;
                }
            }
            // **清零并确认**
            if (!clearPLCData(plcAddressWorkNo, plcAddressStaNo, staProtocol.getSiteId())) {
                writeCount++;
                continue; // 重新尝试清零
            }
            // **写入新任务**
            if (writeTaskToPLC(plcAddressWorkNo, plcAddressStaNo, staProtocol)) {
                writeFlag = true;
                log.info("输送线命令写入成功,PLC编号={},站点数据={},尝试次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                break;
            }
            log.warn("输送线命令写入失败,PLC编号={},站点数据={},尝试次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            writeCount++;
        }
        // **写入失败处理**
        handleWriteFailure(staProtocol, writeFlag);
    }
    private void writeCycle(StaProtocol staProtocol) throws InterruptedException {
        if (staProtocol == null) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        if (index == -1) {
            log.error("站点编号 {} 不在已知列表中,无法写入任务!", staProtocol.getSiteId());
            return;
        }
        int writeCount = 0; // 任务下发尝试次数
        boolean writeFlag = false; // 任务下发成功标记
        String plcAddressWorkNo = "";
        String plcAddressStaNo = "" ;
        switch (staProtocol.getSiteId()){
            case 105:
                plcAddressWorkNo = "DB73." + 0;
                plcAddressStaNo = "DB73." + 4;
                break;
            case 106:
                plcAddressWorkNo = "DB73." + 6;
                plcAddressStaNo = "DB73." + (6 + 4);
                break;
            case 108:
                plcAddressWorkNo = "DB73." + 2 * 6;
                plcAddressStaNo = "DB73." + (2 * 6 + 4);
                break;
            case 110:
                plcAddressWorkNo = "DB73." + 3 * 6;
                plcAddressStaNo = "DB73." + (3 * 6 + 4);
                break;
            case 112:
                plcAddressWorkNo = "DB73." + 4 * 6;
                plcAddressStaNo = "DB73." + (4 * 6 + 4);
                break;
        }
        // **写入新任务**
        if (writeTaskToPLC(plcAddressWorkNo, plcAddressStaNo, staProtocol)) {
            writeFlag = true;
            log.info("输送线命令写入成功,PLC编号={},站点数据={},尝试次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
        }
        // **写入失败处理**
        handleWriteFailure(staProtocol, writeFlag);
    }
    /**
     * 清零 PLC 数据并验证清零是否成功
     */
    private boolean clearPLCData(String plcAddressWorkNo, String plcAddressStaNo, int siteId) throws InterruptedException {
        siemensS7Net.Write(plcAddressWorkNo, 0);
        siemensS7Net.Write(plcAddressStaNo, (short) 0);
        Thread.sleep(100); // 等待PLC识别
        OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6);
        if (readResult.IsSuccess) {
            int readWorkNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
            short readStaNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
            if (readWorkNo == 0 && readStaNo == 0) {
                return true; // 清零成功
            }
        }
        log.warn("站点 {} 清零失败,尝试重新清零...", siteId);
        return false;
    }
    /**
     * 写入新任务到 PLC 并验证是否成功
     */
    private boolean writeTaskToPLC(String plcAddressWorkNo, String plcAddressStaNo, StaProtocol staProtocol) throws InterruptedException {
        OperateResult writeResult2 = siemensS7Net.Write(plcAddressStaNo, staProtocol.getStaNo());
        OperateResult writeResult1 = siemensS7Net.Write(plcAddressWorkNo, staProtocol.getWorkNo().intValue());
        if (writeResult1.IsSuccess && writeResult2.IsSuccess) {
            Thread.sleep(200); // 等待 PLC 识别新值
            OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6);
            if (readResult.IsSuccess) {
                int workNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
                short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
                return workNo == staProtocol.getWorkNo().intValue() && staNo == staProtocol.getStaNo();
            }
        }
        return false;
    }
    private boolean writeTaskToPLC(String plcAddressWorkNo, String plcAddressStaNo, Cycle cycle) throws InterruptedException {
        OperateResult writeResult1 = siemensS7Net.Write(plcAddressWorkNo, cycle.getWorkNo().intValue());
        OperateResult writeResult2 = siemensS7Net.Write(plcAddressStaNo, cycle.getStaNo());
        if (writeResult1.IsSuccess && writeResult2.IsSuccess) {
            Thread.sleep(200); // 等待 PLC 识别新值
            OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6);
            if (readResult.IsSuccess) {
                int workNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
                short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
                return workNo == cycle.getWorkNo().intValue() && staNo == cycle.getStaNo();
            }
        }
        return false;
    }
    /**
     * 处理写入失败的情况
     */
    private void handleWriteFailure(StaProtocol staProtocol, boolean writeFlag) {
        if (!writeFlag) {
            StaProtocol currentStaProtocol = station.get(staProtocol.getSiteId());
            if (currentStaProtocol.getWorkNo() == 0 && currentStaProtocol.getStaNo() == 0) {
                currentStaProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】输送线命令尝试5次失败。PLC编号={1},站点数据={2}",
                    slave.getId(), JSON.toJSON(currentStaProtocol)));
            log.error("输送线命令尝试5次失败,PLC编号={},站点数据={}", slave.getId(), JSON.toJSON(currentStaProtocol));
        } 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 write2(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        short[] array = new short[2];
        array[0] = staProtocol.getWorkNo();
        array[1] = staProtocol.getStaNo();
        OperateResult writeResult;
        //任务下发次数
        int writeCount = 0;
        //任务下发成功标识
        boolean writeFlag = false;
        while(writeCount < 5){
            writeResult = siemensS7Net.Write("DB100." + index*4, array);    // 工作号、目标站
            if(writeResult.IsSuccess){
                Thread.sleep(200);
                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + 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);
                        Date now = new Date();
                        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(3, staProtocol));
            read();//读取1次设备状态
            return;
            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)));
            //log.info("输送线命令下发 [id:{}] >>>>> 命令下发成功: {}",  slave.getId(), JSON.toJSON(staProtocol));
            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));
        }
    }
            Integer siteId = staProtocol.getSiteId();
            staProtocol = station.get(siteId);
            if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
                staProtocol.setPakMk(true);
    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);
            }
        }else {
            log.error("输送命令下发失败"+JSON.toJSONString(staProtocol));
        }
    }
//    /**
//     * 写入 ID+目标站 =====> 单站点写入
//     */
//    private void write(StaProtocol staProtocol) throws InterruptedException {
//        if (null == staProtocol) {
//            return;
//        }
//        int index = staNos.indexOf(staProtocol.getSiteId());
//        short[] array = new short[2];
//        array[0] = staProtocol.getWorkNo();
//        array[1] = staProtocol.getStaNo();
//        OperateResult write = siemensS7Net.Write("DB100." + index*4, array);
//
////        OperateResult write = siemensS7Net.Write("DB100." + index*2, staProtocol.getWorkNo());    // 工作号
////        Thread.sleep(500);
////        OperateResult write1 = siemensS7Net.Write("DB101." + index*2, staProtocol.getStaNo());    // 目标站
//
//        if (!write.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));
//
//            Integer siteId = staProtocol.getSiteId();
//            staProtocol = station.get(siteId);
//            if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
//                staProtocol.setPakMk(true);
//            }
//        }
//    }
    private boolean writeWrk(StaProtocol staProtocol,Integer count)throws InterruptedException {
    // 更新入出库模式
    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()));
                log.error("写入输送线2F入出库模式失败。输送线plc编号={}", slave.getId());
        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());    // 工作号
            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());
//            }
//        }
//    }
    /**
     * 心跳
@@ -807,7 +394,7 @@
        }
        OperateResult write = siemensS7Net.Write("DB100.50", heartBeatVal);
        if (!write.IsSuccess) {
            log.error("输送线plc编号={} 心跳失败", slave.getId());
            News.error("SiemensDevp"+" - 7"+" - 输送线plc编号={} 心跳失败", slave.getId());
        }
    }
@@ -828,15 +415,14 @@
    }
    public static void main(String[] args) {
        ArrayList<Integer> staNos = staNos1;
        System.out.println(staNos.indexOf(129));
        System.out.println(staNos.size());
        for (int i = 0; i<staNos.size(); i++) {
        System.out.println(staNos1.indexOf(129));
        System.out.println(staNos1.size());
        for (int i = 0; i<staNos1.size(); i++) {
//            System.out.println(i*2);
//            System.out.println(i*2 + 200);
//            System.out.println(i);
        }
        int index = staNos.indexOf(128);
        int index = staNos1.indexOf(128);
        System.out.println(index*2);
        System.out.println(index*2 + 200);
    }
src/main/java/com/zy/core/thread/SiemensDevpThread2.java
New file
@@ -0,0 +1,865 @@
//package com.zy.core.thread;
//
//import HslCommunication.Core.Types.OperateResult;
//import HslCommunication.Core.Types.OperateResultExOne;
//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;
//import com.zy.asrs.entity.BasDevp;
//import com.zy.asrs.service.*;
//import com.zy.core.DevpThread;
//import com.zy.core.cache.MessageQueue;
//import com.zy.core.cache.OutputQueue;
//import com.zy.core.cache.SlaveConnection;
//import com.zy.core.enums.IoModeType;
//import com.zy.core.enums.SlaveType;
//import com.zy.core.model.DevpSlave;
//import com.zy.core.model.Task;
//import com.zy.core.model.protocol.Cycle;
//import com.zy.core.model.protocol.StaProtocol;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//
//import java.text.MessageFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * 输送线线程
// * Created by vincent on 2020/8/4
// */
//@Data
//@Slf4j
//public class SiemensDevpThread2 implements Runnable, DevpThread {
//
//    private DevpSlave slave;
//    private SiemensS7Net siemensS7Net;
//    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
//    private short heartBeatVal = 1;
//    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);
//        add(201);add(202);add(203);add(204);add(205);
//        add(206);add(207);add(208);add(209);add(210);
//        add(211);add(212);
//    }};
//    /*public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
//        add(200);add(201);add(202);add(203);
//        add(204);add(205);add(206);add(207);
//        add(208);add(209);add(210);add(211);
//        add(212);add(213);add(214);add(215);
//        add(216);add(217);add(218);add(219);
//        add(220);add(221);add(222);add(223);
//        add(224);add(225);add(226);add(227);
//        add(228);add(229);add(230);add(231);
//        add(232);add(233);add(234);add(235);
//    }};
//    public static final ArrayList<Integer> staNos3 = new ArrayList<Integer>() {{
//        add(300);add(301);add(302);add(303);
//        add(304);add(305);add(306);add(307);
//    }};
//    public static final ArrayList<Integer> staNos4 = new ArrayList<Integer>() {{
//        add(400);add(401);add(402);add(403);
//        add(404);add(405);add(406);add(407);
//    }};*/
//
//    /**
//     * 条码数量
//     */
//    private int barcodeSize = 1;
//
//    /**
//     * 入出库模式
//     * 0:未知
//     * 1:入库启动中
//     * 2.入库模式
//     * 3.出库启动中 (不能生成入库工作档)
//     * 4.出库模式
//     */
//    public IoModeType ioModeOf2F = IoModeType.NONE;
////    public IoModeType ioMode = IoModeType.NONE;
//    private ArrayList<Integer> getStaNo() {
//        switch (slave.getId()) {
//            case 1:
//                return staNos1;
//            /*case 2:
//                return staNos2;
//            case 3:
//                return staNos3;
//            case 4:
//                return staNos4;*/
//            default:
//                throw new CoolException("服务器异常");
//        }
//    }
//
//    public SiemensDevpThread(DevpSlave slave) {
//        this.slave = slave;
//    }
//
//    @Override
//    @SuppressWarnings("InfiniteLoopStatement")
//    public void run() {
//        connect();
//        while (true) {
//            try {
//                int step = 1;
//                Task task = MessageQueue.poll(SlaveType.Devp, slave.getId());
//                if (task != null) {
//                    step = task.getStep();
//                }
//                switch (step) {
//                    // 读数据
//                    case 1:
//                        read();
//                        break;
//                    // 写数据 ID+目标站
//                    case 2:
//                        write((StaProtocol)task.getData());
//                        read();
//                        break;
//                    // 写数据 ID+目标站
//                    case 4:
//                        writeCycle((StaProtocol)task.getData());
//                        read();
//                        break;
//                   /* case 3:
//                        write2((StaProtocol)task.getData());
//                        read();
//                        break;*/
//                    default:
//                        break;
//                }
//                // 心跳
////                heartbeat();
//                Thread.sleep(400);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//
//        }
//    }
//
//    /**
//     * 初始化站点状态
//     */
//    private void initSite() {
//        ArrayList<Integer> staNos = getStaNo();
//        // 站点编号
//        for (Integer siteId : staNos) {
//            StaProtocol staProtocol = station.get(siteId);
//            if (null == staProtocol) {
//                staProtocol = new StaProtocol();
//                staProtocol.setSiteId(siteId);
//                station.put(siteId, staProtocol);
//            }
//            staProtocol.setWorkNo((short) 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.isLoading()) {
//                staProtocol.setPakMk(true);
//            }
//        }
//    }
//
//    @Override
//    public boolean connect() {
//        boolean result = false;
//        siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
//        siemensS7Net.setRack(slave.getRack().byteValue());
//        siemensS7Net.setSlot(slave.getSlot().byteValue());
//        OperateResult connect = siemensS7Net.ConnectServer();
//        if(connect.IsSuccess){
//            result = true;
//            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.info("输送线plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//        } 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:{}]", slave.getId(), slave.getIp(), slave.getPort());
////            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
////            deviceErrorService.addDeviceError("devp", slave.getId(), "输送线plc连接失败");
//            initSite();
//        }
//        siemensS7Net.ConnectClose();
//        return result;
//    }
//
//    /**
//     * 读取状态 ====> 整块plc
//     */
//    private void read() throws InterruptedException {
////        // 更新入出库模式
////        updateIoMode();
//        ArrayList<Integer> staNos = getStaNo();
//        int staNoSize = staNos.size();
//        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize*8));
//        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*8));     // 工作号
//
//                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4));   // 目标站
//
//                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 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.isLoading()) {
//                    staProtocol.setPakMk(true);
//                }
//            }
//        }
//
////        OperateResultExOne<byte[]> resultAgvAndPlc = siemensS7Net.Read("DB102.0", (short) 30);
////        if (resultAgvAndPlc.IsSuccess) {
////            for (int i = 0; i < staNoSize; i++) {
////                int sign =(i+2)/2-1;
////                if ((i+2)%2!=0){
////                    Integer siteId = staNos.get(i); // 站点编号
////                    StaProtocol staProtocol = station.get(siteId);
////                    if (null == staProtocol) {
////                        staProtocol = new StaProtocol();
////                        staProtocol.setSiteId(siteId);
////                        station.put(siteId, staProtocol);
////                    }
////                    staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6+4));     // 允许取货
////                    staProtocol.setAgvStartPlace((short)0);   // 允许放货
////                    continue;
////                }
////                Integer siteId = staNos.get(i); // 站点编号
////                StaProtocol staProtocol = station.get(siteId);
////                if (null == staProtocol) {
////                    staProtocol = new StaProtocol();
////                    staProtocol.setSiteId(siteId);
////                    station.put(siteId, staProtocol);
////                }
////                staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6));     // 允许取货
////                staProtocol.setAgvStartPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6 + 2));   // 允许放货
////            }
////        }
//
////        OperateResultExOne<byte[]> resultAgvAndPlcOk = siemensS7Net.Read("DB132.0", (short) 30);
////        if (resultAgvAndPlcOk.IsSuccess) {
////            for (int i = 0; i < staNoSize; i++) {
////                int sign =(i+2)/2-1;
////                if ((i+2)%2!=0){
////                    Integer siteId = staNos.get(i); // 站点编号
////                    StaProtocol staProtocol = station.get(siteId);
////                    if (null == staProtocol) {
////                        staProtocol = new StaProtocol();
////                        staProtocol.setSiteId(siteId);
////                        station.put(siteId, staProtocol);
////                    }
////                    staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6+4));     // 允许取货
////                    staProtocol.setAgvTargetPlace((short)0);   // 允许放货
////                    continue;
////                }
////                Integer siteId = staNos.get(i); // 站点编号
////                StaProtocol staProtocol = station.get(siteId);
////                if (null == staProtocol) {
////                    staProtocol = new StaProtocol();
////                    staProtocol.setSiteId(siteId);
////                    station.put(siteId, staProtocol);
////                }
////                try{
////                    staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6));     // 取货完成
////                    if (staProtocol.getAgvTargetPick()!=0){
////                        System.out.println(staProtocol.getAgvTargetPick());
////                    }
////                    staProtocol.setAgvTargetPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6 + 2));   // 放货完成
////                    if (staProtocol.getAgvTargetPlace()!=0){
////                        System.out.println(staProtocol.getAgvTargetPlace());
////                    }
////                }catch (Exception e){
////                    log.error(""+e);
////                }
////            }
////        }
//
//
//        if (slave.getId() == 1) {
//            //条码
//            //Thread.sleep(200);
//            OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.848.0", (short) 8);
//            if (result2.IsSuccess) {
//                for (int i = 0; i < 1; 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);
//                    }
//                }
//            }
//
//            //外形检测
//            OperateResultExOne<byte[]> resultErr1 = siemensS7Net.Read("DB101.810.0", (short) (barcodeSize*1));
//            StaProtocol staProtocol1 = station.get(116);
//            boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultErr1.Content, 0, 1);
//            staProtocol1.setFrontErr(status1[0]);
//            staProtocol1.setBackErr(status1[1]);
//            staProtocol1.setHighErr(status1[2]);
//            staProtocol1.setLeftErr(status1[3]);
//            staProtocol1.setRightErr(status1[4]);
//            staProtocol1.setWeightErr(status1[5]);
//            staProtocol1.setBarcodeErr(status1[6]);
//
//            OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.922.0", (short) (staNoSize * 4));
//            if (resultErr.IsSuccess) {
//                for (int i = 0; i < staNoSize; i++) {
//                    Integer siteId = staNos.get(i); // 站点编号
//                    boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.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]);
//
//                }
//            }
//
//        }
//
//
////        //RGV台车位置
////        Thread.sleep(200);
////        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB100.0",(short)4);
////        if (result3.IsSuccess) {
////            for (int i = 0; i < 2; i++) {
////                Integer siteId = i==0 ? 1 : 2; // 站点编号
////                StaProtocol staProtocol = station.get(siteId);
////                if (null == staProtocol) {
////                    staProtocol = new StaProtocol();
////                    staProtocol.setSiteId(siteId);
////                    station.put(siteId, staProtocol);
////                }
////                staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, i*2)));
//////                String aa = staProtocol.getNearbySta();
//////                System.out.println(siteId + "===>>" + staProtocol.getNearbySta());
////            }
////        }
//
////        OperateResultExOne<Short> result2 = siemensS7Net.ReadInt16("DB200.0");
////        if (result2.IsSuccess) {
////            this.ioMode = IoModeType.get(result2.Content);
////        }
//
//        if (result.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());
//            }
//
//            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
//            deviceErrorService.deleteDeviceError("devp", slave.getId());
//        } 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());
//            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
//            deviceErrorService.addDeviceError("devp", slave.getId(), "读取输送线plc状态信息失败");
//        }
//    }
//
//    /**
//     * 写入 ID+目标站 =====> 单站点写入
//     */
//    private void writeAgvOk(StaProtocol staProtocol) throws InterruptedException {
//        if (null == staProtocol) {
//            return;
//        }
//        ArrayList<Integer> staNos = getStaNo();
//        int index = staNos.indexOf(staProtocol.getSiteId());
//        if (staProtocol.getAgvTypeSign()==0 || staProtocol.getAgvTypeSign()==2 ){  //0取货
//            switch (staProtocol.getSiteId()){
//                case 100:
//                    index=32;
//                    break;
//                case 101:
//                    index=34;
//                    break;
//                case 102:
//                    index=38;
//                    break;
//                case 103:
//                    index=40;
//                    break;
//                case 104:
//                    index=44;
//                    break;
//                case 105:
//                    index=46;
//                    break;
//                case 106:
//                    index=50;
//                    break;
//                case 107:
//                    index=52;
//                    break;
//                default:
//                    return;
//            }
//        }else {
//            switch (staProtocol.getSiteId()){
//                case 100:
//                    index=30;
//                    break;
//                case 102:
//                    index=36;
//                    break;
//                case 104:
//                    index=42;
//                    break;
//                case 106:
//                    index=48;
//                    break;
//                default:
//                    return;
//            }
//        }
//
//        OperateResult write = null;
//        //任务下发次数
//        int writeCount = 0;
//        do {
//            short textWrite = 1;// 任务完成
//            if (staProtocol.getAgvTypeSign()>1){
//                textWrite = 0;// 任务复位
//            }
//            write = siemensS7Net.Write("DB102." + index, textWrite);
//            if(write.IsSuccess){
//                writeCount=6;
//            }else {
//                writeCount++;
//                log.error("写入输送线取放货完成命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//            }
//        }while (writeCount<5);
//
//        if (!write.IsSuccess) {
//            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 write(StaProtocol staProtocol) throws InterruptedException {
//        if (staProtocol == null) {
//            return;
//        }
//
//        ArrayList<Integer> staNos = getStaNo();
//        int index = staNos.indexOf(staProtocol.getSiteId());
//
//        if (index == -1) {
//            log.error("站点编号 {} 不在已知列表中,无法写入任务!", staProtocol.getSiteId());
//            return;
//        }
//
//        int writeCount = 0; // 任务下发尝试次数
//        boolean writeFlag = false; // 任务下发成功标记
//        String plcAddressWorkNo = "DB100." + index * 6;
//        String plcAddressStaNo = "DB100." + (index * 6 + 4);
//
//        while (writeCount < 5) {
//            // **读取当前PLC状态,避免不必要的写入**
//            OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6);
//            if (readResult.IsSuccess) {
//                int currentWorkNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
//                short currentStaNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
//
//                if (currentWorkNo == staProtocol.getWorkNo().intValue() && currentStaNo == staProtocol.getStaNo()) {
//                    log.info("站点 {} 当前状态已匹配,无需重复写入", staProtocol.getSiteId());
//                    return;
//                }
//            }
//
//            // **清零并确认**
//            if (!clearPLCData(plcAddressWorkNo, plcAddressStaNo, staProtocol.getSiteId())) {
//                writeCount++;
//                continue; // 重新尝试清零
//            }
//
//            // **写入新任务**
//            if (writeTaskToPLC(plcAddressWorkNo, plcAddressStaNo, staProtocol)) {
//                writeFlag = true;
//                log.info("输送线命令写入成功,PLC编号={},站点数据={},尝试次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//                break;
//            }
//
//            log.warn("输送线命令写入失败,PLC编号={},站点数据={},尝试次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//            writeCount++;
//        }
//
//        // **写入失败处理**
//        handleWriteFailure(staProtocol, writeFlag);
//    }
//
//    private void writeCycle(StaProtocol staProtocol) throws InterruptedException {
//        if (staProtocol == null) {
//            return;
//        }
//
//        ArrayList<Integer> staNos = getStaNo();
//        int index = staNos.indexOf(staProtocol.getSiteId());
//
//        if (index == -1) {
//            log.error("站点编号 {} 不在已知列表中,无法写入任务!", staProtocol.getSiteId());
//            return;
//        }
//
//        int writeCount = 0; // 任务下发尝试次数
//        boolean writeFlag = false; // 任务下发成功标记
//        String plcAddressWorkNo = "";
//        String plcAddressStaNo = "" ;
//        switch (staProtocol.getSiteId()){
//            case 105:
//                plcAddressWorkNo = "DB73." + 0;
//                plcAddressStaNo = "DB73." + 4;
//                break;
//            case 106:
//                plcAddressWorkNo = "DB73." + 6;
//                plcAddressStaNo = "DB73." + (6 + 4);
//                break;
//            case 108:
//                plcAddressWorkNo = "DB73." + 2 * 6;
//                plcAddressStaNo = "DB73." + (2 * 6 + 4);
//                break;
//            case 110:
//                plcAddressWorkNo = "DB73." + 3 * 6;
//                plcAddressStaNo = "DB73." + (3 * 6 + 4);
//                break;
//            case 112:
//                plcAddressWorkNo = "DB73." + 4 * 6;
//                plcAddressStaNo = "DB73." + (4 * 6 + 4);
//                break;
//        }
//
//
//        // **写入新任务**
//        if (writeTaskToPLC(plcAddressWorkNo, plcAddressStaNo, staProtocol)) {
//            writeFlag = true;
//            log.info("输送线命令写入成功,PLC编号={},站点数据={},尝试次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//        }
//
//        // **写入失败处理**
//        handleWriteFailure(staProtocol, writeFlag);
//    }
//
//    /**
//     * 清零 PLC 数据并验证清零是否成功
//     */
//    private boolean clearPLCData(String plcAddressWorkNo, String plcAddressStaNo, int siteId) throws InterruptedException {
//        siemensS7Net.Write(plcAddressWorkNo, 0);
//        siemensS7Net.Write(plcAddressStaNo, (short) 0);
//        Thread.sleep(100); // 等待PLC识别
//
//        OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6);
//        if (readResult.IsSuccess) {
//            int readWorkNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
//            short readStaNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
//            if (readWorkNo == 0 && readStaNo == 0) {
//                return true; // 清零成功
//            }
//        }
//
//        log.warn("站点 {} 清零失败,尝试重新清零...", siteId);
//        return false;
//    }
//
//    /**
//     * 写入新任务到 PLC 并验证是否成功
//     */
//    private boolean writeTaskToPLC(String plcAddressWorkNo, String plcAddressStaNo, StaProtocol staProtocol) throws InterruptedException {
//        OperateResult writeResult2 = siemensS7Net.Write(plcAddressStaNo, staProtocol.getStaNo());
//
//        OperateResult writeResult1 = siemensS7Net.Write(plcAddressWorkNo, staProtocol.getWorkNo().intValue());
//
//        if (writeResult1.IsSuccess && writeResult2.IsSuccess) {
//            Thread.sleep(200); // 等待 PLC 识别新值
//            OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6);
//            if (readResult.IsSuccess) {
//                int workNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
//                short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
//                return workNo == staProtocol.getWorkNo().intValue() && staNo == staProtocol.getStaNo();
//            }
//        }
//        return false;
//    }
//
//    private boolean writeTaskToPLC(String plcAddressWorkNo, String plcAddressStaNo, Cycle cycle) throws InterruptedException {
//        OperateResult writeResult1 = siemensS7Net.Write(plcAddressWorkNo, cycle.getWorkNo().intValue());
//        OperateResult writeResult2 = siemensS7Net.Write(plcAddressStaNo, cycle.getStaNo());
//
//        if (writeResult1.IsSuccess && writeResult2.IsSuccess) {
//            Thread.sleep(200); // 等待 PLC 识别新值
//            OperateResultExOne<byte[]> readResult = siemensS7Net.Read(plcAddressWorkNo, (short) 6);
//            if (readResult.IsSuccess) {
//                int workNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
//                short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
//                return workNo == cycle.getWorkNo().intValue() && staNo == cycle.getStaNo();
//            }
//        }
//        return false;
//    }
//
//    /**
//     * 处理写入失败的情况
//     */
//    private void handleWriteFailure(StaProtocol staProtocol, boolean writeFlag) {
//        if (!writeFlag) {
//            StaProtocol currentStaProtocol = station.get(staProtocol.getSiteId());
//            if (currentStaProtocol.getWorkNo() == 0 && currentStaProtocol.getStaNo() == 0) {
//                currentStaProtocol.setPakMk(true);
//            }
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】输送线命令尝试5次失败。PLC编号={1},站点数据={2}",
//                    slave.getId(), JSON.toJSON(currentStaProtocol)));
//            log.error("输送线命令尝试5次失败,PLC编号={},站点数据={}", slave.getId(), JSON.toJSON(currentStaProtocol));
//        } 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 write2(StaProtocol staProtocol) throws InterruptedException {
//        if (null == staProtocol) {
//            return;
//        }
//        ArrayList<Integer> staNos = getStaNo();
//
//        int index = staNos.indexOf(staProtocol.getSiteId());
//        short[] array = new short[2];
//        array[0] = staProtocol.getWorkNo();
//        array[1] = staProtocol.getStaNo();
//
//        OperateResult writeResult;
//        //任务下发次数
//        int writeCount = 0;
//        //任务下发成功标识
//        boolean writeFlag = false;
//        while(writeCount < 5){
//            writeResult = siemensS7Net.Write("DB100." + index*4, array);    // 工作号、目标站
//
//            if(writeResult.IsSuccess){
//                Thread.sleep(200);
//                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + 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);
//
//                        Date now = new Date();
//                        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(3, 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;
////        }
////        int index = staNos.indexOf(staProtocol.getSiteId());
////        short[] array = new short[2];
////        array[0] = staProtocol.getWorkNo();
////        array[1] = staProtocol.getStaNo();
////        OperateResult write = siemensS7Net.Write("DB100." + index*4, array);
////
//////        OperateResult write = siemensS7Net.Write("DB100." + index*2, staProtocol.getWorkNo());    // 工作号
//////        Thread.sleep(500);
//////        OperateResult write1 = siemensS7Net.Write("DB101." + index*2, staProtocol.getStaNo());    // 目标站
////
////        if (!write.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));
////
////            Integer siteId = staProtocol.getSiteId();
////            staProtocol = station.get(siteId);
////            if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
////                staProtocol.setPakMk(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()));
//                log.error("写入输送线2F入出库模式失败。输送线plc编号={}", slave.getId());
//            }
//        }
//    }
//
//    /**
//     * 心跳
//     */
//    private void heartbeat(){
//        if (heartBeatVal == 1) {
//            heartBeatVal = 2;
//        } else {
//            heartBeatVal = 1;
//        }
//        OperateResult write = siemensS7Net.Write("DB100.50", heartBeatVal);
//        if (!write.IsSuccess) {
//            log.error("输送线plc编号={} 心跳失败", slave.getId());
//        }
//    }
//
//    /**
//     * 设置入库标记
//     */
//    @Override
//    public void setPakMk(Integer siteId, boolean pakMk) {
//        StaProtocol staProtocol = station.get(siteId);
//        if (null != staProtocol) {
//            staProtocol.setPakMk(pakMk);
//        }
//    }
//
//    @Override
//    public void close() {
//        siemensS7Net.ConnectClose();
//    }
//
//    public static void main(String[] args) {
//        ArrayList<Integer> staNos = staNos1;
//        System.out.println(staNos.indexOf(129));
//        System.out.println(staNos.size());
//        for (int i = 0; i<staNos.size(); i++) {
////            System.out.println(i*2);
////            System.out.println(i*2 + 200);
////            System.out.println(i);
//        }
//        int index = staNos.indexOf(128);
//        System.out.println(index*2);
//        System.out.println(index*2 + 200);
//    }
//
////    public static void main(String[] args) throws Exception {
////        DevpSlave slave = new DevpSlave();
////        slave.setIp("192.168.2.125");
////        SiemensDevpThread devpThread = new SiemensDevpThread(slave);
////        devpThread.connect();
////        devpThread.read();
////        // 写
////        StaProtocol staProtocol = devpThread.getStation().get(1);
////        staProtocol.setWorkNo((short) 232);
////        staProtocol.setStaNo((short) 6);
////        staProtocol.setAutoing(true);
////        staProtocol.setEmptyMk(true);
////        staProtocol.setInEnable(true);
////        devpThread.write(staProtocol);
////        System.out.println("----------------------------------------");
////        // 读
////        devpThread.read();
////        System.out.println(JSON.toJSONString(devpThread.station));
////
////    }
//
//}
src/main/java/com/zy/system/controller/LicenseCreatorController.java
@@ -3,6 +3,7 @@
import com.core.common.Cools;
import com.core.common.R;
import com.zy.system.entity.license.*;
import com.zy.system.timer.LicenseTimer;
import de.schlichtherle.license.LicenseContent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -29,6 +30,8 @@
    @Autowired
    private LicenseCheckListener licenseCheckListener;
    @Autowired
    private LicenseTimer licenseTimer;
    /**
     * 获取服务器硬件信息
@@ -61,19 +64,7 @@
     */
    @RequestMapping(value = "/getLicenseDays")
    public R getLicenseDays() {
        LicenseVerify licenseVerify = new LicenseVerify();
        LicenseContent verifyInfo = licenseVerify.getVerifyInfo();
        if (verifyInfo == null) {
            return R.error();
        }
        Date start = new Date();
        Date end = verifyInfo.getNotAfter();
        Long starTime = start.getTime();
        Long endTime = end.getTime();
        Long num = endTime - starTime;//时间戳相差的毫秒数
        int day = (int) (num / 24 / 60 / 60 / 1000);
        return R.ok().add(day);
        return R.ok().add(licenseTimer.getLicenseDays());
    }
    @RequestMapping(value = "/updateLicense")
src/main/java/com/zy/system/entity/license/CustomKeyStoreParam.java
@@ -47,7 +47,8 @@
     */
    @Override
    public InputStream getStream() throws IOException {
        final InputStream in = new FileInputStream(new File(storePath));
        final InputStream in = this.getClass().getClassLoader().getResourceAsStream(storePath);
//        final InputStream in = new FileInputStream(new File(storePath));
        if (null == in) {
            throw new FileNotFoundException(storePath);
        }
src/main/java/com/zy/system/entity/license/LicenseCheckListener.java
@@ -1,9 +1,11 @@
package com.zy.system.entity.license;
import com.core.common.Cools;
import com.zy.system.timer.LicenseTimer;
import de.schlichtherle.license.LicenseContent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
@@ -11,6 +13,7 @@
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.Date;
/**
 * 在项目启动时安装证书
@@ -49,6 +52,9 @@
    @Value("${license.publicKeysStorePath}")
    private String publicKeysStorePath;
    @Autowired
    private LicenseTimer licenseTimer;
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //root application context 没有parent
@@ -64,18 +70,18 @@
            logger.info("++++++++ 开始加载许可证 ++++++++");
            try {
                String publicKeysStoreFileName = this.getClass().getClassLoader().getResource(publicKeysStorePath).getPath();
                File publicKeysStoreFile = new File(publicKeysStoreFileName);
                String licensePathFileName = this.getClass().getClassLoader().getResource(licensePath).getPath();
                File licensePathFile = new File(licensePathFileName);
//                String publicKeysStoreFileName = this.getClass().getClassLoader().getResource(publicKeysStorePath).getPath();
//                File publicKeysStoreFile = new File(publicKeysStoreFileName);
//
//                String licensePathFileName = this.getClass().getClassLoader().getResource(licensePath).getPath();
//                File licensePathFile = new File(licensePathFileName);
                LicenseVerifyParam param = new LicenseVerifyParam();
                param.setSubject(subject);
                param.setPublicAlias(publicAlias);
                param.setStorePass(storePass);
                param.setLicensePath(licensePathFile.getPath());
                param.setPublicKeysStorePath(publicKeysStoreFile.getPath());
                param.setLicensePath(licensePath);
                param.setPublicKeysStorePath(publicKeysStorePath);
                LicenseVerify licenseVerify = new LicenseVerify();
                //安装证书
@@ -83,12 +89,24 @@
                logger.info("++++++++ 许可证加载结束 ++++++++");
                licenseTimer.setSystemSupport(install != null);
                if (install != null) {
                    Date start = new Date();
                    Date end = install.getNotAfter();
                    Long starTime = start.getTime();
                    Long endTime = end.getTime();
                    Long num = endTime - starTime;//时间戳相差的毫秒数
                    int day = (int) (num / 24 / 60 / 60 / 1000);
                    licenseTimer.setLicenseDays(day);
                }
                return install != null;
            } catch (Exception e) {
                return false;
            }
        }
        licenseTimer.setSystemSupport(false);
        return false;
    }
}
src/main/java/com/zy/system/entity/license/LicenseVerify.java
@@ -3,8 +3,11 @@
import de.schlichtherle.license.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.util.IOUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
@@ -28,6 +31,11 @@
            LicenseManager licenseManager = LicenseManagerHolder.getInstance(initLicenseParam(param));
            licenseManager.uninstall();
            InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(param.getLicensePath());
            File file = new File(param.getLicensePath());
            try (FileOutputStream out = new FileOutputStream(file)) {
                IOUtils.copy(inputStream, out);
            }
            result = licenseManager.install(new File(param.getLicensePath()));
            logger.info(MessageFormat.format("许可证加载成功,许可证有效期:{0} - {1}",format.format(result.getNotBefore()),format.format(result.getNotAfter())));
        }catch (Exception e){
src/main/java/com/zy/system/timer/LicenseTimer.java
New file
@@ -0,0 +1,39 @@
package com.zy.system.timer;
import com.zy.system.entity.license.LicenseVerify;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class LicenseTimer {
    private static boolean SYSTEM_SUPPORT = false;//系统激活状态,默认关闭
    private int licenseDays = 0;
    //每天晚上11点更新系统激活状态
    @Scheduled(cron = "0 0 23 * * ? ")
    public void timer() {
//        System.out.println(SYSTEM_SUPPORT);
        //验证许可证是否有效
        LicenseVerify licenseVerify = new LicenseVerify();
        boolean verify = licenseVerify.verify();
        setSystemSupport(verify);//更新系统激活状态
    }
    public boolean getSystemSupport() {
        return SYSTEM_SUPPORT;
    }
    public void setSystemSupport(boolean systemSupport) {
        SYSTEM_SUPPORT = systemSupport;
    }
    public int getLicenseDays() {
        return this.licenseDays;
    }
    public void setLicenseDays(int licenseDays) {
        this.licenseDays = licenseDays;
    }
}
src/main/resources/application.yml
@@ -8,7 +8,7 @@
    name: @pom.build.finalName@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://192.168.10.251:1433;databasename=ynhfasrs
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=ynhfasrs
    username: sa
    password: sa@123
  mvc: