This commit is contained in:
xuzhiheng 2025-07-03 13:50:22 +08:00
parent f2241efc68
commit c07ca22d29
5 changed files with 74 additions and 22 deletions

View File

@ -27,6 +27,7 @@ import org.opentcs.communication.http.service.ExecuteAction;
import org.opentcs.communication.http.service.ExecuteMove; import org.opentcs.communication.http.service.ExecuteMove;
import org.opentcs.communication.http.service.ExecuteOperation; import org.opentcs.communication.http.service.ExecuteOperation;
import org.opentcs.components.kernel.Router; import org.opentcs.components.kernel.Router;
import org.opentcs.components.kernel.services.DispatcherService;
import org.opentcs.components.kernel.services.TCSObjectService; import org.opentcs.components.kernel.services.TCSObjectService;
import org.opentcs.components.kernel.services.TransportOrderService; import org.opentcs.components.kernel.services.TransportOrderService;
import org.opentcs.components.kernel.services.VehicleService; import org.opentcs.components.kernel.services.VehicleService;
@ -41,6 +42,7 @@ import org.opentcs.data.model.TCSResourceReference;
import org.opentcs.data.model.Triple; import org.opentcs.data.model.Triple;
import org.opentcs.data.model.Vehicle; import org.opentcs.data.model.Vehicle;
import org.opentcs.data.order.DriveOrder; import org.opentcs.data.order.DriveOrder;
import org.opentcs.data.order.ReroutingType;
import org.opentcs.data.order.Route; import org.opentcs.data.order.Route;
import org.opentcs.data.order.Route.Step; import org.opentcs.data.order.Route.Step;
import org.opentcs.data.order.TransportOrder; import org.opentcs.data.order.TransportOrder;
@ -162,11 +164,14 @@ public class LoopbackCommunicationAdapter
private final Router router; private final Router router;
private final DispatcherService dispatcherService;
//标记是否开启自动回休息点true=开启false=关闭 //标记是否开启自动回休息点true=开启false=关闭
private final Boolean IS_AUTOMATIC_BREAKS = true; private final Boolean IS_AUTOMATIC_BREAKS = true;
//连接状态 //连接状态
private final Boolean CONNECT_STATUS = false; private final Boolean CONNECT_STATUS = true;
//AGV模式:待机 = 0手动 = 1半自动 = 2自动 = 3示教 = 4服务 = 5升级程序中的工作状态维修 = 6
private Integer AGV_MODEL;
/** /**
* Creates a new instance. * Creates a new instance.
@ -185,7 +190,8 @@ public class LoopbackCommunicationAdapter
TCSObjectService objectService, // 注入对象服务 TCSObjectService objectService, // 注入对象服务
VehicleService vehicleService, VehicleService vehicleService,
TransportOrderService transportOrderService, TransportOrderService transportOrderService,
Router router Router router,
DispatcherService dispatcherService
) { ) {
super( super(
new LoopbackVehicleModel(vehicle), new LoopbackVehicleModel(vehicle),
@ -199,6 +205,7 @@ public class LoopbackCommunicationAdapter
this.vehicleService = requireNonNull(vehicleService, "vehicleService"); this.vehicleService = requireNonNull(vehicleService, "vehicleService");
this.transportOrderService = requireNonNull(transportOrderService, "transportOrderService"); this.transportOrderService = requireNonNull(transportOrderService, "transportOrderService");
this.router = requireNonNull(router, "router"); this.router = requireNonNull(router, "router");
this.dispatcherService = requireNonNull(dispatcherService, "dispatcherService");
// 初始化充电策略管理器 // 初始化充电策略管理器
this.chargingStrategyManager = new ChargingStrategyManager(); this.chargingStrategyManager = new ChargingStrategyManager();
@ -571,7 +578,7 @@ public class LoopbackCommunicationAdapter
String currentPosition = getProcessModel().getPosition(); String currentPosition = getProcessModel().getPosition();
if (currentPosition != null && currentPosition.equals(CURRENT_POS)) { if (currentPosition != null && currentPosition.equals(CURRENT_POS)) {
LOG.info("车辆: {} ,实际位置: {} ,记录位置: {}", vehicle.getName(), currentPosition, CURRENT_POS); // LOG.info("车辆: {} ,实际位置: {} ,记录位置: {}", vehicle.getName(), currentPosition, CURRENT_POS);
getExecutor().schedule( getExecutor().schedule(
() -> movementExec(command), () -> movementExec(command),
500, 500,
@ -591,7 +598,7 @@ public class LoopbackCommunicationAdapter
private void finishCmd(MovementCommand command) { private void finishCmd(MovementCommand command) {
if (Objects.equals(getSentCommands().peek(), command)) { if (Objects.equals(getSentCommands().peek(), command)) {
LOG.info("车辆: {} ,订单: {} ,命令: {} 结束", vehicle.getName(), command.getTransportOrder().getName(), command); // LOG.info("车辆: {} ,订单: {} ,命令: {} 结束", vehicle.getName(), command.getTransportOrder().getName(), command);
//清理任务队列 //清理任务队列
getProcessModel().commandExecuted(requireNonNull(getSentCommands().poll())); getProcessModel().commandExecuted(requireNonNull(getSentCommands().poll()));
} else { } else {
@ -601,8 +608,9 @@ public class LoopbackCommunicationAdapter
private void nextCmd() { private void nextCmd() {
if (getSentCommands().isEmpty() && getUnsentCommands().isEmpty() || getProcessModel().isSingleStepModeEnabled()) { if (getSentCommands().isEmpty() && getUnsentCommands().isEmpty() || getProcessModel().isSingleStepModeEnabled()) {
LOG.info("Vehicle: {} ,order: {} is done", vehicle.getName(), ORDER_NAME); // LOG.info("Vehicle: {} ,order: {} is done", vehicle.getName(), ORDER_NAME);
isSimulationRunning = false; isSimulationRunning = false;
getProcessModel().setState(Vehicle.State.IDLE);
} else { } else {
LOG.info("Vehicle: {} ,order: {} exec next command: {}", vehicle.getName(), ORDER_NAME, getSentCommands().peek()); LOG.info("Vehicle: {} ,order: {} exec next command: {}", vehicle.getName(), ORDER_NAME, getSentCommands().peek());
((ExecutorService) getExecutor()).submit( ((ExecutorService) getExecutor()).submit(
@ -864,12 +872,23 @@ public class LoopbackCommunicationAdapter
//记录车辆最终状态 //记录车辆最终状态
Vehicle.State vehicleState; Vehicle.State vehicleState;
Integer oldModel = AGV_MODEL;
AGV_MODEL = params.getAgv_model();
switch (params.getAgv_model()) { switch (params.getAgv_model()) {
case 3 -> integrationLevel = Vehicle.IntegrationLevel.TO_BE_UTILIZED; case 3 -> integrationLevel = Vehicle.IntegrationLevel.TO_BE_UTILIZED;
case 6 -> integrationLevel = Vehicle.IntegrationLevel.TO_BE_IGNORED; case 6 -> integrationLevel = Vehicle.IntegrationLevel.TO_BE_IGNORED;
default -> integrationLevel = Vehicle.IntegrationLevel.TO_BE_RESPECTED; default -> integrationLevel = Vehicle.IntegrationLevel.TO_BE_RESPECTED;
} }
if (AGV_MODEL == 1) { //AGV状态切为手动执行控制器任务撤销
ExecuteOperation.cancelOrder(vehicle.getName());
}
if (oldModel != null && oldModel != 3 && AGV_MODEL == 3) {
//车辆原本模式不为自动切换为自动时需要重新路由
dispatcherService.reroute(vehicle.getReference(), ReroutingType.FORCED);
}
//更新车辆状态 //更新车辆状态
if (params.getCharge_status() == 1) { if (params.getCharge_status() == 1) {
vehicleState = Vehicle.State.CHARGING; vehicleState = Vehicle.State.CHARGING;
@ -946,10 +965,12 @@ public class LoopbackCommunicationAdapter
* @param agvActionStatus 车辆动作执行状态对象 * @param agvActionStatus 车辆动作执行状态对象
*/ */
private void handleActionStatus(AgvActionStatus agvActionStatus) { private void handleActionStatus(AgvActionStatus agvActionStatus) {
LOG.info("handleActionStatus: {}", agvActionStatus.getStatus());
if (agvActionStatus.getStatus()) { if (agvActionStatus.getStatus()) {
// System.out.println("handleActionStatus: ======"); // System.out.println("handleActionStatus: ======");
ACTION_STATUS = false; ACTION_STATUS = false;
} }
LOG.info("handleActionStatus ACTION_STATUS: {}", ACTION_STATUS);
} }
/** /**

View File

@ -113,7 +113,7 @@ public class ExecuteOperation extends BaseService{
String time = now.format(formatter); String time = now.format(formatter);
// RequestB2 b2 = buildCommand(operation, orderId, taskKey); // RequestB2 b2 = buildCommand(operation, orderId, taskKey);
BaseRequestTo baseRequestTo = new BaseRequestTo(2, "OPENTCS", "KC-CTRL", serialNum, time, data); BaseRequestTo baseRequestTo = new BaseRequestTo(3, "OPENTCS", "KC-CTRL", serialNum, time, data);
HttpClient httpClient = new HttpClient(); HttpClient httpClient = new HttpClient();
httpClient.sendCommand(url, baseRequestTo); httpClient.sendCommand(url, baseRequestTo);

View File

@ -296,6 +296,19 @@ public class V1RequestHandler
// return jsonBinder.toJson(""); // return jsonBinder.toJson("");
} }
// private Object handlePostAgvTaskWithdrawal(Request request, Response response)
// throws KernelRuntimeException {
//
// response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8);
//
// //可能会有动作阻塞所以需要初始化动作状态
// vehicleHandler.initActionStatus(request.params(":NAME"));
// //重新路由需要清理车辆映射订单ID
// ExecuteMove.resetOrder(request.params(":NAME"));
//
// return jsonBinder.toJson("");
// }
private Object handlePostDispatcherTrigger(Request request, Response response) private Object handlePostDispatcherTrigger(Request request, Response response)
throws KernelRuntimeException { throws KernelRuntimeException {
response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8); response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8);
@ -452,8 +465,7 @@ public class V1RequestHandler
private Object handlePostWithdrawalByVehicle(Request request, Response response) private Object handlePostWithdrawalByVehicle(Request request, Response response)
throws ObjectUnknownException { throws ObjectUnknownException {
//初始化动作执行状态
//初始化动作状态
vehicleHandler.initActionStatus(request.params(":NAME")); vehicleHandler.initActionStatus(request.params(":NAME"));
//根据车辆撤销任务 //根据车辆撤销任务
@ -463,7 +475,7 @@ public class V1RequestHandler
disableVehicle(request) disableVehicle(request)
); );
response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8); response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8);
return ""; return jsonBinder.toJson("");
} }
private Object handlePostPeripheralJobWithdrawal(Request request, Response response) private Object handlePostPeripheralJobWithdrawal(Request request, Response response)
@ -475,19 +487,13 @@ public class V1RequestHandler
private Object handlePostVehicleRerouteRequest(Request request, Response response) private Object handlePostVehicleRerouteRequest(Request request, Response response)
throws ObjectUnknownException { throws ObjectUnknownException {
//清理车辆映射订单ID //初始化动作执行状态
ExecuteMove.resetOrder(request.params(":NAME"));
//可能会有动作阻塞所以需要初始化动作状态
vehicleHandler.initActionStatus(request.params(":NAME")); vehicleHandler.initActionStatus(request.params(":NAME"));
//撤销订单 todo 订单撤销后可能会有延时继续运动所以应该考虑是否需要等待订单撤销成功
// ExecuteOperation.cancelOrder(request.params(":NAME"));
//立即重新路由 //立即重新路由
orderDispatcherHandler.reroute(request.params(":NAME"), forced(request)); orderDispatcherHandler.reroute(request.params(":NAME"), forced(request));
response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8); response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8);
return ""; return jsonBinder.toJson("");
} }
private Object handleGetTransportOrders(Request request, Response response) { private Object handleGetTransportOrders(Request request, Response response) {

View File

@ -15,6 +15,7 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.opentcs.communication.http.service.ExecuteOperation;
import org.opentcs.components.kernel.services.RouterService; import org.opentcs.components.kernel.services.RouterService;
import org.opentcs.components.kernel.services.VehicleService; import org.opentcs.components.kernel.services.VehicleService;
import org.opentcs.data.ObjectUnknownException; import org.opentcs.data.ObjectUnknownException;
@ -109,14 +110,37 @@ public class VehicleHandler {
AgvInfo agvInfo = AdapterManage.setAdapterVehicleModel(name, jsonStr); AgvInfo agvInfo = AdapterManage.setAdapterVehicleModel(name, jsonStr);
vehicleService.sendCommAdapterMessage(vehicle.getReference(), agvInfo); vehicleService.sendCommAdapterMessage(vehicle.getReference(), agvInfo);
} else if (type == 5) { //上报动作完成 } else if (type == 5) { //上报动作完成
//动作完成上报 //动作完成初始化动作状态
initActionStatus(name); initActionStatus(name);
// AgvActionStatus agvActionStatus = new AgvActionStatus(); } else if (type == 6) { //撤销任务
// agvActionStatus.setStatus(true); //可能会卡动作先初始化动作
// vehicleService.sendCommAdapterMessage(vehicle.getReference(), agvActionStatus); initActionStatus(name);
//撤销agv控制器中的运动订单
ExecuteOperation.cancelOrder(name);
} }
} }
// /**
// * 撤销已下发的AGV任务
// */
// public void postAgvTaskWithdrawal(Object data) {
// String jsonStr;
// try {
// jsonStr = data.toString().split("=", 2)[1];
// } catch (Exception e) {
// jsonStr = data.toString();
// }
// JSONObject jsonObject = JSON.parseObject(jsonStr);
// String name = jsonObject.getString("vehicle_name");
// Integer type = jsonObject.getInteger("type");
//
// //可能会卡动作先初始化动作
// initActionStatus(name);
//
// //撤销agv控制器中的运动订单
// ExecuteOperation.cancelOrder(name);
// }
/** /**
* 初始化动作完成状态 * 初始化动作完成状态
* @param name 车辆名称 * @param name 车辆名称

View File

@ -358,6 +358,7 @@ public class TransportOrderUtil
//撤销订单,获取订单状态 //撤销订单,获取订单状态
TransportOrder.State state = order.getState(); TransportOrder.State state = order.getState();
LOG.info("车辆: {}: 正在中止订单: {} 订单状态: {}...", vehicle.getName(), order.getName(), order.getState());
if (state == TransportOrder.State.BEING_PROCESSED) { if (state == TransportOrder.State.BEING_PROCESSED) {
//订单执行中需要撤销下发给控制器的任务 //订单执行中需要撤销下发给控制器的任务
ExecuteOperation.cancelOrder(vehicle.getName()); ExecuteOperation.cancelOrder(vehicle.getName());