This commit is contained in:
xuzhiheng 2025-06-09 15:38:41 +08:00
parent b14d86c96b
commit 22c0518721
8 changed files with 118 additions and 118 deletions

View File

@ -30,7 +30,6 @@ import org.opentcs.drivers.vehicle.SimVehicleCommAdapter;
import org.opentcs.drivers.vehicle.VehicleCommAdapter; import org.opentcs.drivers.vehicle.VehicleCommAdapter;
import org.opentcs.drivers.vehicle.VehicleProcessModel; import org.opentcs.drivers.vehicle.VehicleProcessModel;
import org.opentcs.drivers.vehicle.management.VehicleProcessModelTO; import org.opentcs.drivers.vehicle.management.VehicleProcessModelTO;
import org.opentcs.manage.entity.ActionStatus;
import org.opentcs.manage.entity.AgvInfo; import org.opentcs.manage.entity.AgvInfo;
import org.opentcs.manage.entity.AgvInfoParams; import org.opentcs.manage.entity.AgvInfoParams;
import org.opentcs.manage.entity.AgvStatus; import org.opentcs.manage.entity.AgvStatus;
@ -285,9 +284,9 @@ public class LoopbackCommunicationAdapter
if (message instanceof AgvInfo agvInfo) { if (message instanceof AgvInfo agvInfo) {
//通讯适配器车辆模型更新 //通讯适配器车辆模型更新
handleCallbacks(agvInfo.getParams()); 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; return serialNum;
} }
private void handleActionStatus(ActionStatus actionStatus) { private void handleActionStatus(AgvStatus agvStatus) {
if (actionStatus.getStatus()) { if (agvStatus.getActionStatus()) {
ACTION_STATUS = false; ACTION_STATUS = false;
} }
} }

View File

@ -9,7 +9,11 @@ public enum Actions {
//充电 //充电
CHARGE, CHARGE,
//取消充电 //取消充电
CANCEL_CHARGE CANCEL_CHARGE,
//取货
PICK_UP,
//放货
RELEASE,
; ;
/** /**

View File

@ -51,6 +51,10 @@ public class AdapterManage {
* 基于线程安全HASHMAP * 基于线程安全HASHMAP
*/ */
private static final ConcurrentHashMap<String, AgvInfo> adapterDataMap = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, AgvInfo> adapterDataMap = new ConcurrentHashMap<>();
/**
* 内核状态
*/
// public static Boolean kernelStatus = false;
//开启通讯信息 //开启通讯信息
private static final String USER = GuestUserCredentials.USER; private static final String USER = GuestUserCredentials.USER;
@ -58,9 +62,6 @@ public class AdapterManage {
private static final String IP = GuestUserCredentials.IP; private static final String IP = GuestUserCredentials.IP;
private static final Integer PORT = GuestUserCredentials.PORT; private static final Integer PORT = GuestUserCredentials.PORT;
private int i = 1;
//开启定时任务 //开启定时任务
public void START() { public void START() {
scheduler.scheduleWithFixedDelay(task, 5000, 500, TimeUnit.MILLISECONDS); scheduler.scheduleWithFixedDelay(task, 5000, 500, TimeUnit.MILLISECONDS);
@ -72,88 +73,107 @@ public class AdapterManage {
} }
Runnable task = () -> { Runnable task = () -> {
// kernel = new KernelCommunication(USER, PASSWORD, IP, PORT);
// autoManageAdapterStatus(); // if (!kernelStatus) {
// updateAdapterVehicleModel(); // 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(); kernel.logout();
// System.out.println("end task");
}; };
/** /**
* 自动管理通讯适配器 * 自动管理通讯适配器
*/ */
private static boolean autoManageAdapterStatus(String name) { // 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() {
// Date date = new Date(); // Date date = new Date();
// long currentTime = date.getTime(); // long currentTime = date.getTime();
// //
// System.out.println("autoManageAdapterStatus: " + adapterStatusMap); // 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) { // AgvStatus oldData = adapterStatusMap.get(name);
// 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);
// }
// //
// LOG.info("update the adapter: {} status{}", key, value); // if (oldData == null) {
// return false;
// }
// //
// if (agvStatus.getActionStatus()) { // AgvStatus agvStatus = new AgvStatus();
// kernel.sendToAdapter(key, agvStatus); // agvStatus.setTime(oldData.getTime());
// //动作执行结束修改数据
// agvStatus.setActionStatus(false);
// }
// //
// //更新记录数据 // if (currentTime - oldData.getTime() > AUTO_CLOSE_TIME) {
// adapterStatusMap.put(key, agvStatus); // 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() { private void updateAdapterVehicleModel() {
adapterDataMap.forEach((key, value) -> { adapterDataMap.forEach((key, value) -> {
System.out.println("updateAdapterVehicleModel first"); System.out.println("updateAdapterVehicleModel name: " + key);
kernel.sendToAdapter(key, value); kernel.sendToAdapter(key, value);
adapterDataMap.remove(key); adapterDataMap.remove(key);
}); });
@ -169,6 +189,7 @@ public class AdapterManage {
AgvStatus newAgvStatus = new AgvStatus(); AgvStatus newAgvStatus = new AgvStatus();
newAgvStatus.setTime(time); newAgvStatus.setTime(time);
newAgvStatus.setActionStatus(false);
if (!adapterStatusMap.isEmpty() && adapterStatusMap.containsKey(name)) { if (!adapterStatusMap.isEmpty() && adapterStatusMap.containsKey(name)) {
//已记录只更新时间 //已记录只更新时间
@ -195,21 +216,24 @@ public class AdapterManage {
* 设置动作完成状态 * 设置动作完成状态
* @param name 车辆名称 * @param name 车辆名称
*/ */
// public static void setActionStatus(String name) { public static void setActionStatus(String name) {
// AgvStatus agvStatus = adapterStatusMap.get(name); AgvStatus agvStatus = adapterStatusMap.get(name);
// agvStatus.setActionStatus(true); agvStatus.setActionStatus(true);
// adapterStatusMap.put(name, agvStatus); adapterStatusMap.put(name, agvStatus);
// } }
/** /**
* 记录对应通讯适配器最后一次上报数据 * 记录对应通讯适配器最后一次上报数据
* @param name 车辆名称 * @param name 车辆名称
* @param data 数据 * @param data 数据
*/ */
public static AgvInfo setAdapterVehicleModel(String name, String data) { public static void setAdapterVehicleModel(String name, String data) {
JSONObject jsonObject = JSON.parseObject(data); JSONObject jsonObject = JSON.parseObject(data);
//校验通讯序列号
AgvInfo agvInfo = new AgvInfo(); AgvInfo agvInfo = new AgvInfo();
agvInfo.setSender(jsonObject.getString("sender")); agvInfo.setSender(jsonObject.getString("sender"));
agvInfo.setReceiver(jsonObject.getString("receiver")); agvInfo.setReceiver(jsonObject.getString("receiver"));
@ -218,7 +242,7 @@ public class AdapterManage {
agvInfo.setTime(jsonObject.getString("time")); agvInfo.setTime(jsonObject.getString("time"));
agvInfo.setParams(getAgvInfoParams(jsonObject.getString("params"))); agvInfo.setParams(getAgvInfoParams(jsonObject.getString("params")));
return agvInfo; adapterDataMap.put(name, agvInfo);
} }
private static AgvInfoParams getAgvInfoParams(String paramsStr) { private static AgvInfoParams getAgvInfoParams(String paramsStr) {
@ -247,14 +271,4 @@ public class AdapterManage {
Boolean ENABLE = true; Boolean ENABLE = true;
Boolean DISABLE = false; 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");
}
} }

View File

@ -1,13 +0,0 @@
package org.opentcs.manage.entity;
import lombok.Data;
@Data
public class ActionStatus {
/**
* 动作执行状态true表示执行完成false表示执行中
*/
private Boolean status;
}

View File

@ -13,5 +13,8 @@ public class AgvStatus {
* 通讯适配器状态trye=开启false=关闭 * 通讯适配器状态trye=开启false=关闭
*/ */
private Boolean status; private Boolean status;
/**
* 动作执行状态trye=执行完成false=未知
*/
private Boolean actionStatus;
} }

View File

@ -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.PutVehicleAllowedOrderTypesTO;
import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleEnergyLevelThresholdSetTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleEnergyLevelThresholdSetTO;
import org.opentcs.manage.AdapterManage; import org.opentcs.manage.AdapterManage;
import org.opentcs.manage.entity.ActionStatus;
import org.opentcs.manage.entity.AgvInfo;
/** /**
* Handles requests related to vehicles. * Handles requests related to vehicles.
@ -87,22 +85,11 @@ public class VehicleHandler {
//将数据更新到线程安全的集合中防止线程阻塞 //将数据更新到线程安全的集合中防止线程阻塞
AdapterManage.setAdapterStatus(name); AdapterManage.setAdapterStatus(name);
if (AdapterManage.getAdapterStatus(name)) {
vehicleService.enableCommAdapter(vehicle.getReference());
} else {
//todo 关闭暂时有问题
vehicleService.disableCommAdapter(vehicle.getReference());
}
if (type == 1) { //上报agv详细信息 if (type == 1) { //上报agv详细信息
AgvInfo agvInfo = AdapterManage.setAdapterVehicleModel(name, jsonStr); AdapterManage.setAdapterVehicleModel(name, jsonStr);
vehicleService.sendCommAdapterMessage(vehicle.getReference(), agvInfo);
} else if (type == 5) { //上报动作完成 } else if (type == 5) { //上报动作完成
//动作完成上报 //动作完成上报
ActionStatus actionStatus = new ActionStatus(); AdapterManage.setActionStatus(name);
actionStatus.setStatus(true);
vehicleService.sendCommAdapterMessage(vehicle.getReference(), actionStatus);
} }
} }

View File

@ -115,14 +115,14 @@ public class StandardKernel
//开启MQTT服务 //开启MQTT服务
// mqttBrokerServer.startMqtt(); // mqttBrokerServer.startMqtt();
//开启通讯适配器自动管理
adapterManage.START();
LOG.info("Communication adapter auto management started successfully");
initialized = true; initialized = true;
LOG.debug("Starting kernel thread"); LOG.debug("Starting kernel thread");
Thread kernelThread = new Thread(this, "kernelThread"); Thread kernelThread = new Thread(this, "kernelThread");
kernelThread.start(); kernelThread.start();
//开启通讯适配器自动管理
// adapterManage.START();
// LOG.info("Communication adapter auto management started successfully");
} }
@Override @Override
@ -143,7 +143,7 @@ public class StandardKernel
// mqttBrokerServer.stopMqtt(); // mqttBrokerServer.stopMqtt();
//关闭通讯适配器自动管理 //关闭通讯适配器自动管理
// adapterManage.STOP(); adapterManage.STOP();
initialized = false; initialized = false;
terminationSemaphore.release(); terminationSemaphore.release();

View File

@ -51,6 +51,7 @@ import org.opentcs.data.order.TransportOrder;
import org.opentcs.data.peripherals.PeripheralJob; import org.opentcs.data.peripherals.PeripheralJob;
import org.opentcs.data.peripherals.PeripheralOperation; import org.opentcs.data.peripherals.PeripheralOperation;
import org.opentcs.drivers.vehicle.LoadHandlingDevice; import org.opentcs.drivers.vehicle.LoadHandlingDevice;
import org.opentcs.manage.AdapterManage;
import org.opentcs.park.ParkStrategy; import org.opentcs.park.ParkStrategy;
import org.opentcs.park.entity.Park; import org.opentcs.park.entity.Park;
import org.opentcs.util.event.EventHandler; import org.opentcs.util.event.EventHandler;
@ -171,6 +172,8 @@ public class PlantModelManager
ObjectUnknownException { ObjectUnknownException {
LOG.info("Plant model is being created: {}", to.getName()); LOG.info("Plant model is being created: {}", to.getName());
// AdapterManage.kernelStatus = true;
clear(); clear();
setName(to.getName()); setName(to.getName());
setProperties(to.getProperties()); setProperties(to.getProperties());
@ -196,6 +199,9 @@ public class PlantModelManager
} }
createVisualLayout(to.getVisualLayout()); createVisualLayout(to.getVisualLayout());
// AdapterManage.kernelStatus = true;
LOG.info("Plant model created successfully: {}", to.getName());
} }
/** /**