diff --git a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java index 4dde75c..69d6fc6 100644 --- a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java +++ b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java @@ -30,7 +30,6 @@ import org.opentcs.drivers.vehicle.SimVehicleCommAdapter; import org.opentcs.drivers.vehicle.VehicleCommAdapter; import org.opentcs.drivers.vehicle.VehicleProcessModel; import org.opentcs.drivers.vehicle.management.VehicleProcessModelTO; -import org.opentcs.manage.entity.ActionStatus; import org.opentcs.manage.entity.AgvInfo; import org.opentcs.manage.entity.AgvInfoParams; import org.opentcs.manage.entity.AgvStatus; @@ -285,9 +284,9 @@ public class LoopbackCommunicationAdapter if (message instanceof AgvInfo agvInfo) { //通讯适配器车辆模型更新 handleCallbacks(agvInfo.getParams()); - } else if (message instanceof ActionStatus actionStatus) { + } else if (message instanceof AgvStatus agvStatus) { //自动管理通讯适配器状态和适配器动作执行状态 - handleActionStatus(actionStatus); + handleActionStatus(agvStatus); } } @@ -805,8 +804,8 @@ public class LoopbackCommunicationAdapter return serialNum; } - private void handleActionStatus(ActionStatus actionStatus) { - if (actionStatus.getStatus()) { + private void handleActionStatus(AgvStatus agvStatus) { + if (agvStatus.getActionStatus()) { ACTION_STATUS = false; } } diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/enums/Actions.java b/opentcs-common/src/main/java/org/opentcs/communication/http/enums/Actions.java index 1f70535..4db98fc 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/enums/Actions.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/enums/Actions.java @@ -9,7 +9,11 @@ public enum Actions { //充电 CHARGE, //取消充电 - CANCEL_CHARGE + CANCEL_CHARGE, + //取货 + PICK_UP, + //放货 + RELEASE, ; /** diff --git a/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java b/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java index bc3783f..86344f4 100644 --- a/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java +++ b/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java @@ -51,6 +51,10 @@ public class AdapterManage { * 基于线程安全HASHMAP */ private static final ConcurrentHashMap adapterDataMap = new ConcurrentHashMap<>(); + /** + * 内核状态 + */ +// public static Boolean kernelStatus = false; //开启通讯信息 private static final String USER = GuestUserCredentials.USER; @@ -58,9 +62,6 @@ public class AdapterManage { private static final String IP = GuestUserCredentials.IP; private static final Integer PORT = GuestUserCredentials.PORT; - private int i = 1; - - //开启定时任务 public void START() { scheduler.scheduleWithFixedDelay(task, 5000, 500, TimeUnit.MILLISECONDS); @@ -72,88 +73,107 @@ public class AdapterManage { } Runnable task = () -> { -// kernel = new KernelCommunication(USER, PASSWORD, IP, PORT); -// autoManageAdapterStatus(); -// updateAdapterVehicleModel(); +// if (!kernelStatus) { +// return; +// } +// +// System.out.println("test-----start"); +// +// KernelServicePortal servicePortal = new KernelServicePortalBuilder(USER, PASSWORD).build(); +// servicePortal.login(IP, PORT); +// +// VehicleService vehicleService = servicePortal.getVehicleService(); +// Vehicle vehicle = vehicleService.fetchObject(Vehicle.class, "v2"); +// +// vehicleService.enableCommAdapter(vehicle.getReference()); +// +// servicePortal.logout(); +// +// System.out.println("test-----end"); + + kernel = new KernelCommunication(USER, PASSWORD, IP, PORT); + + autoManageAdapterStatus(); + updateAdapterVehicleModel(); kernel.logout(); -// System.out.println("end task"); }; /** * 自动管理通讯适配器 */ - private static boolean autoManageAdapterStatus(String name) { - Date date = new Date(); - long currentTime = date.getTime(); - - System.out.println("autoManageAdapterStatus: " + adapterStatusMap); - - AgvStatus oldData = adapterStatusMap.get(name); - - if (oldData == null) { - return false; - } - - AgvStatus agvStatus = new AgvStatus(); - agvStatus.setTime(oldData.getTime()); - - if (currentTime - oldData.getTime() > AUTO_CLOSE_TIME) { - System.out.println("adapterStatusMap first DISABLE"); - agvStatus.setStatus(AdapterStatus.DISABLE); - } else { - System.out.println("adapterStatusMap first ENABLE"); - agvStatus.setStatus(AdapterStatus.ENABLE); - } - - //更新记录数据 - adapterStatusMap.put(name, agvStatus); - - return agvStatus.getStatus(); - } -// private void autoManageAdapterStatus() { +// private static boolean autoManageAdapterStatus(String name) { // Date date = new Date(); // long currentTime = date.getTime(); // // System.out.println("autoManageAdapterStatus: " + adapterStatusMap); -// adapterStatusMap.forEach((key, value) -> { -// System.out.println("adapterStatusMap first"); -// Long time = value.getTime(); -// AgvStatus agvStatus = new AgvStatus(); -// agvStatus.setTime(value.getTime()); -// agvStatus.setActionStatus(value.getActionStatus()); // -// if (currentTime - time > AUTO_CLOSE_TIME) { -// System.out.println("adapterStatusMap first DISABLE"); -// agvStatus.setStatus(AdapterStatus.DISABLE); -// kernel.disableAdapter(key); -// } else { -// System.out.println("adapterStatusMap first ENABLE"); -// agvStatus.setStatus(AdapterStatus.ENABLE); -// kernel.enableAdapter(key); -// } +// AgvStatus oldData = adapterStatusMap.get(name); // -// LOG.info("update the adapter: {} status:{}", key, value); +// if (oldData == null) { +// return false; +// } // -// if (agvStatus.getActionStatus()) { -// kernel.sendToAdapter(key, agvStatus); -// //动作执行结束,修改数据 -// agvStatus.setActionStatus(false); -// } +// AgvStatus agvStatus = new AgvStatus(); +// agvStatus.setTime(oldData.getTime()); // -// //更新记录数据 -// adapterStatusMap.put(key, agvStatus); -// }); +// if (currentTime - oldData.getTime() > AUTO_CLOSE_TIME) { +// System.out.println("adapterStatusMap first DISABLE"); +// agvStatus.setStatus(AdapterStatus.DISABLE); +// } else { +// System.out.println("adapterStatusMap first ENABLE"); +// agvStatus.setStatus(AdapterStatus.ENABLE); +// } +// +// //更新记录数据 +// adapterStatusMap.put(name, agvStatus); +// +// return agvStatus.getStatus(); // } + private void autoManageAdapterStatus() { + Date date = new Date(); + long currentTime = date.getTime(); + + System.out.println("autoManageAdapterStatus: " + adapterStatusMap); + adapterStatusMap.forEach((key, value) -> { + LOG.info("adapterStatusMap starts name: {}", key); + + AgvStatus agvStatus = new AgvStatus(); + agvStatus.setTime(value.getTime()); + + if (currentTime - value.getTime() > AUTO_CLOSE_TIME) { + agvStatus.setStatus(AdapterStatus.DISABLE); + kernel.disableAdapter(key); + } else { + agvStatus.setStatus(AdapterStatus.ENABLE); + kernel.enableAdapter(key); + } + + LOG.info("update the adapter: {} status:{}", key, value); + + if (value.getActionStatus()) { + kernel.sendToAdapter(key, agvStatus); + } + + //更新数据状态 + agvStatus.setActionStatus(false); + + //更新记录数据 + adapterStatusMap.put(key, agvStatus); + + System.out.println("adapterStatusMap end name: " + key); + LOG.info("adapterStatusMap end name: {}", key); + }); + } /** * 更新适配器车辆模型 */ private void updateAdapterVehicleModel() { adapterDataMap.forEach((key, value) -> { - System.out.println("updateAdapterVehicleModel first"); + System.out.println("updateAdapterVehicleModel name: " + key); kernel.sendToAdapter(key, value); adapterDataMap.remove(key); }); @@ -169,6 +189,7 @@ public class AdapterManage { AgvStatus newAgvStatus = new AgvStatus(); newAgvStatus.setTime(time); + newAgvStatus.setActionStatus(false); if (!adapterStatusMap.isEmpty() && adapterStatusMap.containsKey(name)) { //已记录,只更新时间 @@ -195,21 +216,24 @@ public class AdapterManage { * 设置动作完成状态 * @param name 车辆名称 */ -// public static void setActionStatus(String name) { -// AgvStatus agvStatus = adapterStatusMap.get(name); -// agvStatus.setActionStatus(true); -// adapterStatusMap.put(name, agvStatus); -// } + public static void setActionStatus(String name) { + AgvStatus agvStatus = adapterStatusMap.get(name); + agvStatus.setActionStatus(true); + adapterStatusMap.put(name, agvStatus); + } /** * 记录对应通讯适配器最后一次上报数据 * @param name 车辆名称 * @param data 数据 */ - public static AgvInfo setAdapterVehicleModel(String name, String data) { + public static void setAdapterVehicleModel(String name, String data) { JSONObject jsonObject = JSON.parseObject(data); + //校验通讯序列号 + + AgvInfo agvInfo = new AgvInfo(); agvInfo.setSender(jsonObject.getString("sender")); agvInfo.setReceiver(jsonObject.getString("receiver")); @@ -218,7 +242,7 @@ public class AdapterManage { agvInfo.setTime(jsonObject.getString("time")); agvInfo.setParams(getAgvInfoParams(jsonObject.getString("params"))); - return agvInfo; + adapterDataMap.put(name, agvInfo); } private static AgvInfoParams getAgvInfoParams(String paramsStr) { @@ -247,14 +271,4 @@ public class AdapterManage { Boolean ENABLE = true; Boolean DISABLE = false; } - - private static void test() { - KernelServicePortal build = new KernelServicePortalBuilder(USER, PASSWORD).build(); - build.login(IP, PORT); - VehicleService vehicleService = build.getVehicleService(); - Vehicle vehicle = vehicleService.fetchObject(Vehicle.class, "v1"); - vehicleService.enableCommAdapter(vehicle.getReference()); - vehicleService.sendCommAdapterMessage(vehicle.getReference(), "test"); - } - } diff --git a/opentcs-common/src/main/java/org/opentcs/manage/entity/ActionStatus.java b/opentcs-common/src/main/java/org/opentcs/manage/entity/ActionStatus.java deleted file mode 100644 index 4b32d97..0000000 --- a/opentcs-common/src/main/java/org/opentcs/manage/entity/ActionStatus.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.opentcs.manage.entity; - -import lombok.Data; - -@Data -public class ActionStatus { - - /** - * 动作执行状态,true表示执行完成,false表示执行中 - */ - private Boolean status; - -} diff --git a/opentcs-common/src/main/java/org/opentcs/manage/entity/AgvStatus.java b/opentcs-common/src/main/java/org/opentcs/manage/entity/AgvStatus.java index 304e27f..04f1e5f 100644 --- a/opentcs-common/src/main/java/org/opentcs/manage/entity/AgvStatus.java +++ b/opentcs-common/src/main/java/org/opentcs/manage/entity/AgvStatus.java @@ -13,5 +13,8 @@ public class AgvStatus { * 通讯适配器状态:trye=开启,false=关闭 */ private Boolean status; - + /** + * 动作执行状态:trye=执行完成,false=未知 + */ + private Boolean actionStatus; } diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java index 581825d..b66d37d 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java @@ -37,8 +37,6 @@ import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesR import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleAllowedOrderTypesTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleEnergyLevelThresholdSetTO; import org.opentcs.manage.AdapterManage; -import org.opentcs.manage.entity.ActionStatus; -import org.opentcs.manage.entity.AgvInfo; /** * Handles requests related to vehicles. @@ -87,22 +85,11 @@ public class VehicleHandler { //将数据更新到线程安全的集合中,防止线程阻塞 AdapterManage.setAdapterStatus(name); - - if (AdapterManage.getAdapterStatus(name)) { - vehicleService.enableCommAdapter(vehicle.getReference()); - } else { - //todo 关闭暂时有问题 - vehicleService.disableCommAdapter(vehicle.getReference()); - } - if (type == 1) { //上报agv详细信息 - AgvInfo agvInfo = AdapterManage.setAdapterVehicleModel(name, jsonStr); - vehicleService.sendCommAdapterMessage(vehicle.getReference(), agvInfo); + AdapterManage.setAdapterVehicleModel(name, jsonStr); } else if (type == 5) { //上报动作完成 //动作完成上报 - ActionStatus actionStatus = new ActionStatus(); - actionStatus.setStatus(true); - vehicleService.sendCommAdapterMessage(vehicle.getReference(), actionStatus); + AdapterManage.setActionStatus(name); } } diff --git a/opentcs-kernel/src/main/java/org/opentcs/kernel/StandardKernel.java b/opentcs-kernel/src/main/java/org/opentcs/kernel/StandardKernel.java index 2bfa14e..4eacc5f 100644 --- a/opentcs-kernel/src/main/java/org/opentcs/kernel/StandardKernel.java +++ b/opentcs-kernel/src/main/java/org/opentcs/kernel/StandardKernel.java @@ -115,14 +115,14 @@ public class StandardKernel //开启MQTT服务 // mqttBrokerServer.startMqtt(); + //开启通讯适配器自动管理 + adapterManage.START(); + LOG.info("Communication adapter auto management started successfully"); + initialized = true; LOG.debug("Starting kernel thread"); Thread kernelThread = new Thread(this, "kernelThread"); kernelThread.start(); - - //开启通讯适配器自动管理 -// adapterManage.START(); -// LOG.info("Communication adapter auto management started successfully"); } @Override @@ -143,7 +143,7 @@ public class StandardKernel // mqttBrokerServer.stopMqtt(); //关闭通讯适配器自动管理 -// adapterManage.STOP(); + adapterManage.STOP(); initialized = false; terminationSemaphore.release(); diff --git a/opentcs-kernel/src/main/java/org/opentcs/kernel/workingset/PlantModelManager.java b/opentcs-kernel/src/main/java/org/opentcs/kernel/workingset/PlantModelManager.java index c5bfa71..54040ba 100644 --- a/opentcs-kernel/src/main/java/org/opentcs/kernel/workingset/PlantModelManager.java +++ b/opentcs-kernel/src/main/java/org/opentcs/kernel/workingset/PlantModelManager.java @@ -51,6 +51,7 @@ import org.opentcs.data.order.TransportOrder; import org.opentcs.data.peripherals.PeripheralJob; import org.opentcs.data.peripherals.PeripheralOperation; import org.opentcs.drivers.vehicle.LoadHandlingDevice; +import org.opentcs.manage.AdapterManage; import org.opentcs.park.ParkStrategy; import org.opentcs.park.entity.Park; import org.opentcs.util.event.EventHandler; @@ -171,6 +172,8 @@ public class PlantModelManager ObjectUnknownException { LOG.info("Plant model is being created: {}", to.getName()); +// AdapterManage.kernelStatus = true; + clear(); setName(to.getName()); setProperties(to.getProperties()); @@ -196,6 +199,9 @@ public class PlantModelManager } createVisualLayout(to.getVisualLayout()); + +// AdapterManage.kernelStatus = true; + LOG.info("Plant model created successfully: {}", to.getName()); } /**