| | |
| | | import com.zy.asrs.wcs.core.entity.BasLift; |
| | | import com.zy.asrs.wcs.core.model.command.LiftCommand; |
| | | import com.zy.asrs.wcs.core.model.enums.LiftCommandModeType; |
| | | import com.zy.asrs.wcs.core.model.enums.MotionCtgType; |
| | | import com.zy.asrs.wcs.core.service.BasLiftService; |
| | | import com.zy.asrs.wcs.rcs.News; |
| | | import com.zy.asrs.wcs.rcs.cache.OutputQueue; |
| | |
| | | |
| | | import java.text.MessageFormat; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.*; |
| | | |
| | | @Slf4j |
| | | @SuppressWarnings("all") |
| | | public class SurayLiftThread implements LiftThread { |
| | | |
| | | private static final String API_URL = "http://127.0.0.1:8082"; |
| | | private static String API_URL = "http://127.0.0.1:8082"; |
| | | |
| | | private Device device; |
| | | private RedisUtil redisUtil; |
| | |
| | | public SurayLiftThread(Device device,RedisUtil redisUtil) { |
| | | this.device = device; |
| | | this.redisUtil = redisUtil; |
| | | API_URL = "http://" + device.getIp() + ":" + device.getPort(); |
| | | } |
| | | |
| | | @Override |
| | |
| | | try { |
| | | readStatus(); |
| | | |
| | | //提升机处于运行状态,将标记置为false |
| | | //提升机处于运行状态,将标记置为true |
| | | if (liftProtocol.getRun()) { |
| | | liftProtocol.setPakMk(false); |
| | | liftProtocol.setPakMk(true); |
| | | } |
| | | } catch (Exception e) { |
| | | OutputQueue.LIFT.offer(MessageFormat.format("【{0}】读取提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort())); |
| | |
| | | //----------读取提升机状态----------- |
| | | //模式 |
| | | liftProtocol.setModel(true); |
| | | |
| | | boolean runningState = data.getInteger("runningState") == 1; |
| | | if (!data.getInteger("completeTaskNo").equals(data.getInteger("taskNo"))) { |
| | | runningState = true;//工作号不一致,认为处于运行中 |
| | | } |
| | | //运行状态 |
| | | liftProtocol.setRun(data.getInteger("runningState") == 1); |
| | | liftProtocol.setRun(runningState); |
| | | //就绪状态 |
| | | liftProtocol.setReady(data.getInteger("readyState") == 1); |
| | | //有托盘 |
| | | liftProtocol.setHasTray(data.getString("haveCargo").equals("Y")); |
| | | //有小车 |
| | | liftProtocol.setHasCar(data.getString("haveCar").equals("Y")); |
| | | liftProtocol.setHasCar(data.getInteger("haveCar") == 1); |
| | | //故障码 |
| | | liftProtocol.setErrorCode("0"); |
| | | //层 |
| | | liftProtocol.setLev(data.getInteger("curFloor")); |
| | | //已完成的任务号 |
| | | liftProtocol.setCompleteTaskNo(data.getString("completeTaskNo")); |
| | | |
| | | |
| | | //************补充扩展字段************* |
| | |
| | | |
| | | @Override |
| | | public synchronized boolean reset(LiftCommand command) { |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public boolean isIdle() { |
| | | return isIdle(null); |
| | | } |
| | | |
| | | @Override |
| | | public boolean isIdle(ExecuteSupport support) { |
| | | if (null != support) { |
| | | if (!support.judgement()) { |
| | | return false; |
| | | } |
| | | } |
| | | InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend();//获取扩展字段 |
| | | // 判断提升机是否自动、就绪、空闲、未锁定 |
| | | if (this.liftProtocol.getModel() |
| | | && !this.liftProtocol.getRun() |
| | | && this.liftProtocol.getReady() |
| | | // && this.liftProtocol.getPakMk() |
| | | && this.liftProtocol.getErrorCode().equals("0") |
| | | && this.liftProtocol.getProtocolStatusType().equals(LiftProtocolStatusType.IDLE) |
| | | && !extend.getLock() |
| | | ) { |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public boolean setProtocolStatus(LiftProtocolStatusType status) { |
| | | this.liftProtocol.setProtocolStatus(status); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public boolean setSyncTaskNo(Integer taskNo) { |
| | | this.liftProtocol.setTaskNo(taskNo); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public boolean isLock(ExecuteSupport support) { |
| | | InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend(); |
| | | return extend.getLock(); |
| | | } |
| | | |
| | | @Override |
| | | public boolean commandFinished(Integer taskNo) { |
| | | try { |
| | | LiftCommand command = getTaskClearCommand(); |
| | | String loginToken = requestLoginToken(); |
| | | if (loginToken == null) { |
| | | return false; |
| | |
| | | e.printStackTrace(); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public boolean isIdle() { |
| | | return isIdle(null); |
| | | } |
| | | |
| | | @Override |
| | | public boolean isIdle(MotionCtgType flag) { |
| | | if (flag == null) { |
| | | InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend();//获取扩展字段 |
| | | // 判断提升机是否自动、就绪、空闲、未锁定 |
| | | if (this.liftProtocol.getModel() |
| | | && !this.liftProtocol.getRun() |
| | | && this.liftProtocol.getPakMk() |
| | | && this.liftProtocol.getReady() |
| | | && this.liftProtocol.getErrorCode().equals("0") |
| | | && (this.liftProtocol.getProtocolStatusType().equals(LiftProtocolStatusType.IDLE) |
| | | || this.liftProtocol.getProtocolStatusType().equals(LiftProtocolStatusType.WAITING)) |
| | | && !extend.getLock() |
| | | ) { |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | |
| | | //穿梭车进提升机时-提升机状态判断 |
| | | private boolean isIdleShuttleMoveToLift() { |
| | | InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend();//获取扩展字段 |
| | | // 判断提升机是否自动、就绪、空闲 |
| | | 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)) |
| | | ) { |
| | | if (!extend.getLock()) { |
| | | //提升机未锁定,需要判断是否就绪 |
| | | if (!this.liftProtocol.getReady()) { |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | 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); |
| | | } |
| | | |
| | | @Override |
| | | public boolean isDeviceIdle(ExecuteSupport support) { |
| | | if (null != support) { |
| | | Boolean judgement = support.judgement(); |
| | | if (judgement != null && !judgement) { |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | // 判断提升机是否自动、就绪、空闲 |
| | | if (this.liftProtocol.getModel() |
| | | && !this.liftProtocol.getRun() |
| | | && this.liftProtocol.getErrorCode().equals("0") |
| | | ) { |
| | | if (this.liftProtocol.getTaskNo() == 0) { |
| | | //无任务情况下检测是否就绪 |
| | | if (!this.liftProtocol.getReady()) { |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public boolean setProtocolStatus(LiftProtocolStatusType status) { |
| | | this.liftProtocol.setProtocolStatus(status); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public boolean setSyncTaskNo(Integer taskNo) { |
| | | this.liftProtocol.setTaskNo(taskNo); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public boolean isLock(ExecuteSupport support) { |
| | | InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend(); |
| | | return extend.getLock(); |
| | | } |
| | | |
| | | @Override |
| | | public int generateDeviceTaskNo(int taskNo, MotionCtgType motionCtgType) { |
| | | return taskNo; |
| | | } |
| | | |
| | | //***************设备层通讯-不同厂商设备通讯方案不一致*************** |
| | |
| | | |
| | | //空载移动 |
| | | @Override |
| | | public LiftCommand getMoveCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) { |
| | | public List<LiftCommand> getMoveCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) { |
| | | int taskMode = 3;//空载移动 |
| | | |
| | | HashMap<String, Object> body = new HashMap<>(); |
| | |
| | | command.setMode(LiftCommandModeType.MOVE.id); |
| | | command.setOriginLev(0); |
| | | command.setTargetLev(targetLev); |
| | | return command; |
| | | |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.add(command); |
| | | list.addAll(getTaskClearCommand()); |
| | | return list; |
| | | } |
| | | |
| | | //载车移动 |
| | | @Override |
| | | public LiftCommand getMoveWithShuttleCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) { |
| | | public List<LiftCommand> getMoveWithShuttleCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) { |
| | | HashMap<String, Object> body = new HashMap<>(); |
| | | body.put("messageName", "lifterTask"); |
| | | body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); |
| | |
| | | command.setMode(LiftCommandModeType.MOVE.id); |
| | | command.setOriginLev(sourceLev); |
| | | command.setTargetLev(targetLev); |
| | | return command; |
| | | |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.add(command); |
| | | list.addAll(getTaskClearCommand()); |
| | | return list; |
| | | } |
| | | |
| | | //托盘出入 |
| | | @Override |
| | | public LiftCommand getPalletInOutCommand(Integer taskNo, Integer sourceLev, Integer targetLev, Integer originSta, Integer targetSta, LiftCommandModeType mode) { |
| | | public List<LiftCommand> getPalletInOutCommand(Integer taskNo, Integer sourceLev, Integer targetLev, Integer originSta, Integer targetSta, LiftCommandModeType mode) { |
| | | HashMap<String, Object> body = new HashMap<>(); |
| | | body.put("messageName", "lifterTask"); |
| | | body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); |
| | |
| | | command.setTargetLev(targetLev); |
| | | command.setOriginSta(originSta); |
| | | command.setTargetSta(targetSta); |
| | | return command; |
| | | |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.add(command); |
| | | list.addAll(getTaskClearCommand()); |
| | | return list; |
| | | } |
| | | |
| | | //锁定/解锁提升机 |
| | | @Override |
| | | public LiftCommand getLockCommand(Integer taskNo, Boolean lock) { |
| | | public List<LiftCommand> getLockCommand(Integer taskNo, Boolean lock) { |
| | | HashMap<String, Object> body = new HashMap<>(); |
| | | body.put("messageName", "lifterOperation"); |
| | | body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); |
| | |
| | | command.setLiftNo(Integer.valueOf(this.device.getDeviceNo())); |
| | | command.setBody(JSON.toJSONString(body)); |
| | | command.setMode(lock ? LiftCommandModeType.LOCK.id : LiftCommandModeType.UNLOCK.id); |
| | | return command; |
| | | |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.add(command); |
| | | return list; |
| | | } |
| | | |
| | | //小车已到位/已驶离信号 |
| | | @Override |
| | | public LiftCommand getShuttleSignalCommand(Integer taskNo, Boolean signal) { |
| | | public List<LiftCommand> getShuttleSignalCommand(Integer taskNo, Boolean signal) { |
| | | HashMap<String, Object> body = new HashMap<>(); |
| | | body.put("messageName", "lifterOperation"); |
| | | body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); |
| | |
| | | command.setLiftNo(Integer.valueOf(this.device.getDeviceNo())); |
| | | command.setBody(JSON.toJSONString(body)); |
| | | command.setMode(signal ? LiftCommandModeType.LOCK.id : LiftCommandModeType.UNLOCK.id); |
| | | return command; |
| | | |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.add(command); |
| | | return list; |
| | | } |
| | | |
| | | //获取提升机任务清除命令 |
| | | private LiftCommand getTaskClearCommand() { |
| | | private List<LiftCommand> getTaskClearCommand() { |
| | | HashMap<String, Object> body = new HashMap<>(); |
| | | body.put("messageName", "lifterOperation"); |
| | | body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); |
| | |
| | | command.setLiftNo(Integer.valueOf(this.device.getDeviceNo())); |
| | | command.setBody(JSON.toJSONString(body)); |
| | | command.setMode(LiftCommandModeType.RESET.id); |
| | | return command; |
| | | |
| | | ArrayList<LiftCommand> list = new ArrayList<>(); |
| | | list.add(command); |
| | | return list; |
| | | } |
| | | |
| | | /** |