rev:ndc线程处理
This commit is contained in:
@@ -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)) {
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user