自动化立体仓库 - WCS系统
*
lsh
2025-04-01 0c60480362efdcffa0cbb3f6dd4272f43859adb1
*
18个文件已修改
1365 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ConsoleController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/CrnController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TaskWrkController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasDevp.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TaskWrk.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TaskWrkLog.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnStatusType.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 319 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 515 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasDevpMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskWrkLogMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskWrkMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -147,7 +147,7 @@
            /**
             * 堆垛机状态判断
             */
            if (crnProtocol.getAlarm1() > 0) {
            if (crnProtocol.getAlarm() > 0) {
                vo.setCrnStatus(CrnStatusType.MACHINE_ERROR);
            } else {
                if (crnProtocol.getTaskNo()>0) {
@@ -324,8 +324,8 @@
                vo.setWorkNo(crnProtocol.getTaskNo());
                vo.setCrnStatus(crnProtocol.getStatusType().desc);
                if (crnProtocol.getAlarm1() > 0) {
                    BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1());
                if (crnProtocol.getAlarm() > 0) {
                    BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
                    vo.setError(crnError == null ? "未知异常" : crnError.getErrName());
                }
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -130,7 +130,7 @@
            vo.setForkOffset(crnProtocol.getForkPosType().desc);    // 货叉位置
            vo.setLiftPos(crnProtocol.getLiftPosType().desc);
            vo.setWalkPos(crnProtocol.getWalkPos()==1?"不在定位":"在定位");
            vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1()));
            vo.setWarnCode(String.valueOf(crnProtocol.getAlarm()));
            if (crnProtocol.getAlarm() > 0) {
                BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
                vo.setAlarm(crnError==null?"未知异常":crnError.getErrName());
@@ -165,9 +165,9 @@
        vo.setForkOffset(crnProtocol.getForkPosType().desc);    // 货叉位置
        vo.setLiftPos(crnProtocol.getLiftPosType().desc);
        vo.setWalkPos(crnProtocol.getWalkPos()==1?"不在定位":"在定位");
        vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1()));
        if (crnProtocol.getAlarm1() > 0) {
            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1());
        vo.setWarnCode(String.valueOf(crnProtocol.getAlarm()));
        if (crnProtocol.getAlarm() > 0) {
            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
            vo.setAlarm(crnError==null?"未知异常":crnError.getErrName());
        }
        return R.ok().add(vo);
@@ -307,9 +307,9 @@
            vo.setForkOffset(crnProtocol.getForkPosType().desc);    // 货叉位置
            vo.setLiftPos(crnProtocol.getLiftPosType().desc);
            vo.setWalkPos(crnProtocol.getWalkPos()==1?"不在定位":"在定位");
            vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1()));
            if (crnProtocol.getAlarm1() > 0) {
                BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1());
            vo.setWarnCode(String.valueOf(crnProtocol.getAlarm()));
            if (crnProtocol.getAlarm() > 0) {
                BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
                vo.setAlarm(crnError==null?"未知异常":crnError.getErrName());
            }
            vo.setInEnable(basCrnp.getInEnable());
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -154,43 +154,43 @@
        return R.ok().add(taskWrk);
    }
    //取放货申请
    @PostMapping("/pick/and/place/v1")
    @AppAuth(memo = "agv取放货申请")
    public R getAgvPickAndPlaceV1(@RequestHeader String appkey,
                            @RequestBody TaskOverParam param,
                            HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getStaNo())){
            return R.error("码头[staNo]不能为空");
        }
        if (Cools.isEmpty(param.getType())){
            return R.error("类型[type]不能为空");
        }
        return openService.getAgvPickAndPlaceV1(param);
    }
//    //取放货申请
//    @PostMapping("/pick/and/place/v1")
//    @AppAuth(memo = "agv取放货申请")
//    public R getAgvPickAndPlaceV1(@RequestHeader String appkey,
//                            @RequestBody TaskOverParam param,
//                            HttpServletRequest request){
//        auth(appkey, param, request);
//        if (Cools.isEmpty(param)) {
//            return R.parse(BaseRes.PARAM);
//        }
//        if (Cools.isEmpty(param.getStaNo())){
//            return R.error("码头[staNo]不能为空");
//        }
//        if (Cools.isEmpty(param.getType())){
//            return R.error("类型[type]不能为空");
//        }
//        return openService.getAgvPickAndPlaceV1(param);
//    }
    //取放货完成反馈
    @PostMapping("/pick/and/place/v2")
    @AppAuth(memo = "agv取放货完成反馈")
    public R getAgvPickAndPlaceV2(@RequestHeader String appkey,
                                  @RequestBody TaskOverParam param,
                                  HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getStaNo())){
            return R.error("码头[staNo]不能为空");
        }
        if (Cools.isEmpty(param.getType())){
            return R.error("类型[type]不能为空");
        }
        return openService.getAgvPickAndPlaceV2(param);
    }
//    //取放货完成反馈
//    @PostMapping("/pick/and/place/v2")
//    @AppAuth(memo = "agv取放货完成反馈")
//    public R getAgvPickAndPlaceV2(@RequestHeader String appkey,
//                                  @RequestBody TaskOverParam param,
//                                  HttpServletRequest request){
//        auth(appkey, param, request);
//        if (Cools.isEmpty(param)) {
//            return R.parse(BaseRes.PARAM);
//        }
//        if (Cools.isEmpty(param.getStaNo())){
//            return R.error("码头[staNo]不能为空");
//        }
//        if (Cools.isEmpty(param.getType())){
//            return R.error("类型[type]不能为空");
//        }
//        return openService.getAgvPickAndPlaceV2(param);
//    }
    //查询任务指令集合
    @GetMapping("/queryTaskCommand")
src/main/java/com/zy/asrs/controller/TaskWrkController.java
@@ -306,21 +306,6 @@
        return R.ok();
    }
    @PostMapping(value = "/taskWrk/updateCommandStep")
    @ManagerAuth(memo = "更新步序")
    public R updateCommandStep(@RequestParam Integer wrkNo, @RequestParam Integer commandStep) {
        TaskWrk taskWrk = taskWrkService.selectByWrkNo(wrkNo);
        if (taskWrk == null) {
            return R.error();
        }
        Date now = new Date();
        taskWrk.setCommandStep(commandStep);
        taskWrk.setModiTime(now);//操作时间
        taskWrk.setModiUser(getUserId());//操作员
        taskWrkService.updateById(taskWrk);
        return R.ok();
    }
    public static String getTaskType(Integer paramIoType){
        switch (paramIoType){
            case 1:
src/main/java/com/zy/asrs/entity/BasDevp.java
@@ -214,22 +214,6 @@
    @TableField("cart_pos")
    private Integer cartPos;
    @ApiModelProperty(value= "")
    @TableField("agv_start_pick")
    private Integer agvStartPick;
    @ApiModelProperty(value= "")
    @TableField("agv_target_pick")
    private Integer agvTargetPick;
    @ApiModelProperty(value= "")
    @TableField("agv_start_place")
    private Integer agvStartPlace;
    @ApiModelProperty(value= "")
    @TableField("agv_target_place")
    private Integer agvTargetPlace;
    @ApiModelProperty(value= "异常码")
    @TableField("sta_err")
    private Integer staErr;
src/main/java/com/zy/asrs/entity/TaskWrk.java
@@ -61,6 +61,13 @@
    private Integer wrkNo;
    /**
     * 任务号
     */
    @ApiModelProperty(value= "重量")
    @TableField("sc_weight")
    private Integer scWeight;
    /**
     * 任务时间(接收时间)
     */
    @ApiModelProperty(value= "任务时间(接收时间)")
@@ -168,13 +175,6 @@
    @ApiModelProperty(value= "堆垛机号")
    @TableField("crn_no")
    private Integer crnNo;
    /**
     * 指令执行步序
     */
    @ApiModelProperty(value= "指令执行步序")
    @TableField("command_step")
    private Integer commandStep = 0;
    @ApiModelProperty(value = "移库标记")
    @TableField("transfer_mark")
src/main/java/com/zy/asrs/entity/TaskWrkLog.java
@@ -227,7 +227,6 @@
        this.cancelTime = taskWrk.getCancelTime();
        this.wrkSts = taskWrk.getWrkSts();
        this.crnNo = taskWrk.getCrnNo();
        this.commandStep = taskWrk.getCommandStep();
    }
//    TaskWrkLog taskWrkLog = new TaskWrkLog(
//            null,    // wms任务号
src/main/java/com/zy/asrs/service/OpenService.java
@@ -16,6 +16,6 @@
    void getAgvTaskOver(TaskOverParam param);
    R getAgvPickAndPlaceV1(TaskOverParam param);
    R getAgvPickAndPlaceV2(TaskOverParam param);
//    R getAgvPickAndPlaceV1(TaskOverParam param);
//    R getAgvPickAndPlaceV2(TaskOverParam param);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -56,8 +56,6 @@
@Transactional
public class MainServiceImpl {
    public static final long COMMAND_TIMEOUT = 5 * 1000;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
@@ -77,14 +75,8 @@
    @Autowired
    private TaskWrkService taskWrkService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private StaDescMapper staDescMapper;
    @Autowired
    private CommandInfoService commandInfoService;
    @Autowired
    private OpenServiceImpl openServiceImpl;
    @Autowired
    private StaDescService staDescService;
@@ -103,8 +95,6 @@
    private String taskStatusFeedbackPath;
    @Autowired
    private CrnController crnController;
    @Autowired
    private SiteController siteController;
    public void generateStoreWrkFile() throws IOException, InterruptedException {
@@ -860,54 +850,6 @@
    /**
     * 执行对工作档的完成操作
     */
//    public void storeFinished() {
//        for (CrnSlave crn : slaveProperties.getCrn()) {
//            // 获取堆垛机信息
//            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
//            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
//            if (crnProtocol == null) { continue; }
//
//            //  状态:等待确认 并且  任务完成位 = 1
//            if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) {
//                //获取入库待确认工作档
//                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue());
//                if (Cools.isEmpty(taskWrk)) {
////                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
//                    continue;
//                }
//
//                //获取指令ID
//                Integer commandId = crnProtocol.getCommandId();
//                CommandInfo commandInfo = new CommandInfo();
//                if (Cools.isEmpty(commandId)){
//                    commandInfo = commandInfoService.selectOne(new EntityWrapper<CommandInfo>()
//                            .eq("wrk_no",crnProtocol.getTaskNo())
//                            .eq("device","Crn"));
//                }else {
//                    commandInfo = commandInfoService.selectById(commandId);
//                }
//
//
//                if (commandInfo == null) {
//                    //指令不存在
//                    continue;
//                }
//                if (commandInfo.getCommandStatus() == 3){
//                    continue;
//                }
//                commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);//指令完成
//                commandInfo.setCompleteTime(new Date());//指令完成时间
//                if (commandInfoService.updateById(commandInfo)) {//修改成功后复位堆垛机
//                    // 堆垛机复位
//                    crnThread.setResetFlag(true);
//                }
//            }
//        }
//    }
    /**
     * 执行对工作档的完成操作
     */
    public void storeFinished() throws InterruptedException {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
@@ -916,7 +858,7 @@
            if (crnProtocol == null) { continue; }
            //  状态:等待确认 并且  任务完成位 = 1
            if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) {
            if (!Cools.isEmpty(crnProtocol.getTaskFinish()) && crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                //获取入库待确认工作档
                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue());
                if (Cools.isEmpty(taskWrk)&&crnProtocol.getTaskNo() !=999) {
@@ -1054,7 +996,7 @@
                                    wrkMast.getSourceStaNo(),    // 源站
                                    wrkMast.getSourceLocNo(),    // 源库位
                                    wrkMast.getBarcode(),    // 条码
                                    (int) crnProtocol.getAlarm1(),    // 异常码
                                    (int) crnProtocol.getAlarm(),    // 异常码
                                    errName,    // 异常
                                    1,    // 异常情况
                                    now,    // 添加时间
@@ -1069,7 +1011,7 @@
                        }
                    } else {
                        // 异常修复
                        if (crnProtocol.getAlarm1() == null || crnProtocol.getAlarm1() == 0) {
                        if (crnProtocol.getAlarm() == null || crnProtocol.getAlarm() == 0) {
                            latest.setEndTime(now);
                            latest.setUpdateTime(now);
                            latest.setStatus(2);
@@ -1082,7 +1024,7 @@
                } else {
                    BasErrLog latest = basErrLogService.findLatest(crn.getId());
                    // 有异常
                    if (crnProtocol.getAlarm1() != null && crnProtocol.getAlarm() > 0) {
                    if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) {
                        // 记录新异常
                        if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) {
                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
@@ -1101,7 +1043,7 @@
                                    null,    // 源站
                                    null,    // 源库位
                                    null,    // 条码
                                    (int)crnProtocol.getAlarm1(),    // 异常码
                                    (int)crnProtocol.getAlarm(),    // 异常码
                                    errName,    // 异常
                                    1,    // 异常情况
                                    now,    // 添加时间
@@ -1130,199 +1072,6 @@
            }
        }
    }
    //自动派发任务
    public void autoDistribute() {
        Config config = configService.selectByCode("autoDistribute");
        if (config == null) {
            return;
        }
        if (config.getValue().equals("false")) {//判断是否开启自动派发任务
            return;
        }
        for (TaskWrk taskWrk : taskWrkService.selectReceive()) {
            try {
                taskWrkService.distribute(taskWrk.getTaskNo(), 9527L);
            } catch (CoolException e) {
                log.info(e.getMessage());
            }
        }
    }
    //agv取放货任务完成
    public synchronized void autoCompleteAGV() {
        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
        try{
            Thread.sleep(500);
        }catch (Exception e){
        }
        for (BasDevp basDevp:basDevps){
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo());
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            if (basDevp.getWrkNo()!=0){
                if (basDevp.getAgvTargetPick()!=0){//取货
                    staProtocol.setAgvTypeSign((short)0);
                    staProtocol.setStaNo(basDevp.getDevNo().shortValue());
                    MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
                }
                boolean sign = true;
                if (basDevp.getAgvTargetPlace()!=0){
                    sign = false;
                    basDevp.setAgvTargetPlace(0);
                    basDevpService.updateById(basDevp);
                    staProtocol.setAgvTypeSign((short)3);//1
                    staProtocol.setStaNo(basDevp.getDevNo().shortValue());
                    MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
                }
            }else {
                if (basDevp.getAgvTargetPlace()!=0){
                    if (basDevp.getLoading().equals("Y")){
                        staProtocol.setAgvTypeSign((short)1);
                        staProtocol.setStaNo(basDevp.getDevNo().shortValue());
                        MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
                    }else {
                        log.error("AGV放货完成但输送线无物,复位信号 ===>> [staNo:{}] [basDevp:{}]", basDevp.getDevNo(), basDevp);
                        basDevp.setAgvTargetPlace(0);
                        basDevpService.updateById(basDevp);
                        staProtocol.setAgvTypeSign((short)3);//1
                        staProtocol.setStaNo(basDevp.getDevNo().shortValue());
                        MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
                    }
                }
                if (basDevp.getAgvTargetPick()!=0){
                    basDevp.setAgvTargetPick(0);
                    basDevpService.updateById(basDevp);
                    staProtocol.setAgvTypeSign((short)2);//0
                    staProtocol.setStaNo(basDevp.getDevNo().shortValue());
                    MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
                }
            }
        }
    }
    public synchronized void autoCompleteTask() {
        List<TaskWrk> taskWrks = taskWrkMapper.selectWorkingTask();
        for (TaskWrk taskWrk : taskWrks) {
            //获取命令集合
            List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo());
            if (taskWrk.getCommandStep() < commandInfos.size()) {
                continue;//当前步序没有到达最后一条命令
            }
            //判断末端命令是否执行完成
            CommandInfo commandInfo = commandInfos.get(commandInfos.size() - 1);
            if (commandInfo.getCommandStatus() != CommandStatusType.COMPLETE.id) {
                continue;//指令未完成
            }
            Date now = new Date();
            //指令已完成,更新任务
            if (taskWrk.getIoType() == 1) {
                //入库任务
                taskWrk.setWrkSts(4);//3.吊车入库中 => 4.入库完成
                //taskWrk.setStatus(TaskStatusType.COMPLETE.id);
                taskWrk.setModiTime(now);
                taskWrkService.updateById(taskWrk);
                //更新库位状态
                LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
                locMast.setLocSts("F");//F.在库
                locMast.setBarcode(taskWrk.getBarcode());//托盘码
                locMast.setModiTime(now);
                locMast.setModiUser(9999L);
                locMastService.updateById(locMast);
            } else if (taskWrk.getIoType() == 2) {
                //出库任务
                taskWrk.setWrkSts(14);//12.吊车出库中 => 14.出库完成
//                taskWrk.setStatus(TaskStatusType.COMPLETE.id);
                taskWrk.setModiTime(now);
                taskWrkService.updateById(taskWrk);
                //更新库位状态
                LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
                locMast.setLocSts("O");//O.空库位
                locMast.setBarcode("");//托盘码
                locMast.setModiTime(now);
                locMast.setModiUser(9999L);
                locMastService.updateById(locMast);
            }
        }
    }
    public synchronized String CrnStartRunning(TaskWrk taskWrk){
        String tasktype = null;
        switch (taskWrk.getIoType()){
            case 1:
                tasktype= "RK";
                break;
            case 2:
                tasktype= "CK";
                break;
            case 3:
                tasktype= "YK";
                break;
            default:
                tasktype= "未知";
        }
        Map<String, Object> map = new HashMap<>();
        map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
        TaskOverToWms taskOverToWms = new TaskOverToWms();
        taskOverToWms.setFeedbackFrom("WCS"); //来源
        taskOverToWms.setWarehouseId("1688469798893297665"); //仓库标识
        taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //任务号
        taskOverToWms.setTaskType(tasktype); // 任务类型
        taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 容器编码
        if (taskWrk.getIoType() ==1 || taskWrk.getIoType() == 3){
            taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码
            taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位
        }else if (taskWrk.getIoType() ==2){
            Map<Integer,String> map1 = new HashMap<>();
            map1.put(102,"J-1101");
            map1.put(106,"J-1103");
            map1.put(110,"J-1105");
            map1.put(114,"J-1107");
            map1.put(118,"J-1109");
            map1.put(122,"J-1111");
            map1.put(305,"H-1101");
            map1.put(405,"G-1101");
            taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码
            taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位
        }
        taskOverToWms.setTaskStatus("executing"); //任务状态
        String response = null;
        try {
            response = new HttpHandler.Builder()
                    .setHeaders(map)
                    .setUri(wmsUrl)
                    .setPath("wcsManager/wcsInterface/taskStatusFeedback")
                    .setJson(JSON.toJSONString(taskOverToWms))
                    .build()
                    .doPost();
        }catch (Exception e){
            log.error("堆垛机任务完成,请求wms任务完成接口失败");
        }
        apiLogService.save("堆垛机开始运行"
                ,wmsUrl+"wcsManager/wcsInterface/taskStatusFeedback"
                ,null
                ,"127.0.0.1"
                ,JSON.toJSONString(taskOverToWms)
                ,response
                ,true
        );
        return response;
    }
    private TaskWrk createTask(GetWmsDto dto, String barcode){
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -265,39 +265,39 @@
    }
    @Override
    public R getAgvPickAndPlaceV1(TaskOverParam param) {
        BasDevp basDevp = basDevpService.selectById(param.getStaNo());
        if (Cools.isEmpty(basDevp)){
            return R.error("站点号有误"+param.getStaNo());
        }
        if (param.getType()==0 && basDevp.getAgvStartPick()==1){
            return R.ok();
        }else if (param.getType()==1 && basDevp.getAgvStartPlace()==1){
            return R.ok();
        }else {
            return R.error("不允许");
        }
    }
//    @Override
//    public R getAgvPickAndPlaceV1(TaskOverParam param) {
//        BasDevp basDevp = basDevpService.selectById(param.getStaNo());
//        if (Cools.isEmpty(basDevp)){
//            return R.error("站点号有误"+param.getStaNo());
//        }
//        if (param.getType()==0 && basDevp.getAgvStartPick()==1){
//            return R.ok();
//        }else if (param.getType()==1 && basDevp.getAgvStartPlace()==1){
//            return R.ok();
//        }else {
//            return R.error("不允许");
//        }
//    }
    @Override
    public R getAgvPickAndPlaceV2(TaskOverParam param) {
        BasDevp basDevp = basDevpService.selectById(param.getStaNo());
        if (Cools.isEmpty(basDevp)){
            return R.error("站点号有误"+param.getStaNo());
        }
        if (param.getType()==0){
            basDevp.setAgvTargetPick(1);
            basDevpService.updateById(basDevp);
            return R.ok();
        }else if (param.getType()==1){
            basDevp.setAgvTargetPlace(1);
            basDevpService.updateById(basDevp);
            return R.ok();
        }else {
            return R.error("请求类型异常"+param.getType());
        }
    }
//    @Override
//    public R getAgvPickAndPlaceV2(TaskOverParam param) {
//        BasDevp basDevp = basDevpService.selectById(param.getStaNo());
//        if (Cools.isEmpty(basDevp)){
//            return R.error("站点号有误"+param.getStaNo());
//        }
//        if (param.getType()==0){
//            basDevp.setAgvTargetPick(1);
//            basDevpService.updateById(basDevp);
//            return R.ok();
//        }else if (param.getType()==1){
//            basDevp.setAgvTargetPlace(1);
//            basDevpService.updateById(basDevp);
//            return R.ok();
//        }else {
//            return R.error("请求类型异常"+param.getType());
//        }
//    }
    public List<Integer> getInEnableRoadway(){
        int[] roadway = null;
src/main/java/com/zy/core/MainProcess.java
@@ -68,13 +68,6 @@
                        i = 0;
                    }
                    //自动派发任务
   //                 mainService.autoDistribute();
                    //自动完成任务
//                    mainService.autoCompleteTask();
                    //agv取放货完成
                    mainService.autoCompleteAGV();
                } catch (Exception e) {
                    e.printStackTrace();
                }
src/main/java/com/zy/core/enums/CrnStatusType.java
@@ -2,37 +2,23 @@
public enum CrnStatusType {
//    NONE(-1, "离线"),
//    IDLE(0, "空闲"),
//    FETCH_MOVING(1, "取货行走"),
//    FETCH_WAITING(2, "取货等待"),
//    FETCHING(3, "取货中"),
//    PUT_MOVING(4, "放货走行"),
//    PUT_WAITING(5, "放货等待"),
//    PUTTING(6, "放货中"),
//    ORIGIN_GO(7, "回原点"),
//    ORIGIN_BACK(8, "回反原点"),
//    MOVING(9, "走行中"),
//    WAITING(10, "任务完成等待WCS确认"),
//    PAUSE(11, "任务暂停"),
//    SOS(99, "报警"),
//    ;
    IDLE(0, "空闲,无任务"),
    NONE_MOVING(1, "取货定位"),
    FETCHING(2, "取货等待"),
    MOVING(3, "取货中"),
    PUTTING(4, "放货走行"),
    HOMING(5, "放货等待"),
    ANTI_ORIGIN(6, "放货中"),
    PUT_COMPLETE(7, "回原点"),
//    MOVE_THE_SHIPPING_LOCATION(8, "移动到放货位置"),
//    PUTTING(9, "放货中"),
    HANDLING_COMPLETED(10, "搬运完成等待WCS确认"),
    EMPTY_AVOIDANCE(11, "空载避让"),
    NONE(-1, "离线"),
    IDLE(0, "空闲"),
    FETCH_MOVING(1, "取货行走"),
    FETCH_WAITING(2, "取货等待"),
    FETCHING(3, "取货中"),
    PUT_MOVING(4, "放货走行"),
    PUT_WAITING(5, "放货等待"),
    PUTTING(6, "放货中"),
    ORIGIN_GO(7, "回原点"),
    ORIGIN_BACK(8, "回反原点"),
    MOVING(9, "走行中"),
    WAITING(10, "任务完成等待WCS确认"),
    PAUSE(11, "任务暂停"),
    SOS(99, "报警"),
    OTHER(100, "其他"),
    UNKNOW(100, "其他"),
    ;
    public Integer id;
    public String desc;
@@ -50,7 +36,7 @@
                return type;
            }
        }
        return null;
        return NONE;
    }
    public static CrnStatusType get(CrnStatusType type) {
src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -1,7 +1,10 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasCrnp;
import com.zy.core.enums.*;
import com.zy.core.enums.CrnForkPosType;
import com.zy.core.enums.CrnLiftPosType;
import com.zy.core.enums.CrnModeType;
import com.zy.core.enums.CrnStatusType;
import lombok.Data;
/**
@@ -9,6 +12,8 @@
 */
@Data
public class CrnProtocol {
    private Integer crnNo;
    /**
     * 1 = 手动模式
@@ -25,14 +30,14 @@
    public Short taskFinish;
    /**
     * 校验结果 1表示检验成功
     */
    public Short valid;
    /**
     * 1 = 急停
     */
    public Short eStop;
    /**
     * 异常码
     */
    public Short alarm;
    /**
     * 任务号
@@ -54,12 +59,15 @@
     */
    public Short status;
    public Short alarm = 0;
    /**
     * 状态枚举
     */
    public CrnStatusType statusType;
    /**
     * 故障
     */
    public Boolean fault;
    /**
     * 堆垛机当前列号
@@ -72,175 +80,45 @@
    public Short level;
    /**
     * 堆垛机当前排
     */
    public Short row;
    /**
     * 堆垛机当前巷道号
     */
    public Short lane;
    /**
     * 堆垛机通讯状态
     */
    public Boolean connStatus;
    /**
     * 申请入库修正
     */
    public Boolean correction;
    /**
     * 托盘号错
     */
    public Boolean tuError;
    /**
     * 取货无箱
     */
    public Boolean noneError;
    /**
     * 双重入库
     */
    public Boolean stockError;
    /**
     * 作业数据无效
     */
    public Boolean jobInvalid;
    /**
     * 空闲状态
     */
    public Boolean idle;
    /**
     * 控制柜使能
     */
    public Boolean control;
    /**
     * 停准
     */
    public Boolean stopQuasi;
    /**
     * 运行
     */
    public Boolean running;
    /**
     * 故障
     */
    public Boolean fault;
    /**
     * 货叉中位
     */
    public Boolean forkHome;
    /**
     * 单伸位货叉左位
     */
    public Boolean forkSingleLeft;
    /**
     * 单伸位货叉右位
     */
    public Boolean forkSingleRight;
    /**
     * 双伸位货叉左位
     */
    public Boolean forkDoubleLeft;
    /**
     * 双伸位货叉右位
     */
    public Boolean forkDoubleRight;
    /**
     * 单伸位高位
     */
    public Boolean singleHigh;
    /**
     * 单伸位低位
     */
    public Boolean singleLow;
    /**
     * 双伸位高位
     */
    public Boolean doubleHigh;
    /**
     * 双伸位低位
     */
    public Boolean doubleLow;
    /**
     * 站台高位
     */
    public Boolean platformHigh;
    /**
     * 站台低位
     */
    public Boolean platformLow;
    /**
     * 当前货叉位置
     * 0 = 货叉原位
     * 1 = 货叉在左侧
     * 2 = 货叉在右侧
     */
    public Short forkPos = -1;
    public Short forkPos;
    public CrnForkPosType forkPosType = CrnForkPosType.NONE;
    public CrnForkPosType forkPosType;
    /**
     * 当前载货台位置
     * 0 = 下定位
     * 1 = 上定位
     */
    public Short liftPos = -1;
    public Short liftPos;
    public CrnLiftPosType liftPosType = CrnLiftPosType.ERROR;
    public CrnLiftPosType liftPosType;
    /**
     * 走行在定位
     * 0 = 在定位
     * 1 = 不在定位
     */
    public Short walkPos = 0;
    /**
     * 拨指位置
     * 0 = 不在定位
     * 1 = 上定位
     * 2 = 下定位
     */
    public Short fingerPos;
    public CrnFingerPosType fingerPosType;
    public Short walkPos;
    /**
     * 载货台有物
     */
    public Short loaded;
    /**
     * 堆垛机垂直故障代码(数值显示)
     */
    private Integer alarm1 = 0;
    private Short temp1;
    /**
     * 堆垛机水平故障代码(数值显示)
     */
    private Integer alarm2 = 0;;
    private CrnTemp1 crnTemp1;
    /**
     * 堆垛机货叉故障代码(数值显示)
     */
    private Integer alarm3 = 0;;
    private Short temp2;
    /**
     * 堆垛机状态故障代码(数值显示)
     */
    private Integer alarm4 = 0;;
    private Short temp3;
    private Short temp4;
    /**
     * 异常1
@@ -271,42 +149,53 @@
    private CrnError4 crnError4;
    /**
     * 异常5
     */
    private boolean[] error5;
    private CrnError5 crnError5;
    /**
     * 异常6
     */
    private boolean[] error6;
    private CrnError6 crnError6;
    /**
     * X行走线速度m/min
     */
    private Float xSpeed = 0F;
    private Float xSpeed;
    /**
     * Y行走线速度m/min
     */
    private Float ySpeed = 0F;
    private Float ySpeed;
    /**
     * Z行走线速度m/min
     */
    private Float zSpeed = 0F;
    private Float zSpeed;
    /**
     * 堆垛机累计走行距离km
     */
    public Float xDistance = 0F;
    public Float xDistance;
    /**
     * 堆垛机累计升降距离km
     */
    public Float yDistance = 0F;
    public Float yDistance;
    /**
     * 堆垛机累计走行时长h
     */
    public Float xDuration = 0F;
    public Float xDuration;
    /**w
    /**
     * 堆垛机累计升降时长h
     */
    public Float yDuration = 0F;
    //指令ID
    private Integer commandId;
    public Float yDuration;
    public void setMode(Short mode) {
        this.mode = mode;
@@ -348,81 +237,12 @@
        this.status = CrnStatusType.get(type).id.shortValue();
    }
    public void setFingerPos(Short type) {
        this.fingerPos = type;
        this.fingerPosType = CrnFingerPosType.get(type);
    public Short getTemp1() {
        return temp1;
    }
    public void setError1(boolean[] error1){
        this.error1 = error1;
        this.crnError1 = new CrnError1();
        this.crnError1.remoteStop = error1[0];
        this.crnError1.mainStop = error1[1];
        this.crnError1.controlStop = error1[2];
        this.crnError1.xCoverErr = error1[3];
        this.crnError1.yCoverErr = error1[4];
        this.crnError1.zCoverErr = error1[5];
        this.crnError1.laserErr = error1[6];
        this.crnError1.barcodeErr = error1[7];
        this.crnError1.xFrontLimitErr = error1[8];
        this.crnError1.xBackLimitErr = error1[9];
        this.crnError1.yUpLimitErr = error1[10];
        this.crnError1.yDownLimitErr = error1[11];
        this.crnError1.zLeftLimitErr = error1[12];
        this.crnError1.zRightLimitErr = error1[13];
        this.crnError1.leftOverWidthErr1 = error1[14];
        this.crnError1.leftOverWidthErr2 = error1[15];
    }
    public void setError2(boolean[] error2){
        this.error2 = error2;
        this.crnError2 = new CrnError2();
        this.crnError2.leftOverLenErr1 = error2[0];
        this.crnError2.leftOverLenErr2 = error2[1];
        this.crnError2.leftOverHighErr = error2[2];
        this.crnError2.rightOverWidthErr1 = error2[3];
        this.crnError2.rightOverWidthErr2 = error2[4];
        this.crnError2.rightOverLenErr1 = error2[5];
        this.crnError2.rightOverLenErr2 = error2[6];
        this.crnError2.rightOverHighErr = error2[7];
        this.crnError2.leftLooseRopeErr = error2[8];
        this.crnError2.rightLooseRopeErr = error2[9];
        this.crnError2.frontDoorErr = error2[10];
        this.crnError2.backDoorErr = error2[11];
        this.crnError2.startupErr = error2[12];
        this.crnError2.xFrontLocaUpErr = error2[13];
        this.crnError2.xFrontLocaDownErr = error2[14];
        this.crnError2.xBackLocaUpErr = error2[15];
    }
    public void setError3(boolean[] error3) {
        this.error3 = error3;
        this.crnError3 = new CrnError3();
        this.crnError3.xBackLocaDownErr = error3[0];
        this.crnError3.yUpLocaUpErr = error3[1];
        this.crnError3.yUpLocaDownErr = error3[2];
        this.crnError3.yDownLocaUpErr = error3[3];
        this.crnError3.yDownLocaDownErr = error3[4];
        this.crnError3.zLeftLocaUpErr = error3[5];
        this.crnError3.zLeftLocaDownErr = error3[6];
        this.crnError3.zRightLocaUpErr = error3[7];
        this.crnError3.zRightLocaDownErr = error3[8];
        this.crnError3.leftTakeNoneErr = error3[9];
        this.crnError3.rightTakeNoneErr = error3[10];
        this.crnError3.leftTakeThenLoadErr = error3[11];
        this.crnError3.rightTakeThenLoadErr = error3[12];
        this.crnError3.leftPutAndLoadErr = error3[13];
        this.crnError3.rightPutAndLoadErr = error3[14];
        this.crnError3.leftPutThenNoneErr = error3[15];
    }
    public void setError4(boolean[] error4) {
        this.error4 = error4;
        this.crnError4 = new CrnError4();
        this.crnError4.rightPutThenNoneErr = error4[0];
        this.crnError4.xLooseBrakeTimeout = error4[1];
        this.crnError4.yLooseBrakeTimeout = error4[2];
        this.crnError4.zLooseBrakeTimeout = error4[3];
    public void setTemp1(Short temp1) {
        this.temp1 = temp1;
    }
    /**
@@ -434,8 +254,39 @@
    public BasCrnp toSqlModel(BasCrnp basCrnp){
        basCrnp.setCrnErr(alarm.longValue());
        if (alarm!=null) {
            basCrnp.setCrnErr(alarm.longValue());
        }
        basCrnp.setWrkNo(taskNo.intValue());
        return basCrnp;
    }
    public void setxSpeed(Short xSpeed) {
        this.xSpeed = Float.valueOf(xSpeed);
    }
    public void setySpeed(Short ySpeed) {
        this.ySpeed = Float.valueOf(ySpeed);
    }
    public void setzSpeed(Short zSpeed) {
        this.zSpeed = Float.valueOf(zSpeed);
    }
    public void setxDistance(Short xDistance) {
        this.xDistance = Float.valueOf(xDistance);
    }
    public void setyDistance(Short yDistance) {
        this.yDistance = Float.valueOf(yDistance);
    }
    public void setxDuration(Short xDuration) {
        this.xDuration = Float.valueOf(xDuration);
    }
    public void setyDuration(Short yDuration) {
        this.yDuration = Float.valueOf(yDuration);
    }
}
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -197,8 +197,6 @@
        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());
        return basDevp;
    }
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -21,7 +21,6 @@
import com.zy.core.model.CrnSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.cpmmandParam.CrnCommandParam;
import com.zy.core.model.protocol.CrnProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -41,7 +40,6 @@
    private CrnSlave slave;
    private CrnProtocol crnProtocol;
    private boolean resetFlag = false;
    private boolean resetFlagTwo = false;
    public Long sign = System.currentTimeMillis();
@@ -51,7 +49,6 @@
     * 堆垛机是否在回原点运动中标记
     */
    private boolean backHpFlag = false;
    private boolean backHpFlagTwo = false;
    public SiemensCrnThread(CrnSlave slave) {
        this.slave = slave;
@@ -61,7 +58,6 @@
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        this.connect();
        sign = System.currentTimeMillis();
        while (isRunning) {
            try {
                int step = 1;
@@ -96,32 +92,6 @@
                        command.setDestinationPosZ((short)0);     // 目标库位层
                        write(command);
                        break;
                    // 写入数据
                    case 5:
                        write5((CrnCommand) task.getData());
                        break;
                    // 复位
                    case 6:
                        CrnCommand command2 = (CrnCommand) task.getData();
                        if (null == command2) {
                            command2 = new CrnCommand();
                        }
                        command2.setCrnNo(slave.getId()); // 堆垛机编号
                        command2.setTaskNo((short) 0); // 工作号
                        command2.setAckFinish((short) 1);  // 任务完成确认位
                        command2.setTaskMode(CrnTaskModeType.NONE); // 任务模式
                        command2.setSourcePosX((short)0);     // 源库位排
                        command2.setSourcePosY((short)0);     // 源库位列
                        command2.setSourcePosZ((short)0);     // 源库位层
                        command2.setDestinationPosX((short)0);     // 目标库位排
                        command2.setDestinationPosY((short)0);     // 目标库位列
                        command2.setDestinationPosZ((short)0);     // 目标库位层
                        write5(command2);
                        break;
                    // 双工位同时作业
                    case 9:
                        write9((CrnCommandParam) task.getData());
                        break;
                    default:
                        break;
                }
@@ -144,7 +114,6 @@
        crnProtocol.setMode((short) -1);
//        crnProtocol.setTaskNo((short)0);
        crnProtocol.setStatus((short)-1);
        crnProtocol.setStatusTwo((short)-1);
        crnProtocol.setBay((short)0);
        crnProtocol.setLevel((short)0);
        crnProtocol.setForkPos((short) -1);
@@ -159,16 +128,6 @@
        crnProtocol.setyDistance((short) 0);
        crnProtocol.setxDuration((short) 0);
        crnProtocol.setyDuration((short) 0);
        // 根据实时信息更新数据库
        BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
        BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
        basCrnp.setCrnSts((int)crnProtocol.getMode());
        basCrnp.setCrnStatusOne(-1);
        basCrnp.setCrnStatusTwo(-1);
        if (!basCrnpService.updateById(basCrnp)){
            log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
        }
    }
    @Override
@@ -196,74 +155,40 @@
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = new OperateResultExOne<byte[]>();
            if (slave.getId()>2 && slave.getId()<6){
                result = siemensNet.Read("DB101.0", (short) 66);
            } else {
                result = siemensNet.Read("DB101.0", (short) 56);
            }
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 56);
            if (result.IsSuccess) {
                if (null == crnProtocol) {
                    crnProtocol = new CrnProtocol();
                    crnProtocol.setCrnNo(slave.getId());
                }
                crnProtocol.setCrnNo(slave.getId());
                crnProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));
                crnProtocol.setTaskNo(siemensNet.getByteTransform().TransInt16(result.Content, 2));
                crnProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 4));
                crnProtocol.setBay(siemensNet.getByteTransform().TransInt16(result.Content, 6));
                crnProtocol.setLevel(siemensNet.getByteTransform().TransInt16(result.Content, 8));
                crnProtocol.setForkPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));
                if (slave.getId()<3 || slave.getId()>5){
                    crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                    crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                    crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 16));
                    crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18));
                    crnProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 20));
                    crnProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 22));
                    crnProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                    crnProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 26));
                    crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28));
                    crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 32));
                    crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 36));
                    crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
                    crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 44));
                    crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48));
                    crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 52));
                } else {
                    crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                    crnProtocol.setTaskNoTwo(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                    crnProtocol.setStatusTwo(siemensNet.getByteTransform().TransInt16(result.Content, 16));
                    crnProtocol.setBayTwo(siemensNet.getByteTransform().TransInt16(result.Content, 18));
                    crnProtocol.setLevelTwo(siemensNet.getByteTransform().TransInt16(result.Content, 20));
                    crnProtocol.setForkPosTwo(siemensNet.getByteTransform().TransInt16(result.Content, 22));
                    crnProtocol.setLoadedTwo(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                    crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 26));
                    crnProtocol.setWalkPosTwo(siemensNet.getByteTransform().TransInt16(result.Content, 28));
                    crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 30));
                    crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 32));
                    crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 34));
                    crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 38));
                    crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 42));
//                    crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 42));
                    crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 50));
                    crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 54));
                    crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 58));
                    crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 62));
                }
                crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 16));
                crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18));
                crnProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 20));
                crnProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 22));
                crnProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                crnProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 26));
                crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28));
                crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 32));
                crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 36));
                crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
                crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 44));
                crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48));
                crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 52));
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                // 复位信号
                if (!Cools.isEmpty(crnProtocol.getStatusType()) && (crnProtocol.getStatusType().equals(CrnStatusType.WAITING) || crnProtocol.getStatusType().equals(CrnStatusType.SEPARATE_WAITING))) {
                    log.error("-------------------------工位1-------------------------第一步、[堆垛机号:{}, 工作号:{}, 载货台:{}]==>> 状态为{},等待确认!!",
                            slave.getId(),crnProtocol.getTaskNo(), crnProtocol.getLoaded()==1 ? "有物" : "无物",crnProtocol.getStatusType());
                if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
                    log.error("-------------------------------------------第一步、[堆垛机号:{}, 工作号:{}, 载货台:{}]==>> 状态为10,等待确认!!",
                            slave.getId(),crnProtocol.getTaskNo(), crnProtocol.getLoaded()==1 ? "有物" : "无物");
                    if (resetFlag) {
                        if(crnProtocol.getTaskNo()==9999){
                            backHpFlag = false;
@@ -272,22 +197,6 @@
                        crnCommand.setAckFinish((short)1);
                        if (write(crnCommand)) {
                            resetFlag = false;
                        }
                    }
                }
                // 复位信号
                if (!Cools.isEmpty(crnProtocol.getStatusTypeTwo()) && (crnProtocol.getStatusTypeTwo().equals(CrnStatusType.WAITING) || crnProtocol.getStatusTypeTwo().equals(CrnStatusType.SEPARATE_WAITING))) {
                    log.error("-------------------------工位2-------------------------第一步、[堆垛机号:{}, 工作号:{}, 载货台:{}]==>> 状态为{},等待确认!!",
                            slave.getId(),crnProtocol.getTaskNoTwo(), crnProtocol.getLoadedTwo()==1 ? "有物" : "无物",crnProtocol.getStatusTypeTwo());
                    if (resetFlagTwo) {
                        if(crnProtocol.getTaskNoTwo()==9999){
                            backHpFlagTwo = false;
                        }
                        CrnCommand crnCommand = new CrnCommand();
                        crnCommand.setAckFinish((short)1);
                        if (write5(crnCommand)) {
                            resetFlagTwo = false;
                        }
                    }
                }
@@ -348,398 +257,12 @@
//        array[9] = command.getSourceStaNo();
//        array[10] = command.getDestinationStaNo();
        array[9] = command.getCommand();
        OperateResult result18 = siemensNet.Write("DB100.18", (short)0);
        OperateResult result = siemensNet.Write("DB100.0", array);
        log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
        //堆垛机任务写入后,回读一次,看是否成功
        Thread.sleep(200);
        int writeCount = 1;
        do {
            try{
                if(!result.IsSuccess){
                    log.error("写入堆垛机plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSONString(command),writeCount);
                    result = siemensNet.Write("DB100.0", array);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
                if (resultRead.IsSuccess) {
                    CrnCommand one = new CrnCommand();
                    one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                    one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                    one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                    one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                    one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                    one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                    one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                    one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                    if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                            || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                            || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                            || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                    ){
                        try{
                            log.error("堆垛机命令地址写入后回读失败==>不一致[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(one));
                        }catch (Exception e){
                            try{
                                log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(resultRead));
                            }catch (Exception e1){
                                log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSONString(command));
                            }
                        }
                        try{
                            Thread.sleep(100);
                        }catch (Exception e){
                        }
                        log.error("写入堆垛机plc数据失败,重新下发任务  回读不一致 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSONString(command),writeCount);
                        result = siemensNet.Write("DB100.0", array);
                        writeCount++;
                        continue;
                    } else {
                        log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(one));
                        break;
                    }
                }
            }catch (Exception e){
                log.error("堆垛机命令地址写入后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        if (command.getAckFinish() == 0) {
            short commandFinish = 1;
            Thread.sleep(100L);
            result = siemensNet.Write("DB100.18", commandFinish);
            int signFinish = 1;
            while (signFinish<5){
                OperateResultExOne<byte[]> result10018 = siemensNet.Read("DB100.18", (short) 2);
                short transInt16 = siemensNet.getByteTransform().TransInt16(result10018.Content, 0);
                if (transInt16 != commandFinish){
                    log.info("下发DB100.18  回读失败" + "commandFinish:"+commandFinish);
                    log.info("下发DB100.18  回读失败" + "array:"+ JSON.toJSONString(array));
                    result = siemensNet.Write("DB100.18", commandFinish);
                    signFinish++;
                }else {
                    log.info("下发DB100.18" + "commandFinish:"+commandFinish);
                    log.info("下发DB100.18" + "array:"+ JSON.toJSONString(array));
                    break;
                }
            }
        }
        try {
            // 日志记录
            BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class);
            BasCrnOpt basCrnOpt = new BasCrnOpt(
                    command.getTaskNo().intValue(),    // 任务号
                    command.getCrnNo(),    // 堆垛机[非空]
                    new Date(),    // 下发时间
                    command.getTaskModeType().toString(),    // 模式
                    command.getSourcePosX().intValue(),    // 源排
                    command.getSourcePosY().intValue(),    // 源列
                    command.getSourcePosZ().intValue(),    // 源层
                    null,    // 源站
                    command.getDestinationPosX().intValue(),    // 目标排
                    command.getDestinationPosY().intValue(),    // 目标列
                    command.getDestinationPosZ().intValue(),    // 目标层
                    null,    // 目标站
                    null,    // 响应结果
                    null,    // 修改时间
                    null    // 修改人员
            );
            bean.insert(basCrnOpt);
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command)));
            return true;
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    /**
     * 写入数据  工位2
     */
    private boolean write5(CrnCommand command) throws InterruptedException {
        if (null == command) {
            log.error("堆垛机写入命令为空");
            return false;
        }
//        convertRow(command);
        command.setCrnNo(slave.getId());
        short[] array = new short[10];
        array[0] = command.getAckFinish();
        array[1] = command.getTaskNo();
        array[2] = command.getTaskMode();
        array[3] = command.getSourcePosX();
        array[4] = command.getSourcePosY();
        array[5] = command.getSourcePosZ();
        array[6] = command.getDestinationPosX();
        array[7] = command.getDestinationPosY();
        array[8] = command.getDestinationPosZ();
//        array[9] = command.getSourceStaNo();
//        array[10] = command.getDestinationStaNo();
        array[9] = command.getCommand();
        OperateResult result18 = siemensNet.Write("DB100.38", (short)0);
        OperateResult result = siemensNet.Write("DB100.20", array);
        log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
        //堆垛机任务写入后,回读一次,看是否成功
        Thread.sleep(200);
        int writeCount = 1;
        do {
            try{
                if(!result.IsSuccess){
                    log.error("写入堆垛机plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSONString(command),writeCount);
                    result = siemensNet.Write("DB100.20", array);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.20", (short) 24);
                if (resultRead.IsSuccess) {
                    CrnCommand one = new CrnCommand();
                    one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                    one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                    one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                    one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                    one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                    one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                    one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                    one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                    if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                            || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                            || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                            || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                    ){
                        try{
                            log.error("堆垛机命令地址写入后回读失败==>不一致[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(one));
                        }catch (Exception e){
                            try{
                                log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(resultRead));
                            }catch (Exception e1){
                                log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSONString(command));
                            }
                        }
                        try{
                            Thread.sleep(100);
                        }catch (Exception e){
                        }
                        log.error("写入堆垛机plc数据失败,重新下发任务  回读不一致 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSONString(command),writeCount);
                        result = siemensNet.Write("DB100.20", array);
                        writeCount++;
                        continue;
                    } else {
                        log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(one));
                        break;
                    }
                }
            }catch (Exception e){
                log.error("堆垛机命令地址写入后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        if (command.getAckFinish() == 0) {
            short commandFinish = 1;
            Thread.sleep(100L);
            result = siemensNet.Write("DB100.38", commandFinish);
            int signFinish = 1;
            while (signFinish<5){
                OperateResultExOne<byte[]> result10018 = siemensNet.Read("DB100.38", (short) 2);
                short transInt16 = siemensNet.getByteTransform().TransInt16(result10018.Content, 0);
                if (transInt16 != commandFinish){
                    log.info("下发DB100.38  回读失败" + "commandFinish:"+commandFinish);
                    log.info("下发DB100.38  回读失败" + "array:"+ JSON.toJSONString(array));
                    result = siemensNet.Write("DB100.38", commandFinish);
                    signFinish++;
                }else {
                    log.info("下发DB100.38" + "commandFinish:"+commandFinish);
                    log.info("下发DB100.38" + "array:"+ JSON.toJSONString(array));
                    break;
                }
            }
        }
        try {
            // 日志记录
            BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class);
            BasCrnOpt basCrnOpt = new BasCrnOpt(
                    command.getTaskNo().intValue(),    // 任务号
                    command.getCrnNo(),    // 堆垛机[非空]
                    new Date(),    // 下发时间
                    command.getTaskModeType().toString(),    // 模式
                    command.getSourcePosX().intValue(),    // 源排
                    command.getSourcePosY().intValue(),    // 源列
                    command.getSourcePosZ().intValue(),    // 源层
                    null,    // 源站
                    command.getDestinationPosX().intValue(),    // 目标排
                    command.getDestinationPosY().intValue(),    // 目标列
                    command.getDestinationPosZ().intValue(),    // 目标层
                    null,    // 目标站
                    null,    // 响应结果
                    null,    // 修改时间
                    null    // 修改人员
            );
            bean.insert(basCrnOpt);
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command)));
            return true;
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    /**
     * 写入数据  双工位
     */
    private boolean write9(CrnCommandParam command) throws InterruptedException {
        if (null == command) {
            log.error("堆垛机写入命令为空");
            return false;
        }
        command.setCrnNo(slave.getId());
        short[] array = new short[22];
        array[0] = command.getAckFinish();
        array[1] = command.getTaskNo();
        array[2] = command.getTaskMode();
        array[3] = command.getSourcePosX();
        array[4] = command.getSourcePosY();
        array[5] = command.getSourcePosZ();
        array[6] = command.getDestinationPosX();
        array[7] = command.getDestinationPosY();
        array[8] = command.getDestinationPosZ();
        array[9] = command.getCommand();
        array[10] = command.getAckFinish2();
        array[11] = command.getTaskNo2();
        array[12] = command.getTaskMode2();
        array[13] = command.getSourcePosX2();
        array[14] = command.getSourcePosY2();
        array[15] = command.getSourcePosZ2();
        array[16] = command.getDestinationPosX2();
        array[17] = command.getDestinationPosY2();
        array[18] = command.getDestinationPosZ2();
        array[19] = command.getCommand();
        array[20] = (short)1;
        array[21] = (short)1;
        OperateResult result18 = siemensNet.Write("DB100.18", (short)0);
        OperateResult result38 = siemensNet.Write("DB100.38", (short)0);
        OperateResult result = siemensNet.Write("DB100.0", array);
//        OperateResult result = siemensNet.Write("DB100.20", array);
        log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
        //堆垛机任务写入后,回读一次,看是否成功
        Thread.sleep(200);
        int writeCount = 1;
        do {
            try{
                if(!result.IsSuccess){
                    log.error("写入堆垛机plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount);
                    result = siemensNet.Write("DB100.0", array);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 40);
                if (resultRead.IsSuccess) {
                    CrnCommandParam one = new CrnCommandParam();
                    one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                    one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                    one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                    one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                    one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                    one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                    one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                    one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                    one.setTaskNo2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 22));
                    one.setTaskMode2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24));
                    one.setSourcePosX2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 26));
                    one.setSourcePosY2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 28));
                    one.setSourcePosZ2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30));
                    one.setDestinationPosX2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 32));
                    one.setDestinationPosY2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 34));
                    one.setDestinationPosZ2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 36));
                    if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                            || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                            || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                            || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                            ||
                            !command.getTaskNo2().equals(one.getTaskNo2()) || !command.getTaskMode2().equals(one.getTaskMode2())
                            || !command.getSourcePosX2().equals(one.getSourcePosX2()) || !command.getSourcePosY2().equals(one.getSourcePosY2())
                            || !command.getSourcePosZ2().equals(one.getSourcePosZ2()) || !command.getDestinationPosX2().equals(one.getDestinationPosX2())
                            || !command.getDestinationPosY2().equals(one.getDestinationPosY2()) || !command.getDestinationPosZ2().equals(one.getDestinationPosZ2())
                    ){
                        try{
                            log.error("堆垛机命令地址写入后回读失败==>不一致[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                        }catch (Exception e){
                            try{
                                log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                            }catch (Exception e1){
                                log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                            }
                        }
                        try{
                            Thread.sleep(100);
                        }catch (Exception e){
                        }
                        log.error("写入堆垛机plc数据失败,重新下发任务  回读不一致 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount);
                        result = siemensNet.Write("DB100.0", array);
                        writeCount++;
                        continue;
                    } else {
                        log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                        break;
                    }
                }
            }catch (Exception e){
                log.error("堆垛机命令地址写入后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        if (command.getAckFinish() == 0) {
            short commandFinish = 1;
            Thread.sleep(100L);
            result18 = siemensNet.Write("DB100.18", commandFinish);
            result38 = siemensNet.Write("DB100.38", commandFinish);
            int signFinish = 1;
            while (signFinish<5){
                OperateResultExOne<byte[]> result10018 = siemensNet.Read("DB100.18", (short) 2);
                OperateResultExOne<byte[]> result10038 = siemensNet.Read("DB100.38", (short) 2);
                short transInt1618 = siemensNet.getByteTransform().TransInt16(result10018.Content, 0);
                short transInt1638 = siemensNet.getByteTransform().TransInt16(result10038.Content, 0);
                if (transInt1618 != commandFinish || transInt1638 != commandFinish){
                    log.info("下发DB100.18/DB100.38  回读失败" + "commandFinish:"+commandFinish);
                    log.info("下发DB100.18/DB100.38  回读失败" + "array:"+ JSON.toJSONString(array));
                    result18 = siemensNet.Write("DB100.18", commandFinish);
                    result38 = siemensNet.Write("DB100.38", commandFinish);
                    signFinish++;
                }else {
                    log.info("下发DB100.18/DB100.38" + "commandFinish:"+commandFinish);
                    log.info("下发DB100.18/DB100.38" + "array:"+ JSON.toJSONString(array));
                    break;
                }
            }
        }
        try {
src/main/resources/mapper/BasDevpMapper.xml
@@ -41,10 +41,6 @@
        <result column="max_wt" property="maxWt" />
        <result column="gross_wt" property="grossWt" />
        <result column="cart_pos" property="cartPos" />
        <result column="agv_start_pick" property="agvStartPick" />
        <result column="agv_target_pick" property="agvTargetPick" />
        <result column="agv_start_place" property="agvStartPlace" />
        <result column="agv_target_place" property="agvTargetPlace" />
        <result column="sta_err" property="staErr" />
    </resultMap>
src/main/resources/mapper/TaskWrkLogMapper.xml
@@ -23,7 +23,6 @@
        <result column="cancel_time" property="cancelTime" />
        <result column="wrk_sts" property="wrkSts" />
        <result column="crn_no" property="crnNo" />
        <result column="command_step" property="commandStep" />
        <result column="transfer_mark" property="transferMark" />
    </resultMap>
src/main/resources/mapper/TaskWrkMapper.xml
@@ -12,6 +12,9 @@
        <result column="io_pri" property="ioPri" />
        <result column="start_point" property="startPoint" />
        <result column="target_point" property="targetPoint" />
        <result column="origin_start_point" property="originStartPoint" />
        <result column="origin_target_point" property="originTargetPoint" />
        <result column="sc_weight" property="scWeight" />
        <result column="modi_user" property="modiUser" />
        <result column="modi_time" property="modiTime" />
        <result column="memo" property="memo" />
@@ -22,7 +25,6 @@
        <result column="cancel_time" property="cancelTime" />
        <result column="wrk_sts" property="wrkSts" />
        <result column="crn_no" property="crnNo" />
        <result column="command_step" property="commandStep" />
        <result column="transfer_mark" property="transferMark" />
    </resultMap>