package com.zy.asrs.wcs.core.kernel.command;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.zy.asrs.wcs.core.action.LiftAction;
|
import com.zy.asrs.wcs.core.entity.Motion;
|
import com.zy.asrs.wcs.core.model.command.LiftAssignCommand;
|
import com.zy.asrs.wcs.core.model.command.LiftCommand;
|
import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
|
import com.zy.asrs.wcs.core.model.enums.MotionCtgType;
|
import com.zy.asrs.wcs.core.model.enums.MotionStsType;
|
import com.zy.asrs.wcs.core.service.MotionService;
|
import com.zy.asrs.wcs.core.service.TaskService;
|
import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
|
import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
|
import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol;
|
import com.zy.asrs.wcs.rcs.thread.LiftThread;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.util.ArrayList;
|
import java.util.Objects;
|
|
/**
|
* Created by vincent on 2023/10/23
|
*/
|
@Slf4j
|
@Service
|
public class LiftCommandService {
|
|
@Autowired
|
private MotionService motionService;
|
@Autowired
|
private TaskService taskService;
|
@Autowired
|
private LiftAction liftAction;
|
|
public Boolean accept(Motion motion) {
|
Integer deviceNo = Integer.parseInt(motion.getDevice());
|
LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, deviceNo);
|
if (liftThread == null) {
|
return false;
|
}
|
|
LiftProtocol liftProtocol = liftThread.getStatus();
|
if (liftProtocol == null) {
|
return false;
|
}
|
|
//判断提升机是否自动
|
if (!liftThread.isIdle()) {
|
return false;
|
}
|
|
if (motionService.count(new LambdaQueryWrapper<Motion>()
|
.eq(Motion::getDeviceCtg, DeviceCtgType.LIFT.val())
|
.eq(Motion::getDevice, motion.getDevice())
|
.eq(Motion::getMotionSts, MotionStsType.EXECUTING.val())) > 0) {
|
return false;
|
}
|
|
ArrayList<LiftCommand> list = new ArrayList<>();
|
LiftAssignCommand assignCommand = new LiftAssignCommand();
|
assignCommand.setLiftNo(liftProtocol.getLiftNo());
|
assignCommand.setTaskNo(motion.getTaskNo());
|
assignCommand.setCommands(list);
|
|
LiftCommand command = new LiftCommand();
|
switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){
|
case LIFT_MOVE:
|
// 如果已经在目标层,那边层过滤
|
if (liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) {
|
liftThread.setSyncTaskNo(motion.getTaskNo());
|
break;
|
}
|
|
command = liftThread.getMoveCommand(motion.getTaskNo(), 0, Integer.parseInt(motion.getTarget()), null);
|
list.add(command);
|
return liftAction.assignWork(liftThread.getDevice(), assignCommand);
|
case LIFT_WITH_GOODS:
|
return false;
|
// if (!liftProtocol.getLineFrontHasStock() || !liftProtocol.getLineEndHasStock()) {
|
// return false;
|
// }
|
//
|
// command = liftThread.getLiftUpDownCommand(Integer.parseInt(motion.getTarget()));
|
// command.setLiftNo(deviceNo.shortValue());
|
// command.setTaskNo(motion.getWrkNo().shortValue());
|
// return liftThread.assignWork(command);
|
case LIFT_WITH_SHUTTLE:
|
if (!liftProtocol.getHasCar()) {
|
return false;
|
}
|
|
command = liftThread.getMoveWithShuttleCommand(motion.getTaskNo(), Integer.parseInt(motion.getOrigin()), Integer.parseInt(motion.getTarget()), null);
|
list.add(command);
|
return liftAction.assignWork(liftThread.getDevice(), assignCommand);
|
case LIFT_WITH_GOODS_AND_SHUTTLE:
|
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;
|
// // 判断输送线状态
|
// int staNo = Integer.parseInt(motion.getTarget());
|
// WorkZoneType zoneType = WorkZoneType.query(staNo);
|
//
|
// SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, zoneType.devpPlcId);
|
//
|
// StaProtocol staProtocol = devpThread.getStation().get(staNo);
|
// if (staProtocol == null) {
|
// return false;
|
// }
|
//
|
// if (!staProtocol.isAutoing()
|
// || staProtocol.isLoading()
|
//// || !staProtocol.isOutEnable()
|
// || staProtocol.getWorkNo() != 0) {
|
// return false;
|
// }
|
//
|
// // 判断提升机状态
|
// if (!liftProtocol.getLev().equals(Short.parseShort(motion.getOrigin()))) { // 是否处于任务层
|
// return false;
|
// }
|
//
|
// // 下发命令 ---------------------------------------------------
|
//
|
// // 1.驱动输送线电机
|
// StaMotorType staMotorType = null;
|
// StaMotorType reqStaMotorType = null;
|
// LiftInteractiveModeType liftInteractiveModeType = null;
|
// LiftNeighborType neighborType = LiftNeighborType.query(staNo);
|
// StaProtocol staProtocol1 = staProtocol.clone();
|
// staProtocol1.setWorkNo(motion.getWrkNo().shortValue());
|
// staProtocol1.setStaNo(neighborType.finalStaNo.shortValue());
|
// switch (neighborType) {
|
// case LIFT_2_NEIGHBOR_OUTBOUND_LEV_1:
|
// staMotorType = StaMotorType.FORWARD;
|
// reqStaMotorType = StaMotorType.REQ_FORWARD;
|
// liftInteractiveModeType = LiftInteractiveModeType.ENGINE_LOADING_TURN_REVERSE;
|
// break;
|
// case LIFT_1_NEIGHBOR_INBOUND_LEV_2:
|
// case LIFT_1_NEIGHBOR_INBOUND_LEV_3:
|
// case LIFT_1_NEIGHBOR_INBOUND_LEV_4:
|
// staMotorType = StaMotorType.FORWARD;
|
// reqStaMotorType = StaMotorType.REQ_FORWARD;
|
// liftInteractiveModeType = LiftInteractiveModeType.ENGINE_LOADING_TURN_REVERSE;
|
// break;
|
// case LIFT_1_NEIGHBOR_OUTBOUND_LEV_1_FINAL_8:
|
// staMotorType = StaMotorType.FORWARD;
|
// reqStaMotorType = StaMotorType.REQ_FORWARD;
|
// liftInteractiveModeType = LiftInteractiveModeType.ENGINE_LOADING_TURN_REVERSE;
|
// break;
|
// default:
|
// break;
|
// }
|
//
|
// MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol1));
|
// try {
|
// Thread.sleep(1000);
|
// } catch (InterruptedException ignore) {}
|
//// int times = 0;boolean staProtocolMotorRes = false;
|
//// while (times < 5) {
|
//// if (staProtocol.getStaMotorType().equals(staMotorType)) {
|
//// staProtocolMotorRes = true;
|
//// break;
|
//// }
|
//// if (!devpThread.controlMotor(staNo, reqStaMotorType)) {
|
//// continue;
|
//// }
|
//// try {
|
//// Thread.sleep(500);
|
//// } catch (InterruptedException ignore) {}
|
//// times++;
|
//// }
|
//// if (!staProtocolMotorRes) {
|
//// return false;
|
//// }
|
//
|
// // 2.驱动提升机电机
|
// command = liftThread.getLiftTurnCommand(liftInteractiveModeType.id);
|
// command.setLiftNo(deviceNo.shortValue());
|
// command.setTaskNo(motion.getWrkNo().shortValue());
|
// return liftThread.assignWork(command);
|
default:
|
break;
|
|
}
|
|
return Boolean.TRUE;
|
}
|
|
public Boolean finish(Motion motion) {
|
Integer deviceNo = Integer.parseInt(motion.getDevice());
|
LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, deviceNo);
|
if (liftThread == null) {
|
return false;
|
}
|
LiftProtocol liftProtocol = liftThread.getStatus();
|
if (liftProtocol == null) {
|
return false;
|
}
|
|
if (liftProtocol.getRun() || liftProtocol.getTaskNo() != motion.getTaskNo().shortValue()) {
|
return false;
|
}
|
|
switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){
|
case LIFT_MOVE:
|
// 判断提升机是否空闲
|
if (!liftThread.isIdle()) {
|
return false;
|
}
|
|
if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) {
|
return false;
|
}
|
break;
|
case LIFT_WITH_GOODS:
|
// 判断提升机是否空闲
|
if (!liftThread.isIdle()) {
|
return false;
|
}
|
|
// if (!liftProtocol.getLineFrontHasStock() || !liftProtocol.getLineEndHasStock()) {
|
// return false;
|
// }
|
|
if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) {
|
return false;
|
}
|
|
break;
|
case LIFT_WITH_SHUTTLE:
|
// 判断提升机是否空闲
|
if (!liftThread.isIdle()) {
|
return false;
|
}
|
|
if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) {
|
return false;
|
}
|
|
//检测是否有小车
|
if (!liftProtocol.getHasCar()) {
|
return false;
|
}
|
break;
|
case LIFT_WITH_GOODS_AND_SHUTTLE:
|
// 判断提升机是否空闲
|
if (!liftThread.isIdle()) {
|
return false;
|
}
|
|
if (!liftProtocol.getHasCar()) {
|
return false;
|
}
|
|
if (!liftProtocol.getLev().equals(Integer.valueOf(motion.getTarget()))) {
|
return false;
|
}
|
|
break;
|
case LIFT_TRANSPORT_TO_CONVEYOR:
|
// // 判断提升机是否自动、空闲、准备就绪、前光电无货、链条没有转动
|
// if (!liftProtocol.getModel()
|
// || liftProtocol.getRun()
|
// || !liftProtocol.getReady()
|
// || liftProtocol.getLineFxrontHasStock()
|
// || liftProtocol.getLineEndHasStock()
|
// || liftProtocol.getForwardRotationFeedback()
|
// || liftProtocol.getReverseFeedback()
|
// ) {
|
// return false;
|
// }
|
//
|
// if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) {
|
// return false;
|
// }
|
//
|
// // 判断输送线状态
|
// int staNo = Integer.parseInt(motion.getTarget());
|
// WorkZoneType zoneType = WorkZoneType.query(staNo);
|
//
|
// SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, zoneType.devpPlcId);
|
//
|
// StaProtocol staProtocol = devpThread.getStation().get(staNo);
|
// if (staProtocol == null) {
|
// return false;
|
// }
|
//
|
// if (!staProtocol.getStaMotorType().equals(StaMotorType.STANDBY)) {
|
// return false;
|
// }
|
//
|
//// // 判断输送线状态
|
//// int staNo = Integer.parseInt(motion.getTarget());
|
//// WorkZoneType zoneType = WorkZoneType.query(staNo);
|
////
|
//// SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, zoneType.devpPlcId);
|
////
|
//// StaProtocol staProtocol = devpThread.getStation().get(staNo);
|
//// if (staProtocol == null) {
|
//// return false;
|
//// }
|
////
|
//// if (!staProtocol.isAutoing() || !staProtocol.isLoading() || staProtocol.getWorkNo() != motion.getWrkNo().intValue()) {
|
//// return false;
|
//// }
|
//
|
//// if (!staProtocol.getStaMotorType().equals(StaMotorType.STANDBY)) {
|
//// return false;
|
//// }
|
//
|
//// // 将任务号先保存到输送线站点上,目标站为0
|
//// StaProtocol clone = staProtocol.clone();
|
//// clone.setWorkNo(motion.getWrkNo().shortValue());
|
//// clone.setStaNo((short) 0);
|
//// if (!MessageQueue.offer(SlaveType.Devp, zoneType.devpPlcId, new Task(2, clone))) {
|
//// return false;
|
//// }
|
////
|
//// // 停止提升机电机转动,并复位
|
//// command = liftThread.getLiftTurnCommand(LiftInteractiveModeType.ENGINE_STOP.id);
|
//// command.setLiftNo(deviceNo.shortValue());
|
//// command.setTaskNo(motion.getWrkNo().shortValue());
|
//// return liftThread.assignWork(command);
|
|
break;
|
default:
|
return false;
|
}
|
|
liftThread.setSyncTaskNo(0);//清零工作号
|
return true;
|
}
|
|
|
}
|