rev:ndc线程处理

This commit is contained in:
2026-01-04 18:43:45 +08:00
parent d698739469
commit 2eadea497f
4 changed files with 78 additions and 54 deletions

View File

@@ -33,10 +33,15 @@ import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString; import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString;
@@ -64,6 +69,10 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
boolean requireSucessTake = false; boolean requireSucessTake = false;
boolean requireSucessPut = false; boolean requireSucessPut = false;
private final ConcurrentHashMap<String, ExecutorService> carExecutors = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, AtomicBoolean> CAR_PHASE = new ConcurrentHashMap<>();
@Autowired @Autowired
ISysParamService paramService; ISysParamService paramService;
@@ -119,7 +128,7 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
dis = new DataInputStream(socket.getInputStream()); dis = new DataInputStream(socket.getInputStream());
while (socket.isConnected()) { while (socket.isConnected()) {
System.out.println("当前socket状态"+socket.isConnected()); System.out.println("当前socket状态" + socket.isConnected());
int count = dis.read(b); int count = dis.read(b);
// System.out.println("当前count值"+count); // System.out.println("当前count值"+count);
if (count == -1) { if (count == -1) {
@@ -198,8 +207,6 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
device = deviceAppService.findDeviceByCode(device_code); device = deviceAppService.findDeviceByCode(device_code);
} }
AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver;
AgvNdcOneDeviceDriver agvNdcOneDeviceDriver;
//开始任务 //开始任务
if (phase == 0x01) { if (phase == 0x01) {
if (!ObjectUtil.isEmpty(inst)) { if (!ObjectUtil.isEmpty(inst)) {
@@ -221,10 +228,10 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
Device agvDevice = deviceAppService.findDeviceByCode(agvcar); Device agvDevice = deviceAppService.findDeviceByCode(agvcar);
if (agvDevice != null) { if (agvDevice != null) {
if (agvDevice.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { if (agvDevice.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) {
agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) agvDevice.getDeviceDriver(); AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) agvDevice.getDeviceDriver();
agvNdcTwoDeviceDriver.setInstruction(null); agvNdcTwoDeviceDriver.setInstruction(null);
} else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) { } else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) {
agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver(); AgvNdcOneDeviceDriver agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver();
agvNdcOneDeviceDriver.setInstruction(null); agvNdcOneDeviceDriver.setInstruction(null);
} }
} }
@@ -273,8 +280,7 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
} else { } else {
log.info("未下发NDC信号原因: 下发开门信号值为:{},读取开门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getOpen()); log.info("未下发NDC信号原因: 下发开门信号值为:{},读取开门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getOpen());
} }
} } else if (device.getDeviceDriver() instanceof RasterDeviceDriver) {
else if (device.getDeviceDriver() instanceof RasterDeviceDriver){
rasterDeviceDriver = (RasterDeviceDriver) device.getDeviceDriver(); rasterDeviceDriver = (RasterDeviceDriver) device.getDeviceDriver();
try { try {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
@@ -316,8 +322,7 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
} else { } else {
log.info("未下发NDC信号原因: 读取自动门信号值为:{}", standardAutodoorDeviceDriver.getClose()); log.info("未下发NDC信号原因: 读取自动门信号值为:{}", standardAutodoorDeviceDriver.getClose());
} }
} } else if (device.getDeviceDriver() instanceof RasterDeviceDriver) {
else if (device.getDeviceDriver() instanceof RasterDeviceDriver) {
rasterDeviceDriver = (RasterDeviceDriver) device.getDeviceDriver(); rasterDeviceDriver = (RasterDeviceDriver) device.getDeviceDriver();
try { try {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
@@ -336,64 +341,83 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
} else { } else {
log.info(device_code + "对应设备号为空!"); log.info(device_code + "对应设备号为空!");
} }
} else if (phase == 0x64){ } else if (phase == 0x64) {
log.info("AGV车号{}反馈充电任务下发成功,锁定充电桩{}",agvaddr,station); log.info("AGV车号{}反馈充电任务下发成功,锁定充电桩{}", agvaddr, station);
Dict dict = dictService.getDictByName3("station",String.valueOf(agvaddr),null); Dict dict = dictService.getDictByName3("station", String.valueOf(agvaddr), null);
if (ObjectUtil.isNotEmpty(dict)){ if (ObjectUtil.isNotEmpty(dict)) {
dict.setValue("1"); dict.setValue("1");
dict.setPara2(String.valueOf(agvaddr)); dict.setPara2(String.valueOf(agvaddr));
dict.setPara3("下发成功"); dict.setPara3("下发成功");
dictService.updateDetail(dict); dictService.updateDetail(dict);
} }
//充电成功 //充电成功
}else if (phase == 0x65){ } else if (phase == 0x65) {
log.info("AGV车号{}反馈充电中,充电桩{}",agvaddr,station); log.info("AGV车号{}反馈充电中,充电桩{}", agvaddr, station);
//充电取消上报 //充电取消上报
}else if (phase == 0x66){ } else if (phase == 0x66) {
log.info("AGV车号{}反馈充电任务已取消,释放充电桩{}",agvaddr,station); log.info("AGV车号{}反馈充电任务已取消,释放充电桩{}", agvaddr, station);
Dict dict = dictService.getDictByName3("station",String.valueOf(agvaddr),null); Dict dict = dictService.getDictByName3("station", String.valueOf(agvaddr), null);
if (ObjectUtil.isNotEmpty(dict)){ if (ObjectUtil.isNotEmpty(dict)) {
dict.setValue("0"); dict.setValue("0");
dict.setPara2(""); dict.setPara2("");
dict.setPara3("充电桩空闲"); dict.setPara3("充电桩空闲");
dictService.updateDetail(dict); dictService.updateDetail(dict);
} }
} } else {
else {
//上报异常信息 //上报异常信息
//不需要WCS反馈 //不需要WCS反馈
if (phase == 0x67 || phase == 0x70 || phase == 0x71 || phase == 0x72 || phase == 0x73 || phase == 0x74) {
device = deviceAppService.findDeviceByCode(Integer.toString(arr[18] * 256 + arr[19])); String carnoKey = String.valueOf(arr[20]);
} else { int phaseForCarno = arr[16] * 256 + arr[17];
device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); if (phaseForCarno == 0x67 || phaseForCarno == 0x70 || phaseForCarno == 0x71 || phaseForCarno == 0x72 || phaseForCarno == 0x73 || phaseForCarno == 0x74) {
carnoKey = String.valueOf(arr[18] * 256 + arr[19]);
} }
try { final int[] arrCopy = new int[count];
if (ObjectUtil.isNotEmpty(device)) { System.arraycopy(arr, 0, arrCopy, 0, count);
if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { final String bsCopy = bs.toString();
agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); final String finalCarnoKey = carnoKey;
CompletableFuture.runAsync(() -> { ExecutorService executor = carExecutors.computeIfAbsent(finalCarnoKey, k -> {
try { ExecutorService es = Executors.newSingleThreadExecutor(r -> {
agvNdcTwoDeviceDriver.processSocket(arr); Thread t = new Thread(r, "NDC2-Car-" + k);
} catch (Exception e) { t.setDaemon(true);
e.printStackTrace(); return t;
log.error("agv运行逻辑报错:{}", e.getMessage()); });
LuceneLogDto logDto = LuceneLogDto.builder() return es;
.content("agv运行报错" + "报错原因:" + e.getMessage()) });
.build(); Device agvDevice = deviceAppService.findDeviceByCode(carnoKey);
logDto.setLog_level(4);
luceneExecuteLogService.deviceExecuteLog(logDto); // if (phase == 0x67 || phase == 0x70 || phase == 0x71 || phase == 0x72 || phase == 0x73 || phase == 0x74) {
// device = deviceAppService.findDeviceByCode(Integer.toString(arr[18] * 256 + arr[19]));
// } else {
// device = deviceAppService.findDeviceByCode(Integer.toString(arr[20]));
// }
if (ObjectUtil.isNotEmpty(agvDevice)) {
String car_phase = carnoKey + "_" + phaseForCarno;
AtomicBoolean atomicBoolean = CAR_PHASE.computeIfAbsent(car_phase, k -> new AtomicBoolean(false));
if (atomicBoolean.compareAndSet(false, true)) {
executor.submit((Runnable) () -> {
try {
if (agvDevice.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) {
AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) agvDevice.getDeviceDriver();
agvNdcTwoDeviceDriver.processSocket(arrCopy);
} else if (agvDevice.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) {
AgvNdcOneDeviceDriver agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) agvDevice.getDeviceDriver();
agvNdcOneDeviceDriver.processSocket(arrCopy);
} }
}); } catch (Exception e) {
} else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) { log.info("processSocket出错:{},{},{}", e, e.getMessage(), Arrays.toString(e.getStackTrace()));
agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver(); e.printStackTrace();
agvNdcOneDeviceDriver.processSocket(arr); } finally {
} atomicBoolean.set(false);
if (CAR_PHASE.get(car_phase) == atomicBoolean) {
CAR_PHASE.remove(car_phase, atomicBoolean);
}
}
});
} else { } else {
log.info("当前phase" + phase + "未找到对应设备"); logServer.deviceExecuteLog("NDC2", "", "","当前车号:" + carnoKey + "当前PHASE值" + phaseForCarno + "正在执行中,后续不进行处理");
log.info("当前车号:" + carnoKey + "当前PHASE值" + phaseForCarno + "正在执行中,后续不进行处理");
} }
} catch (Exception e) {
log.info("processSocket出错:{},{}", e, e.getMessage());
e.printStackTrace();
} }
} }
if (!ObjectUtil.isEmpty(data)) { if (!ObjectUtil.isEmpty(data)) {

View File

@@ -102,7 +102,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
int mode = 2; int mode = 2;
public synchronized void processSocket(int[] arr) throws Exception { public synchronized void processSocket(int[] arr) {
device_code = this.getDeviceCode(); device_code = this.getDeviceCode();
byte[] data = null; byte[] data = null;
phase = arr[16] * 256 + arr[17]; phase = arr[16] * 256 + arr[17];

View File

@@ -106,7 +106,7 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic
this.error_message = error_message; this.error_message = error_message;
} }
public synchronized void processSocket(int[] arr) throws Exception { public synchronized void processSocket(int[] arr) {
device_code = this.getDeviceCode(); device_code = this.getDeviceCode();
byte[] data = null; byte[] data = null;
phase = arr[16] * 256 + arr[17]; phase = arr[16] * 256 + arr[17];

View File

@@ -286,19 +286,19 @@ public class PlugPullDeviceSiteDeviceDriver extends AbstractOpcDeviceDriver impl
} }
break; break;
case 6: case 6:
if (!requireSucess) { if (!requireSucess && StrUtil.isNotEmpty(this.barcode)) {
//拔轴完成 //拔轴完成
pullShaftSucess(mode); pullShaftSucess(mode);
} }
break; break;
case 7: case 7:
if (!requireSucess) { if (!requireSucess && StrUtil.isNotEmpty(this.barcode)) {
//申请拔轴 //申请拔轴
applyPullShaft(mode); applyPullShaft(mode);
} }
break; break;
case 8: case 8:
if (!requireSucess) { if (!requireSucess && this.size > 0) {
//缓存线已满,申请行架任务 //缓存线已满,申请行架任务
applyTask(mode); applyTask(mode);
} }