From 8037d14a47edcec17b3baa55f8de0e833d7a3eee Mon Sep 17 00:00:00 2001 From: yanps Date: Wed, 19 Jun 2024 15:44:50 +0800 Subject: [PATCH 1/3] =?UTF-8?q?opt:=20=E7=AB=8B=E5=BA=93=E8=BE=93=E9=80=81?= =?UTF-8?q?=E6=9C=BA=E5=86=99=E5=85=A5=E4=BF=A1=E5=8F=B7=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E4=BC=98=E5=8C=96,=E6=B7=BB=E5=8A=A0=E8=BE=93=E9=80=81?= =?UTF-8?q?=E6=9C=BA=E7=A7=B0=E9=87=8D=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/device_driver/DriverTypeEnum.java | 2 + ...BoxPalletizingManipulatorDeviceDriver.java | 6 +- .../ItemProtocol.java | 10 +- .../SiemensConveyorDeviceDriver.java | 94 +- .../siemens_weigh_conveyor/ItemProtocol.java | 174 +++ .../SiemensWeightConveyorDefination.java | 64 + .../SiemensWeightConveyorDeviceDriver.java | 1251 +++++++++++++++++ .../wms/service/impl/WmsToAcsServiceImpl.java | 12 + .../src/views/acs/device/config.vue | 2 + .../device/driver/siemens_weight_conveyor.vue | 559 ++++++++ 10 files changed, 2135 insertions(+), 39 deletions(-) create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/ItemProtocol.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDefination.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDeviceDriver.java create mode 100644 acs/nladmin-ui/src/views/acs/device/driver/siemens_weight_conveyor.vue 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 c096a172f..b8757c595 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 @@ -35,6 +35,8 @@ public enum DriverTypeEnum { SIEMENS_CONVEYOR(13, "siemens_conveyor", "西门子-输送机驱动", "conveyor"), + SIEMENS_WEIGHT_CONVEYOR(29, "siemens_weight_conveyor", "西门子-输送机驱动-称重", "conveyor"), + HONGXIANG_CONVEYOR(13, "hongxiang_conveyor", "烘箱对接位", "conveyor"), INSPECT_CONVEYOR_CONTROL_WITH_SCANNER(14, "standard_conveyor_control_with_scanner", "标准版-输送机-控制点-关联扫码", "conveyor"), diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/BoxPalletizingManipulatorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/BoxPalletizingManipulatorDeviceDriver.java index ac79f4826..6a9b2bf27 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/BoxPalletizingManipulatorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/BoxPalletizingManipulatorDeviceDriver.java @@ -110,7 +110,7 @@ public class BoxPalletizingManipulatorDeviceDriver extends AbstractOpcDeviceDriv action = this.itemProtocol.getAction(); walk_y = this.itemProtocol.getWalk_y(); error = this.itemProtocol.getError(); - task = this.itemProtocol.getTask(); + /*task = this.itemProtocol.getTask();*/ iserror = this.itemProtocol.deviceStatus; if (mode != last_mode) { logServer.deviceItemValue(this.device_code, "mode", String.valueOf(mode)); @@ -132,10 +132,10 @@ public class BoxPalletizingManipulatorDeviceDriver extends AbstractOpcDeviceDriv logServer.deviceItemValue(this.device_code, "walk_y", String.valueOf(walk_y)); logServer.deviceExecuteLog(this.device_code, "", "", "信号walk_y:" + last_walk_y + "->" + walk_y); } - if (task != last_task) { + /*if (task != last_task) { logServer.deviceItemValue(this.device_code, "task", String.valueOf(task)); logServer.deviceExecuteLog(this.device_code, "", "", "信号task:" + last_task + "->" + task); - } + }*/ } catch (Exception var17) { return; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/ItemProtocol.java index ec5a996e0..0bd24e040 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/ItemProtocol.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/ItemProtocol.java @@ -25,8 +25,8 @@ public class ItemProtocol { public static String item_walk_y = "walk_y"; //报警 public static String item_error = "error"; - //任务号 - public static String item_task = "task"; + /*//任务号 + public static String item_task = "task";*/ private BoxPalletizingManipulatorDeviceDriver driver; @@ -59,9 +59,9 @@ public class ItemProtocol { return this.getOpcIntegerValue(item_error); } - public int getTask() { + /*public int getTask() { return this.getOpcIntegerValue(item_task); - } + }*/ Boolean isonline; @@ -103,7 +103,7 @@ public class ItemProtocol { list.add(new ItemDto(item_action, "动作信号", "DB1.B3")); list.add(new ItemDto(item_walk_y, "行走列", "DB1.B4")); list.add(new ItemDto(item_error, "报警信号", "DB1.B5")); - list.add(new ItemDto(item_task, "任务号", "DB1.D6")); + /*list.add(new ItemDto(item_task, "任务号", "DB1.D6"));*/ return list; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java index ed2173932..724d46d46 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java @@ -747,9 +747,18 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme map3.put("code", "to_command"); map3.put("value", "1"); list.add(map3); - this.writing(list); - requireSucess = true; - while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() + try { + this.writing(list); + } catch (Exception e) { + logServer.deviceExecuteLog(device_code, "", "", "下发指令:" + inst.getInstruction_code() + + ",指令起点:" + inst.getStart_device_code() + + ",指令终点:" + inst.getNext_device_code() + ",根据指令下发信号失败" + e.getMessage()); + if (ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))) { + requireSucess = false; + return false; + } + } + /*while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() , inst.getInstruction_code())) { this.writing(list); logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发信号"); @@ -762,18 +771,11 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme requireSucess = false; return false; } - } - -// if (task != Integer.parseInt(inst.getInstruction_code())) { -// this.writing(list); -// message = "重新下发电气信号"; -// logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); -// } + }*/ message = "下发电气任务号成功"; requireSucess = true; return true; } - // type 5 输送任务 if (!StrUtil.equals(taskdto.getTask_type(), "5")) { return false; @@ -870,9 +872,18 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme map3.put("code", "to_command"); map3.put("value", "1"); list.add(map3); - this.writing(list); - requireSucess = true; - while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() + try { + this.writing(list); + } catch (Exception e) { + logServer.deviceExecuteLog(device_code, "", "", "下发指令:" + instdto.getInstruction_code() + + ",指令起点:" + instdto.getStart_device_code() + + ",指令终点:" + instdto.getNext_device_code() + ",根据指令下发信号失败" + e.getMessage()); + if (ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))) { + requireSucess = false; + return false; + } + } + /*while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() , instdto.getInstruction_code())) { this.writing(list); logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); @@ -885,14 +896,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme requireSucess = false; return false; } - } - - -// if (task != Integer.parseInt(inst.getInstruction_code())) { -// this.writing(list); -// message = "重新下发电气信号"; -// logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); -// } + }*/ } else { //如果不存在则直接找对应指令 Instruction inst = instructionService.findByDeviceCodeFromCache(this.device_code); @@ -929,9 +933,18 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme map3.put("code", "to_command"); map3.put("value", "1"); list.add(map3); - this.writing(list); - requireSucess = true; - while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() + try { + this.writing(list); + } catch (Exception e) { + logServer.deviceExecuteLog(device_code, "", "", "下发指令:" + inst.getInstruction_code() + + ",指令起点:" + inst.getStart_device_code() + + ",指令终点:" + inst.getNext_device_code() + ",根据指令下发信号失败" + e.getMessage()); + if (ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))) { + requireSucess = false; + return false; + } + } + /*while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() , inst.getInstruction_code())) { this.writing(list); logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); @@ -944,11 +957,13 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme requireSucess = false; return false; } - } + }*/ // if (task != Integer.parseInt(inst.getInstruction_code())) { // this.writing(list); // logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); // } + requireSucess = true; + return true; } return true; } @@ -1116,7 +1131,18 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme if (jo.getInteger("status") == 200) { message = "申请补码AGV搬运任务成功"; List list = new ArrayList(); - while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".to_command").toString() + Map map = new HashMap(); + map.put("code", "to_command"); + map.put("value", "8"); + list.add(map); + try { + this.writing(list); + } catch (Exception e) { + logServer.deviceExecuteLog(device_code, "", "", "申请补码AGV搬运任务下发信号失败" + e.getMessage()); + requireSucess = false; + return; + } + /*while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".to_command").toString() , "8")) { this.writing(list); logServer.deviceExecuteLog(device_code, "", "", "再次下发mode信号"); @@ -1125,7 +1151,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme } catch (InterruptedException e) { e.printStackTrace(); } - } + }*/ logServer.deviceExecuteLog(this.device_code, "", "", "申请补码AGV任务,返回参数:" + jo); requireSucess = true; } else { @@ -1166,8 +1192,14 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme map.put("code", "to_command"); map.put("value", "8"); list.add(map); - this.writing(list); - while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".to_command").toString() + try { + this.writing(list); + } catch (Exception e) { + logServer.deviceExecuteLog(device_code, "", "", "申请AGV搬运任务下发信号失败" + e.getMessage()); + requireSucess = false; + return; + } + /*while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".to_command").toString() , "8")) { this.writing(list); logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发mode信号"); @@ -1176,7 +1208,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme } catch (InterruptedException e) { e.printStackTrace(); } - } + }*/ logServer.deviceExecuteLog(this.device_code, "", "", "申请AGV任务,返回参数:" + jo); requireSucess = true; } else { diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/ItemProtocol.java new file mode 100644 index 000000000..5ddfa5f15 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/ItemProtocol.java @@ -0,0 +1,174 @@ +package org.nl.acs.device_driver.basedriver.siemens_weigh_conveyor; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device_driver.standard_inspect.ItemDto; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Data +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_carrier_direction = "carrier_direction"; + //报警 + public static String item_error = "error"; + //任务号 + public static String item_task = "task"; + //重量 + public static String item_weight = "weight"; + + //下发命令 + public static String item_to_command = "to_command"; + //下发目标站 + public static String item_to_target = "to_target"; + //下发托盘类型 + public static String item_to_container_type = "to_container_type"; + //下发任务号 + public static String item_to_task = "to_task"; + //困扎次数 + public static String item_to_strap_times = "to_strap_times"; + //木箱长度 + public static String item_to_length = "to_length"; + //木箱宽度 + public static String item_to_weight = "to_weight"; + //木箱高度 + public static String item_to_height = "to_height"; + + + private SiemensWeightConveyorDeviceDriver driver; + + public ItemProtocol(SiemensWeightConveyorDeviceDriver 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 getCarrier_direction() { + return this.getOpcIntegerValue(item_carrier_direction); + } + + public int getError() { + return this.getOpcIntegerValue(item_error); + } + + public int getTask() { + return this.getOpcIntegerValue(item_task); + } + + public int getTo_command() { + return this.getOpcIntegerValue(item_to_command); + } + + public int getTo_target() { + return this.getOpcIntegerValue(item_to_target); + } + + public int getTo_task() { + return this.getOpcIntegerValue(item_to_task); + } + + public int getTo_strap_times() { + return this.getOpcIntegerValue(item_to_strap_times); + } + + public int getTo_length() { + return this.getOpcIntegerValue(item_to_length); + } + + public int getTo_weight() { + return this.getOpcIntegerValue(item_to_weight); + } + + public int getTo_height() { + return this.getOpcIntegerValue(item_to_height); + } + + public int getWeight() { + return this.getOpcIntegerValue(item_weight); + } + + + Boolean isonline; + Boolean deviceStatus = false; + + public int getOpcIntegerValue(String protocol) { + Integer value = this.driver.getIntegeregerValue(protocol); + if(ObjectUtil.isEmpty(value)){ + deviceStatus = true; + }else if (item_heartbeat.equals(protocol)){ + deviceStatus = false; + } + 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 (StrUtil.isEmpty(value)) { + + } else { + return value; + } + return "0"; + } + + public static List getReadableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB600.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB600.B2")); + list.add(new ItemDto(item_move, "光电信号", "DB600.B3")); + list.add(new ItemDto(item_carrier_direction, "托盘方向", "DB600.B4")); + list.add(new ItemDto(item_error, "报警信号", "DB600.B6")); + list.add(new ItemDto(item_task, "任务号", "DB600.D10")); + list.add(new ItemDto(item_weight, "重量", "DB600.D12")); + return list; + } + + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_to_command, "下发命令", "DB601.W2")); + list.add(new ItemDto(item_to_target, "下发目标站", "DB601.W4")); + list.add(new ItemDto(item_to_container_type, "下发托盘类型", "DB601.W6")); + list.add(new ItemDto(item_to_task, "下发任务号", "DB601.D8")); + list.add(new ItemDto(item_to_strap_times, "困扎次数", "DB601.W12")); + list.add(new ItemDto(item_to_length, "木箱长度", "DB601.W14")); + list.add(new ItemDto(item_to_weight, "木箱宽度", "DB601.W16")); + list.add(new ItemDto(item_to_height, "木箱高度", "DB601.W18")); + return list; + } + + @Override + public String toString() { + return ""; + } + +} + diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDefination.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDefination.java new file mode 100644 index 000000000..5b6fd33b9 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDefination.java @@ -0,0 +1,64 @@ +package org.nl.acs.device_driver.basedriver.siemens_weigh_conveyor; + +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 SiemensWeightConveyorDefination implements OpcDeviceDriverDefination { + @Override + public String getDriverCode() { + return "siemens_weight_conveyor"; + } + + @Override + public String getDriverName() { + return "西门子-输送机驱动-称重"; + } + + @Override + public String getDriverDescription() { + return "西门子-输送机驱动-称重"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new SiemensWeightConveyorDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return SiemensWeightConveyorDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList(); + types.add(DeviceType.station); + return types; + } + + @Override + public List getReadableItemDtos() { + 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/siemens_weigh_conveyor/SiemensWeightConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDeviceDriver.java new file mode 100644 index 000000000..f2a2c1a17 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDeviceDriver.java @@ -0,0 +1,1251 @@ +package org.nl.acs.device_driver.basedriver.siemens_weigh_conveyor; + +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.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.nl.acs.AcsConfig; +import org.nl.acs.agv.server.NDCAgvService; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.FeedLmsRealFailed; +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.data.ApplyLabelingAndBindingRequest; +import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; +import org.nl.acs.ext.wms.data.ApplyManipulatorActionRequest; +import org.nl.acs.ext.wms.data.ApplyManipulatorActionResponse; +import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; +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.opc.DeviceAppService; +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.config.thread.ThreadPoolExecutorUtil; +import org.nl.modules.system.service.ParamService; +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 java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 西门子-输送机称重驱动 + */ +@Slf4j +@Data +@RequiredArgsConstructor +public class SiemensWeightConveyorDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor, FeedLmsRealFailed { + private final static ThreadPoolExecutor EXECUTOR = ThreadPoolExecutorUtil.getPoll(); + protected ItemProtocol itemProtocol = new ItemProtocol(this); + @Autowired + InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); + @Autowired + DeviceService deviceservice = SpringContextHolder.getBean(DeviceService.class); + @Autowired + RouteLineService routelineserver = SpringContextHolder.getBean(RouteLineService.class); + @Autowired + TaskService taskserver = SpringContextHolder.getBean(TaskService.class); + @Autowired + DeviceAppService deviceAppservice = SpringContextHolder.getBean(DeviceAppService.class); + @Autowired + RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class); + @Autowired + ParamService paramService = SpringContextHolder.getBean(ParamService.class); + @Autowired + AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsService.class); + @Autowired + DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + //当前指令 + Instruction inst = null; + + private String error_type = "ssx_error_type"; + + //工作模式 + int mode = 0; + int last_mode = 0; + //光电信号 + int move = 0; + int last_move = 0; + //托盘方向 + int carrier_direction = 0; + int last_carrier_direction = 0; + //报警信号 + int error = 0; + int last_error = 0; + //任务号 + int task = 0; + int last_task = 0; + int agvphase = 0; + int weight = 0; + int last_weight = 0; + String task_code = null; + int to_command = 0; + int last_to_command = 0; + + int to_target = 0; + int last_to_target = 0; + + int to_task = 0; + int last_to_task = 0; + + int to_strap_times = 0; + int last_to_strap_times = 0; + int to_length = 0; + int last_to_length = 0; + int to_weight = 0; + int last_to_weight = 0; + int to_height = 0; + int last_to_height = 0; + + int phase = 0; + int index = 0; + Boolean isonline = true; + int hasGoods = 0; + String message = null; + Boolean iserror = false; + Boolean deviceStatus = false; + + String hand_barcode = null; + + Integer heartbeat_tag; + private Date instruction_update_time = new Date(); + private int instruction_update_time_out = 500; + + private Date instruction_require_time = new Date(); + private Date require_apply_labeling_time = new Date(); + private Date require_apply_strangulation_time = new Date(); + private Date require_empty_in_time = new Date(); + private Date require_empty_out_time = new Date(); + + private int instruction_require_time_out = 3000; + //行架机械手申请任务成功标识 + boolean requireSucess = false; + boolean requireEmptyInSuccess = false; + boolean requiresShipDeviceUpdate = true; + private int instruction_finished_time_out; + + int branchProtocol = 0; + String inst_message; + String last_inst_message; + int heartbeat = 0; + int last_heartbeat = 0; + //当前指令 + + //暂定 0就绪 1请求取货 2取货完成 3请求放货 4放货完成 5取货完成离开 6放货完成离开 7请求进入区域 8请求离开区域 + int flag; + + String device_code; + + String vehicle_code; + String last_vehicle_code; + + @Override + public Device getDevice() { + return this.device; + } + + + @Override + public void execute() { + try { + device_code = this.getDeviceCode(); + mode = this.itemProtocol.getMode(); + move = this.itemProtocol.getMove(); + carrier_direction = this.itemProtocol.getCarrier_direction(); + error = this.itemProtocol.getError(); + task = this.itemProtocol.getTask(); + to_command = this.itemProtocol.getTo_command(); + to_target = this.itemProtocol.getTo_target(); + to_task = this.itemProtocol.getTo_task(); + heartbeat = this.itemProtocol.getHeartbeat(); + to_strap_times = this.itemProtocol.getTo_strap_times(); + to_length = this.itemProtocol.getTo_length(); + to_weight = this.itemProtocol.getTo_weight(); + to_height = this.itemProtocol.getTo_height(); + weight = this.itemProtocol.getWeight(); + deviceStatus = this.itemProtocol.deviceStatus; + + if (to_strap_times != last_to_strap_times) { + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_strap_times:" + last_to_strap_times + "->" + to_strap_times); + } + if (weight == last_weight) { + logServer.deviceExecuteLog(this.device_code, "", "", "信号weight:" + last_weight + "->" + weight); + } + if (to_length != last_to_length) { + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_length:" + last_to_length + "->" + to_length); + } + if (to_weight != last_to_weight) { + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_weight:" + last_to_weight + "->" + to_weight); + } + if (to_height != last_to_height) { + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_height:" + last_to_height + "->" + to_height); + } + if (to_command != last_to_command) { + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_command:" + last_to_command + "->" + to_command); + } + if (to_target != last_to_target) { + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_target:" + last_to_target + "->" + to_target); + } + if (to_task != last_to_task) { + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_task:" + last_to_task + "->" + to_task); + } + /*if (mode != last_mode) { + + //Boolean flag = ObjectUtil.isEmpty(this.device.getExtraValue().get("special_flag")) ? false : Boolean.valueOf(this.device.getExtraValue().get("special_flag").toString()); + //暂时这样写 后续通过配置判断 + if (StrUtil.equals(this.device_code, "1018")) { + if (mode == 6 && last_mode == 2) { + requireSucess = false; + requireEmptyInSuccess = false; + } + } else if (StrUtil.equals(this.device_code, "1016")) { + if (mode == 8 && (last_mode == 2 || last_mode == 3)) { + requireSucess = false; + requireEmptyInSuccess = false; + } + + } else { + requireSucess = false; + requireEmptyInSuccess = false; + } + + if ("true".equals(this.device.getExtraValue().get("sendDeviceStatus"))) { + JSONObject param = new JSONObject(); + param.put("device_code", this.device_code); + param.put("mode", Math.min(mode, 3)); + param.put("device_name", this.getDevice().getDevice_name()); + param.put("device_type", "1"); + param.put("product_area", paramService.findByCode("productArea").getValue()); +// acsToWmsService.sendDeviceStatus(param); + sendDeviceStatus(param); + } + message = ""; + logServer.deviceExecuteLog(this.device_code, "", "", "信号mode:" + last_mode + "->" + mode + "复位请求标记:" + requireSucess); + logServer.deviceExecuteLog(this.device_code, "", "", "信号mode:" + last_mode + "->" + mode); + } + if (move != last_move) { + message = null; + if (move == 0) { + inst_message = null; + inst = null; + this.hand_barcode = null; + this.clearWrite(); + } + if (move == 0 && last_move == 1) { + last_vehicle_code = vehicle_code; + last_inst_message = inst_message; + if ("true".equals(this.device.getExtraValue().get("ship_device_update"))) { + this.requiresShipDeviceUpdate = false; + if (mode > 0) { + shipDeviceUpdate(); + } + } + } + logServer.deviceItemValue(this.device_code, "move", String.valueOf(move)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号move:" + last_move + "->" + move); + } + if (carrier_direction != last_carrier_direction) { + logServer.deviceItemValue(this.device_code, "carrier_direction", String.valueOf(carrier_direction)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号carrier_direction:" + last_carrier_direction + "->" + carrier_direction); + } + if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + String errorInfo = ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(error)); + dto.setError_info(errorInfo); + deviceErrorLogService.create(dto); + } + + if ("true".equals(this.device.getExtraValue().get("sendDeviceStatus"))) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + String errorInfo = ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(error)); + dto.setError_info(errorInfo); + deviceErrorLogService.create(dto); + } + + if (error != 110 && error != 70) { + JSONObject param = new JSONObject(); + param.put("device_code", this.device_code); + param.put("error", error); + param.put("error_msg", error == 0 ? "" : ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(error))); + param.put("device_name", this.getDevice().getDevice_name()); + param.put("device_type", "1"); + param.put("product_area", paramService.findByCode("productArea").getValue()); + acsToWmsService.sendDeviceStatus(param); + } + } + + logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); + } + if (task != last_task) { + logServer.deviceItemValue(this.device_code, "task", String.valueOf(task)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号task:" + last_task + "->" + task); + if ("true".equals(this.device.getExtraValue().get("task_update"))) { + taskDeviceUpdate(task); + } + } + if (move != 0 && task > 0) { +// logServer.deviceExecuteLog(device_code, "", "", "输送线任务开始反馈任务状态,指令号:" + task); + //inst_message + update_instruction_status(); + } + + } catch (Exception var17) { + var17.printStackTrace(); + logServer.deviceExecuteLog(this.device_code, "", "", "读取信号值时出现异常:" + var17.getMessage() + ",this.itemProtocol is null:" + ObjectUtil.isEmpty(this.itemProtocol)); + } + + try { + if ("true".equals(this.device.getExtraValue().get("ship_device_update"))) { + if (ObjectUtil.equal(this.getDevice().getExtraValue().get("noIdleRequest"), "true")) { + if (!requiresShipDeviceUpdate && move == 0) { + this.shipDeviceUpdate(); + } + } else { + if (mode == 2 && !requiresShipDeviceUpdate && move == 0) { + this.shipDeviceUpdate(); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + logServer.deviceExecuteLog(this.device_code, "", "", "读取信号值时出现异常:" + Arrays.toString(e.getStackTrace())); + } + + + if (mode == 0) { + this.setIsonline(false); + message = "未联机"; + //有报警 + + } else { + this.setIsonline(true); + this.setIserror(false); + if (error != 0) { + this.setIserror(true); + message = "有报警"; + } + + Instruction instruction = null; + List toInstructions; + if(mode > 0) { + switch (mode) { + case 1: + log.debug("设备运转模式:等待工作"); + break; + case 2: + //申请任务 + if (move > 0 && !requireSucess) { + instruction_require(); + } + break; + case 4: + //申请捆扎 + if (move > 0 && !requireSucess) { + applyLaStrangulation(String.valueOf(mode)); + } + break; + case 5: + //申请贴标 + if (move > 0 && !requireSucess) { + //applyLabeling(); + } + break; + case 6: + //空托盘满垛入库申请 + if (move > 0 && !requireEmptyInSuccess) { + emptyIn(); + } + if (move > 0 && !requireSucess) { + instruction_require(); + } + break; + case 7: + //空盘出库申请 + if (move == 0 && !requireSucess) { + emptyOut(); + } + break; + case 8: + //申请AGV任务 + if (move == 1 && !requireSucess) { + applyAgvTask(); + } + break; + case 9: + //申请捆扎 + if (move > 0 && !requireSucess) { + applyLaStrangulation(String.valueOf(mode)); + } + break; + } + }*/ + } catch (Exception e) { + e.printStackTrace(); + logServer.deviceExecuteLog(this.device_code, "", "", "读取信号值时出现异常:" + Arrays.toString(e.getStackTrace())); + } + last_mode = mode; + last_move = move; + last_carrier_direction = carrier_direction; + last_error = error; + last_task = task; + last_heartbeat = heartbeat; + last_to_task = to_task; + last_to_command = to_command; + last_to_target = to_target; + last_to_strap_times = to_strap_times; + last_to_length = to_length; + last_to_weight = to_weight; + last_to_height = to_height; + } + + public void shipDeviceUpdate() { + CompletableFuture future = new CompletableFuture<>(); + // 使用线程池执行异步操作 + EXECUTOR.submit(() -> { + try { + JSONObject param = new JSONObject(); + param.put("device_code", device_code); + logServer.deviceExecuteLog(this.device_code, "", "", "有货变无货请求LMS,参数:" + param); + HttpResponse response = acsToWmsService.shipDeviceUpdate(param); + if (response == null || response.getStatus() == 200) { + logServer.deviceExecuteLog(this.device_code, "", "", "有货变无货请求LMS,接口返回:" + response.body()); + } + future.complete("Async operation completed"); + } catch (Exception e) { + future.completeExceptionally(e); + } + }); + this.requiresShipDeviceUpdate = true; + } + + public void sendDeviceStatus(JSONObject param) { + CompletableFuture future = new CompletableFuture<>(); + // 使用线程池执行异步操作 + EXECUTOR.submit(() -> { + try { + acsToWmsService.sendDeviceStatus(param); + future.complete("Async operation completed"); + } catch (Exception e) { + future.completeExceptionally(e); + } + }); + this.requiresShipDeviceUpdate = true; + } + + private void taskDeviceUpdate(int task) { + Instruction inst = instructionService.findByInsructionCode(String.valueOf(task)); + ApplyManipulatorActionRequest applyManipulatorActionRequest = new ApplyManipulatorActionRequest(); + applyManipulatorActionRequest.setDevice_code(device_code); + applyManipulatorActionRequest.setAction("3"); + if (ObjectUtil.isEmpty(inst)) { + logServer.deviceExecuteLog(this.device_code, "", "", "任务号不存在:" + inst); + return; + } + applyManipulatorActionRequest.setTask_code1(inst.getTask_code()); + logServer.deviceExecuteLog(this.device_code, "", "", "task变化请求LMS,参数:" + applyManipulatorActionRequest); + try { + final ThreadPoolExecutor EXECUTOR = ThreadPoolExecutorUtil.getPoll(); + EXECUTOR.submit(() -> { + for (int i = 0; i < 5; i++) { + ApplyManipulatorActionResponse response = acsToWmsService.actionFinishRequest(applyManipulatorActionRequest); + if (response == null || response.getstatus() == 200) { + logServer.deviceExecuteLog(this.device_code, "", "", "task变化请求LMS,接口返回:" + response.getMessage()); + break; + } else { + logServer.deviceExecuteLog(this.device_code, "", "", "任务变化请求LMS失败:" + response.getMessage()); + message = "task变化请求LMS失败: " + response.getMessage(); + try { + Thread.sleep(15000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + }); + } catch (Exception e) { + e.printStackTrace(); + logServer.deviceExecuteLog(this.device_code, "", "", "task变化请求LMS失败" + e.getMessage()); + } + + } + + + public boolean exe_error() { + if (this.error == 0) { + return true; + } else { + log.debug("设备报警"); + return false; + } + } + + public void clearWrite() { + + List list = new ArrayList(); + Map map = new HashMap(); + map.put("code", "to_target"); + map.put("value", "0"); + list.add(map); + Map map2 = new HashMap(); + map2.put("code", "to_task"); + map2.put("value", "0"); + list.add(map2); + Map map3 = new HashMap(); + map3.put("code", "to_command"); + map3.put("value", "0"); + list.add(map3); + Map map4 = new HashMap(); + map4.put("code", "to_strap_times"); + map4.put("value", "0"); + list.add(map4); + Map map5 = new HashMap(); + map5.put("code", "to_length"); + map5.put("value", "0"); + list.add(map5); + Map map6 = new HashMap(); + map6.put("code", "to_weight"); + map6.put("value", "0"); + list.add(map6); + Map map7 = new HashMap(); + map7.put("code", "to_height"); + map7.put("value", "0"); + list.add(map7); + this.writing(list); + message = null; + vehicle_code = null; + } + + public boolean exe_business() { + return true; + } + + public synchronized boolean finish_instruction() throws Exception { + instructionService.finish(inst); + return true; + } + + + protected void thingToNothing() throws Exception { + requireSucess = false; + } + + + 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; + Map itemMap = new HashMap(); + + itemMap.put(to_param, Integer.parseInt(value)); + this.control(itemMap); + logServer.deviceExecuteLog(device_code, "", "", "下发电气信号设备号:" + device_code + ",下发电气:" + to_param + ",下发电气值:" + value); + } + + public void executing(Server server, Map itemMap) { + this.control(itemMap); + } + + public void writing(int command) { + Map itemMap = new HashMap(); + this.control(itemMap); + } + + @Override + public JSONObject getDeviceStatusName() { + JSONObject jo = new JSONObject(); + String mode = ""; + String move = ""; + String carrier_direction = ""; + if (this.getMode() == 0) { + mode = "脱机"; + } else if (this.getMode() == 1) { + mode = "单机"; + } else if (this.getMode() == 2) { + mode = "待机"; + } else if (this.getMode() == 3) { + mode = "运行中"; + } else if (this.getMode() == 4) { + mode = "申请捆扎中"; + } else if (this.getMode() == 5) { + mode = "申请贴标中"; + } else if (this.getMode() == 6) { + mode = "申请空盘入库中"; + } else if (this.getMode() == 7) { + mode = "申请空盘出库中"; + } else if (this.getMode() == 8) { + mode = "申请AGV任务中"; + } + + if (this.getMove() == 0) { + move = "无货"; + jo.put("hasGoods", false); + } else if (this.getMove() == 1) { + move = "有货"; + jo.put("hasGoods", true); + } else if (this.getMove() == 2) { + move = "有托盘有货"; + jo.put("hasGoods", true); + } + if (deviceStatus) { + iserror = true; + } + if (error == 0 && !deviceStatus) { + iserror = false; + } + if (this.carrier_direction == 1) { + carrier_direction = "正转"; + } else if (this.carrier_direction == 2) { + carrier_direction = "反转"; + } + String requireSucess = "0"; + if (this.requireSucess) { + requireSucess = "1"; + } + if (error == 0 && iserror) { + message = "信号连接异常!"; + } + jo.put("device_name", this.getDevice().getDevice_name()); + jo.put("mode", mode); + jo.put("move", move); + jo.put("carrier_direction", carrier_direction); + jo.put("task", task); + jo.put("last_task", last_task); + jo.put("task_code", task_code); + jo.put("inst_message", this.inst_message); + jo.put("last_inst_message", this.last_inst_message); + jo.put("isOnline", this.getIsonline()); + jo.put("error", ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(this.getError()))); + jo.put("isError", this.getIserror()); + jo.put("message", this.getMessage()); + jo.put("hand_barcode", hand_barcode); + jo.put("barcode", this.getMove() == 0 ? null : checkInst() == null ? vehicle_code : checkInst().getVehicle_code()); + jo.put("is_click", true); + jo.put("requireSucess", requireSucess); + jo.put("driver_type", "siemens_conveyor"); + return jo; + } + + @Override + public void setDeviceStatus(JSONObject data) { + String requestSucess = data.getString("requireSucess"); + if (StrUtil.equals(requestSucess, "0")) { + this.requireSucess = false; + } else if (StrUtil.equals(requestSucess, "1")) { + this.requireSucess = true; + } + + String hand_barcode = data.getString("hand_barcode"); + this.setHand_barcode(hand_barcode); + } + + @Override + public JSONObject feedLmsRealFailedInfo() { + JSONObject jo = new JSONObject(); + jo.put("device_code", this.getDevice().getDevice_code()); + jo.put("device_name", this.getDevice().getDevice_name()); + jo.put("fault_code", String.valueOf(error)); + jo.put("fault_info", ErrorUtil.getDictDetail(error_type, String.valueOf(this.getError()))); + jo.put("fault_type", error_type); + return jo; + } + + public void writing(List list) { + Map itemMap = new HashMap(); + for (int i = 0; i < list.size(); i++) { + Object ob = list.get(i); + JSONObject json = (JSONObject) JSONObject.toJSON(ob); + if (!StrUtil.isEmpty(json.getString("value"))) { + String to_param = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + json.getString("code"); + itemMap.put(to_param, json.getString("value")); + } + } + logServer.deviceExecuteLog(device_code, "", "", "下发电气信号:" + itemMap); + try { + this.checkcontrol(itemMap); + } catch (Exception e) { + e.printStackTrace(); + try { + this.checkcontrol(itemMap); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + + } + + + /** + * 请求指令 + */ + public synchronized boolean instruction_require() { + 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); + return false; + } else { + this.instruction_require_time = date; + //判断是否存在起点相同 任务状态就绪的任务 + TaskDto taskdto = taskserver.findByStartCodeAndReady(device_code); + if (!ObjectUtil.isEmpty(taskdto) && "5".equals(taskdto.getTask_type())) { + //需要判断当前设备是否已经存在就绪的指令 如果存在就直接下发 不存在则创建 + Instruction inst = instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()); + if (ObjectUtil.isNotEmpty(inst)) { + List list = new ArrayList(); + Map map = new HashMap(); + if (StrUtil.isNotEmpty(taskdto.getTo_z())) { + if (StrUtil.equals(taskdto.getTo_z(), "01")) { + map.put("code", "to_target"); + map.put("value", "102"); + } else if (StrUtil.equals(taskdto.getTo_z(), "02")) { + map.put("code", "to_target"); + map.put("value", "201"); + } else if (StrUtil.equals(taskdto.getTo_z(), "03")) { + map.put("code", "to_target"); + map.put("value", "301"); + } + } + list.add(map); + Map map2 = new HashMap(); + map2.put("code", "to_task"); + map2.put("value", inst.getInstruction_code()); + list.add(map2); + Map map3 = new HashMap(); + map3.put("code", "to_command"); + map3.put("value", "1"); + list.add(map3); + try { + this.writing(list); + } catch (Exception e) { + logServer.deviceExecuteLog(device_code, "", "", "下发指令:" + inst.getInstruction_code() + + ",指令起点:" + inst.getStart_device_code() + + ",指令终点:" + inst.getNext_device_code() + ",根据指令下发信号失败" + e.getMessage()); + if (ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))) { + requireSucess = false; + return false; + } + } + message = "下发电气任务号成功"; + requireSucess = true; + return true; + } + // type 5 输送任务 + if (!StrUtil.equals(taskdto.getTask_type(), "5")) { + return false; + } + String taskid = taskdto.getTask_id(); + String taskcode = taskdto.getTask_code(); + String vehiclecode = taskdto.getVehicle_code(); + String priority = taskdto.getPriority(); + String start_point_code = taskdto.getStart_point_code(); + String start_device_code = taskdto.getStart_device_code(); + String route_plan_code = taskdto.getRoute_plan_code(); + String next_device_code = ""; + + /** + * 开始平均分配 + */ + String this_coevice_code = taskserver.queryAssignedByDevice(device_code, taskdto.getNext_device_code()); + if (StrUtil.isEmpty(this_coevice_code)) { + List shortPathsList = routeLineService.getShortPathLines(start_device_code, taskdto.getNext_device_code(), route_plan_code); + RouteLineDto routeLineDto = shortPathsList.get(0); + + String path = routeLineDto.getPath(); + String type = routeLineDto.getType(); + String[] str = path.split("->"); + + List pathlist = Arrays.asList(str); + int index = 0; + for (int m = 0; m < pathlist.size(); m++) { + if (pathlist.get(m).equals(start_device_code)) { + index = m + 1; + break; + } + } + next_device_code = pathlist.get(index); + } else { + next_device_code = this_coevice_code; + } + //校验路由关系 + List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); + if (ObjectUtils.isEmpty(shortPathsList)) { + throw new RuntimeException("路由不通!"); + } + + Device startdevice = deviceAppservice.findDeviceByCode(start_device_code); + Device nextdevice = deviceAppservice.findDeviceByCode(next_device_code); + String next_point_code; + if (StrUtil.equals(deviceAppservice.findDeviceTypeByCode(next_device_code), "storage")) { + next_point_code = taskdto.getTo_x() + "-" + taskdto.getTo_y() + "-" + taskdto.getTo_z(); + } else { + next_point_code = next_device_code; + } + Instruction instdto = new Instruction(); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(taskdto.getRemark()); + instdto.setMaterial(taskdto.getMaterial()); + instdto.setQuantity(taskdto.getQuantity()); + instdto.setTask_id(taskid); + instdto.setTask_code(taskcode); + instdto.setVehicle_code(vehiclecode); + String now = DateUtil.now(); + instdto.setCreate_time(now); + instdto.setCreate_by("auto"); + instdto.setStart_device_code(start_device_code); + instdto.setNext_device_code(next_device_code); + instdto.setStart_point_code(start_point_code); + instdto.setNext_point_code(next_point_code); + instdto.setPriority(priority); + instdto.setInstruction_status("0"); + instdto.setExecute_device_code(start_point_code); + try { + instructionService.create(instdto); + } catch (Exception e) { + e.printStackTrace(); + log.error("指令创建失败!", e.getMessage()); + return false; + } + //创建指令后修改任务状态 + taskdto.setTask_status("1"); + taskserver.update(taskdto); + requireSucess = true; + String next_addr = nextdevice.getExtraValue().get("address").toString(); + + List list = new ArrayList(); + Map map = new HashMap(); + map.put("code", "to_target"); + map.put("value", next_addr); + list.add(map); + Map map2 = new HashMap(); + map2.put("code", "to_task"); + map2.put("value", instdto.getInstruction_code()); + list.add(map2); + Map map3 = new HashMap(); + map3.put("code", "to_command"); + map3.put("value", "1"); + list.add(map3); + try { + this.writing(list); + } catch (Exception e) { + logServer.deviceExecuteLog(device_code, "", "", "下发指令:" + instdto.getInstruction_code() + + ",指令起点:" + instdto.getStart_device_code() + + ",指令终点:" + instdto.getNext_device_code() + ",根据指令下发信号失败" + e.getMessage()); + if (ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))) { + requireSucess = false; + return false; + } + } + } else { + //如果不存在则直接找对应指令 + Instruction inst = instructionService.findByDeviceCodeFromCache(this.device_code); + if (ObjectUtil.isEmpty(inst)) { + return false; + } + //当起点为行架任务的时候不需要请求下发 + if (StrUtil.equals(inst.getInstruction_type(), "6") || StrUtil.equals(inst.getInstruction_type(), "9")) { + return false; + } + Device nextdevice = deviceAppservice.findDeviceByCode(inst.getNext_device_code()); + String next_addr = nextdevice.getExtraValue().get("address").toString(); + if (StrUtil.equals(next_addr, "0")) { + if (StrUtil.isNotEmpty(inst.getTo_z())) { + if (StrUtil.equals(inst.getTo_z(), "01")) { + next_addr = "102"; + } else if (StrUtil.equals(inst.getTo_z(), "02")) { + next_addr = "201"; + } else if (StrUtil.equals(inst.getTo_z(), "03")) { + next_addr = "301"; + } + } + } + List list = new ArrayList(); + Map map = new HashMap(); + map.put("code", "to_target"); + map.put("value", next_addr); + list.add(map); + Map map2 = new HashMap(); + map2.put("code", "to_task"); + map2.put("value", inst.getInstruction_code()); + list.add(map2); + Map map3 = new HashMap(); + map3.put("code", "to_command"); + map3.put("value", "1"); + list.add(map3); + try { + this.writing(list); + } catch (Exception e) { + logServer.deviceExecuteLog(device_code, "", "", "下发指令:" + inst.getInstruction_code() + + ",指令起点:" + inst.getStart_device_code() + + ",指令终点:" + inst.getNext_device_code() + ",根据指令下发信号失败" + e.getMessage()); + if (ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))) { + requireSucess = false; + return false; + } + } + requireSucess = true; + return true; + } + return true; + } + } + + //申请捆扎 + @SneakyThrows + public synchronized void applyLaStrangulation(String mode) { + Date date = new Date(); + if (date.getTime() - this.require_apply_strangulation_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); + return; + } else { + this.require_apply_strangulation_time = date; + String vehicle_code = ""; + if (StrUtil.isNotEmpty(hand_barcode)) { + vehicle_code = hand_barcode; + } else { + if (task > 0) { + Instruction instruction = checkInst(); + if (ObjectUtil.isEmpty(instruction)) { + message = "申请捆扎电气设备任务号:" + task + "未找到对应指令"; + logServer.deviceExecuteLog(device_code, "", "", "申请捆扎电气设备任务号:" + task + "未找到对应指令"); + return; + } + vehicle_code = instruction.getVehicle_code(); + } else { + logServer.deviceExecuteLog(device_code, "", "", "申请捆扎电气设备任务号:" + task + "异常"); + message = "申请捆扎电气设备任务号:" + task + "异常"; + return; + } + if (StrUtil.isEmpty(vehicle_code)) { + logServer.deviceExecuteLog(device_code, "", "", "申请捆扎电气设备任务号:" + task + "未找到载具号"); + message = "申请捆扎电气设备任务号:" + task + "未找到载具号"; + return; + } + } + ApplyLabelingAndBindingRequest applyLabelingAndBindingRequest = + new ApplyLabelingAndBindingRequest(); + JSONObject device_json = WQLObject.getWQLObject("acs_storage_cell").query("storage_code ='" + this.device_code + "'").uniqueResult(0); + String start_point_code = null; + if (!ObjectUtil.isEmpty(device_json)) { + start_point_code = (String) device_json.get("parent_storage_code") == null ? this.device_code : (String) device_json.get("parent_storage_code"); + } + applyLabelingAndBindingRequest.setDevice_code(start_point_code); + applyLabelingAndBindingRequest.setType("2"); + applyLabelingAndBindingRequest.setVehicle_code(vehicle_code); + if (StrUtil.equals(mode, "9")) { + applyLabelingAndBindingRequest.setIs_bind("0"); + } else { + applyLabelingAndBindingRequest.setIs_bind("1"); + } + logServer.deviceExecuteLog(this.device_code, "", "", "申请捆扎,请求参数:" + applyLabelingAndBindingRequest); + ApplyLabelingAndBindingResponse applyLabelingAndBindingResponse = acsToWmsService.applyLabelingAndBindingRequest(applyLabelingAndBindingRequest); + if (applyLabelingAndBindingResponse.getstatus() == 200) { + if (ObjectUtil.isNotEmpty(applyLabelingAndBindingResponse.getData())) { + Map datas = applyLabelingAndBindingResponse.getData(); + String length = datas.get("box_length").toString(); + String width = datas.get("box_width").toString(); + String box_high = datas.get("box_high").toString(); + String bundle_times = datas.get("bundle_times").toString(); + + List list = new ArrayList(); + Map map = new HashMap(); + map.put("code", "to_length"); + map.put("value", length); + list.add(map); + Map map2 = new HashMap(); + map2.put("code", "to_weight"); + map2.put("value", width); + list.add(map2); + Map map3 = new HashMap(); + map3.put("code", "to_height"); + map3.put("value", box_high); + list.add(map3); + Map map4 = new HashMap(); + map4.put("code", "to_strap_times"); + map4.put("value", bundle_times); + list.add(map4); + Map map5 = new HashMap(); + map5.put("code", "to_command"); + map5.put("value", mode); + list.add(map5); + this.writing(list); +// this.writing(list); + logServer.deviceExecuteLog(this.device_code, "", "", "申请捆扎,返回参数:" + applyLabelingAndBindingResponse); + message = "申请捆扎成功"; + //requireSucess = true; + } else { + message = "未返回尺寸信息"; + logServer.deviceExecuteLog(this.device_code, "", "", "申请捆扎,返回参数:" + applyLabelingAndBindingResponse); + } + + } else { + message = applyLabelingAndBindingResponse.getMessage(); + logServer.deviceExecuteLog(this.device_code, "", "", "申请捆扎,返回参数:" + applyLabelingAndBindingResponse); + } + + } + } + + + public synchronized void emptyIn() { + Date date = new Date(); + if (date.getTime() - this.require_empty_in_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); + return; + } else { + this.require_empty_in_time = date; + + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + +// if(taskserver.querySameOriginTask(this.device_code) > 0 ){ +// message = "已存在空盘出库任务不再请求"; +// return; +// } + + JSONObject apply = new JSONObject(); + apply.put("device_code", device_code); + apply.put("type", "2"); + String str = acsToWmsService.applyTaskToWms(apply); + logServer.deviceExecuteLog(this.device_code, "", "", "申请空盘入库,请求参数:" + apply + ",响应参数:" + JSON.toJSONString(str)); + message = "申请空盘入库任务,请求参数:" + apply + "响应参数: " + str; + + JSONObject jo = JSON.parseObject(str); + if (ObjectUtil.isEmpty(jo)) { + message = "申请空盘入库接口不通"; + logServer.deviceExecuteLog(this.device_code, "", "", "申请空盘入库接口不通"); + } else { + if (jo.getInteger("status") == 200) { + message = "申请空盘入库成功"; + requireEmptyInSuccess = true; + } else { + message = "申请空盘入库失败," + jo.get("message").toString(); + logServer.deviceExecuteLog(this.device_code, "", "", message); + } + } + } + } + } + + public synchronized void applyAgvTask() { + 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); + return; + } else { + this.instruction_require_time = date; + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + //判断是否有手动补码 如果有就申请补码agv任务 + if (StrUtil.isNotEmpty(hand_barcode)) { + message = "申请补码AGV搬运任务中..."; + JSONObject apply = new JSONObject(); + apply.put("device_code", device_code); + apply.put("type", "4"); + apply.put("vehicle_code", hand_barcode); + + String str = acsToWmsService.applyTaskToWms(apply); + logServer.deviceExecuteLog(this.device_code, "", "", "申请AGV任务,请求参数:" + apply + ",响应参数," + str); + + JSONObject jo = JSON.parseObject(str); + if (ObjectUtil.isEmpty(jo)) { + message = "申请补码AGV搬运任务接口不通"; + } else { + if (jo.getInteger("status") == 200) { + message = "申请补码AGV搬运任务成功"; + List list = new ArrayList(); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".to_command").toString() + , "8")) { + this.writing(list); + logServer.deviceExecuteLog(device_code, "", "", "再次下发mode信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + logServer.deviceExecuteLog(this.device_code, "", "", "申请补码AGV任务,返回参数:" + jo); + requireSucess = true; + } else { + message = "申请补码AGV搬运任务失败," + jo.get("message").toString(); + } + } + return; + } + //没有就正常申请agv任务 + Instruction instruction = instructionService.findByCode(String.valueOf(task)); + if (ObjectUtil.isEmpty(instruction)) { + message = "指令号" + task + "未找到对应指令"; + return; + } + if (StrUtil.isEmpty(instruction.getVehicle_code())) { + message = "指令号" + task + "未找到对应木箱号"; + return; + } + + message = "申请AGV搬运任务中..."; + JSONObject apply = new JSONObject(); + apply.put("device_code", device_code); + apply.put("type", "4"); + apply.put("vehicle_code", instruction.getVehicle_code()); + + String str = acsToWmsService.applyTaskToWms(apply); + logServer.deviceExecuteLog(this.device_code, "", "", "申请AGV任务,请求参数:" + apply + ",响应参数"); + + JSONObject jo = JSON.parseObject(str); + if (ObjectUtil.isEmpty(jo)) { + message = "申请AGV搬运任务接口不通"; +// requireSucess = true; + } else { + if (jo.getInteger("status") == 200) { + message = "申请AGV搬运任务成功"; + List list = new ArrayList(); + Map map = new HashMap(); + map.put("code", "to_command"); + map.put("value", "8"); + list.add(map); + this.writing(list); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".to_command").toString() + , "8")) { + this.writing(list); + logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发mode信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + logServer.deviceExecuteLog(this.device_code, "", "", "申请AGV任务,返回参数:" + jo); + requireSucess = true; + } else { + message = "申请AGV搬运任务失败," + jo.get("message").toString(); + } + } + + } + } + } + + public synchronized void emptyOut() { + Date date = new Date(); + if (date.getTime() - this.require_empty_out_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); + return; + } else { + this.require_empty_out_time = date; + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { +// if (taskserver.querySameDestinationTask(this.device_code) > 0) { +// message = "已存在空盘出库任务不再请求"; +// return; +// } + message = "申请空盘出库任务中..."; + JSONObject apply = new JSONObject(); + apply.put("device_code", device_code); + apply.put("type", "3"); + String str = acsToWmsService.applyTaskToWms(apply); + JSONObject jo = JSON.parseObject(str); + if (ObjectUtil.isEmpty(jo)) { + message = "申请空盘出库接口不通"; + requireSucess = true; + } else { + if (jo.getInteger("status") == 200) { + message = "申请空盘出库成功"; + requireSucess = true; + } else { + message = "申请空盘出库失败," + jo.get("message").toString(); + } + } + + } + } + } + + /** + * 更新指令状态 + */ + public synchronized void update_instruction_status() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_update_time.getTime() < (long) this.instruction_update_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_update_time_out); + + } else { + this.instruction_update_time = date; + inst = checkInst(); + if (inst != null) { + inst_message = "当前指令号:" + inst.getInstruction_code() + " " + inst.getStart_point_code() + "->" + inst.getNext_point_code() + " 载具号:" + inst.getVehicle_code(); + vehicle_code = inst.getVehicle_code(); + task_code = inst.getTask_code(); + if (StrUtil.equals(inst.getInstruction_status(), "0") && StrUtil.equals(this.getDeviceCode(), inst.getStart_device_code())) { + inst.setInstruction_status("1"); + inst.setExecute_device_code(this.device_code); + instructionService.update(inst); + logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈成功,指令号:" + task + ",载具号:" + inst.getVehicle_code()); + } + if (StrUtil.equals(inst.getInstruction_status(), "1") || StrUtil.equals(inst.getInstruction_status(), "0")) { + if (StrUtil.equals(this.getDeviceCode(), inst.getNext_device_code())) { + vehicle_code = inst.getVehicle_code(); + inst.setExecute_device_code(this.device_code); + if (mode == 2) { + finish_instruction(); + } + logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈完成状态,反馈成功,指令号:" + task + ",载具号:" + inst.getVehicle_code()); + } else { + + } + } + } else { +// message = "输送线任务反馈状态,查询不到指令号:" + task +"指令已完成"; + inst_message = null; + } + + } + } + + public Instruction checkInst() { + if (ObjectUtil.isNotEmpty(this.inst)) { + if (this.task > 0) { + if (this.inst.getInstruction_code().equals(String.valueOf(this.task))) { + return this.inst; + } else { + inst = instructionService.findByCodeFromCache(String.valueOf(task)); + return inst; + } + } + } else { + inst = instructionService.findByCodeFromCache(String.valueOf(task)); + return inst; + } + return null; + } +} 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 e4228194d..1022cafa8 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 @@ -39,6 +39,7 @@ import org.nl.acs.device_driver.basedriver.siemens_conveyor.SiemensConveyorDevic import org.nl.acs.device_driver.basedriver.siemens_conveyor_ckk.SiemensConveyorCkkDeviceDriver; import org.nl.acs.device_driver.basedriver.siemens_conveyor_labeling.SiemensConveyorLabelingDeviceDriver; import org.nl.acs.device_driver.basedriver.siemens_onefloor_agv_conveyor.SiemensOneFloorAGVConveyorDeviceDriver; +import org.nl.acs.device_driver.basedriver.siemens_weigh_conveyor.SiemensWeightConveyorDeviceDriver; import org.nl.acs.device_driver.basedriver.slit_two_manipulator.SlitTwoManipulatorDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_ordinary_site.StandardOrdinarySiteDefination; @@ -265,6 +266,9 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { CasingStationConveyorDeviceDriver casingStationConveyorDeviceDriver; //RGV RgvDeviceDriver rgvDeviceDriver; + //西门子-输送机称重驱动 + SiemensWeightConveyorDeviceDriver siemensWeightConveyorDeviceDriver; + if (datas.size() == 0) { throw new BadRequestException("缺少输入参数!"); @@ -498,6 +502,14 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { // jo.put("task2", driver.getTask2()); jo.put("error", driver.getError()); jo.put("error_msg", driver.getError() == 0 ? "" : ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(driver.getError()))); + }else if (device.getDeviceDriver() instanceof SiemensWeightConveyorDeviceDriver) { + siemensWeightConveyorDeviceDriver = (SiemensWeightConveyorDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", siemensWeightConveyorDeviceDriver.getDevice().getDevice_code()); + jo.put("device_name", siemensWeightConveyorDeviceDriver.getDevice().getDevice_name()); + jo.put("mode", siemensWeightConveyorDeviceDriver.getMode()); + jo.put("move", siemensWeightConveyorDeviceDriver.getMove()); + jo.put("error", siemensWeightConveyorDeviceDriver.getError()); + jo.put("weight", siemensWeightConveyorDeviceDriver.getWeight()); } else { jo.put("device_code", parent_device_code); } diff --git a/acs/nladmin-ui/src/views/acs/device/config.vue b/acs/nladmin-ui/src/views/acs/device/config.vue index 9b4b5a250..e751fa848 100644 --- a/acs/nladmin-ui/src/views/acs/device/config.vue +++ b/acs/nladmin-ui/src/views/acs/device/config.vue @@ -89,6 +89,7 @@ import agv_ndc_two from '@/views/acs/device/driver/agv/agv_ndc_two' import box_palletizing_manipulator from '@/views/acs/device/driver/box_palletizing_manipulator' import oven_manipulator from '@/views/acs/device/driver/oven_manipulator' import siemens_conveyor from '@/views/acs/device/driver/siemens_conveyor' +import siemens_weight_conveyor from '@/views/acs/device/driver/siemens_weight_conveyor' import slit_two_manipulator from '@/views/acs/device/driver/slit_two_manipulator' import hongxiang_device from '@/views/acs/device/driver/hongxiang_device' import hongxiang_conveyor from '@/views/acs/device/driver/hongxiang_conveyor' @@ -126,6 +127,7 @@ export default { hongxiang_device, hongxiang_conveyor, box_palletizing_manipulator, + siemens_weight_conveyor, oven_manipulator, siemens_conveyor, slit_two_manipulator, diff --git a/acs/nladmin-ui/src/views/acs/device/driver/siemens_weight_conveyor.vue b/acs/nladmin-ui/src/views/acs/device/driver/siemens_weight_conveyor.vue new file mode 100644 index 000000000..1d3381c43 --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/device/driver/siemens_weight_conveyor.vue @@ -0,0 +1,559 @@ + + + + + From 9a6afe1c2ff0e348520afd53ac346b57f36d145b Mon Sep 17 00:00:00 2001 From: yanps Date: Wed, 19 Jun 2024 17:10:20 +0800 Subject: [PATCH 2/3] =?UTF-8?q?opt:=20=E8=BE=93=E9=80=81=E6=9C=BA=E7=A7=B0?= =?UTF-8?q?=E9=87=8D=E9=A9=B1=E5=8A=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SiemensWeightConveyorDeviceDriver.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDeviceDriver.java index f2a2c1a17..39d8b67dd 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_weigh_conveyor/SiemensWeightConveyorDeviceDriver.java @@ -194,7 +194,7 @@ public class SiemensWeightConveyorDeviceDriver extends AbstractOpcDeviceDriver i if (to_strap_times != last_to_strap_times) { logServer.deviceExecuteLog(this.device_code, "", "", "信号to_strap_times:" + last_to_strap_times + "->" + to_strap_times); } - if (weight == last_weight) { + if (weight != last_weight) { logServer.deviceExecuteLog(this.device_code, "", "", "信号weight:" + last_weight + "->" + weight); } if (to_length != last_to_length) { @@ -215,7 +215,7 @@ public class SiemensWeightConveyorDeviceDriver extends AbstractOpcDeviceDriver i if (to_task != last_to_task) { logServer.deviceExecuteLog(this.device_code, "", "", "信号to_task:" + last_to_task + "->" + to_task); } - /*if (mode != last_mode) { + if (mode != last_mode) { //Boolean flag = ObjectUtil.isEmpty(this.device.getExtraValue().get("special_flag")) ? false : Boolean.valueOf(this.device.getExtraValue().get("special_flag").toString()); //暂时这样写 后续通过配置判断 @@ -411,10 +411,7 @@ public class SiemensWeightConveyorDeviceDriver extends AbstractOpcDeviceDriver i } break; } - }*/ - } catch (Exception e) { - e.printStackTrace(); - logServer.deviceExecuteLog(this.device_code, "", "", "读取信号值时出现异常:" + Arrays.toString(e.getStackTrace())); + } } last_mode = mode; last_move = move; @@ -429,6 +426,7 @@ public class SiemensWeightConveyorDeviceDriver extends AbstractOpcDeviceDriver i last_to_length = to_length; last_to_weight = to_weight; last_to_height = to_height; + last_weight = weight; } public void shipDeviceUpdate() { From ee7a406d81b4200db256587e49a3dc6baa23dd2b Mon Sep 17 00:00:00 2001 From: liuxy Date: Thu, 20 Jun 2024 17:07:40 +0800 Subject: [PATCH 3/3] =?UTF-8?q?add=EF=BC=9A1.=E6=96=B0=E5=A2=9E=E6=9C=A8?= =?UTF-8?q?=E7=AE=B1=E7=A7=B0=E9=87=8D=E6=A0=A1=E9=AA=8C=E5=8A=9F=E8=83=BD?= =?UTF-8?q?2.=E8=BE=93=E9=80=81=E4=BB=BB=E5=8A=A1=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=B8=AD=E6=9B=B4=E6=96=B0=E6=9C=A8=E7=AE=B1?= =?UTF-8?q?=E6=AF=9B=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/ext/acs/rest/WmsToAcsController.java | 7 +++ .../wms/ext/acs/service/WmsToAcsService.java | 7 +++ .../acs/service/impl/WmsToAcsServiceImpl.java | 43 ++++++++++++++++ .../pda/st/rest/ProductInstorController.java | 6 +++ .../pda/st/service/ProductInstorService.java | 2 + .../impl/ProductInstorServiceImpl.java | 49 +++++++++++++++++++ .../org/nl/wms/sch/tasks/CutConveyorTask.java | 10 ++++ 7 files changed, 124 insertions(+) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java index 3282bab65..045e272d4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java @@ -143,5 +143,12 @@ public class WmsToAcsController { return new ResponseEntity<>(wmsToAcsService.PaperTubeAction(jo), HttpStatus.OK); } + @PostMapping("/queryBoxWeigh") + @Log(value = "查询木箱毛重", isInterfaceLog = true, interfaceLogType = InterfaceLogType.LMS_TO_ACS) + + public ResponseEntity querydeviceOne(@RequestBody JSONObject jo) { + return new ResponseEntity<>(wmsToAcsService.queryBoxWeigh(jo), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java index 39177a5cc..bd8c8eda0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -137,4 +137,11 @@ public interface WmsToAcsService { * @return JSONObject */ JSONObject PaperTubeAction(JSONObject jo); + + /** + * 查询木箱重量 + * @param jo 、 + * @return JSONObject + */ + JSONObject queryBoxWeigh(JSONObject jo); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java index 4a03359de..96f71437e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -459,4 +459,47 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { return result; } + @Override + public JSONObject queryBoxWeigh(JSONObject jo) { + String api = "api/wms/querydevice"; + //判断是否连接ACS系统 + String isConnect = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("is_connect_acs").getValue(); + JSONObject result = new JSONObject(); + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "查询失败,未连接ACS!"); + result.put("data", new JSONArray()); + return result; + } + + String product_area = "LK"; + + String acs_url = URLEnum.find(product_area); + if (StrUtil.isEmpty(acs_url)) { + log.info(product_area); + throw new BadRequestException("未查询到区域对应的acs地址!"); + } + + String url = acs_url + api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(jo.getJSONArray("data"))) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONArray()); + } + //acs抛异常这里 + if (!StrUtil.equals(result.getString("status"), "200")) { + throw new BadRequestException("操作失败:" + result.getString("message")); + } + return result; + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductInstorController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductInstorController.java index 4e061477d..5d79e8646 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductInstorController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductInstorController.java @@ -33,6 +33,12 @@ public class ProductInstorController { return new ResponseEntity<>(productInstorService.boxQuery(whereJson), HttpStatus.OK); } + @PostMapping("/weighCheck") + @Log("称重校验") + public ResponseEntity weighCheck(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(productInstorService.weighCheck(whereJson), HttpStatus.OK); + } + @PostMapping("/confirm") @Log("手持生产入库确认") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductInstorService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductInstorService.java index e36c10025..e82f8c4cc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductInstorService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductInstorService.java @@ -22,4 +22,6 @@ public interface ProductInstorService { JSONObject bale(JSONObject whereJson); JSONObject abnormalOut(JSONObject whereJson); + + JSONObject weighCheck(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java index 5e62ec19b..7bc6ddc23 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java @@ -3,6 +3,7 @@ package org.nl.wms.pda.st.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; @@ -17,6 +18,7 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl; +import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.ext.acs.service.impl.AcsToWmsServiceImpl; import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; import org.nl.wms.pda.st.service.ProductInstorService; @@ -55,6 +57,8 @@ public class ProductInstorServiceImpl implements ProductInstorService { private final RedissonClient redissonClient; + private final WmsToAcsService wmsToAcsService; + @Override public JSONObject boxQuery(JSONObject whereJson) { String box_no = whereJson.getString("box_no"); @@ -540,4 +544,49 @@ public class ProductInstorServiceImpl implements ProductInstorService { return jo; } + + @Override + public JSONObject weighCheck(JSONObject whereJson) { + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + JSONObject jo = new JSONObject(); + + String point_code = whereJson.getString("point_code"); + String box_no = whereJson.getString("box_no"); + + if (ObjectUtil.isEmpty(point_code)) { + throw new BadRequestException("点位不能为空!"); + } + + if (ObjectUtil.isEmpty(box_no)) { + throw new BadRequestException("木箱号不能为空!"); + } + + // 组织数据 + JSONArray paramArr = new JSONArray(); + JSONObject paramJson = new JSONObject(); + paramJson.put("device_code", point_code); + paramArr.add(paramJson); + + // 调用接口 + whereJson.put("data", paramArr); + JSONObject jsonObject = wmsToAcsService.queryBoxWeigh(whereJson); + + JSONObject data = jsonObject.getJSONArray("data").getJSONObject(0); + double weight_now = NumberUtil.div(data.getDoubleValue("weight"), 10); + + // 获取系统参数 + double weight_sys = Double.parseDouble(SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("weight_sys").getValue()); + + // 查询子卷包装关系 + JSONObject jsonSub = subTab.query("package_box_sn = '" + box_no + "'").uniqueResult(0); + double box_weight = jsonSub.getDoubleValue("box_weight"); + + if (NumberUtil.sub(box_weight, weight_sys) <= weight_now && NumberUtil.add(box_weight, weight_sys) >= weight_now) { + jo.put("message", "重量合格!当前称重重量:"+weight_now); + } else { + jo.put("message", "重量不合格!当前称重重量:"+weight_now); + } + + return jo; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutConveyorTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutConveyorTask.java index 8f04dc9c3..a8ead88de 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutConveyorTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutConveyorTask.java @@ -77,6 +77,7 @@ public class CutConveyorTask extends AbstractAcsTask { public void updateTaskStatus(JSONObject taskObj, String status) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt"); + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); String task_id = taskObj.getString("task_id"); JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); @@ -111,6 +112,15 @@ public class CutConveyorTask extends AbstractAcsTask { jsonTask.put("update_time", DateUtil.now()); taskTab.update(jsonTask); + if ("010507".equals(jsonTask.getString("task_type"))) { + double weight = taskObj.getDoubleValue("weight"); + + // 更新子卷包装实际重量 + JSONObject param = new JSONObject(); + param.put("real_weight",weight); + subTab.update(param,"package_box_sn ='"+jsonTask.getString("vehicle_code")+"'"); + } + //只有输送入的时候才调用MES if ("010402".equals(jsonTask.getString("task_type"))) { //调用MES接口,通知MES运输中