| | |
| | | label: '当前层', |
| | | children: item.lev, |
| | | }, |
| | | { |
| | | key: '11', |
| | | label: '已完成任务号', |
| | | children: item.completeTaskNo, |
| | | }, |
| | | { |
| | | key: '12', |
| | | label: '扩展', |
| | | children: JSON.stringify(item.extend), |
| | | }, |
| | | ]; |
| | | return <div key={item.id} style={{ width: '45%' }}> |
| | | <div style={{ marginBottom: '10px' }}> |
| | |
| | | setSearchParam={setSearchParam} |
| | | />, |
| | | }, |
| | | { |
| | | title: '修改人员', |
| | | dataIndex: 'updateBy$', |
| | | valueType: 'text', |
| | | hidden: false, |
| | | width: 140, |
| | | filterDropdown: (props) => <LinkFilter |
| | | name='updateBy' |
| | | major='user' |
| | | {...props} |
| | | actionRef={actionRef} |
| | | setSearchParam={setSearchParam} |
| | | />, |
| | | }, |
| | | { |
| | | title: '创建人员', |
| | | dataIndex: 'createBy$', |
| | | valueType: 'text', |
| | | hidden: false, |
| | | width: 140, |
| | | filterDropdown: (props) => <LinkFilter |
| | | name='createBy' |
| | | major='user' |
| | | {...props} |
| | | actionRef={actionRef} |
| | | setSearchParam={setSearchParam} |
| | | />, |
| | | }, |
| | | { |
| | | title: '创建时间', |
| | | dataIndex: 'createTime$', |
| | | valueType: 'text', |
| | | hidden: false, |
| | | width: 140, |
| | | filterDropdown: (props) => <DatetimeRangeFilter |
| | | name='createTime' |
| | | {...props} |
| | | actionRef={actionRef} |
| | | setSearchParam={setSearchParam} |
| | | />, |
| | | }, |
| | | { |
| | | title: '修改时间', |
| | | dataIndex: 'updateTime$', |
| | | valueType: 'text', |
| | | hidden: false, |
| | | width: 140, |
| | | filterDropdown: (props) => <DatetimeRangeFilter |
| | | name='updateTime' |
| | | {...props} |
| | | actionRef={actionRef} |
| | | setSearchParam={setSearchParam} |
| | | />, |
| | | }, |
| | | // { |
| | | // title: '修改人员', |
| | | // dataIndex: 'updateBy$', |
| | | // valueType: 'text', |
| | | // hidden: false, |
| | | // width: 140, |
| | | // filterDropdown: (props) => <LinkFilter |
| | | // name='updateBy' |
| | | // major='user' |
| | | // {...props} |
| | | // actionRef={actionRef} |
| | | // setSearchParam={setSearchParam} |
| | | // />, |
| | | // }, |
| | | // { |
| | | // title: '创建人员', |
| | | // dataIndex: 'createBy$', |
| | | // valueType: 'text', |
| | | // hidden: false, |
| | | // width: 140, |
| | | // filterDropdown: (props) => <LinkFilter |
| | | // name='createBy' |
| | | // major='user' |
| | | // {...props} |
| | | // actionRef={actionRef} |
| | | // setSearchParam={setSearchParam} |
| | | // />, |
| | | // }, |
| | | // { |
| | | // title: '创建时间', |
| | | // dataIndex: 'createTime$', |
| | | // valueType: 'text', |
| | | // hidden: false, |
| | | // width: 140, |
| | | // filterDropdown: (props) => <DatetimeRangeFilter |
| | | // name='createTime' |
| | | // {...props} |
| | | // actionRef={actionRef} |
| | | // setSearchParam={setSearchParam} |
| | | // />, |
| | | // }, |
| | | // { |
| | | // title: '修改时间', |
| | | // dataIndex: 'updateTime$', |
| | | // valueType: 'text', |
| | | // hidden: false, |
| | | // width: 140, |
| | | // filterDropdown: (props) => <DatetimeRangeFilter |
| | | // name='updateTime' |
| | | // {...props} |
| | | // actionRef={actionRef} |
| | | // setSearchParam={setSearchParam} |
| | | // />, |
| | | // }, |
| | | { |
| | | title: '备注', |
| | | dataIndex: 'memo', |
| | |
| | | setSearchParam={setSearchParam} |
| | | />, |
| | | }, |
| | | { |
| | | title: '工作模式', |
| | | dataIndex: 'workMode$', |
| | | valueType: 'text', |
| | | hidden: false, |
| | | width: 140, |
| | | filterDropdown: (props) => <TextFilter |
| | | name='workMode' |
| | | {...props} |
| | | actionRef={actionRef} |
| | | setSearchParam={setSearchParam} |
| | | />, |
| | | }, |
| | | |
| | | { |
| | | title: '操作', |
| | |
| | | import com.zy.asrs.framework.common.R; |
| | | import com.zy.asrs.framework.common.SnowflakeIdWorker; |
| | | import com.zy.asrs.wcs.core.domain.dto.BasLiftStaDto; |
| | | import com.zy.asrs.wcs.core.domain.param.CreateInTaskParam; |
| | | import com.zy.asrs.wcs.core.domain.param.CreateManualTakeTaskParam; |
| | | import com.zy.asrs.wcs.core.domain.param.CreateMoveTaskParam; |
| | | import com.zy.asrs.wcs.core.domain.param.CreateOutTaskParam; |
| | | import com.zy.asrs.wcs.core.domain.param.*; |
| | | import com.zy.asrs.wcs.core.entity.*; |
| | | import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; |
| | | import com.zy.asrs.wcs.core.model.enums.TaskCtgType; |
| | |
| | | import com.zy.asrs.wcs.rcs.model.enums.SlaveType; |
| | | import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; |
| | | import com.zy.asrs.wcs.rcs.service.DeviceService; |
| | | import com.zy.asrs.wcs.rcs.thread.DevpThread; |
| | | import com.zy.asrs.wcs.rcs.thread.ShuttleThread; |
| | | import com.zy.asrs.wcs.system.controller.BaseController; |
| | | import com.zy.asrs.wcs.system.entity.Dict; |
| | |
| | | private BasConveyorPathService basConveyorPathService; |
| | | @Autowired |
| | | private BasLiftService basLiftService; |
| | | @Autowired |
| | | private BasConveyorService basConveyorService; |
| | | |
| | | //生成入库任务 |
| | | @PostMapping("/createInTask") |
| | |
| | | return R.ok(); |
| | | } |
| | | |
| | | //切换工作模式 |
| | | @PostMapping("/switchWorkMode") |
| | | public R switchWorkMode(@RequestBody SwitchWorkModeParam param) { |
| | | BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>().eq(BasConveyor::getConveyorNo, param.getConveyorNo())); |
| | | if(basConveyor == null) { |
| | | return R.error("输送线不存在"); |
| | | } |
| | | |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); |
| | | if(devpThread == null) { |
| | | return R.error("输送线线程不存在"); |
| | | } |
| | | |
| | | boolean result = devpThread.switchWorkMode(param.getSiteId(), param.getWorkMode()); |
| | | if (!result) { |
| | | return R.error("模式切换失败"); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.core.domain.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class SwitchWorkModeParam { |
| | | |
| | | //工作模式 |
| | | private Integer workMode; |
| | | |
| | | //输送线号 |
| | | private Integer conveyorNo; |
| | | |
| | | //站点 |
| | | private Integer siteId; |
| | | |
| | | } |
| | |
| | | import java.util.Date; |
| | | |
| | | import com.zy.asrs.wcs.core.service.BasConveyorService; |
| | | import com.zy.asrs.wcs.rcs.model.enums.WorkModeType; |
| | | import com.zy.asrs.wcs.system.entity.Host; |
| | | import com.zy.asrs.wcs.system.entity.User; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | |
| | | @ApiModelProperty(value= "工作号") |
| | | private Integer taskNo; |
| | | |
| | | /** |
| | | * 工作模式 |
| | | */ |
| | | @ApiModelProperty(value= "工作模式") |
| | | private Integer workMode; |
| | | |
| | | public BasConveyorSta() {} |
| | | |
| | | public BasConveyorSta(Long conveyorId,Integer conveyorNo,Long updateBy,Long createBy,Date createTime,Date updateTime,String memo,Integer deleted,Long hostId,Integer siteNo,String inEnable,String outEnable,String autoing,String loading,String canining,String canouting,Integer locType1,Integer locType2,Integer locType3,String locNo,String qrCodeValue) { |
| | |
| | | } |
| | | } |
| | | |
| | | public String getWorkMode$() { |
| | | if (null == this.workMode){ return null; } |
| | | WorkModeType workModeType = WorkModeType.get(this.workMode.shortValue()); |
| | | if(!Cools.isEmpty(workModeType)){ |
| | | return workModeType.desc; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | * 是否删除 1: 是 0: 否 |
| | | */ |
| | | @ApiModelProperty(value= "是否删除 1: 是 0: 否 ") |
| | | @TableLogic |
| | | private Integer deleted; |
| | | |
| | | /** |
| | |
| | | MotionCtgType.SHUTTLE_MOVE_TO_LIFT |
| | | )); |
| | | |
| | | // 向提升机发送小车已到位信号 |
| | | motionList.addAll(kernelService.liftShuttleArrival( |
| | | null |
| | | , MotionDto.build((dto -> { |
| | | dto.setLiftNo(liftDevice.getId().intValue()); |
| | | })) |
| | | )); |
| | | |
| | | // 解锁提升机 |
| | | motionList.addAll(kernelService.liftUnlock( |
| | | null |
| | |
| | | return motionList; |
| | | } |
| | | |
| | | /** |
| | | * 提升机-小车已到位 |
| | | */ |
| | | public List<Motion> liftShuttleArrival(MotionDto origin, MotionDto target) { |
| | | List<Motion> motionList = new ArrayList<>(); |
| | | |
| | | motionList.add(Motion.build(motion -> { |
| | | motion.setDeviceCtg(DeviceCtgType.LIFT.val()); |
| | | motion.setDevice(String.valueOf(target.getLiftNo())); |
| | | motion.setMotionCtg(MotionCtgType.LIFT_SHUTTLE_ARRIVAL.val()); |
| | | })); |
| | | |
| | | return motionList; |
| | | } |
| | | |
| | | /** |
| | | * 提升机-小车已驶离 |
| | | */ |
| | | public List<Motion> liftShuttleLeave(MotionDto origin, MotionDto target) { |
| | | List<Motion> motionList = new ArrayList<>(); |
| | | |
| | | motionList.add(Motion.build(motion -> { |
| | | motion.setDeviceCtg(DeviceCtgType.LIFT.val()); |
| | | motion.setDevice(String.valueOf(target.getLiftNo())); |
| | | motion.setMotionCtg(MotionCtgType.LIFT_SHUTTLE_LEAVE.val()); |
| | | })); |
| | | |
| | | return motionList; |
| | | } |
| | | |
| | | // shuttle ----------------------------------------------------------------------------- |
| | | |
| | | /** |
| | |
| | | return false; |
| | | } |
| | | |
| | | //判断提升机是否自动 |
| | | if (!liftThread.isIdle()) { |
| | | return false; |
| | | } |
| | | |
| | | if (motionService.count(new LambdaQueryWrapper<Motion>() |
| | | .eq(Motion::getDeviceCtg, DeviceCtgType.LIFT.val()) |
| | | .eq(Motion::getDevice, motion.getDevice()) |
| | |
| | | List<LiftCommand> command = new ArrayList<>(); |
| | | switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){ |
| | | case LIFT_MOVE: |
| | | //判断提升机是否自动 |
| | | if (!liftThread.isIdle()) { |
| | | return false; |
| | | } |
| | | |
| | | // 如果已经在目标层,那边层过滤 |
| | | if (liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) { |
| | | liftThread.setSyncTaskNo(motion.getTaskNo()); |
| | |
| | | list.addAll(command); |
| | | return liftAction.assignWork(liftThread.getDevice(), assignCommand); |
| | | case LIFT_WITH_GOODS: |
| | | //判断提升机是否自动 |
| | | if (!liftThread.isIdle()) { |
| | | return false; |
| | | } |
| | | // if (liftProtocol.getHasTray()) { |
| | | // return false; |
| | | // } |
| | |
| | | list.addAll(command); |
| | | return liftAction.assignWork(liftThread.getDevice(), assignCommand); |
| | | case LIFT_WITH_SHUTTLE: |
| | | //判断提升机是否自动 |
| | | if (!liftThread.isIdle()) { |
| | | return false; |
| | | } |
| | | |
| | | if (!liftProtocol.getHasCar()) { |
| | | return false; |
| | | } |
| | |
| | | list.addAll(command); |
| | | return liftAction.assignWork(liftThread.getDevice(), assignCommand); |
| | | case LIFT_WITH_GOODS_AND_SHUTTLE: |
| | | //判断提升机是否自动 |
| | | if (!liftThread.isIdle()) { |
| | | return false; |
| | | } |
| | | |
| | | return false; |
| | | // if (!liftProtocol.getPlatShuttleCheck()) { |
| | | // return false; |
| | | // } |
| | | // |
| | | // command = liftThread.getLiftUpDownCommand(Integer.parseInt(motion.getTarget())); |
| | | // command.setLiftNo(deviceNo.shortValue()); |
| | | // command.setTaskNo(motion.getWrkNo().shortValue()); |
| | | // return liftThread.assignWork(command); |
| | | case LIFT_TRANSPORT_TO_CONVEYOR: |
| | | return false; |
| | | case LIFT_LOCK: |
| | | //锁定提升机 |
| | | //判断提升机是否自动 |
| | | if (!liftThread.isIdle(MotionCtgType.LIFT_LOCK)) { |
| | | return false; |
| | | } |
| | | |
| | | command = liftThread.getLockCommand(motion.getTaskNo(), true);//获取提升机锁定命令 |
| | | list.addAll(command); |
| | | return liftAction.assignWork(liftThread.getDevice(), assignCommand); |
| | | case LIFT_UNLOCK: |
| | | //锁定提升机 |
| | | //解锁提升机 |
| | | //判断提升机是否自动 |
| | | if (!liftThread.isIdle(MotionCtgType.LIFT_UNLOCK)) { |
| | | return false; |
| | | } |
| | | |
| | | command = liftThread.getLockCommand(motion.getTaskNo(), false);//获取提升机解定命令 |
| | | list.addAll(command); |
| | | return liftAction.assignWork(liftThread.getDevice(), assignCommand); |
| | | case LIFT_SHUTTLE_ARRIVAL: |
| | | //提升机-小车已到位 |
| | | //判断提升机是否自动 |
| | | if (!liftThread.isIdle(MotionCtgType.LIFT_SHUTTLE_ARRIVAL)) { |
| | | return false; |
| | | } |
| | | |
| | | command = liftThread.getShuttleSignalCommand(motion.getTaskNo(), true);//获取小车已到位命令 |
| | | list.addAll(command); |
| | | return liftAction.assignWork(liftThread.getDevice(), assignCommand); |
| | | default: |
| | | break; |
| | | |
| | | } |
| | | |
| | | return Boolean.TRUE; |
| | |
| | | return false; |
| | | } |
| | | break; |
| | | case LIFT_SHUTTLE_ARRIVAL: |
| | | |
| | | break; |
| | | default: |
| | | return false; |
| | | } |
| | |
| | | if (!liftThread.isLock(new ExecuteSupport() { |
| | | @Override |
| | | public Boolean judgement() { |
| | | return true; |
| | | return true;//牛眼没有提升机锁,直接返回true |
| | | } |
| | | })) { |
| | | return false; |
| | |
| | | } |
| | | |
| | | //判断提升机是否被锁定 |
| | | if (liftThread.isLock(new ExecuteSupport() { |
| | | if (!liftThread.isLock(new ExecuteSupport() { |
| | | @Override |
| | | public Boolean judgement() { |
| | | return false; |
| | | } |
| | | })) { |
| | | //解锁提升机 |
| | | List<LiftCommand> lockCommand = liftThread.getLockCommand(motion.getTaskNo(), false);//获取提升机解锁命令 |
| | | |
| | | LiftAssignCommand liftAssignCommand = new LiftAssignCommand(); |
| | | liftAssignCommand.setLiftNo(liftThread.getStatus().getLiftNo()); |
| | | liftAssignCommand.setTaskNo(motion.getTaskNo()); |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.addAll(lockCommand); |
| | | liftAssignCommand.setCommands(list); |
| | | |
| | | liftAction.assignWork(liftThread.getDevice(), liftAssignCommand); |
| | | return false;//等待下一次轮询 |
| | | } |
| | | |
| | | //判断小车是否已到位 |
| | | if (liftProtocol.getHasCar()) { |
| | | List<LiftCommand> signalCommand = liftThread.getShuttleSignalCommand(motion.getTaskNo(), true);//获取小车已到位命令 |
| | | if(signalCommand != null) { |
| | | boolean hasKey = redisUtil.hasKey(DeviceRedisConstant.COMMAND_TMP + motion.getTaskNo()); |
| | | if (!hasKey) { |
| | | LiftAssignCommand liftAssignCommand = new LiftAssignCommand(); |
| | | liftAssignCommand.setLiftNo(liftThread.getStatus().getLiftNo()); |
| | | liftAssignCommand.setTaskNo(motion.getTaskNo()); |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.addAll(signalCommand); |
| | | liftAssignCommand.setCommands(list); |
| | | liftAction.assignWork(liftThread.getDevice(), liftAssignCommand); |
| | | redisUtil.set(DeviceRedisConstant.COMMAND_TMP + motion.getTaskNo(), true, 120); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //判断提升机工作号是否和当前任务相同 |
| | | if (liftProtocol.getTaskNo().intValue() != motion.getTaskNo()) { |
| | | return false; |
| | | } |
| | | |
| | | if (liftProtocol.getTaskNo() != 0) { |
| | | //清空提升机号 |
| | | liftThread.setSyncTaskNo(0); |
| | | //判断小车是否已到位 |
| | | if (!liftProtocol.getHasCar()) { |
| | | return false; |
| | | } |
| | | |
| | | // //判断提升机工作号是否和当前任务相同 |
| | | // if (liftProtocol.getTaskNo().intValue() != motion.getTaskNo()) { |
| | | // return false; |
| | | // } |
| | | break; |
| | | case SHUTTLE_MOVE_FROM_LIFT: |
| | | liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp())); |
| | |
| | | } |
| | | |
| | | //判断提升机是否被锁定 |
| | | if (liftThread.isLock(new ExecuteSupport() { |
| | | if (!liftThread.isLock(new ExecuteSupport() { |
| | | @Override |
| | | public Boolean judgement() { |
| | | return false; |
| | | } |
| | | })) { |
| | | //解锁提升机 |
| | | List<LiftCommand> lockCommand = liftThread.getLockCommand(motion.getTaskNo(), false);//获取提升机解锁命令 |
| | | |
| | | LiftAssignCommand liftAssignCommand = new LiftAssignCommand(); |
| | | liftAssignCommand.setLiftNo(liftThread.getStatus().getLiftNo()); |
| | | liftAssignCommand.setTaskNo(motion.getTaskNo()); |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.addAll(lockCommand); |
| | | liftAssignCommand.setCommands(list); |
| | | |
| | | liftAction.assignWork(liftThread.getDevice(), liftAssignCommand); |
| | | return false;//等待下一次轮询 |
| | | } |
| | | |
| | | //判断小车是否已离开 |
| | | if (!liftProtocol.getHasCar()) { |
| | | List<LiftCommand> signalCommand = liftThread.getShuttleSignalCommand(motion.getTaskNo(), false);//获取小车已驾离命令 |
| | | if(signalCommand != null) { |
| | | boolean hasKey = redisUtil.hasKey(DeviceRedisConstant.COMMAND_TMP + motion.getTaskNo()); |
| | | if (!hasKey) { |
| | | redisUtil.set(DeviceRedisConstant.COMMAND_TMP + motion.getTaskNo(), JSON.toJSONString(signalCommand), 120); |
| | | LiftAssignCommand liftAssignCommand = new LiftAssignCommand(); |
| | | liftAssignCommand.setLiftNo(liftThread.getStatus().getLiftNo()); |
| | | liftAssignCommand.setTaskNo(motion.getTaskNo()); |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.addAll(signalCommand); |
| | | liftAssignCommand.setCommands(list); |
| | | liftAction.assignWork(liftThread.getDevice(), liftAssignCommand); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //判断提升机工作号是否和当前任务相同 |
| | | if (liftProtocol.getTaskNo().intValue() != motion.getTaskNo()) { |
| | | return false; |
| | | } |
| | | |
| | | if (liftProtocol.getTaskNo() != 0) { |
| | | //清空提升机号 |
| | | liftThread.setSyncTaskNo(0); |
| | | //判断小车是否已离开 |
| | | if (liftProtocol.getHasCar()) { |
| | | return false; |
| | | } |
| | | |
| | | // //判断提升机工作号是否和当前任务相同 |
| | | // if (liftProtocol.getTaskNo().intValue() != motion.getTaskNo()) { |
| | | // return false; |
| | | // } |
| | | break; |
| | | case SHUTTLE_TRANSPORT_FROM_LIFT: |
| | | case SHUTTLE_TRANSPORT_TO_LIFT: |
| | |
| | | return false; |
| | | } |
| | | })) { |
| | | //解锁提升机 |
| | | List<LiftCommand> lockCommand = liftThread.getLockCommand(motion.getTaskNo(), false);//获取提升机解锁命令 |
| | | |
| | | LiftAssignCommand liftAssignCommand = new LiftAssignCommand(); |
| | | liftAssignCommand.setLiftNo(liftThread.getStatus().getLiftNo()); |
| | | liftAssignCommand.setTaskNo(motion.getTaskNo()); |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.addAll(lockCommand); |
| | | liftAssignCommand.setCommands(list); |
| | | |
| | | liftAction.assignWork(liftThread.getDevice(), liftAssignCommand); |
| | | return false;//等待下一次轮询 |
| | | return false; |
| | | } |
| | | |
| | | //判断提升机工作号是否和当前任务相同 |
| | | if (liftProtocol.getTaskNo().intValue() != motion.getTaskNo()) { |
| | | return false; |
| | | } |
| | | |
| | | if (liftProtocol.getTaskNo() != 0) { |
| | | //清空提升机号 |
| | | liftThread.setSyncTaskNo(0); |
| | | } |
| | | break; |
| | | case SHUTTLE_UPDATE_LOCATION://小车坐标更新 |
| | |
| | | LIFT_MISSION_COMPLETE(LIFT), |
| | | LIFT_LOCK(LIFT), |
| | | LIFT_UNLOCK(LIFT), |
| | | LIFT_SHUTTLE_ARRIVAL(LIFT), |
| | | LIFT_SHUTTLE_LEAVE(LIFT), |
| | | |
| | | // 穿梭车 -------------------------------------------- |
| | | SHUTTLE_MOVE(SHUTTLE), |
New file |
| | |
| | | package com.zy.asrs.wcs.rcs.model.dto; |
| | | |
| | | import com.zy.asrs.wcs.rcs.model.enums.WorkModeType; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class WorkModeTypeDto { |
| | | |
| | | private Integer siteId; |
| | | |
| | | private WorkModeType workModeType; |
| | | |
| | | private String address; |
| | | |
| | | public WorkModeTypeDto(Integer siteId, WorkModeType workModeType, String address) { |
| | | this.siteId = siteId; |
| | | this.workModeType = workModeType; |
| | | this.address = address; |
| | | } |
| | | } |
New file |
| | |
| | | package com.zy.asrs.wcs.rcs.model.enums; |
| | | |
| | | /** |
| | | * 入出库模式枚举 |
| | | */ |
| | | public enum WorkModeType { |
| | | |
| | | NONE((short) 0, "未知"), |
| | | PAKIN_MODE((short) 1, "入库模式"), |
| | | PAKOUT_MODE((short) 2, "出库模式"), |
| | | ; |
| | | |
| | | public Short id; |
| | | public String desc; |
| | | |
| | | WorkModeType(Short id, String desc) { |
| | | this.id = id; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | public static WorkModeType get(Short id) { |
| | | for (WorkModeType type : WorkModeType.values()) { |
| | | if (id.equals(type.id)) { |
| | | return type; |
| | | } |
| | | } |
| | | return WorkModeType.NONE; |
| | | } |
| | | |
| | | } |
| | |
| | | // 扫码失败 |
| | | private boolean barcodeErr; |
| | | |
| | | // 工作模式 |
| | | private Integer workMode; |
| | | |
| | | @Override |
| | | public StaProtocol clone() { |
| | | try { |
| | |
| | | station.setLoading(loading?"Y":"N"); |
| | | station.setInEnable(inEnable?"Y":"N"); |
| | | station.setOutEnable(outEnable?"Y":"N"); |
| | | station.setWorkMode(workMode); |
| | | station.setLocType1(0); // 高低类型{0:未知,1:低库位,2:高库位} |
| | | station.setLocType2(0); // 宽窄类型{0:未知,1:窄库位,2:宽库位} |
| | | station.setLocType3(0); // 轻重类型{0:未知,1:轻库位,2:重库位} |
| | |
| | | |
| | | void setPakMk(Integer siteId, boolean pakMk); |
| | | |
| | | boolean switchWorkMode(int siteId, int workMode); |
| | | |
| | | } |
| | |
| | | import com.zy.asrs.wcs.rcs.News; |
| | | import com.zy.asrs.wcs.rcs.cache.OutputQueue; |
| | | import com.zy.asrs.wcs.rcs.entity.Device; |
| | | import com.zy.asrs.wcs.rcs.model.dto.WorkModeTypeDto; |
| | | import com.zy.asrs.wcs.rcs.model.enums.WorkModeType; |
| | | import com.zy.asrs.wcs.rcs.model.protocol.StaProtocol; |
| | | import com.zy.asrs.wcs.rcs.thread.DevpThread; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | */ |
| | | private int barcodeSize = 2; |
| | | |
| | | /** |
| | | * 入出库模式 |
| | | * 0:未知 |
| | | * 1:入库启动中 |
| | | * 2.入库模式 |
| | | * 3.出库启动中 (不能生成入库工作档) |
| | | * 4.出库模式 |
| | | */ |
| | | private Map<Integer, WorkModeTypeDto> workModeTypes = new ConcurrentHashMap<>(); |
| | | |
| | | public SiemensDevpThread(Device device, RedisUtil redisUtil) { |
| | | this.device = device; |
| | | this.redisUtil = redisUtil; |
| | | |
| | | workModeTypes.put(101, new WorkModeTypeDto(101, WorkModeType.NONE, "DB1001.120")); |
| | | } |
| | | |
| | | private ArrayList<BasConveyorSta> getStaNo() { |
| | |
| | | staProtocol.setPakMk(pakMk); |
| | | } |
| | | } |
| | | |
| | | private void updateWorkMode() { |
| | | for (Map.Entry<Integer, WorkModeTypeDto> entry : workModeTypes.entrySet()) { |
| | | WorkModeTypeDto workModeTypeDto = entry.getValue(); |
| | | WorkModeType workModeType = workModeTypeDto.getWorkModeType(); |
| | | if (workModeType != WorkModeType.NONE) { |
| | | if (!siemensS7Net.Write(workModeTypeDto.getAddress(), workModeType.id).IsSuccess) { |
| | | OutputQueue.DEVP.offer(MessageFormat.format("写入输送线{1}入出库模式失败。输送线编号={0}", device.getId(), workModeTypeDto.getSiteId())); |
| | | log.error("写入输送线{1}入出库模式失败。输送线编号={0}", device.getId(), workModeTypeDto.getSiteId()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public boolean switchWorkMode(int siteId, int workMode) { |
| | | WorkModeTypeDto workModeTypeDto = workModeTypes.get(siteId); |
| | | if(workModeTypeDto == null) { |
| | | return false; |
| | | } |
| | | |
| | | workModeTypeDto.setWorkModeType(WorkModeType.get((short) workMode)); |
| | | workModeTypes.put(siteId, workModeTypeDto); |
| | | return false; |
| | | } |
| | | } |
| | |
| | | import com.zy.asrs.wcs.rcs.News; |
| | | import com.zy.asrs.wcs.rcs.cache.OutputQueue; |
| | | import com.zy.asrs.wcs.rcs.entity.Device; |
| | | import com.zy.asrs.wcs.rcs.model.dto.WorkModeTypeDto; |
| | | import com.zy.asrs.wcs.rcs.model.enums.WorkModeType; |
| | | import com.zy.asrs.wcs.rcs.model.protocol.StaProtocol; |
| | | import com.zy.asrs.wcs.rcs.thread.DevpThread; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | */ |
| | | private int barcodeSize = 2; |
| | | |
| | | /** |
| | | * 入出库模式 |
| | | * 0:未知 |
| | | * 1:入库启动中 |
| | | * 2.入库模式 |
| | | * 3.出库启动中 (不能生成入库工作档) |
| | | * 4.出库模式 |
| | | */ |
| | | private Map<Integer, WorkModeTypeDto> workModeTypes = new ConcurrentHashMap<>(); |
| | | |
| | | public SuopaiSiemensDevpThread(Device device, RedisUtil redisUtil) { |
| | | this.device = device; |
| | | this.redisUtil = redisUtil; |
| | | |
| | | workModeTypes.put(101, new WorkModeTypeDto(101, WorkModeType.NONE, "DB1001.120")); |
| | | } |
| | | |
| | | private ArrayList<BasConveyorSta> getStaNo() { |
| | |
| | | } |
| | | |
| | | private void read() throws InterruptedException { |
| | | updateWorkMode(); |
| | | ArrayList<BasConveyorSta> staNos = getStaNo(); |
| | | int staNoSize = staNos.size(); |
| | | OperateResultExOne<byte[]> result = siemensS7Net.Read("DB1000.100", (short) (staNoSize * 40)); |
| | |
| | | staProtocol.setLoading(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 32) == 1); // 有物 |
| | | staProtocol.setInEnable(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 14) == 1); // 可入 |
| | | staProtocol.setOutEnable(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 14) == 2);// 可出 |
| | | staProtocol.setWorkMode((int) siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 8));// 工作模式 |
| | | // staProtocol.setEmptyMk(status[4]); // 空板信号 |
| | | // staProtocol.setFullPlt(status[5]); // 满托盘 |
| | | // staProtocol.setHigh(status[6]); // 高库位 |
| | |
| | | staProtocol.setPakMk(pakMk); |
| | | } |
| | | } |
| | | |
| | | private void updateWorkMode() { |
| | | for (Map.Entry<Integer, WorkModeTypeDto> entry : workModeTypes.entrySet()) { |
| | | WorkModeTypeDto workModeTypeDto = entry.getValue(); |
| | | WorkModeType workModeType = workModeTypeDto.getWorkModeType(); |
| | | if (workModeType != WorkModeType.NONE) { |
| | | if (!siemensS7Net.Write(workModeTypeDto.getAddress(), workModeType.id).IsSuccess) { |
| | | OutputQueue.DEVP.offer(MessageFormat.format("写入输送线{1}入出库模式失败。输送线编号={0}", device.getId(), workModeTypeDto.getSiteId())); |
| | | log.error("写入输送线{1}入出库模式失败。输送线编号={0}", device.getId(), workModeTypeDto.getSiteId()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public boolean switchWorkMode(int siteId, int workMode) { |
| | | WorkModeTypeDto workModeTypeDto = workModeTypes.get(siteId); |
| | | if(workModeTypeDto == null) { |
| | | return false; |
| | | } |
| | | |
| | | workModeTypeDto.setWorkModeType(WorkModeType.get((short) workMode)); |
| | | workModeTypes.put(siteId, workModeTypeDto); |
| | | return true; |
| | | } |
| | | } |
| | |
| | | liftProtocol.setErrorCode("0"); |
| | | //层 |
| | | liftProtocol.setLev(data.getInteger("curFloor")); |
| | | //已完成的任务号 |
| | | liftProtocol.setCompleteTaskNo(data.getString("completeTaskNo")); |
| | | |
| | | |
| | | //************补充扩展字段************* |
| | |
| | | switch (Objects.requireNonNull(MotionCtgType.get(String.valueOf(flag)))){ |
| | | case SHUTTLE_MOVE_FROM_LIFT://穿梭车出提升机 |
| | | case SHUTTLE_MOVE_TO_LIFT://穿梭车进提升机 |
| | | case LIFT_SHUTTLE_ARRIVAL://提升机解锁 |
| | | return isIdleShuttleMoveToLift(); |
| | | case LIFT_LOCK://提升机锁定 |
| | | case LIFT_UNLOCK://提升机解锁 |
| | | return isIdleLiftLock(); |
| | | } |
| | | |
| | | return false; |
| | |
| | | return false; |
| | | } |
| | | |
| | | //提升机锁定-提升机状态判断 |
| | | private boolean isIdleLiftLock() { |
| | | // 判断提升机是否自动、就绪、空闲 |
| | | if (this.liftProtocol.getModel() |
| | | && !this.liftProtocol.getRun() |
| | | && this.liftProtocol.getPakMk() |
| | | && this.liftProtocol.getErrorCode().equals("0") |
| | | && (this.liftProtocol.getProtocolStatusType().equals(LiftProtocolStatusType.IDLE) |
| | | || this.liftProtocol.getProtocolStatusType().equals(LiftProtocolStatusType.WAITING)) |
| | | ) { |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public boolean isDeviceIdle() { |
| | | return isDeviceIdle(null); |