rev:更新

This commit is contained in:
2026-07-19 10:29:03 +08:00
parent aa1dda4fa2
commit 824400397b
21 changed files with 414 additions and 387 deletions

View File

@@ -76,14 +76,14 @@ public class AppRun {
@GetMapping("/kaishichongdian/{no}")
@SaIgnore
public String kaishichongdian(@PathVariable Integer no) {
BMSSocketConnectionAutoRun.writeStartCharge(no);
BMSSocketConnectionAutoRun.writeStartChargeAndArmExtend(no);
return "Backend service started successfully";
}
@GetMapping("/tingzhichongdian/{no}")
@SaIgnore
public String tingzhichongdian(@PathVariable Integer no) {
BMSSocketConnectionAutoRun.writeStopCharge(no);
BMSSocketConnectionAutoRun.writeStopChargeAndArmRetract(no);
return "Backend service started successfully";
}
@@ -115,4 +115,3 @@ public class AppRun {
return String.valueOf(armExtended);
}
}

View File

@@ -26,6 +26,7 @@ import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.springframework.stereotype.Component;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -35,7 +36,6 @@ import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.zip.CRC32;
@Slf4j
@Component
@@ -71,8 +71,10 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
private static final long RECONNECT_DELAY_MS = 3000L;
private static final long CONFIG_REFRESH_MS = 5000L;
private static final long STATUS_EXPIRE_MS = 3000L;
private static final long COMMAND_RESPONSE_WINDOW_MS = 5000L;
private static final int CIRCUIT_FAILURE_THRESHOLD = 5;
private static final long CIRCUIT_OPEN_MS = 30000L;
private static final int LOCAL_PORT_BASE = 10000;
private static final Map<Integer, StationClient> CLIENTS = new ConcurrentHashMap<>();
private static final AtomicBoolean stopRequested = new AtomicBoolean(false);
@@ -137,10 +139,18 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
write(buildFixedFrame(CHARGE_CMD_START, ARM_CMD_NONE, stationNo), stationNo);
}
public static void writeStartChargeAndArmExtend(int stationNo) {
write(buildFixedFrame(CHARGE_CMD_START, ARM_CMD_EXTEND, stationNo), stationNo);
}
public static void writeStopCharge(int stationNo) {
write(buildFixedFrame(CHARGE_CMD_STOP, ARM_CMD_NONE, stationNo), stationNo);
}
public static void writeStopChargeAndArmRetract(int stationNo) {
write(buildFixedFrame(CHARGE_CMD_STOP, ARM_CMD_RETRACT, stationNo), stationNo);
}
public static void writeChargeComplete(int stationNo) {
writeStopCharge(stationNo);
}
@@ -189,6 +199,41 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
return waitUntil(stationNo, timeoutMs, WaitTarget.CHARGE_STOPPED);
}
private static String armStateToText(int armState) {
switch (armState) {
case ARM_STATE_RETRACTED:
return "退回到位";
case ARM_STATE_EXTENDED:
return "伸出到位";
case ARM_STATE_UNKNOWN:
default:
return "未知";
}
}
private static String chargerStateToText(int chargerState) {
switch (chargerState) {
case CHARGER_STATE_CHARGING:
return "充电中";
case CHARGER_STATE_STOPPED:
return "停止充电/充满";
case CHARGER_STATE_INVALID:
default:
return "未知";
}
}
private static String describeWord7(int word7) {
switch (word7) {
case 0x0000:
return "无附加状态";
case 0x0006:
return "保留位返回0x0006";
default:
return "保留位状态未知";
}
}
public static byte[] buildFixedFrame(int chargeCmd, int armCmd, int stationNo) {
if (stationNo < 0 || stationNo > 0xFFFF) {
throw new IllegalArgumentException("stationNo must be in [0, 65535]");
@@ -203,7 +248,7 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
offset += 2;
writeUInt16BE(frame, offset, stationNo);
offset += 2;
writeUInt32BE(frame, offset, calculateCrc32(frame, FRAME_HEAD.length, 6));
writeUInt32BE(frame, offset, 0L);
offset += 4;
System.arraycopy(FRAME_TAIL, 0, frame, offset, FRAME_TAIL.length);
@@ -307,6 +352,10 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
log.warn("BMS站点配置无效stationNo异常: {}", item);
continue;
}
if (LOCAL_PORT_BASE + stationNo > 65535) {
log.warn("BMS站点{}配置无效,本地端口{}超出范围", stationNo, LOCAL_PORT_BASE + stationNo);
continue;
}
if (StrUtil.isBlank(ip)) {
log.warn("BMS站点{}配置无效ip为空", stationNo);
continue;
@@ -385,10 +434,12 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
| (long) (source[offset + 3] & 0xFF);
}
private static long calculateCrc32(byte[] source, int offset, int len) {
CRC32 crc32 = new CRC32();
crc32.update(source, offset, len);
return crc32.getValue();
private static long calculateWordChecksum(byte[] source, int offset, int wordCount) {
long checksum = 0L;
for (int i = 0; i < wordCount; i++) {
checksum += readUInt16BE(source, offset + i * 2);
}
return checksum & 0xFFFFFFFFL;
}
private static boolean validateChecksum(byte[] frame) {
@@ -397,12 +448,12 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
}
if (frame.length == FRAME_LEN) {
long expected = readUInt32BE(frame, FRAME_HEAD.length + 6);
long actual = calculateCrc32(frame, FRAME_HEAD.length, 6);
long actual = calculateWordChecksum(frame, FRAME_HEAD.length, 3);
return expected == actual;
}
if (frame.length == REPORT_FRAME_LEN) {
long expected = readUInt32BE(frame, FRAME_HEAD.length + 14);
long actual = calculateCrc32(frame, FRAME_HEAD.length, 14);
long actual = calculateWordChecksum(frame, FRAME_HEAD.length, 7);
return expected == actual;
}
return false;
@@ -473,6 +524,8 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
private volatile String lastConnectError = "";
private volatile long lastConnectSuccessTimeMs = 0L;
private volatile long lastConnectAttemptTimeMs = 0L;
private volatile String pendingCommandHex;
private volatile long pendingCommandTimeMs = 0L;
private StationClient(StationConfig config) {
this.config = config;
@@ -525,6 +578,7 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
.channel(NioSocketChannel.class)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.option(ChannelOption.SO_KEEPALIVE, true)
.option(ChannelOption.SO_REUSEADDR, true)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
@@ -535,7 +589,9 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
});
StationConfig currentConfig = this.config;
ChannelFuture future = bootstrap.connect(currentConfig.ip, currentConfig.port);
int localPort = getLocalPort(currentConfig.stationNo);
ChannelFuture future = bootstrap.connect(new InetSocketAddress(currentConfig.ip, currentConfig.port),
new InetSocketAddress(localPort));
future.addListener((ChannelFutureListener) f -> {
reconnectScheduled.set(false);
if (closed.get() || stopRequested.get()) {
@@ -548,7 +604,8 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
if (f.isSuccess()) {
channel = f.channel();
onConnectSuccess();
log.info("BMS站点{}连接成功 {}:{}", currentConfig.stationNo, currentConfig.ip, currentConfig.port);
log.info("BMS站点{}连接成功 localPort={}, remote={}:{}",
currentConfig.stationNo, localPort, currentConfig.ip, currentConfig.port);
} else {
onConnectFailure(f.cause());
}
@@ -602,21 +659,31 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
ensureConnected();
return;
}
log.info("下发BMS站点{}数据(HEX): {}", config.stationNo, bytesToHex(data));
String commandHex = bytesToHex(data);
log.info("下发BMS站点{}数据(HEX): {}", config.stationNo, commandHex);
current.writeAndFlush(current.alloc().buffer(data.length).writeBytes(data)).addListener((ChannelFutureListener) future -> {
if (!future.isSuccess()) {
log.error("下发BMS站点{}数据失败: {}", config.stationNo, bytesToHex(data), future.cause());
log.error("下发BMS站点{}数据失败: {}", config.stationNo, commandHex, future.cause());
Channel failedChannel = future.channel();
if (failedChannel != null && failedChannel.isOpen()) {
failedChannel.close();
}
} else {
pendingCommandHex = commandHex;
pendingCommandTimeMs = System.currentTimeMillis();
}
});
}
private void updateStatus(byte[] frame) {
if (!validateChecksum(frame)) {
log.warn("BMS站点{}收到CRC校验失败报文忽略: {}", config.stationNo, bytesToHex(frame));
long expected = frame.length == REPORT_FRAME_LEN ? readUInt32BE(frame, FRAME_HEAD.length + 14) : -1L;
long actual = frame.length == REPORT_FRAME_LEN ? calculateWordChecksum(frame, FRAME_HEAD.length, 7) : -1L;
log.warn("BMS站点{}收到校验失败报文expected=0x{}, actual=0x{}, 忽略: {}",
config.stationNo,
Long.toHexString(expected),
Long.toHexString(actual),
bytesToHex(frame));
return;
}
int dataOffset = FRAME_HEAD.length;
@@ -625,6 +692,9 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
int armState = readUInt16BE(frame, dataOffset + 4);
int chargerState = readUInt16BE(frame, dataOffset + 6);
int reportStationNo = readUInt16BE(frame, dataOffset + 8);
int reservedWord6 = readUInt16BE(frame, dataOffset + 10);
int reservedWord7 = readUInt16BE(frame, dataOffset + 12);
long checksum = readUInt32BE(frame, dataOffset + 14);
if (reportStationNo != config.stationNo) {
log.warn("BMS站点{}收到站点{}上报,忽略异常报文: {}", config.stationNo, reportStationNo, bytesToHex(frame));
return;
@@ -636,12 +706,31 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
status.outputCurrentRaw = outputCurrent;
status.armState = armState;
status.chargerState = chargerState;
status.reservedWord6 = reservedWord6;
status.reservedWord7 = reservedWord7;
status.checksum = checksum;
status.lastUpdateTimeMs = System.currentTimeMillis();
status.rawFrameHex = bytesToHex(frame);
latestStatus = status;
log.info("BMS状态更新 stationNo={}, armState={}, chargerState={}, voltageRaw={}, currentRaw={}",
reportStationNo, armState, chargerState, outputVoltage, outputCurrent);
String commandHex = pendingCommandHex;
if (commandHex != null && status.lastUpdateTimeMs - pendingCommandTimeMs <= COMMAND_RESPONSE_WINDOW_MS) {
log.info("BMS站点{}下发后收到回包: commandHex={}, replyHex={}",
config.stationNo, commandHex, status.rawFrameHex);
pendingCommandHex = null;
pendingCommandTimeMs = 0L;
}
log.info("BMS站点{}状态更新: 机械臂={}, 充电状态={}, 输出电压原始值={}, 输出电流原始值={}, 保留字6=0x{}, 保留字7=0x{}({}), 校验值=0x{}",
reportStationNo,
armStateToText(armState),
chargerStateToText(chargerState),
outputVoltage,
outputCurrent,
Integer.toHexString(reservedWord6),
Integer.toHexString(reservedWord7),
describeWord7(reservedWord7),
Long.toHexString(checksum));
}
private BmsStationStatus snapshotStatus() {
@@ -652,6 +741,9 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
copy.outputCurrentRaw = source.outputCurrentRaw;
copy.armState = source.armState;
copy.chargerState = source.chargerState;
copy.reservedWord6 = source.reservedWord6;
copy.reservedWord7 = source.reservedWord7;
copy.checksum = source.checksum;
copy.lastUpdateTimeMs = source.lastUpdateTimeMs;
copy.rawFrameHex = source.rawFrameHex;
if (copy.lastUpdateTimeMs <= 0 || System.currentTimeMillis() - copy.lastUpdateTimeMs > STATUS_EXPIRE_MS) {
@@ -699,6 +791,10 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
return latestStatus.lastUpdateTimeMs;
}
private int getLocalPort(int stationNo) {
return LOCAL_PORT_BASE + stationNo;
}
private boolean allowConnectAttempt() {
long now = System.currentTimeMillis();
if (circuitState == CircuitState.OPEN) {
@@ -839,6 +935,9 @@ public class BMSSocketConnectionAutoRun extends AbstractAutoRunnable {
public int outputCurrentRaw;
public int armState = ARM_STATE_UNKNOWN;
public int chargerState = CHARGER_STATE_INVALID;
public int reservedWord6;
public int reservedWord7;
public long checksum;
public long lastUpdateTimeMs;
public String rawFrameHex;
}

View File

@@ -37,6 +37,8 @@ import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString;
@Slf4j
@Component
public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
private static final long BMS_COMMAND_WAIT_TIMEOUT_MS = 5000L;
static volatile Socket socket;
String ip = "192.168.46.225";
@@ -149,13 +151,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver;
//开始任务
if (phase == 0x01) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x01")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0x01ikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x01").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0x01ikey=" + ikey + "index=" + index).build());
if (!ObjectUtil.isEmpty(inst)) {
inst.setInstruction_status("1");
@@ -163,26 +159,13 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
inst.setSend_status("1");
instructionService.update(inst);
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x01")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x01ikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x01").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x01ikey=" + ikey + "index=" + index).build());
}
}
//任务完毕
//无车id及状态
else if (phase == 0x14) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x14")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0x14ikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x14").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0x14ikey=" + ikey + "index=" + index).build());
if (ObjectUtil.isEmpty(inst)) {
log.info("未找到指令号{}对应的指令", ikey);
} else {
@@ -202,96 +185,37 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
}
}
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x14")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x14ikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x14").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x14ikey=" + ikey + "index=" + index).build());
}
//请求删除任务
//(需要WCS反馈)
else if (phase == 0x30) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x30")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0x30ikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x30").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0x30ikey=" + ikey + "index=" + index).build());
data = ndcAgvService.sendAgvTwoModeInst(0x8F, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x30")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x30ikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x30").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x30ikey=" + ikey + "index=" + index).build());
}
//任务删除确认
//(需要WCS反馈)
else if (phase == 0xFF) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0xFF")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0xFFikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0xFF").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0xFFikey=" + ikey + "index=" + index).build());
if (ObjectUtil.isEmpty(inst)) {
log.info("未找到指令号{}对应的指令", ikey);
} else {
instructionService.cancelNOSendAgv(inst.getInstruction_id());
}
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0xFF")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0xFFikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0xFF").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0xFFikey=" + ikey + "index=" + index).build());
}
//任务删除结束
else if (phase == 0x0F) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x0F")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0x0Fikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x0F").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0x0Fikey=" + ikey + "index=" + index).build());
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x0F")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x0Fikey=" + ikey + "index=" + index)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x0F").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x0Fikey=" + ikey + "index=" + index).build());
} // 开门
else if (phase == 0x50) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x50")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x50").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
if (ObjectUtil.isEmpty(device_code)) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x50")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: agvaddr=" + agvaddr + " 对应设备号为空")
.content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x50").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: agvaddr=" + agvaddr + " 对应设备号为空").content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info(agvaddr + "对应设备号为空!");
return;
}
@@ -300,14 +224,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
try {
elevatorDoorDeviceDriver.writing("call", "1");
} catch (Exception e) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x50")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 下发开门信号异常: " + e.getMessage())
.content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x50").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 下发开门信号异常: " + e.getMessage()).content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info("下发电气信号失败:" + e.getMessage());
log.error("下发呼叫电梯信号失败", e);
}
@@ -315,79 +232,31 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
if (elevatorDoorDeviceDriver.getOpen() == 1 && elevatorDoorDeviceDriver.getCall() == 1 && elevatorDoorDeviceDriver.getFire_open() == 1) {
log.info("下发开门信号值为:{},读取开门信号值为:{}", elevatorDoorDeviceDriver.getCall(), elevatorDoorDeviceDriver.getOpen());
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x50")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x50").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
} else {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x50")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 未满足反馈条件, call=" + elevatorDoorDeviceDriver.getCall() + ", open=" + elevatorDoorDeviceDriver.getOpen() + ", fire_open=" + elevatorDoorDeviceDriver.getFire_open())
.content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x50").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 未满足反馈条件, call=" + elevatorDoorDeviceDriver.getCall() + ", open=" + elevatorDoorDeviceDriver.getOpen() + ", fire_open=" + elevatorDoorDeviceDriver.getFire_open()).content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info("未下发NDC信号原因: 下发开门信号值为:{},读取开门信号值为:{},读取防火门状态:{}", elevatorDoorDeviceDriver.getCall(), elevatorDoorDeviceDriver.getOpen(), elevatorDoorDeviceDriver.getFire_open());
}
} else {
if (elevatorDoorDeviceDriver.getOpen() == 1 && elevatorDoorDeviceDriver.getCall() == 1) {
log.info("下发开门信号值为:{},读取开门信号值为:{}", elevatorDoorDeviceDriver.getCall(), elevatorDoorDeviceDriver.getOpen());
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x50")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x50").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
} else {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x50")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 未满足反馈条件, call=" + elevatorDoorDeviceDriver.getCall() + ", open=" + elevatorDoorDeviceDriver.getOpen())
.content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x50").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 未满足反馈条件, call=" + elevatorDoorDeviceDriver.getCall() + ", open=" + elevatorDoorDeviceDriver.getOpen()).content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info("未下发NDC信号原因: 下发开门信号值为:{},读取开门信号值为:{}", elevatorDoorDeviceDriver.getCall(), elevatorDoorDeviceDriver.getOpen());
}
}
} else {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x50")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: device_code=" + device_code + " 不是电梯门设备")
.content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x50").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: device_code=" + device_code + " 不是电梯门设备").content("未反馈AGVphase=0x50ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info(agvaddr + "对应设备号为空!");
}
}
// 关门
else if (phase == 0x51) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x51")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x51").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
if (ObjectUtil.isEmpty(device_code)) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x51")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: agvaddr=" + agvaddr + " 对应设备号为空")
.content("未反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x51").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: agvaddr=" + agvaddr + " 对应设备号为空").content("未反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info(agvaddr + "对应设备号为空!");
return;
}
@@ -396,48 +265,20 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
try {
elevatorDoorDeviceDriver.writing("call", "0");
} catch (Exception e) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x51")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 下发关门信号异常: " + e.getMessage())
.content("未反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x51").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 下发关门信号异常: " + e.getMessage()).content("未反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info("下发电气信号失败:" + e.getMessage());
log.error("下发关门信号失败", e);
}
if (elevatorDoorDeviceDriver.getOpen() == 0 && elevatorDoorDeviceDriver.getCall() == 0) {
log.info("读取关门信号值为:{}", elevatorDoorDeviceDriver.getOpen());
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x51")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x51").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
} else {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x51")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 未满足反馈条件, call=" + elevatorDoorDeviceDriver.getCall() + ", open=" + elevatorDoorDeviceDriver.getOpen())
.content("未反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x51").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 未满足反馈条件, call=" + elevatorDoorDeviceDriver.getCall() + ", open=" + elevatorDoorDeviceDriver.getOpen()).content("未反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info("未下发NDC信号原因: 读取自动门信号值为:{}", elevatorDoorDeviceDriver.getOpen());
}
} else {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x51")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: device_code=" + device_code + " 不是电梯门设备")
.content("未反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x51").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: device_code=" + device_code + " 不是电梯门设备").content("未反馈AGVphase=0x51ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info(device_code + "对应设备号为空!");
}
} //请求充电,需要充电桩伸出到位
@@ -446,83 +287,29 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
//carno是车号
//ADDR_STATION 是AGV站点号对应的充电桩桩号
Integer stationNo = ADDR_STATION.get(ikey);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x64")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x64").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
if (ObjectUtil.isEmpty(stationNo)) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x64")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: ikey=" + ikey + " 未映射到充电桩stationNo")
.content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x64").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: ikey=" + ikey + " 未映射到充电桩stationNo").content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
continue;
}
try {
BMSSocketConnectionAutoRun.writeStartChargeAndArmExtend(stationNo);
} catch (Exception e) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x64").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 下发组合命令(开始充电+伸臂)异常: " + e.getMessage()).content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
continue;
}
boolean armExtended = false;
try {
armExtended = BMSSocketConnectionAutoRun.isArmExtended(stationNo);
armExtended = BMSSocketConnectionAutoRun.waitArmExtended(stationNo, BMS_COMMAND_WAIT_TIMEOUT_MS);
} catch (Exception e) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x64")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 查询充电臂状态异常: " + e.getMessage())
.content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x64").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 等待充电桩伸出到位异常: " + e.getMessage()).content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
continue;
}
if (armExtended) {
try {
BMSSocketConnectionAutoRun.writeStartCharge(stationNo);
}catch (Exception e){
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x64")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 下发开始充电异常: " + e.getMessage())
.content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
continue;
}
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x64")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x64").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
} else {
try {
BMSSocketConnectionAutoRun.writeArmExtend(stationNo);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x64")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 充电臂未伸出,已下发伸臂命令")
.content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
} catch (Exception e) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x64")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 下发伸臂命令异常: " + e.getMessage())
.content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
continue;
}
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x64").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 已下发组合命令(开始充电+伸臂)但充电桩未伸出到位不给NDC反馈").content("未反馈AGVphase=0x64ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
}
}
//请求离开,需要充电桩缩回到位
@@ -531,61 +318,32 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
//carno是车号
//ADDR_STATION 是AGV站点号对应的充电桩桩号
Integer stationNo = ADDR_STATION.get(ikey);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x66")
.request_direction("AGV->ACS")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.content("phase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x66").request_direction("AGV->ACS").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).content("phase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
if (ObjectUtil.isEmpty(stationNo)) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x66")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: ikey=" + ikey + " 未映射到充电桩stationNo")
.content("未反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x66").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: ikey=" + ikey + " 未映射到充电桩stationNo").content("未反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
continue;
}
boolean armRetracted = BMSSocketConnectionAutoRun.isArmRetracted(stationNo);
if (armRetracted) {
try {
BMSSocketConnectionAutoRun.writeStopCharge(stationNo);
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x66")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data))
.content("已反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
} catch (Exception e) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x66")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 停止充电或反馈异常: " + e.getMessage())
.content("未反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
}
} else {
BMSSocketConnectionAutoRun.writeStopCharge(stationNo);
BMSSocketConnectionAutoRun.writeArmRetract(stationNo);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x66")
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 充电臂未缩回到位,下发退回")
.content("未反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo)
.build());
try {
BMSSocketConnectionAutoRun.writeStopChargeAndArmRetract(stationNo);
} catch (Exception e) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x66").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 下发组合命令(停止充电+退回伸臂)异常," + e.getMessage()).content("未反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
continue;
}
}
else {
//退回到位
boolean armRetracted = false;
try {
armRetracted = BMSSocketConnectionAutoRun.waitArmRetracted(stationNo, BMS_COMMAND_WAIT_TIMEOUT_MS);
} catch (Exception e) {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x66").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 等待停止充电/退回到位异常: " + e.getMessage()).content("未反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
continue;
}
if (armRetracted) {
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x66").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param(ObjectUtil.isEmpty(data) ? "" : Bytes2HexString(data)).content("已反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
} else {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x66").request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 已下发组合命令(停止充电+退回伸臂)但充电桩未同时满足停止充电和退回到位不给NDC反馈").content("未反馈AGVphase=0x66ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code + "stationNo=" + stationNo).build());
}
} else {
if (phase == 0x70 || phase == 0x71 || phase == 0x72 || phase == 0x73 || phase == 0x74) {
device = deviceAppService.findDeviceByCode(Integer.toString(arr[18] * 256 + arr[19]));
} else {
@@ -598,14 +356,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable {
agvNdcTwoDeviceDriver.processSocket(arr);
}
} else {
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder()
.request_url("socket://ndc/phase/0x" + Integer.toHexString(phase).toUpperCase())
.request_direction("ACS->AGV")
.method("NDCSocketConnectionAutoRun.autoRun")
.request_param(bs.toString().toUpperCase())
.response_param("原因: 当前phase=" + phase + " 未找到对应设备")
.content("未反馈AGVphase=0x" + Integer.toHexString(phase).toUpperCase() + "ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code)
.build());
luceneExecuteLogService.interfaceExecuteLog(LuceneLogDto.builder().request_url("socket://ndc/phase/0x" + Integer.toHexString(phase).toUpperCase()).request_direction("ACS->AGV").method("NDCSocketConnectionAutoRun.autoRun").request_param(bs.toString().toUpperCase()).response_param("原因: 当前phase=" + phase + " 未找到对应设备").content("未反馈AGVphase=0x" + Integer.toHexString(phase).toUpperCase() + "ikey=" + ikey + "index=" + index + "agvaddr=" + agvaddr + "device_code=" + device_code).build());
log.info("当前phase" + phase + "未找到对应设备");
}
} catch (Exception e) {

View File

@@ -83,6 +83,17 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic
String error_type = "agv_error_type";
/**
* 屏蔽拆封盖机需要用到
* 四点任务从拆包机对接位->料筒库缓存位空位;从料筒库缓存位空桶位->拆包机对接位;
* 在拆包机对接位取货完成后,需要人工确认盖盖子
* 在拆包机对接位放货前,需要人工拆盖子
* 拆盖标记 open_flag 封盖标记close_flag
*/
private boolean open_flag = false;
private boolean close_flag = false;
private Integer lastPhase = 0;
/**

View File

@@ -53,6 +53,7 @@ public class WmsToAcsController {
@PostMapping("/areaControl")
@Log(value = "区域控制")
@SaIgnore
public ResponseEntity<Object> areaControl(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(wmstoacsService.areaControl(whereJson), HttpStatus.OK);
}