自动化立体仓库 - WCS系统
Junjie
4 天以前 b69671d75ba283f8d47c31ae989b5dd346b62967
#出库任务预调度提升机
2个文件已添加
1个文件已删除
14个文件已修改
281 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ForkLiftController.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ShuttleController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/WorkNoType.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/action/ForkLiftAction.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/WrkIoType.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ForkLiftThread.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/docs/台升四向库WCS与货叉提升机PLC通讯接口协议1.1.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/20250424151727.nb3 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/出库任务预调度提升机sql 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/forklift.html 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ForkLiftController.java
@@ -16,10 +16,7 @@
import com.zy.core.action.ForkLiftAction;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.ForkLiftProtocolStatusType;
import com.zy.core.enums.ForkLiftTaskModeType;
import com.zy.core.enums.RedisKeyType;
import com.zy.core.enums.SlaveType;
import com.zy.core.enums.*;
import com.zy.core.model.ForkLiftSlave;
import com.zy.core.model.command.*;
import com.zy.core.model.protocol.ForkLiftProtocol;
@@ -274,7 +271,7 @@
        if (param.getLiftTaskMode() == 1) {
            //小车换层
            int workNo = commonService.getWorkNo(99);//获取任务号
            int workNo = commonService.getWorkNo(WrkIoType.MANUAL.id);//获取任务号
            Integer startSta = param.getSourceStaNo();
            Integer targetSta = param.getStaNo();
@@ -296,7 +293,7 @@
            return R.ok();
        } else if (param.getLiftTaskMode() == 2) {
            //移动托盘
            int workNo = commonService.getWorkNo(99);//获取任务号
            int workNo = commonService.getWorkNo(WrkIoType.MANUAL.id);//获取任务号
            Integer startSta = param.getSourceStaNo();
            Integer targetSta = param.getStaNo();
@@ -317,6 +314,28 @@
            forkLiftAction.assignWork(forkLiftProtocol.getLiftNo(), assignCommand);
            return R.ok();
        } else if (param.getLiftTaskMode() == 3) {
            //移动
            int workNo = commonService.getWorkNo(WrkIoType.MANUAL.id);//获取任务号
            Integer startSta = param.getSourceStaNo();
            Integer targetSta = param.getStaNo();
            //获取提升机命令
            List<ForkLiftCommand> liftCommand = forkLiftThread.getMoveCommand(workNo, startSta, targetSta);
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
            assignCommand.setCommands(commands);
            assignCommand.setLiftNo(forkLiftProtocol.getLiftNo().shortValue());
            assignCommand.setTaskNo((short) workNo);
            assignCommand.setAuto(false);//手动模式
            assignCommand.setTaskMode(ForkLiftTaskModeType.MOVE.id.shortValue());
            forkLiftAction.assignWork(forkLiftProtocol.getLiftNo(), assignCommand);
            return R.ok();
        } else if (param.getLiftTaskMode() == 4) {
            //任务确认
            forkLiftThread.reset();
            return R.ok();
src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -298,7 +298,7 @@
        ShuttleTaskModeType shuttleTaskModeType = ShuttleTaskModeType.get(param.getShuttleTaskMode().intValue());
        assignCommand.setShuttleNo(param.getShuttleNo()); // å››å‘穿梭车编号
        assignCommand.setTaskMode(shuttleTaskModeType.id);
        assignCommand.setTaskNo(commonService.getWorkNo(99));//获取任务号
        assignCommand.setTaskNo(commonService.getWorkNo(WrkIoType.MANUAL.id));//获取任务号
        assignCommand.setAuto(false);//手动模式
        if (shuttleTaskModeType == ShuttleTaskModeType.MOVE_LOC_NO) {
src/main/java/com/zy/asrs/domain/enums/WorkNoType.java
File was deleted
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -919,6 +919,15 @@
                        } else {
                            News.error("提升机已确认且任务完成状态,复位失败,但未找到工作档。提升机号={},工作号={}", forkLiftProtocol.getLiftNo(), forkLiftProtocol.getWrkNo());
                        }
                    }else {
                        boolean checkPreviewDispatchForkLift = commonService.checkWorkNoContainMk(forkLiftProtocol.getWrkNo(), WrkIoType.FORKLIFT_MOVE.id);
                        if (checkPreviewDispatchForkLift) {
                            //属于提升机预调度移动任务
                            //无工作档支撑,直接确认完成
                            forkLiftThread.setSyncTaskNo(0);
                            forkLiftThread.reset();
                            News.info("已确认提升机预调度移动任务。提升机号={}", forkLiftProtocol.getLiftNo());
                        }
                    }
                }
            }
@@ -1860,4 +1869,81 @@
        }
    }
    //出库任务预调度提升机
    public void outTaskPreviewDispatchForkLift() {
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .in("wrk_sts"
                        , WrkStsType.OUTBOUND_SHUTTLE_RUN.sts
                ));
        for (WrkMast wrkMast : wrkMasts) {
            if(wrkMast.getShuttleNo() == null){
                continue;
            }
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
            if (shuttleThread == null) {
                continue;
            }
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null) {
                continue;
            }
            if(shuttleProtocol.getCurrentLocNo() == null){
                continue;
            }
            //通过输送线站号获取提升机号
            Integer liftNo = ForkLiftUtils.getConveyorBindLiftNo(wrkMast.getStaNo());
            if (liftNo == null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,未找到匹配的提升机", wrkMast.getWrkNo());
                continue;
            }
            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
            if (forkLiftThread == null) {
                continue;
            }
            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
            if (forkLiftProtocol == null) {
                continue;
            }
            //判断提升机是否有其他任务
            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo());
            if (liftWrkMast != null) {
                continue;//提升机已被绑定,不再执行预调度任务
            }
            if (!forkLiftThread.isIdle()) {
                continue;
            }
            //提升机不在出库层
            if (forkLiftProtocol.getLev() != Utils.getLev(wrkMast.getSourceLocNo())) {
                continue;
            }
            //移动
            int workNo = commonService.getWorkNo(WrkIoType.FORKLIFT_MOVE.id);//获取任务号
            //获取提升机命令
            List<ForkLiftCommand> liftCommand = forkLiftThread.getMoveCommand(workNo, forkLiftProtocol.getLev(), Utils.getLev(wrkMast.getSourceLocNo()));
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
            assignCommand.setCommands(commands);
            assignCommand.setLiftNo(forkLiftProtocol.getLiftNo().shortValue());
            assignCommand.setTaskNo((short) workNo);
            assignCommand.setTaskMode(ForkLiftTaskModeType.MOVE.id.shortValue());
            forkLiftAction.assignWork(forkLiftProtocol.getLiftNo(), assignCommand);
        }
    }
}
src/main/java/com/zy/common/service/CommonService.java
@@ -21,8 +21,6 @@
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WrkMastLogService wrkMastLogService;
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private LocMastService locMastService;
@@ -65,6 +63,21 @@
        return workNo;
    }
    //检测工作号是否在指定类型工作范围内
    public synchronized boolean checkWorkNoContainMk(Integer workNo, Integer wrkMk) {
        WrkLastno wrkLastno = wrkLastnoService.selectById(wrkMk);
        if (Cools.isEmpty(wrkLastno)) {
            throw new CoolException("数据异常,请联系管理员");
        }
        int sNo = wrkLastno.getSNo();
        int eNo = wrkLastno.getENo();
        if (workNo >= sNo && workNo <= eNo) {
            return true;
        }
        return false;
    }
    public static String zerofill(String msg, Integer count) {
        if (msg.length() == count) {
            return msg;
src/main/java/com/zy/core/MainProcess.java
@@ -66,6 +66,9 @@
                    //自动切换出入库模式
                    mainService.autoSwitchForkLiftIOMode();
                    //出库任务预调度提升机
                    mainService.outTaskPreviewDispatchForkLift();
                    // é—´éš”
                    Thread.sleep(200);
                } catch (Exception e) {
src/main/java/com/zy/core/action/ForkLiftAction.java
@@ -148,6 +148,8 @@
            response = forkLiftThread.pickAndPut(command);
        } else if (command.getMode().intValue() == ForkLiftTaskModeType.SHUTTLE_SWITCH.id) {
            response = forkLiftThread.shuttleSwitch(command);
        } else if (command.getMode().intValue() == ForkLiftTaskModeType.MOVE.id) {
            response = forkLiftThread.move(command);
        }
        return response;
    }
src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java
@@ -8,6 +8,7 @@
    PUT_DOWN(2, "放货"),
    PICK_PUT(3, "取放货"),
    SHUTTLE_SWITCH(4, "小车换层"),
    MOVE(5, "提升机移动"),
    ;
    public Integer id;
src/main/java/com/zy/core/enums/WrkIoType.java
@@ -9,6 +9,8 @@
    SHUTTLE_MOVE(200, "小车移动"),
    LOC_MOVE(201, "移库任务"),
    SHUTTLE_CHARGE(300, "小车充电"),
    FORKLIFT_MOVE(98, "提升机预调度移动任务"),
    MANUAL(99, "手动任务"),
    ;
    WrkIoType(int id, String desc) {
src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java
@@ -85,6 +85,11 @@
    private Integer errorCode;
    /**
     * å½“前层
     */
    private Integer lev;
    /**
     * ä½œä¸šæ ‡è®°
     */
    private Boolean pakMk = false;
src/main/java/com/zy/core/thread/ForkLiftThread.java
@@ -24,6 +24,8 @@
    CommandResponse shuttleSwitch(ForkLiftCommand command);//小车换层
    CommandResponse move(ForkLiftCommand command);//小车换层
    CommandResponse reset();//复位
    boolean isIdle();//是否空闲
@@ -46,4 +48,6 @@
    List<ForkLiftCommand> getShuttleSwitchCommand(Integer taskNo, Integer pick, Integer put);//小车换层
    List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put);//提升机移动
}
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java
@@ -159,6 +159,8 @@
                forkLiftProtocol.setIOMode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 12));
                //故障码
                forkLiftProtocol.setErrorCode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 14));
                //当前层
                forkLiftProtocol.setLev((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 16));
                //************补充扩展字段*************
                InnerForkLiftExtend forkLiftExtend = (InnerForkLiftExtend) forkLiftProtocol.getExtend();
@@ -304,6 +306,25 @@
    }
    @Override
    public CommandResponse move(ForkLiftCommand command) {
        CommandResponse response = new CommandResponse(false);
        short[] array = new short[4];
        array[0] = command.getTaskNo();//任务号
        array[1] = command.getMode();//任务模式
        array[2] = command.getPick();//取货数据
        array[3] = command.getPut();//放货数据
        OperateResult result = this.masterThread.write(this.slave.getId(), "write", array);
        if (result.IsSuccess) {
            OperateResult result2 = this.masterThread.write(this.slave.getId(), "writeConfirm", command.getConfirm());
            if (result2.IsSuccess) {
                response.setResult(true);
            }
        }
        return response;
    }
    @Override
    public CommandResponse reset() {
        CommandResponse response = new CommandResponse(false);
        OperateResult result = this.masterThread.write(this.slave.getId(), "confirm", (short) 1);
@@ -424,6 +445,24 @@
        return commands;
    }
    @Override
    public List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put) {
        Integer realPick = pick % 1000;
        Integer realPut = put % 1000;
        List<ForkLiftCommand> commands = new ArrayList<>();
        ForkLiftCommand command = new ForkLiftCommand();
        command.setLiftNo(slave.getId());
        command.setTaskNo(taskNo.shortValue());
        command.setMode(ForkLiftTaskModeType.MOVE.id.shortValue());
        command.setPick(realPick.shortValue());
        command.setPut(realPut.shortValue());
        command.setConfirm((short) 1);
        commands.add(command);
        return commands;
    }
    /**
     * æ‰©å±•字段
     */
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java
@@ -285,6 +285,25 @@
    }
    @Override
    public CommandResponse move(ForkLiftCommand command) {
        CommandResponse response = new CommandResponse(false);
        short[] array = new short[4];
        array[0] = command.getTaskNo();//任务号
        array[1] = command.getMode();//任务模式
        array[2] = command.getPick();//取货数据
        array[3] = command.getPut();//放货数据
        OperateResult result = siemensS7Net.Write("DB103.0", array);
        if (result.IsSuccess) {
            OperateResult result2 = siemensS7Net.Write("DB103.8", command.getConfirm());
            if (result2.IsSuccess) {
                response.setResult(true);
            }
        }
        return response;
    }
    @Override
    public CommandResponse reset() {
        CommandResponse response = new CommandResponse(false);
        OperateResult result = siemensS7Net.Write("DB103.10", (short) 1);
@@ -405,6 +424,24 @@
        return commands;
    }
    @Override
    public List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put) {
        Integer realPick = pick % 1000;
        Integer realPut = put % 1000;
        List<ForkLiftCommand> commands = new ArrayList<>();
        ForkLiftCommand command = new ForkLiftCommand();
        command.setLiftNo(slave.getId());
        command.setTaskNo(taskNo.shortValue());
        command.setMode(ForkLiftTaskModeType.MOVE.id.shortValue());
        command.setPick(realPick.shortValue());
        command.setPut(realPut.shortValue());
        command.setConfirm((short) 1);
        commands.add(command);
        return commands;
    }
    /**
     * æ‰©å±•字段
     */
src/main/resources/docs/̨ÉýËÄÏò¿âWCSÓë»õ²æÌáÉý»úPLCͨѶ½Ó¿ÚЭÒé1.1.docx
Binary files differ
src/main/resources/sql/20250424151727.nb3
Binary files differ
src/main/resources/sql/³ö¿âÈÎÎñÔ¤µ÷¶ÈÌáÉý»úsql
New file
@@ -0,0 +1 @@
INSERT INTO `asr_wrk_lastno` (`wrk_mk`, `wrk_no`, `modi_user`, `modi_time`, `appe_user`, `appe_time`, `s_no`, `e_no`, `memo_m`) VALUES (98, 35001, 9527, '2025-04-24 14:57:34', 9527, '2025-04-24 14:57:39', 35001, 40000, NULL);
src/main/webapp/views/forklift.html
@@ -91,7 +91,8 @@
                        </div>
                        <button class="item" onclick="liftOperator(1)">小车换层</button>
                        <button class="item" onclick="liftOperator(2)">移动托盘</button>
                        <button class="item" onclick="liftOperator(3)">任务确认</button>
                        <button class="item" onclick="liftOperator(3)">移动</button>
                        <button class="item" onclick="liftOperator(4)">任务确认</button>
                        <button class="item" onclick="liftOperator(0)">复位</button>
                    </div>
                </fieldset>