From ce5c100923614750fe1afb895e93e5d328154e93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?= Date: Thu, 10 Aug 2023 18:01:54 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E5=8F=8D=E9=A6=88=E5=8A=A8=E4=BD=9C?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=20=E7=AB=99=E7=82=B9=E5=9C=A8=E5=B8=AD?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=20=E6=8E=A5=E5=8F=A3=E4=B8=8E=E8=B0=83?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/device_driver/DriverTypeEnum.java | 34 +- .../standard_inspect/ReadUtil.java | 84 +- .../agv/ndcone/AgvNdcOneDeviceDriver.java | 718 +++++++++++++++++- .../standard_autodoor/ItemProtocol.java | 72 ++ .../StandardAutoDoorDefinition.java | 65 ++ .../StandardAutoDoorDeviceDriver.java | 156 ++++ .../StandardInspectSiteDeviceDriver.java | 149 +--- .../driver/AbstractOpcDeviceDriver.java | 141 ++-- .../FoldDiscSiteDefination.java | 65 ++ .../FoldDiscSiteDeviceDriver.java | 250 ++++++ .../fold_disc_site/ItemProtocol.java | 117 +++ .../acs/ext/wms/service/AcsToWmsService.java | 2 +- .../wms/service/impl/AcsToWmsServiceImpl.java | 50 +- .../wms/service/impl/WmsToAcsServiceImpl.java | 6 + .../service/InstructionService.java | 2 + .../service/impl/InstructionServiceImpl.java | 26 + .../modules/quartz/task/AutoCreateInst.java | 73 ++ 17 files changed, 1757 insertions(+), 253 deletions(-) create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/ItemProtocol.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDefinition.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDeviceDriver.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDefination.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDeviceDriver.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/ItemProtocol.java diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java index 29d5415..5c11575 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java @@ -15,35 +15,11 @@ public enum DriverTypeEnum { STORAGE(3, "standard_storage", "标准版-货架", "storage"), -// SCANNER(4, "standard_scanner", "标准版-扫码器", "scanner"), - -// INSPECT_CONVEYOR_CONTROL(5, "standard_conveyor_control", "标准版-输送机-控制点", "conveyor"), -// -// INSPECT_CONVEYOR_MONITOR(6, "standard_conveyor_monitor", "标准版-输送机-监控点", "conveyor"), - - AGV_NDC_ONE(7, "agv_ndc_one", "NDCAGV", "agv"); - -// AGV_NDC_TWO(8, "agv_ndc_two", "NDC2楼AGV", "agv"), - -// HONGXIANG_DEVICE(9, "hongxiang_device", "烘箱设备点位", "conveyor"), -// -// OVEN_MANIPULATOR(10, "oven_manipulator", "烘箱-行架机械手", "station"), -// -// SLIT_TWO_MANIPULATOR(11, "slit_two_manipulator", "分切双工位-行架机械手", "station"), -// -// BOX_PALLETIZING_MANIPULATOR(12, "box_palletizing_manipulator", "木箱码垛-行架机械手", "station"), -// -// SIEMENS_CONVEYOR(13, "siemens_conveyor", "西门子-输送机驱动", "conveyor"), -// -// HONGXIANG_CONVEYOR(13, "hongxiang_conveyor", "烘箱对接位", "conveyor"), -// -// INSPECT_CONVEYOR_CONTROL_WITH_SCANNER(14, "standard_conveyor_control_with_scanner", "标准版-输送机-控制点-关联扫码", "conveyor"), -// -// PLUG_PULL_DEVICE_SITE(15, "plug_pull_device_site", "插拔轴站点", "conveyor"), -// -// SIEMENS_CONVEYOR_LABELING(16, "siemens_conveyor_labeling", "西门子-输送机驱动-贴标", "conveyor"), -// -// SIEMENS_CONVEYOR_CKK(17, "siemens_conveyor_ckk", "西门子-输送机驱动-出库口", "conveyor"); + AUTODOOR(4, "standard_auto_door", "标准版-自动门", "auto_door"), + + AGV_NDC_ONE(5, "agv_ndc_one", "NDCAGV", "agv"), + + FOLD_DISC_SITE(6, "fold_disc_site", "叠盘机", "station"); //驱动索引 diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/standard_inspect/ReadUtil.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/standard_inspect/ReadUtil.java index cb22b1d..69714e1 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/standard_inspect/ReadUtil.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/standard_inspect/ReadUtil.java @@ -25,6 +25,49 @@ import java.util.concurrent.TimeUnit; public class ReadUtil { + /** + * 发布订阅测试 + */ + private static final int PERIOD = 100; + + private static final int SLEEP = 2000; + + public static void test() throws AlreadyConnectedException, JIException, UnknownHostException, AddFailedException, NotConnectedException, DuplicateGroupException, InterruptedException { + /*ConnectionInformation ci = new ConnectionInformation(); + ci.setHost("10.1.5.123"); + ci.setDomain(""); + ci.setUser("freud"); + ci.setPassword("password"); + ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305"); + + Server server = new Server(ci, + Executors.newSingleThreadScheduledExecutor());*/ + Server server = getServer(); + + // server.connect(); + + AccessBase access = new Async20Access(server, PERIOD, false); + + access.addItem("RD1.RD1.B21.mode", new DataCallback() { + + private int count; + + @SneakyThrows + public void changed(Item item, ItemState itemstate) { + System.out.println("[" + (++count) + "],ItemName:[" + + item.getId() + "],value:" + itemstate.getValue()); + System.out.println(itemstate.getValue().isArray()); + List listB = Arrays.asList(itemstate.getValue().toString()); + System.out.println(listB.get(0)); + + } + }); + + access.bind(); + Thread.sleep(SLEEP); + access.unbind(); + server.dispose(); + } public static Server getServer(String opc_id) { //OPC表【acs_opc】 @@ -51,26 +94,51 @@ public class ReadUtil { return server; } + public static Server getServer() { + //RD1.RD1.1028 + // 连接信息 + ConnectionInformation ci = new ConnectionInformation(); + ci.setHost("192.168.81.251"); + ci.setDomain(""); + ci.setUser("administrator"); + ci.setPassword("Huawei@123"); + ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729"); + final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor()); + try { + server.connect(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (JIException e) { + e.printStackTrace(); + } catch (AlreadyConnectedException e) { + e.printStackTrace(); + } + return server; + } + public static void write(Map strings, Server server) { try { //Group group = this.opcServerService.getServer(opcServiceCode); + try { + server.connect(); + } catch (AlreadyConnectedException ignored) { + } Group group = server.addGroup(); - Iterator it = strings.keySet().iterator(); - while (it.hasNext()) { - String key = (String) it.next(); + for (String key : strings.keySet()) { Item byteItem = group.addItem(key); Object o = strings.get(key); if (o == null || o.equals("")) { break; } WriteRequest write1 = new WriteRequest(byteItem, new JIVariant(o.toString())); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(write1); - OpcUtl.writeValue(group, (WriteRequest[]) list.toArray(new WriteRequest[0])); + OpcUtl.writeValue(group, list.toArray(new WriteRequest[0])); } - server.disconnect(); } catch (Exception e) { - e.printStackTrace(); + write(strings, server); + } finally { + server.disconnect(); } } @@ -93,6 +161,7 @@ public class ReadUtil { public static Map read(List itemString, Server server) { HashMap map = new HashMap(); try { + //Group group = this.opcServerService.getServer(opcServiceCode); Group group = server.addGroup(); Map items = new LinkedHashMap(); Iterator is = itemString.iterator(); @@ -120,7 +189,6 @@ public class ReadUtil { } catch (Exception e) { e.printStackTrace(); } - return map; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java index 869d212..56e0905 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java @@ -2,20 +2,26 @@ package org.nl.acs.device_driver.basedriver.agv.ndcone; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpStatus; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.Data; import lombok.EqualsAndHashCode; 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.service.DeviceService; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.basedriver.agv.utils.ErrorUtil; import org.nl.acs.device_driver.basedriver.siemens_conveyor.SiemensConveyorDeviceDriver; +import org.nl.acs.device_driver.basedriver.standard_autodoor.StandardAutoDoorDeviceDriver; +import org.nl.acs.device_driver.basedriver.standard_inspect_site.StandardInspectSiteDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_storage.StandardStorageDeviceDriver; import org.nl.acs.device_driver.driver.AbstractDeviceDriver; +import org.nl.acs.device_driver.fold_disc_site.FoldDiscSiteDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; import org.nl.acs.instruction.service.InstructionService; @@ -73,6 +79,8 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic String error_code = "0"; String error_message = ""; + String device_status = "UNKNOWN"; + String message = ""; public synchronized void processSocket(int[] arr) { device_code = this.getDeviceCode(); @@ -89,6 +97,9 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic Instruction link_inst = null; List insts = null; Instruction inst = null; + boolean flag = false; + boolean wcsFlag = false; + boolean wmsFlag = false; boolean link_flag = false; if (ikey != 0) { inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); @@ -111,6 +122,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic inst.setCarno(String.valueOf(carno)); instructionService.update(inst); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); + this.device_status = "EXECUTING"; //到达取货点 //(需要WCS反馈) @@ -149,6 +161,148 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic return; } + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + StandardOrdinarySiteDeviceDriver driver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + + if ("true".equals(device.getExtraValue().get("wait"))) { + // todo 请求wcs是否允许取货 + } else { + wcsFlag = true; + } + + if ("true".equals(device.getExtraValue().get("reqWms")) + && !inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue())) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 1); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + wmsFlag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV取货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + wmsFlag = true; + } + + if (wcsFlag && wmsFlag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV取货。"); + } + } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + StandardInspectSiteDeviceDriver driver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + + if (driver.getMode() != 0 + && driver.getMove() != 0) { + if (!inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 1); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV取货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = ""; + if (driver.getMode() == 0) { + message += "站点未联机,"; + } else { + if (driver.getMove() == 0) { + message += "站点无货,"; + } + } + message += "不允许AGV取货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV取货。"); + } + } else if (device.getDeviceDriver() instanceof FoldDiscSiteDeviceDriver) { + FoldDiscSiteDeviceDriver driver = (FoldDiscSiteDeviceDriver) device.getDeviceDriver(); + if (driver.getMode() != 0 + && driver.getMove() != 0 + && driver.getNumber() != 0) { + if (!inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 1); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV取货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = ""; + if (driver.getMode() == 0) { + message += "站点未联机,"; + } else { + if (driver.getMove() == 0) { + message += "站点无货,"; + } + if (driver.getNumber() == 0) { + message += "站点无托盘,"; + } + } + message += "不允许AGV取货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV取货。"); + } + } + //取货完毕 //(需要WCS反馈) } else if (phase == 0x05) { @@ -185,6 +339,148 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic return; } + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + StandardOrdinarySiteDeviceDriver driver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + + if ("true".equals(device.getExtraValue().get("wait"))) { + // todo 请求wcs是否允许取货 + } else { + wcsFlag = true; + } + + if ("true".equals(device.getExtraValue().get("reqWms")) + && !inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue())) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 2); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + wmsFlag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV取货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + wmsFlag = true; + } + + if (wcsFlag && wmsFlag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV取货后离开。"); + } + } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + StandardInspectSiteDeviceDriver driver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + + if (driver.getMode() != 0 + && driver.getMove() == 0) { + if (!inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 2); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV取货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = ""; + if (driver.getMode() == 0) { + message += "站点未联机,"; + } else { + if (driver.getMove() != 0) { + message += "站点有货,"; + } + } + message += "不允许AGV取货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV取货后离开。"); + } + } else if (device.getDeviceDriver() instanceof FoldDiscSiteDeviceDriver) { + FoldDiscSiteDeviceDriver driver = (FoldDiscSiteDeviceDriver) device.getDeviceDriver(); + if (driver.getMode() != 0 + && driver.getMove() == 0 + && driver.getNumber() == 0) { + if (!inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 2); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV取货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = ""; + if (driver.getMode() == 0) { + message += "站点未联机,"; + } else { + if (driver.getMove() != 0) { + message += "站点有货,"; + } + if (driver.getNumber() != 0) { + message += "站点有托盘,"; + } + } + message += "不允许AGV取货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV取货后离开。"); + } + } + //到达放货点 //(需要WCS反馈) } else if (phase == 0x07) { @@ -218,6 +514,139 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic return; } + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + StandardOrdinarySiteDeviceDriver driver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + + if ("true".equals(device.getExtraValue().get("wait"))) { + // todo 请求wcs是否允许取货 + } else { + wcsFlag = true; + } + + if ("true".equals(device.getExtraValue().get("reqWms")) + && !inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue())) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 3); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + wmsFlag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV放货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + wmsFlag = true; + } + + if (wcsFlag && wmsFlag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV放货。"); + } + } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + StandardInspectSiteDeviceDriver driver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + + if (driver.getMode() != 0 + && driver.getMove() == 0) { + if (!inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 3); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV放货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = ""; + if (driver.getMode() == 0) { + message += "站点未联机,"; + } else { + if (driver.getMove() != 0) { + message += "站点有货,"; + } + } + message += "不允许AGV放货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV放货。"); + } + } else if (device.getDeviceDriver() instanceof FoldDiscSiteDeviceDriver) { + FoldDiscSiteDeviceDriver driver = (FoldDiscSiteDeviceDriver) device.getDeviceDriver(); + if (driver.getMode() != 0) { + if (!inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 3); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV放货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = ""; + if (driver.getMode() == 0) { + message += "站点未联机,"; + } + message += "不允许AGV放货。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV放货。"); + } + } + //放货完毕 //(需要WCS反馈) } else if (phase == 0x09) { @@ -252,6 +681,151 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic return; } + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + StandardOrdinarySiteDeviceDriver driver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + + if ("true".equals(device.getExtraValue().get("wait"))) { + // todo 请求wcs是否允许取货 + } else { + wcsFlag = true; + } + + if ("true".equals(device.getExtraValue().get("reqWms")) + && !inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue())) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 4); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + wmsFlag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV放货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + wmsFlag = true; + } + + if (wcsFlag && wmsFlag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV放货后离开。"); + } + } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + StandardInspectSiteDeviceDriver driver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + + if (driver.getMode() != 0 + && driver.getMove() != 0) { + if (!inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 4); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV放货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = ""; + if (driver.getMode() == 0) { + message += "站点未联机,"; + } else { + if (driver.getMove() == 0) { + message += "站点无货,"; + } + } + message += "不允许AGV放货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV放货后离开。"); + } + } else if (device.getDeviceDriver() instanceof FoldDiscSiteDeviceDriver) { + FoldDiscSiteDeviceDriver driver = (FoldDiscSiteDeviceDriver) device.getDeviceDriver(); + if (driver.getMode() != 0 + && driver.getMove() != 0 + && driver.getNumber() != 0) { + if (!inst.getTask_code().startsWith("-") + && "1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 4); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "不允许AGV放货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = ""; + if (driver.getMode() == 0) { + message += "站点未联机,"; + } else { + if (driver.getMove() == 0) { + message += "站点无货,"; + } + if (driver.getNumber() == 0) { + message += "站点无托盘,"; + } + } + message += "不允许AGV放货后离开。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许AGV放货后离开。"); + } + } + + if (flag) { + this.device_status = "IDLE"; + } } //到达位置点 //(需要WCS反馈) @@ -262,19 +836,155 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } else if (phase == 0x50) {//进入区域 - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + if (agvaddr == 0) { + agvaddr = agvaddr_copy; + } + if (agvaddr < 1) { + logServer.deviceExecuteLog(this.device_code, "", "", "agv地址参数有误,phase:" + phase); + return; + } + if (agvaddr != 0) { + old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); + if (StrUtil.contains(old_device_code, "-")) { + String[] point = old_device_code.split("-"); + device_code = point[0]; + } else if (StrUtil.contains(old_device_code, ".")) { + String[] point = old_device_code.split("\\."); + device_code = point[0]; + } else { + device_code = old_device_code; + } + } + + device = deviceAppService.findDeviceByCode(device_code); + if (ObjectUtil.isEmpty(device_code)) { + log.info(agvaddr + "对应设备号为空!"); + return; + } + + if (device.getDeviceDriver() instanceof StandardAutoDoorDeviceDriver) { + StandardAutoDoorDeviceDriver driver = (StandardAutoDoorDeviceDriver) device.getDeviceDriver(); + + if (driver.getMode() != 0) { + if ("1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 5); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "无法开门。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = "自动门未联机,无法开门。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + driver.writing(1); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许开门。"); + } + + if (driver.getAction() == 1) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + } + } } else if (phase == 0x51) {//离开区域 - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + if (agvaddr == 0) { + agvaddr = agvaddr_copy; + } + if (agvaddr < 1) { + logServer.deviceExecuteLog(this.device_code, "", "", "agv地址参数有误,phase:" + phase); + return; + } + if (agvaddr != 0) { + old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); + if (StrUtil.contains(old_device_code, "-")) { + String[] point = old_device_code.split("-"); + device_code = point[0]; + } else if (StrUtil.contains(old_device_code, ".")) { + String[] point = old_device_code.split("\\."); + device_code = point[0]; + } else { + device_code = old_device_code; + } + } + + device = deviceAppService.findDeviceByCode(device_code); + if (ObjectUtil.isEmpty(device_code)) { + log.info(agvaddr + "对应设备号为空!"); + return; + } + + if (device.getDeviceDriver() instanceof StandardAutoDoorDeviceDriver) { + StandardAutoDoorDeviceDriver driver = (StandardAutoDoorDeviceDriver) device.getDeviceDriver(); + + if (driver.getMode() != 0) { + if ("1".equals(paramService.findByCode(AcsConfig.HASWMS).getValue()) + && "true".equals(device.getExtraValue().get("reqWms"))) { + JSONObject form = new JSONObject(); + form.put("vehicle_code", inst.getVehicle_code()); + form.put("status", 6); + form.put("device_code", device_code); + form.put("task_code", inst.getTask_code()); + JSONObject result = acsToWmsService.feedAgvTaskStatus(new JSONArray() {{ + add(form); + }}); + if (HttpStatus.HTTP_OK == result.getIntValue("status")) { + flag = true; + } else { + String resultMessage = result.getString("message"); + this.message = resultMessage; + String message = resultMessage + "无法关门。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + } else { + flag = true; + } + } else { + String message = "自动门未联机,无法关门。"; + driver.setMessage(message); + logServer.deviceExecuteLog(device_code, "", "", message); + } + + if (flag) { + driver.writing(2); + this.message = ""; + driver.setMessage(""); + logServer.deviceExecuteLog(device_code, "", "", "允许关门。"); + } + + if (driver.getAction() == 2) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + } + } } else if (phase == 0x67) {//agv异常 if (ikey == 0) { this.setErrorInfo(ikey, "0", "正常"); + this.device_status = "IDLE"; } else { Map error = ErrorUtil.getAgvErrorMsg(ikey); String code = error.get("code"); String info = error.get("info"); this.setErrorInfo(ikey, code, info); + this.device_status = "ERROR"; } data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); last_error = error; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/ItemProtocol.java new file mode 100644 index 0000000..d1fd7e6 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/ItemProtocol.java @@ -0,0 +1,72 @@ +package org.nl.acs.device_driver.basedriver.standard_autodoor; + +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device_driver.standard_inspect.ItemDto; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class ItemProtocol { + public static String item_heartbeat = "heartbeat"; + public static String item_mode = "mode"; + public static String item_action = "action"; + public static String item_error = "error"; + public static String item_to_command = "to_command"; + + + private StandardAutoDoorDeviceDriver driver; + + public ItemProtocol(StandardAutoDoorDeviceDriver driver) { + this.driver = driver; + } + + public int getHeartbeat() { + return this.getOpcIntegerValue(item_heartbeat); + } + + public int getMode() { + return this.getOpcIntegerValue(item_mode); + } + + public int getAction() { + return this.getOpcIntegerValue(item_action); + } + + public int getError() { + return this.getOpcIntegerValue(item_error); + } + + public int getToCommand() { + return this.getOpcIntegerValue(item_to_command); + } + + + public int getOpcIntegerValue(String protocol) { + Integer value = this.driver.getIntegeregerValue(protocol); + if (value == null) { + log.error("读取错误!"); + } else { + return value; + } + return 0; + + } + + public static List getReadableItemDtos() { + ArrayList list = new ArrayList<>(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB51.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB51.B1", Boolean.TRUE)); + list.add(new ItemDto(item_action, "动作信号", "DB51.B2")); + list.add(new ItemDto(item_error, "报警信号", "DB51.B4")); + return list; + } + + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList<>(); + list.add(new ItemDto(item_to_command, "作业命令", "DB52.W2", Boolean.TRUE)); + return list; + } + +} + diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDefinition.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDefinition.java new file mode 100644 index 0000000..cab2b5b --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDefinition.java @@ -0,0 +1,65 @@ +package org.nl.acs.device_driver.basedriver.standard_autodoor; + +import org.nl.acs.device.device_driver.standard_inspect.ItemDto; +import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.defination.OpcDeviceDriverDefination; +import org.nl.acs.opc.Device; +import org.nl.acs.opc.DeviceType; +import org.springframework.stereotype.Service; + +import java.util.LinkedList; +import java.util.List; + +/** + * 自动门驱动定义 + */ +@Service +public class StandardAutoDoorDefinition implements OpcDeviceDriverDefination { + @Override + public String getDriverCode() { + return "standard_autodoor"; + } + + @Override + public String getDriverName() { + return "标准版-自动门"; + } + + @Override + public String getDriverDescription() { + return "标准版-自动门"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new StandardAutoDoorDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return StandardAutoDoorDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList<>(); + types.add(DeviceType.conveyor); + return types; + } + + @Override + public List getReadableItemDtos() { + return getReadableItemDtos2(); + } + + public static List getReadableItemDtos2() { + return ItemProtocol.getReadableItemDtos(); + } + + @Override + public List getWriteableItemDtos() { + return ItemProtocol.getWriteableItemDtos(); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDeviceDriver.java new file mode 100644 index 0000000..28de621 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDeviceDriver.java @@ -0,0 +1,156 @@ +package org.nl.acs.device_driver.basedriver.standard_autodoor; + +import com.alibaba.fastjson.JSONObject; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; +import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.opc.Device; +import org.nl.acs.route.service.RouteLineService; +import org.nl.acs.task.service.TaskService; +import org.nl.modules.wql.util.SpringContextHolder; +import org.openscada.opc.lib.da.Server; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 自动门驱动 + */ +@Slf4j +@Getter +@Setter +@RequiredArgsConstructor +public class StandardAutoDoorDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver { + protected ItemProtocol itemProtocol = new ItemProtocol(this); + + InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl"); + + DeviceService deviceservice = SpringContextHolder.getBean("deviceServiceImpl"); + + RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); + + TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); + String container; + String container_type_desc; + String last_container_type_desc; + String last_container; + //放货准备锁 + String putReadyLock = null; + //有货标记 + protected boolean has_goods_tag = false; + String devicecode; + int mode = 0; + int action = 0; + int error = 0; + Boolean iserror = false; + + int move = 0; + int task = 0; + int last_action = 0; + int last_mode = 0; + int last_error = 0; + int last_move = 0; + int last_task = 0; + + boolean hasVehicle = false; + boolean isReady = false; + protected int instruction_num = 0; + protected int instruction_num_truth = 0; + protected boolean hasGoods = false; + boolean isFold = false; + private String assemble_check_tag; + private Boolean sampleMode0; + private Boolean sampleMode3; + private Integer sampleError; + private Boolean sampleOnline; + protected String displayMessage = null; + public int display_message_time_out = 30000; + public Date display_message_time; + protected String current_stage_instruction_message; + protected String last_stage_instruction_message; + Integer heartbeat_tag; + private Date instruction_require_time = new Date(); + private Date instruction_finished_time = new Date(); + + private int instruction_require_time_out; + boolean requireSucess = false; + + private int instruction_finished_time_out; + + int branchProtocol = 0; + + String message = ""; + + @Override + public Device getDevice() { + return this.device; + } + + + @Override + public void execute() { + devicecode = this.getDevice().getDevice_code(); + mode = this.itemProtocol.getMode(); + action = this.itemProtocol.getAction(); + error = this.itemProtocol.getError(); + + + last_action = action; + last_mode = mode; + last_error = error; + } + + public synchronized String getStatus() { + JSONObject jo = new JSONObject(); + + if (action == 1) { + jo.put("name", this.getDevice().getDevice_code()); + jo.put("status", "OPEN"); + + } else if (action == 2) { + jo.put("name", this.getDevice().getDevice_code()); + jo.put("status", "CLOSE"); + + } else { + jo.put("name", this.getDevice().getDevice_code()); + jo.put("status", "ERROR"); + } + return jo.toString(); + } + + + public void writing(int command) { + String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command; + + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_command, command); + ReadUtil.write(itemMap, server); + server.disconnect(); + log.info("下发PLC信号:{},{}", to_command, command); + System.out.println("设备:" + devicecode + ",下发PLC信号:" + to_command + ",value:" + command); + + } + + public synchronized void OpenOrClose(String type) { + + //开门 + if ("1".equals(type)) { + writing(1); + } else { + writing(2); + } + + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java index fcdd34c..c7b87f6 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java @@ -2,7 +2,9 @@ package org.nl.acs.device_driver.basedriver.standard_inspect_site; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import lombok.Data; import lombok.RequiredArgsConstructor; @@ -13,6 +15,7 @@ import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.monitor.DeviceStageMonitor; @@ -29,6 +32,7 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.openscada.opc.lib.da.Server; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import java.util.Date; import java.util.HashMap; @@ -51,6 +55,8 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); @Autowired TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); + + AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl"); String container; String container_type_desc; String last_container_type_desc; @@ -87,7 +93,7 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp private Date instruction_require_time = new Date(); private Date instruction_finished_time = new Date(); - private int instruction_require_time_out; + private int instruction_require_time_out = 3000; boolean requireSucess = false; private int instruction_finished_time_out; @@ -129,67 +135,15 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp public void execute() { String message = null; try { - String device_code = this.getDeviceCode(); + devicecode = this.getDeviceCode(); mode = this.itemProtocol.getMode(); error = this.itemProtocol.getError(); move = this.itemProtocol.getMove(); task = this.itemProtocol.getTask(); hasGoods = this.itemProtocol.getMove(); - if (mode != last_mode) { - this.setRequireSucess(false); - } if (move != last_move) { - } - if (error != last_error) { - } - - if (this.getApply_handling()) { - String link_device_code = this.getDevice().getExtraValue().get("link_device_code").toString(); - DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); - Device link_device = appService.findDeviceByCode(link_device_code); - StandardInspectSiteDeviceDriver standardInspectSiteDevicedriver; - if (link_device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { - standardInspectSiteDevicedriver = (StandardInspectSiteDeviceDriver) link_device.getDeviceDriver(); -// if(standardInspectSiteDevicedriver.getMode() != 2){ -// log.debug("设备未待机"); -// return; -// } -// if(standardInspectSiteDevicedriver.getMove() != 0){ -// log.debug("设备不满足放货条件"); -// return; -// } - - //如果目标设备申请叫料 则允许生成任务 - if (standardInspectSiteDevicedriver.getApply_material()) { - TaskDto dto = new TaskDto(); - String now = DateUtil.now(); - dto.setTask_id(IdUtil.simpleUUID()); - dto.setCreate_by(this.getDevice().getDevice_code()); - dto.setUpdate_by(this.getDevice().getDevice_code()); - dto.setStart_point_code(this.getDevice().getDevice_code()); - - String taskcode = CodeUtil.getNewCode("TASK_NO"); - dto.setTask_code("-" + taskcode); - dto.setTask_status("0"); - dto.setPriority("101"); -// RouteLineDto jo = routelineserver.findByCode(this.getDevice().getDevice_code()); -// String next_device_codecode = jo.getNext_device_code(); -// if(StrUtil.isEmpty(next_device_codecode)){ -// throw new RuntimeException("该设备未找到对应路由"); -// } - dto.setNext_point_code(standardInspectSiteDevicedriver.getDevicecode()); - dto.setUpdate_time(now); - dto.setCreate_time(now); - - WQLObject wo = WQLObject.getWQLObject("acs_task"); - JSONObject json = (JSONObject) JSONObject.toJSON(dto); - - wo.insert(json); - standardInspectSiteDevicedriver.setApply_material(false); - } - } - this.setApply_handling(false); + this.requireSucess = false; } } catch (Exception var17) { @@ -222,72 +176,14 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp log.debug("设备运转模式:等待工作"); return; case 2: - //申请任务 -// if (this.getApply_handling()) { -// String link_device_code = this.getDevice().getExtraValue().get("link_device_code").toString(); -// DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); -// Device link_device = appService.findDeviceByCode(link_device_code); -// StandardInspectSiteDeviceDriver standardInspectSiteDevicedriver; -// if(link_device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { -// standardInspectSiteDevicedriver = (StandardInspectSiteDeviceDriver) link_device.getDeviceDriver(); -// if(standardInspectSiteDevicedriver.getMode() != 2){ -// log.debug("设备未待机"); -// return; -// } -// if(standardInspectSiteDevicedriver.getMove() != 0){ -// log.debug("设备不满足放货条件"); -// return; -// } -// -// //如果目标设备申请叫料 则允许生成任务 -// if(standardInspectSiteDevicedriver.getApply_material()){ -// TaskDto dto = new TaskDto(); -// String now = DateUtil.now(); -// dto.setTask_id(IdUtil.simpleUUID()); -// dto.setCreate_by(this.getDevice().getDevice_code()); -// dto.setUpdate_by(this.getDevice().getDevice_code()); -// dto.setStart_point_code(this.getDevice().getDevice_code()); -// -// String taskcode = CodeGenerateUtil.getNewCode("TASK_NO"); -// dto.setTask_code("-"+taskcode); -// dto.setTask_status("0"); -// dto.setPriority("101"); -// RouteLineDto jo = routelineserver.findByCode(this.getDevice().getDevice_code()); -// String next_device_codecode = jo.getNext_device_code(); -// if(StrUtil.isEmpty(next_device_codecode)){ -// throw new RuntimeException("该设备未找到对应路由"); -// } -// dto.setNext_point_code(next_device_codecode); -// dto.setUpdate_time(now); -// dto.setCreate_time(now); -// -// WQLObject wo = WQLObject.getWQLObject("acs_task"); -// JSONObject json = (JSONObject) JSONObject.toJSON(dto); - -// wo.insert(json); -// standardInspectSiteDevicedriver.setApply_material(false); -// } -// } -// this.setApply_handling(false); -// } - - if (material.length() > 0 && qty.length() > 0 && !requireSucess) { - this.instruction_require(container); + if (!requireSucess) { + JSONObject param = new JSONObject(); + param.put("device_code", this.devicecode); + param.put("is_have", this.move); + this.shipDeviceUpdate(param); } } - switch (flag) { - //取货完成 - case 1: - writing(2); - return; - //放货完成 - case 2: - writing(3); - return; - - } - } last_mode = mode; last_error = error; @@ -438,6 +334,23 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp } } + private void shipDeviceUpdate(JSONObject param) { + Date date = new Date(); + if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); + } else { + this.instruction_require_time = date; + + HttpResponse response = acsToWmsService.shipDeviceUpdate(param); + if (response.getStatus() == HttpStatus.OK.value()) { + JSONObject result = JSONObject.parseObject(response.body()); + if (ObjectUtil.isNotEmpty(result) && result.getIntValue("status") == HttpStatus.OK.value()) { + this.requireSucess = true; + } + } + } + } + @Override public JSONObject getDeviceStatusName() { JSONObject jo = new JSONObject(); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java index 30eac18..a47f150 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java @@ -17,98 +17,97 @@ import java.util.Iterator; import java.util.Map; public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements OpcDeviceDriver { - UnifiedDataAccessor opcUdw; - - private Date sendTime; - private String last_items; - private int noLog_sendTimeOut; - private Date noLog_sendTime; - private String noLog_last_items; - - public AbstractOpcDeviceDriver() { - this.opcUdw = UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); - } - - @Override - public UnifiedDataAccessor getOpcValueAccessor() { - return this.opcUdw; - } - - public boolean control(Map itemValues) { - - Iterator> it = itemValues.entrySet().iterator(); - - ItemValue p2[]; - p2 = new ItemValue[itemValues.size()]; - int i=0; - while (it.hasNext()) { - Map.Entry entry = it.next(); - System.out.println("即将写入值:"+entry.getKey() + ":" + entry.getValue()); - p2[i] = new ItemValue(); - p2[i].setItem_code(entry.getKey()); - p2[i].setItem_value(entry.getValue()); - i++; + UnifiedDataAccessor opcUdw; + + private Date sendTime; + private String last_items; + private int noLog_sendTimeOut; + private Date noLog_sendTime; + private String noLog_last_items; + + public AbstractOpcDeviceDriver() { + this.opcUdw = UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); } - return this.control(p2); - } + @Override + public UnifiedDataAccessor getOpcValueAccessor() { + return this.opcUdw; + } + public boolean control(Map itemValues) { + Iterator> it = itemValues.entrySet().iterator(); - public boolean control(ItemValue[] itemValues) { - if (itemValues != null && itemValues.length != 0) { - String this_items = JsonUtl.parseWithoutException(itemValues); - boolean need_write = false; - StringBuilder sb = new StringBuilder(); - ItemValue[] var5 = itemValues; - int var6 = itemValues.length; + ItemValue p2[]; + p2 = new ItemValue[itemValues.size()]; + int i = 0; + while (it.hasNext()) { + Map.Entry entry = it.next(); + System.out.println("即将写入值:" + entry.getKey() + ":" + entry.getValue()); + p2[i] = new ItemValue(); + p2[i].setItem_code(entry.getKey()); + p2[i].setItem_value(entry.getValue()); + i++; + } - for (int var7 = 0; var7 < var6; ++var7) { - ItemValue itemValue = var5[var7]; - String code = itemValue.getItem_code(); - Object udw_value = this.getUdwValue(code); - Object write_value = itemValue.getItem_value(); - sb.append(code); - sb.append(":"); - sb.append(JsonUtl.parseWithoutException(udw_value)); - sb.append(";"); + return this.control(p2); + } + + + public boolean control(ItemValue[] itemValues) { + if (itemValues != null && itemValues.length != 0) { + String this_items = JsonUtl.parseWithoutException(itemValues); + boolean need_write = false; + StringBuilder sb = new StringBuilder(); + ItemValue[] var5 = itemValues; + int var6 = itemValues.length; + + for (int var7 = 0; var7 < var6; ++var7) { + ItemValue itemValue = var5[var7]; + String code = itemValue.getItem_code(); + Object udw_value = this.getUdwValue(code); + Object write_value = itemValue.getItem_value(); + sb.append(code); + sb.append(":"); + sb.append(JsonUtl.parseWithoutException(udw_value)); + sb.append(";"); // if (!need_write && !UnifiedDataAppService.isEquals(udw_value, write_value)) { // need_write = true; // } - } - need_write = true; + } + need_write = true; - if (need_write) { - Date date = new Date(); + if (need_write) { + Date date = new Date(); /*if (StringUtl.isEqual(this_items, this.last_items) && date.getTime() - this.sendTime.getTime() < (long) WcsConfig.opc_write_repeat_check) { log.trace("发送时间因为小于{}毫秒,而被无视", WcsConfig.opc_write_repeat_check); return false; }*/ - this.last_items = this_items; - this.sendTime = date; + this.last_items = this_items; + this.sendTime = date; /* this.execute_log.setResource(this.getDevice().getCode(), this.getDevice().getName()); this.execute_log.log("原始记录{}->变更为{}", new Object[]{sb, this_items}); OpcServerService opcServerService = OpcServerFactory.getOpcServerService();*/ - OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class); + OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class); - opcServerService.writeInteger(this.getOpcServer(), itemValues); - UnifiedDataAccessor opcValueAccessor = this.getOpcValueAccessor(); - ItemValue[] var17 = itemValues; - int var18 = itemValues.length; + opcServerService.writeInteger(this.getOpcServer(), itemValues); + UnifiedDataAccessor opcValueAccessor = this.getOpcValueAccessor(); + ItemValue[] var17 = itemValues; + int var18 = itemValues.length; - for (int var19 = 0; var19 < var18; ++var19) { - ItemValue itemValue = var17[var19]; - String code = itemValue.getItem_code(); - Object value = itemValue.getItem_value(); - opcValueAccessor.setValue(code, value); - } - } + for (int var19 = 0; var19 < var18; ++var19) { + ItemValue itemValue = var17[var19]; + String code = itemValue.getItem_code(); + Object value = itemValue.getItem_value(); + opcValueAccessor.setValue(code, value); + } + } - return true; - } else { - throw new WDKException("下发 无内容"); + return true; + } else { + throw new WDKException("下发 无内容"); + } } - } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDefination.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDefination.java new file mode 100644 index 0000000..666b556 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDefination.java @@ -0,0 +1,65 @@ +package org.nl.acs.device_driver.fold_disc_site; + +import org.nl.acs.device.device_driver.standard_inspect.ItemDto; +import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.defination.OpcDeviceDriverDefination; +import org.nl.acs.opc.Device; +import org.nl.acs.opc.DeviceType; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * 晟华叠盘机 + */ +@Service +public class FoldDiscSiteDefination implements OpcDeviceDriverDefination { + @Override + public String getDriverCode() { + return "fold_disc_site"; + } + + @Override + public String getDriverName() { + return "叠盘机"; + } + + @Override + public String getDriverDescription() { + return "叠盘机"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new FoldDiscSiteDeviceDriver()).setDevice(device).setDriverDefination(this); + } + + @Override + public Class getDeviceDriverType() { + return FoldDiscSiteDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList<>(); + types.add(DeviceType.station); + return types; + } + + @Override + public List getReadableItemDtos() { + return getReadableItemDtos2(); + } + + public static List getReadableItemDtos2() { + return ItemProtocol.getReadableItemDtos(); + } + + @Override + public List getWriteableItemDtos() { + return ItemProtocol.getWriteableItemDtos(); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDeviceDriver.java new file mode 100644 index 0000000..bbbff77 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDeviceDriver.java @@ -0,0 +1,250 @@ +package org.nl.acs.device_driver.fold_disc_site; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.RouteableDeviceDriver; +import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; +import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.log.service.DeviceExecuteLogService; +import org.nl.acs.monitor.DeviceStageMonitor; +import org.nl.acs.opc.Device; +import org.nl.acs.route.service.RouteLineService; +import org.nl.acs.route.service.dto.RouteLineDto; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.openscada.opc.lib.da.Server; +import org.springframework.http.HttpStatus; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 晟华叠盘机 + */ +@Slf4j +@Getter +@Setter +@RequiredArgsConstructor +public class FoldDiscSiteDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor { + protected ItemProtocol itemProtocol = new ItemProtocol(this); + + InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl"); + + DeviceService deviceservice = SpringContextHolder.getBean("deviceServiceImpl"); + + RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); + + TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); + + DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + + AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl"); + String device_code; + int mode = 0; + int error = 0; + int move = 0; + int last_mode = 0; + int last_error = 0; + int last_move = 0; + Boolean isonline = true; + int hasGoods = 0; + Boolean iserror = false; + + boolean requireSucess = false; + boolean requireQtySuccess = false; + boolean errorDeviceRecord = false; + JSONObject errorDeviceRecordRequest = new JSONObject(); + + int heartbeat; + int last_heartbeat; + private Date checkHeartbeattime = new Date(); + private Date last_checkHeartbeattime = new Date(); + + int branchProtocol = 0; + + private Date instruction_require_time = new Date(); + private Date instruction_finished_time = new Date(); + + private int instruction_require_time_out = 3000; + private int instruction_finished_time_out; + + String message; + + int number = 0; + int last_number = 0; + + int task = 0; + int last_task = 0; + + @Override + public Device getDevice() { + return this.device; + } + + + @Override + public void execute() { + try { + device_code = this.getDeviceCode(); + + mode = itemProtocol.getMode(); + move = itemProtocol.getMove(); + number = itemProtocol.getNumber(); + error = itemProtocol.getError(); + task = itemProtocol.getTask(); + + if (number != last_number) { + int max_emptypalletnum = Integer.parseInt(this.getDevice().getExtraValue().get("max_emptypalletnum").toString()); + if (number == 0 || number == max_emptypalletnum) { + this.requireSucess = false; + } + } + + } catch (Exception var17) { + return; + } + + //急停 + if (this.isStop()) { + + //未在线无心跳 + } else if (!this.itemProtocol.getIsonline()) { + this.setIsonline(false); + this.setIserror(true); + message = "信号量同步异常"; + //未联机 + } else if (mode == 0) { + this.setIsonline(false); + this.setIserror(true); + message = "未联机"; + //有报警 + } else if (error != 0) { + this.setIsonline(false); + this.setIserror(true); + message = "有报警"; + //无报警 + } else { + this.setIsonline(true); + this.setIserror(false); + message = ""; + switch (mode) { + case 1: + log.debug("设备运转模式:等待工作"); + break; + case 2: + if (!this.requireSucess) { + JSONObject param = new JSONObject(); + param.put("device_code", this.device_code); + param.put("is_have", this.number == 0 ? 0 : 1); + this.shipDeviceUpdate(param); + } + } + } + + last_mode = mode; + last_move = move; + last_number = number; + last_error = error; + last_task = task; + } + + public void writing(String param, String value) { + + String to_param = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + param; + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap<>(); + itemMap.put(to_param, value); + ReadUtil.write(itemMap, server); + server.disconnect(); + logServer.deviceExecuteLog(this.device_code, "", "", param + " 写入 " + value); + } + + public void executing(Server server, Map itemMap) { + ReadUtil.write(itemMap, server); + server.disconnect(); + } + + public void writing(int command) { + String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command; + + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_command, command); + ReadUtil.write(itemMap, server); + ReadUtil.write(itemMap, server); + server.disconnect(); + logServer.deviceExecuteLog(this.device_code, "", "", "to_command 写入 " + command); + } + + private void shipDeviceUpdate(JSONObject param) { + Date date = new Date(); + if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); + } else { + this.instruction_require_time = date; + + HttpResponse response = acsToWmsService.shipDeviceUpdate(param); + if (response.getStatus() == HttpStatus.OK.value()) { + JSONObject result = JSONObject.parseObject(response.body()); + if (ObjectUtil.isNotEmpty(result) && result.getIntValue("status") == HttpStatus.OK.value()) { + this.requireSucess = true; + } + } + } + } + + @Override + public JSONObject getDeviceStatusName() throws Exception { + String mode; + + switch (this.mode) { + case 0: + mode = "脱机"; + break; + case 2: + mode = "待机"; + break; + default: + mode = String.valueOf(this.mode); + } + + JSONObject jo = new JSONObject(); + jo.put("device_name", this.getDevice().getDevice_name()); + jo.put("mode", mode); + jo.put("move", move); + jo.put("error", error); + jo.put("number", number); + jo.put("isError", iserror); + jo.put("isOnline", isonline); + jo.put("message", message); + return jo; + } + + @Override + public void setDeviceStatus(JSONObject data) { + + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/ItemProtocol.java new file mode 100644 index 0000000..a8f1f74 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/ItemProtocol.java @@ -0,0 +1,117 @@ +package org.nl.acs.device_driver.fold_disc_site; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device_driver.standard_inspect.ItemDto; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Getter +@Setter +@SuppressWarnings("unused") +public class ItemProtocol { + public static String item_heartbeat = "heartbeat"; + public static String item_mode = "mode"; + public static String item_move = "move"; + public static String item_number = "number"; + public static String item_error = "error"; + public static String item_task = "task"; + + public static String item_to_command = "to_command"; + public static String item_to_target = "to_target"; + public static String item_to_task = "to_task"; + Boolean isonline; + + private FoldDiscSiteDeviceDriver driver; + + public ItemProtocol(FoldDiscSiteDeviceDriver driver) { + this.driver = driver; + } + + public int getHeartbeat() { + return this.getOpcIntegerValue(item_heartbeat); + } + + public int getMode() { + return this.getOpcIntegerValue(item_mode); + } + + public int getMove() { + return this.getOpcIntegerValue(item_move); + } + + public int getNumber() { + return this.getOpcIntegerValue(item_number); + } + + public int getError() { + return this.getOpcIntegerValue(item_error); + } + + public int getTask() { + return this.getOpcIntegerValue(item_task); + } + + public int getToCommand() { + return this.getOpcIntegerValue(item_to_command); + } + + public int getToTarget() { + return this.getOpcIntegerValue(item_to_target); + } + + public int getToTask() { + return this.getOpcIntegerValue(item_to_task); + } + + //是否有货 + public int hasGoods(int move) { + return move; + } + + + public int getOpcIntegerValue(String protocol) { + Integer value = this.driver.getIntegeregerValue(protocol); + if (value == null) { +// log.error(this.getDriver().getDeviceCode() + ":protocol " + protocol + " 信号同步异常!"); + setIsonline(false); + } else { + setIsonline(true); + return value; + } + return 0; + + } + + public String getOpcStringValue(String protocol) { + String value = this.driver.getStringValue(protocol); + if (value != null) { + return value; + } + return ""; + } + + public static List getReadableItemDtos() { + ArrayList list = new ArrayList<>(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB1.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB1.B1", Boolean.TRUE)); + list.add(new ItemDto(item_move, "广电信号", "DB1.B2")); + list.add(new ItemDto(item_number, "数量", "DB1.B3")); + list.add(new ItemDto(item_error, "error", "DB1.B5")); + list.add(new ItemDto(item_task, "任务号", "DB1.D6")); + return list; + } + + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList<>(); + list.add(new ItemDto(item_to_command, "下发指令", "DB2.W0", Boolean.TRUE)); + list.add(new ItemDto(item_to_target, "下发目标站", "DB2.W2")); + list.add(new ItemDto(item_to_task, "下发任务号", "DB2.D4")); + return list; + } + +} + diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java index 53de2bd..882304f 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java @@ -113,7 +113,7 @@ public interface AcsToWmsService { * @param from * @return */ - HttpResponse feedAgvTaskStatus(JSONArray from); + JSONObject feedAgvTaskStatus(JSONArray from); JSONObject test(JSONObject form); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java index a9dbb5f..cb7c101 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpStatus; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -14,9 +15,9 @@ import org.nl.acs.AcsConfig; import org.nl.acs.device.address.service.AddressService; import org.nl.acs.device.address.service.dto.AddressDto; import org.nl.acs.device.service.DeviceService; +import org.nl.acs.ext.wms.RetryableUtil; import org.nl.acs.ext.wms.data.*; import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.acs.ext.wms.RetryableUtil; import org.nl.modules.common.utils.RedisUtils; import org.nl.modules.system.service.ParamService; import org.slf4j.MDC; @@ -556,31 +557,36 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } @Override - public HttpResponse feedAgvTaskStatus(JSONArray from) { - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - log.info("开始反馈WMS AGV取放货状态,请求参数:{}", from); - this.getTokenFromWms(); - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - AddressDto addressDto = addressService.findByCode("feedAgvTaskStatus"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - HttpResponse result = null; - Map map = new HashMap<>(); - map.put("payload", JSON.toJSONString(from)); - try { - result = HttpRequest.post(url) - .header("Content-Type", "application/json;charset=UTF-8") - .header("Authorization", String.valueOf(redisUtils.get("wms_token"))) - .body(JSON.toJSONString(from)) - .timeout(3000) + public JSONObject feedAgvTaskStatus(JSONArray from) { + try { + MDC.put(log_file_type, log_type); + + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + AddressDto addressDto = addressService.findByCode("feedAgvTaskStatus"); + String methodsUrl = addressDto.getMethods_url(); + String url = wmsUrl + methodsUrl; +// log.info("feedAgvTaskStatus - 请求参数 {}", param); + HttpResponse response = HttpRequest + .post(url) + .body(from.toString()) .execute(); - log.info("反馈WMS AGV取放货状态成功,请求路径:{},请求结果:{}", url, result.body()); - } catch (Exception e) { - log.info("反馈WMS AGV取放货状态失败,请求路径:{},请求结果:{}", url, e.getMessage()); +// log.info("feedAgvTaskStatus - 返回参数 {}", response.body()); + return JSONObject.parseObject(response.body()); } + } catch (Throwable ignored) { + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.HTTP_CLIENT_TIMEOUT); + result.put("message", "请求超时!"); return result; + } finally { + MDC.remove(log_file_type); } - return null; + + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.HTTP_BAD_REQUEST); + result.put("message", "请求失败,未知原因!"); + return result; } @Override diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index ecc9b90..7f2731c 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -496,10 +496,16 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { JSONObject start_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + start_device_code + "'").uniqueResult(0); if (!ObjectUtil.isEmpty(start_device_json)) { start_point_code = (String) start_device_json.get("parent_storage_code") == null ? start_device_code : (String) start_device_json.get("storage_code"); + if (StrUtil.isNotEmpty(start_point_code) && start_point_code.contains(".")) { + start_point_code = start_point_code.substring(0, start_point_code.indexOf(".")); + } } JSONObject next_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + next_device_code + "'").uniqueResult(0); if (!ObjectUtil.isEmpty(next_device_json)) { next_point_code = (String) next_device_json.get("parent_storage_code") == null ? next_point_code : (String) next_device_json.get("storage_code"); + if (StrUtil.isNotEmpty(start_point_code) && start_point_code.contains(".")) { + start_point_code = start_point_code.substring(0, start_point_code.indexOf(".")); + } } if (StrUtil.isNotEmpty(start_point_code) && start_point_code.indexOf("-") > 0) { String str[] = start_point_code.split("-"); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java index 203e45e..eb25aed 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java @@ -276,4 +276,6 @@ public interface InstructionService { void init(String id); + + int queryDeviceInstCount(String nextDeviceCode); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index 97bd083..a7ebe17 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -1435,4 +1435,30 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu ((SiemensConveyorDeviceDriver) startDeviceDriver).writing(list); } } + + @Override + public int queryDeviceInstCount(String device_code) { + if (StrUtil.isBlank(device_code)) { + return 0; + } + + int count = 0; + for (int i = 0; i < instructions.size(); i++) { + Instruction inst = instructions.get(i); + //处理空盘位站点 + String start_code = inst.getStart_point_code(); + if (start_code.contains(".")) { + start_code = start_code.substring(0, start_code.indexOf(".")); + } + String next_code = inst.getNext_point_code(); + if (next_code.contains(".")) { + start_code = start_code.substring(0, start_code.indexOf(".")); + } + if (StrUtil.equals(device_code, start_code) || StrUtil.equals(device_code, start_code)) { + count++; + } + } + + return count; + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java index e575119..2352755 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java @@ -5,8 +5,10 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; +import org.nl.acs.device_driver.fold_disc_site.FoldDiscSiteDeviceDriver; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; import org.nl.acs.route.service.RouteLineService; @@ -107,6 +109,77 @@ public class AutoCreateInst { next_point_code = next_device_code; } + //空盘位生成指令需要另外逻辑 + Device nextDevice = appService.findDeviceByCode(next_device_code); + if (nextDevice.getDeviceDriver() instanceof FoldDiscSiteDeviceDriver) { + FoldDiscSiteDeviceDriver driver = (FoldDiscSiteDeviceDriver) nextDevice.getDeviceDriver(); + if (driver.getMode() == 0) { + log.info("任务 [" + taskcode + "] 终点 [" + nextDevice.getDevice_name() + "] 未联机,无法生成指令。"); + acsTask.setRemark("任务 [" + taskcode + "] 终点 [" + nextDevice.getDevice_name() + "] 未联机,无法生成指令。"); + taskserver.updateByCodeFromCache(acsTask); + continue; + } else if (driver.getError() != 0) { + log.info("任务 [" + taskcode + "] 终点 [" + nextDevice.getDevice_name() + "] 异常,无法生成指令。"); + acsTask.setRemark("任务 [" + taskcode + "] 终点 [" + nextDevice.getDevice_name() + "] 异常,无法生成指令。"); + taskserver.updateByCodeFromCache(acsTask); + continue; + } + int max_emptypalletnum = Integer.parseInt(nextDevice.getExtraValue().get("max_emptypalletnum").toString()); + int nowNumber = driver.getNumber(); + if (nowNumber >= max_emptypalletnum) { + log.info("任务 [" + taskcode + "] 终点 [" + nextDevice.getDevice_name() + "] 已满,无法生成指令。"); + acsTask.setRemark("任务 [" + taskcode + "] 终点 [" + nextDevice.getDevice_name() + "] 已满,无法生成指令。"); + taskserver.updateByCodeFromCache(acsTask); + continue; + } + // 查看是否有相同终点的指令 + int count = instructionService.queryDeviceInstCount(next_device_code); + if (count > 0) { + log.info("任务 [" + taskcode + "] 终点 [" + nextDevice.getDevice_name() + "] 已被占用,无法生成指令。"); + acsTask.setRemark("任务 [" + taskcode + "] 终点 [" + nextDevice.getDevice_name() + "] 已被占用,无法生成指令。"); + taskserver.updateByCodeFromCache(acsTask); + continue; + } + next_point_code = next_device_code + "." + (nowNumber + 1); + } + + Device startDevice = appService.findDeviceByCode(start_device_code); + if (startDevice.getDeviceDriver() instanceof FoldDiscSiteDeviceDriver) { + FoldDiscSiteDeviceDriver driver = (FoldDiscSiteDeviceDriver) startDevice.getDeviceDriver(); + if (driver.getMode() == 0) { + log.info("任务 [" + taskcode + "] 起点 [" + startDevice.getDevice_name() + "] 未联机,无法生成指令。"); + acsTask.setRemark("任务 [" + taskcode + "] 起点 [" + startDevice.getDevice_name() + "] 未联机,无法生成指令。"); + taskserver.updateByCodeFromCache(acsTask); + continue; + } else if (driver.getError() != 0) { + log.info("任务 [" + taskcode + "] 起点 [" + startDevice.getDevice_name() + "] 异常,无法生成指令。"); + acsTask.setRemark("任务 [" + taskcode + "] 起点 [" + startDevice.getDevice_name() + "] 异常,无法生成指令。"); + taskserver.updateByCodeFromCache(acsTask); + continue; + } + + int container_qty = driver.getNumber(); + int max_emptypalletnum = Integer.parseInt(startDevice.getExtraValue().get("max_emptypalletnum").toString()); + if (container_qty < (max_emptypalletnum / 2)) { + log.info("任务 [" + taskcode + "] 起点 [" + startDevice.getDevice_name() + "] 可用托盘数量少于最大托盘数量 [" + max_emptypalletnum + "] / 2,无法生成指令。"); + acsTask.setRemark("任务 [" + taskcode + "] 起点 [" + startDevice.getDevice_name() + "] 可用托盘数量少于最大托盘数量 [" + max_emptypalletnum + "] / 2,无法生成指令。"); + taskserver.updateByCodeFromCache(acsTask); + continue; + } + + int count = instructionService.queryDeviceInstCount(start_device_code); + if (count > 0) { + log.info("任务 [" + taskcode + "] 起点 [" + startDevice.getDevice_name() + "] 已被占用,无法生成指令。"); + acsTask.setRemark("任务 [" + taskcode + "] 起点 [" + startDevice.getDevice_name() + "] 已被占用,无法生成指令。"); + taskserver.updateByCodeFromCache(acsTask); + //this.execute_log.setResource(nextdevice.getDevice_code(), nextdevice.getDevice_code()); + //this.execute_log.log("存在相同终点的指令,任务号:" + taskcode); + continue; + } + + start_point_code = start_device_code + ".1"; + } + Instruction instdto = new Instruction(); instdto.setInstruction_type(task_type);