From 7340bfc26d0579270dae39144ba2dda12852d02e Mon Sep 17 00:00:00 2001 From: zds <2388969634@qq.com> Date: Thu, 6 Mar 2025 10:16:42 +0800 Subject: [PATCH] =?UTF-8?q?opt:=E8=87=AA=E5=8A=A8=E4=B8=8B=E5=8F=91?= =?UTF-8?q?=E5=88=86=E9=85=8D=E5=85=85=E7=94=B5=E4=BB=BB=E5=8A=A1=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/nl/acs/AcsConfig.java | 4 ++ .../org/nl/acs/agv/server/NDCAgvService.java | 3 + .../agv/server/impl/NDCAgvServiceImpl.java | 72 ++++++++++++++++++- .../run/OneNDCSocketConnectionAutoRun.java | 37 +++++++++- .../agv/ndcone/AgvNdcOneDeviceDriver.java | 22 ++++++ 5 files changed, 136 insertions(+), 2 deletions(-) diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java index 2d9a98f..d249f4e 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java @@ -58,4 +58,8 @@ public interface AcsConfig { String MAXSENDTASKTIME = "maxSendTaskTime"; //指令下发立库 String INSTSENDLK = "instSendLk"; + + String ELECTRIC ="electric"; + + String IS_ATUO_ELECTRIC ="is_atuo_electric"; } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/NDCAgvService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/NDCAgvService.java index d1c9d24..aabe0cb 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/NDCAgvService.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/NDCAgvService.java @@ -40,4 +40,7 @@ public interface NDCAgvService { * @return */ public boolean createChargingTaskToNDC(String carno); + + + public void charge(String carno); } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java index 0fc13bd..69f45bf 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java @@ -16,6 +16,8 @@ import org.nl.acs.log.LokiLogType; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; +import org.nl.system.service.dict.ISysDictService; +import org.nl.system.service.dict.dao.Dict; import org.nl.system.service.param.ISysParamService; import org.nl.common.utils.CodeUtil; import org.nl.config.SpringContextHolder; @@ -23,6 +25,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.HashMap; +import java.util.List; import java.util.Map; @Slf4j @@ -34,7 +37,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { private final DeviceAppService deviceAppService; private final ISysParamService paramService; private final AcsToWmsService acsToWmsService; - + private final ISysDictService dictService; private final DeviceExecuteLogService logServer; Map AGVDeviceStatus = new HashMap(); @@ -193,6 +196,73 @@ public class NDCAgvServiceImpl implements NDCAgvService { return b; } + @Override + public void charge(String carno) { + //检查数据字典station为0的参数 + //分配车辆 + List dictList= dictService.getDictByName("station"); + int satation=0; + Dict temp=new Dict(); + for(Dict dict : dictList){ + if ("1".equals(dict.getValue())&&carno.equals(dict.getPara2())){ + log.info("当前车辆{}已分配充电桩{},退出后续判断",carno,dict.getPara1()); + return; + } + } + for(Dict dict : dictList){ + if ("0".equals(dict.getValue())){ + satation = Integer.parseInt(dict.getPara1()); + temp=dict; + break; + } + } + if(satation!=0){ + String instcode =CodeUtil.getNewCode("INSTRUCT_NO"); + byte ikeyhigh = (byte) IntToHexHigh(Integer.parseInt(instcode)); + byte ikeylow = (byte) IntToHexLow(Integer.parseInt(instcode)); + byte carhigh = (byte) IntToHexHigh(Integer.parseInt(carno)); + byte carlow = (byte) IntToHexLow(Integer.parseInt(carno)); + byte satationhigh = (byte) IntToHexHigh(satation); + byte satationlow = (byte) IntToHexLow(satation); + String str = "十进制下发:"; + String str1 = "十六进制下发:"; + str += "ikey:" + (Integer.parseInt(instcode)); + str1 += "ikey:" + hexToString(ikeyhigh & 0xFF) + hexToString(ikeylow & 0xFF); + str += "carno:" + (Integer.parseInt(carno)); + str1 += "carno:" + hexToString(carhigh & 0xFF) + hexToString(carlow & 0xFF); + str += "/satation:" + (satation); + str1 += "/satation:" + hexToString(satationhigh & 0xFF) + hexToString(satationlow & 0xFF); + + byte[] b = new byte[]{(byte) 0X87, (byte) 0XCD, + (byte) 0X00, (byte) 0X08, + (byte) 0X00, (byte) 0X0E, + (byte) 0X00, (byte) 0X01, + (byte) 0X00, (byte) 0X71, + (byte) 0X00, (byte) 0X0A, + (byte) 0X64, (byte) 0X80, + (byte) 0X00, (byte) 0X01, + (byte) ikeyhigh, (byte) ikeylow, + (byte) carhigh, (byte) carlow, + (byte) satationhigh, (byte) satationlow + + }; + log.info("下发AGV充电任务--{}", str1); + + try{ + OneNDCSocketConnectionAutoRun.write(b); + } catch (Exception e){ + log.error("下发充电任务失败{}{}",e,e.getMessage()); + } + + temp.setValue("1"); + temp.setPara2(String.valueOf(carno)); + dictService.updateDetail(temp); + + }else{ + log.error("目前暂无可使用充电桩充电桩,暂不分配{}充电任务",carno); + } + } + @Override public boolean createChargingTaskToNDC(String carno) { byte carhigh = (byte) IntToHexHigh(Integer.parseInt(carno)); diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java index c2c2722..986415f 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java @@ -17,6 +17,8 @@ import org.nl.acs.instruction.service.impl.InstructionServiceImpl; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.task.service.TaskService; +import org.nl.system.service.dict.ISysDictService; +import org.nl.system.service.dict.dao.Dict; import org.nl.system.service.lucene.LuceneExecuteLogService; import org.nl.system.service.param.ISysParamService; import org.nl.config.SpringContextHolder; @@ -59,6 +61,8 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { AutoRunService autoRunService; @Autowired LuceneExecuteLogService luceneExecuteLogService; + @Autowired + ISysDictService dictService; public OneNDCSocketConnectionAutoRun() { @@ -127,6 +131,9 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { int agvaddr = arr[18] * 256 + arr[19]; //车号 int carno = arr[20]; + //充电桩站点号 + int station=arr[25]; + Instruction link_inst = null; Instruction inst = null; List insts = null; @@ -245,8 +252,36 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } } data = NDCAgvService.sendAgvOneModeInst(phase, index, 0, 0, 0, 0, 0); + //充电任务下发成功上报 + } else if (phase == 0x64){ + log.info("AGV车号{}反馈充电任务下发成功,锁定充电桩{}",agvaddr,station); + List dictList= dictService.getDictByName("station"); + for(Dict dict : dictList){ + if (Integer.parseInt(dict.getPara1())==station){ + dict.setValue("1"); + dict.setPara2(String.valueOf(agvaddr)); + dictService.updateDetail(dict); + break; + } + } + //充电成功 + }else if (phase == 0x65){ + log.info("AGV车号{}反馈充电中,充电桩{}",agvaddr,station); + //充电取消上报 + }else if (phase == 0x66){ + log.info("AGV车号{}反馈充电任务已取消,释放充电桩{}",agvaddr,station); + List dictList= dictService.getDictByName("station"); + for(Dict dict : dictList){ + if (Integer.parseInt(dict.getPara1())==station){ + dict.setValue("0"); + dict.setPara2(""); + dictService.updateDetail(dict); + break; + } + } + } - } else { + else { //上报异常信息 //(不需要WCS反馈) if (phase == 0x67) { diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java index 3a1eb43..aa3bef9 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java @@ -9,6 +9,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.acs.AcsConfig; import org.nl.acs.agv.server.NDCAgvService; import org.nl.acs.auto.run.OneNDCSocketConnectionAutoRun; import org.nl.acs.device.domain.Device; @@ -75,6 +76,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic int last_electric_qty = 0; int last_status = 0; int last_error = 0; + boolean isCharge = false; @LokiLog(type = LokiLogType.ACS_TO_LMS) public synchronized void processSocket(int[] arr) throws Exception { @@ -322,7 +324,27 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic agvaddr_copy = agvaddr; data = NDCAgvService.sendAgvOneModeInst(phase, index, 0, 0, 0, 0, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + }else if (phase == 0x73) { + //agv电量 + electric_qty = ikey; + //是否开启自动充电 + String is_atuo_electric = paramService.findByCode(AcsConfig.IS_ATUO_ELECTRIC).getValue(); + if("1".equals(is_atuo_electric)){ + int electric = Integer.parseInt(paramService.findByCode(AcsConfig.ELECTRIC).getValue()); + if (electric_qty>0&&electric_qty < electric) { + log.info("当前车辆{}电量为{}低于{},开始判断是否需要充电!", this.device_code, electric_qty,electric); + NDCAgvService.charge(String.valueOf(this.agvaddr)); + isCharge =true; + } + } + } else if (phase == 0x74) { + //三色灯状态 + status = ikey; } + + + + if (!ObjectUtil.isEmpty(data)) { logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); OneNDCSocketConnectionAutoRun.write(data);