Browse Source

add 反馈动作信息 站点在席信号 接口与调用

master
张江玮 2 years ago
parent
commit
ce5c100923
  1. 34
      acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java
  2. 84
      acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/standard_inspect/ReadUtil.java
  3. 718
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java
  4. 72
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/ItemProtocol.java
  5. 65
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDefinition.java
  6. 156
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutoDoorDeviceDriver.java
  7. 149
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java
  8. 141
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/driver/AbstractOpcDeviceDriver.java
  9. 65
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDefination.java
  10. 250
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/FoldDiscSiteDeviceDriver.java
  11. 117
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/fold_disc_site/ItemProtocol.java
  12. 2
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java
  13. 50
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java
  14. 6
      acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java
  15. 2
      acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java
  16. 26
      acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
  17. 73
      acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java

34
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"), STORAGE(3, "standard_storage", "标准版-货架", "storage"),
// SCANNER(4, "standard_scanner", "标准版-扫码器", "scanner"), AUTODOOR(4, "standard_auto_door", "标准版-自动门", "auto_door"),
// INSPECT_CONVEYOR_CONTROL(5, "standard_conveyor_control", "标准版-输送机-控制点", "conveyor"), AGV_NDC_ONE(5, "agv_ndc_one", "NDCAGV", "agv"),
//
// INSPECT_CONVEYOR_MONITOR(6, "standard_conveyor_monitor", "标准版-输送机-监控点", "conveyor"), FOLD_DISC_SITE(6, "fold_disc_site", "叠盘机", "station");
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");
//驱动索引 //驱动索引

84
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 { 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<String> 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) { public static Server getServer(String opc_id) {
//OPC表【acs_opc】 //OPC表【acs_opc】
@ -51,26 +94,51 @@ public class ReadUtil {
return server; 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<String, Object> strings, Server server) { public static void write(Map<String, Object> strings, Server server) {
try { try {
//Group group = this.opcServerService.getServer(opcServiceCode); //Group group = this.opcServerService.getServer(opcServiceCode);
try {
server.connect();
} catch (AlreadyConnectedException ignored) {
}
Group group = server.addGroup(); Group group = server.addGroup();
Iterator it = strings.keySet().iterator(); for (String key : strings.keySet()) {
while (it.hasNext()) {
String key = (String) it.next();
Item byteItem = group.addItem(key); Item byteItem = group.addItem(key);
Object o = strings.get(key); Object o = strings.get(key);
if (o == null || o.equals("")) { if (o == null || o.equals("")) {
break; break;
} }
WriteRequest write1 = new WriteRequest(byteItem, new JIVariant(o.toString())); WriteRequest write1 = new WriteRequest(byteItem, new JIVariant(o.toString()));
List<WriteRequest> list = new ArrayList(); List<WriteRequest> list = new ArrayList<>();
list.add(write1); 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) { } catch (Exception e) {
e.printStackTrace(); write(strings, server);
} finally {
server.disconnect();
} }
} }
@ -93,6 +161,7 @@ public class ReadUtil {
public static Map<String, Object> read(List<String> itemString, Server server) { public static Map<String, Object> read(List<String> itemString, Server server) {
HashMap map = new HashMap(); HashMap map = new HashMap();
try { try {
//Group group = this.opcServerService.getServer(opcServiceCode);
Group group = server.addGroup(); Group group = server.addGroup();
Map<String, Item> items = new LinkedHashMap(); Map<String, Item> items = new LinkedHashMap();
Iterator is = itemString.iterator(); Iterator is = itemString.iterator();
@ -120,7 +189,6 @@ public class ReadUtil {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return map; return map;
} }

718
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.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nl.acs.AcsConfig;
import org.nl.acs.agv.server.NDCAgvService; import org.nl.acs.agv.server.NDCAgvService;
import org.nl.acs.auto.run.OneNDCSocketConnectionAutoRun; import org.nl.acs.auto.run.OneNDCSocketConnectionAutoRun;
import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.DeviceService;
import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.DeviceDriver;
import org.nl.acs.device_driver.basedriver.agv.utils.ErrorUtil; 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.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_ordinary_site.StandardOrdinarySiteDeviceDriver;
import org.nl.acs.device_driver.basedriver.standard_storage.StandardStorageDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_storage.StandardStorageDeviceDriver;
import org.nl.acs.device_driver.driver.AbstractDeviceDriver; 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.AcsToWmsService;
import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl;
import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.InstructionService;
@ -73,6 +79,8 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
String error_code = "0"; String error_code = "0";
String error_message = ""; String error_message = "";
String device_status = "UNKNOWN";
String message = "";
public synchronized void processSocket(int[] arr) { public synchronized void processSocket(int[] arr) {
device_code = this.getDeviceCode(); device_code = this.getDeviceCode();
@ -89,6 +97,9 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
Instruction link_inst = null; Instruction link_inst = null;
List<Instruction> insts = null; List<Instruction> insts = null;
Instruction inst = null; Instruction inst = null;
boolean flag = false;
boolean wcsFlag = false;
boolean wmsFlag = false;
boolean link_flag = false; boolean link_flag = false;
if (ikey != 0) { if (ikey != 0) {
inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); inst = instructionService.findByCodeFromCache(String.valueOf(ikey));
@ -111,6 +122,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
inst.setCarno(String.valueOf(carno)); inst.setCarno(String.valueOf(carno));
instructionService.update(inst); instructionService.update(inst);
logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data);
this.device_status = "EXECUTING";
//到达取货点 //到达取货点
//(需要WCS反馈) //(需要WCS反馈)
@ -149,6 +161,148 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
return; 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反馈) //(需要WCS反馈)
} else if (phase == 0x05) { } else if (phase == 0x05) {
@ -185,6 +339,148 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
return; 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反馈) //(需要WCS反馈)
} else if (phase == 0x07) { } else if (phase == 0x07) {
@ -218,6 +514,139 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
return; 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反馈) //(需要WCS反馈)
} else if (phase == 0x09) { } else if (phase == 0x09) {
@ -252,6 +681,151 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
return; 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反馈) //(需要WCS反馈)
@ -262,19 +836,155 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic
data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); data = NDCAgvService.sendAgvOneModeInst(phase, index, 0);
logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data);
} else if (phase == 0x50) {//进入区域 } else if (phase == 0x50) {//进入区域
data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); if (agvaddr == 0) {
logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); 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) {//离开区域 } else if (phase == 0x51) {//离开区域
data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); if (agvaddr == 0) {
logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); 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异常 } else if (phase == 0x67) {//agv异常
if (ikey == 0) { if (ikey == 0) {
this.setErrorInfo(ikey, "0", "正常"); this.setErrorInfo(ikey, "0", "正常");
this.device_status = "IDLE";
} else { } else {
Map<String, String> error = ErrorUtil.getAgvErrorMsg(ikey); Map<String, String> error = ErrorUtil.getAgvErrorMsg(ikey);
String code = error.get("code"); String code = error.get("code");
String info = error.get("info"); String info = error.get("info");
this.setErrorInfo(ikey, code, info); this.setErrorInfo(ikey, code, info);
this.device_status = "ERROR";
} }
data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); data = NDCAgvService.sendAgvOneModeInst(phase, index, 0);
last_error = error; last_error = error;

72
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<ItemDto> getReadableItemDtos() {
ArrayList<ItemDto> 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<ItemDto> getWriteableItemDtos() {
ArrayList<ItemDto> list = new ArrayList<>();
list.add(new ItemDto(item_to_command, "作业命令", "DB52.W2", Boolean.TRUE));
return list;
}
}

65
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<? extends DeviceDriver> getDeviceDriverType() {
return StandardAutoDoorDeviceDriver.class;
}
@Override
public List<DeviceType> getFitDeviceTypes() {
List<DeviceType> types = new LinkedList<>();
types.add(DeviceType.conveyor);
return types;
}
@Override
public List<ItemDto> getReadableItemDtos() {
return getReadableItemDtos2();
}
public static List<ItemDto> getReadableItemDtos2() {
return ItemProtocol.getReadableItemDtos();
}
@Override
public List<ItemDto> getWriteableItemDtos() {
return ItemProtocol.getWriteableItemDtos();
}
}

156
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<String, Object> itemMap = new HashMap<String, Object>();
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);
}
}
}

149
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.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.Data; import lombok.Data;
import lombok.RequiredArgsConstructor; 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.RouteableDeviceDriver;
import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver;
import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; 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.InstructionService;
import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.instruction.service.dto.Instruction;
import org.nl.acs.monitor.DeviceStageMonitor; 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.nl.modules.wql.util.SpringContextHolder;
import org.openscada.opc.lib.da.Server; import org.openscada.opc.lib.da.Server;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
@ -51,6 +55,8 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp
RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl");
@Autowired @Autowired
TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl");
AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl");
String container; String container;
String container_type_desc; String container_type_desc;
String last_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_require_time = new Date();
private Date instruction_finished_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; boolean requireSucess = false;
private int instruction_finished_time_out; private int instruction_finished_time_out;
@ -129,67 +135,15 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp
public void execute() { public void execute() {
String message = null; String message = null;
try { try {
String device_code = this.getDeviceCode(); devicecode = this.getDeviceCode();
mode = this.itemProtocol.getMode(); mode = this.itemProtocol.getMode();
error = this.itemProtocol.getError(); error = this.itemProtocol.getError();
move = this.itemProtocol.getMove(); move = this.itemProtocol.getMove();
task = this.itemProtocol.getTask(); task = this.itemProtocol.getTask();
hasGoods = this.itemProtocol.getMove(); hasGoods = this.itemProtocol.getMove();
if (mode != last_mode) {
this.setRequireSucess(false);
}
if (move != last_move) { if (move != last_move) {
} this.requireSucess = false;
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);
} }
} catch (Exception var17) { } catch (Exception var17) {
@ -222,72 +176,14 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp
log.debug("设备运转模式:等待工作"); log.debug("设备运转模式:等待工作");
return; return;
case 2: case 2:
//申请任务 if (!requireSucess) {
// if (this.getApply_handling()) { JSONObject param = new JSONObject();
// String link_device_code = this.getDevice().getExtraValue().get("link_device_code").toString(); param.put("device_code", this.devicecode);
// DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); param.put("is_have", this.move);
// Device link_device = appService.findDeviceByCode(link_device_code); this.shipDeviceUpdate(param);
// 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);
} }
} }
switch (flag) {
//取货完成
case 1:
writing(2);
return;
//放货完成
case 2:
writing(3);
return;
}
} }
last_mode = mode; last_mode = mode;
last_error = error; 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 @Override
public JSONObject getDeviceStatusName() { public JSONObject getDeviceStatusName() {
JSONObject jo = new JSONObject(); JSONObject jo = new JSONObject();

141
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; import java.util.Map;
public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements OpcDeviceDriver { public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements OpcDeviceDriver {
UnifiedDataAccessor opcUdw; UnifiedDataAccessor opcUdw;
private Date sendTime; private Date sendTime;
private String last_items; private String last_items;
private int noLog_sendTimeOut; private int noLog_sendTimeOut;
private Date noLog_sendTime; private Date noLog_sendTime;
private String noLog_last_items; private String noLog_last_items;
public AbstractOpcDeviceDriver() { public AbstractOpcDeviceDriver() {
this.opcUdw = UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); this.opcUdw = UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key);
}
@Override
public UnifiedDataAccessor getOpcValueAccessor() {
return this.opcUdw;
}
public boolean control(Map<String, Object> itemValues) {
Iterator<Map.Entry<String, Object>> it = itemValues.entrySet().iterator();
ItemValue p2[];
p2 = new ItemValue[itemValues.size()];
int i=0;
while (it.hasNext()) {
Map.Entry<String, Object> 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++;
} }
return this.control(p2); @Override
} public UnifiedDataAccessor getOpcValueAccessor() {
return this.opcUdw;
}
public boolean control(Map<String, Object> itemValues) {
Iterator<Map.Entry<String, Object>> it = itemValues.entrySet().iterator();
public boolean control(ItemValue[] itemValues) { ItemValue p2[];
if (itemValues != null && itemValues.length != 0) { p2 = new ItemValue[itemValues.size()];
String this_items = JsonUtl.parseWithoutException(itemValues); int i = 0;
boolean need_write = false; while (it.hasNext()) {
StringBuilder sb = new StringBuilder(); Map.Entry<String, Object> entry = it.next();
ItemValue[] var5 = itemValues; System.out.println("即将写入值:" + entry.getKey() + ":" + entry.getValue());
int var6 = itemValues.length; p2[i] = new ItemValue();
p2[i].setItem_code(entry.getKey());
p2[i].setItem_value(entry.getValue());
i++;
}
for (int var7 = 0; var7 < var6; ++var7) { return this.control(p2);
ItemValue itemValue = var5[var7]; }
String code = itemValue.getItem_code();
Object udw_value = this.getUdwValue(code);
Object write_value = itemValue.getItem_value(); public boolean control(ItemValue[] itemValues) {
sb.append(code); if (itemValues != null && itemValues.length != 0) {
sb.append(":"); String this_items = JsonUtl.parseWithoutException(itemValues);
sb.append(JsonUtl.parseWithoutException(udw_value)); boolean need_write = false;
sb.append(";"); 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)) { // if (!need_write && !UnifiedDataAppService.isEquals(udw_value, write_value)) {
// need_write = true; // need_write = true;
// } // }
} }
need_write = true; need_write = true;
if (need_write) { if (need_write) {
Date date = new Date(); Date date = new Date();
/*if (StringUtl.isEqual(this_items, this.last_items) && date.getTime() - this.sendTime.getTime() < (long) WcsConfig.opc_write_repeat_check) { /*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); log.trace("发送时间因为小于{}毫秒,而被无视", WcsConfig.opc_write_repeat_check);
return false; return false;
}*/ }*/
this.last_items = this_items; this.last_items = this_items;
this.sendTime = date; this.sendTime = date;
/* this.execute_log.setResource(this.getDevice().getCode(), this.getDevice().getName()); /* this.execute_log.setResource(this.getDevice().getCode(), this.getDevice().getName());
this.execute_log.log("原始记录{}->变更为{}", new Object[]{sb, this_items}); this.execute_log.log("原始记录{}->变更为{}", new Object[]{sb, this_items});
OpcServerService opcServerService = OpcServerFactory.getOpcServerService();*/ OpcServerService opcServerService = OpcServerFactory.getOpcServerService();*/
OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class); OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class);
opcServerService.writeInteger(this.getOpcServer(), itemValues); opcServerService.writeInteger(this.getOpcServer(), itemValues);
UnifiedDataAccessor opcValueAccessor = this.getOpcValueAccessor(); UnifiedDataAccessor opcValueAccessor = this.getOpcValueAccessor();
ItemValue[] var17 = itemValues; ItemValue[] var17 = itemValues;
int var18 = itemValues.length; int var18 = itemValues.length;
for (int var19 = 0; var19 < var18; ++var19) { for (int var19 = 0; var19 < var18; ++var19) {
ItemValue itemValue = var17[var19]; ItemValue itemValue = var17[var19];
String code = itemValue.getItem_code(); String code = itemValue.getItem_code();
Object value = itemValue.getItem_value(); Object value = itemValue.getItem_value();
opcValueAccessor.setValue(code, value); opcValueAccessor.setValue(code, value);
} }
} }
return true; return true;
} else { } else {
throw new WDKException("下发 无内容"); throw new WDKException("下发 无内容");
}
} }
}
} }

65
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<? extends DeviceDriver> getDeviceDriverType() {
return FoldDiscSiteDeviceDriver.class;
}
@Override
public List<DeviceType> getFitDeviceTypes() {
List<DeviceType> types = new LinkedList<>();
types.add(DeviceType.station);
return types;
}
@Override
public List<ItemDto> getReadableItemDtos() {
return getReadableItemDtos2();
}
public static List<ItemDto> getReadableItemDtos2() {
return ItemProtocol.getReadableItemDtos();
}
@Override
public List<ItemDto> getWriteableItemDtos() {
return ItemProtocol.getWriteableItemDtos();
}
}

250
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<String, Object> 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<String, Object> 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<String, Object> itemMap = new HashMap<String, Object>();
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) {
}
}

117
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<ItemDto> getReadableItemDtos() {
ArrayList<ItemDto> 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<ItemDto> getWriteableItemDtos() {
ArrayList<ItemDto> 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;
}
}

2
acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java

@ -113,7 +113,7 @@ public interface AcsToWmsService {
* @param from * @param from
* @return * @return
*/ */
HttpResponse feedAgvTaskStatus(JSONArray from); JSONObject feedAgvTaskStatus(JSONArray from);
JSONObject test(JSONObject form); JSONObject test(JSONObject form);
} }

50
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.core.util.StrUtil;
import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; 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.AddressService;
import org.nl.acs.device.address.service.dto.AddressDto; import org.nl.acs.device.address.service.dto.AddressDto;
import org.nl.acs.device.service.DeviceService; 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.data.*;
import org.nl.acs.ext.wms.service.AcsToWmsService; 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.common.utils.RedisUtils;
import org.nl.modules.system.service.ParamService; import org.nl.modules.system.service.ParamService;
import org.slf4j.MDC; import org.slf4j.MDC;
@ -556,31 +557,36 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
} }
@Override @Override
public HttpResponse feedAgvTaskStatus(JSONArray from) { public JSONObject feedAgvTaskStatus(JSONArray from) {
if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { try {
log.info("开始反馈WMS AGV取放货状态,请求参数:{}", from); MDC.put(log_file_type, log_type);
this.getTokenFromWms();
String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) {
AddressDto addressDto = addressService.findByCode("feedAgvTaskStatus"); String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue();
String methods_url = addressDto.getMethods_url(); AddressDto addressDto = addressService.findByCode("feedAgvTaskStatus");
String url = wmsUrl + methods_url; String methodsUrl = addressDto.getMethods_url();
HttpResponse result = null; String url = wmsUrl + methodsUrl;
Map<String, Object> map = new HashMap<>(); // log.info("feedAgvTaskStatus - 请求参数 {}", param);
map.put("payload", JSON.toJSONString(from)); HttpResponse response = HttpRequest
try { .post(url)
result = HttpRequest.post(url) .body(from.toString())
.header("Content-Type", "application/json;charset=UTF-8")
.header("Authorization", String.valueOf(redisUtils.get("wms_token")))
.body(JSON.toJSONString(from))
.timeout(3000)
.execute(); .execute();
log.info("反馈WMS AGV取放货状态成功,请求路径:{},请求结果:{}", url, result.body()); // log.info("feedAgvTaskStatus - 返回参数 {}", response.body());
} catch (Exception e) { return JSONObject.parseObject(response.body());
log.info("反馈WMS AGV取放货状态失败,请求路径:{},请求结果:{}", url, e.getMessage());
} }
} catch (Throwable ignored) {
JSONObject result = new JSONObject();
result.put("status", HttpStatus.HTTP_CLIENT_TIMEOUT);
result.put("message", "请求超时!");
return result; 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 @Override

6
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); JSONObject start_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + start_device_code + "'").uniqueResult(0);
if (!ObjectUtil.isEmpty(start_device_json)) { 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"); 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); JSONObject next_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + next_device_code + "'").uniqueResult(0);
if (!ObjectUtil.isEmpty(next_device_json)) { 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"); 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) { if (StrUtil.isNotEmpty(start_point_code) && start_point_code.indexOf("-") > 0) {
String str[] = start_point_code.split("-"); String str[] = start_point_code.split("-");

2
acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java

@ -276,4 +276,6 @@ public interface InstructionService {
void init(String id); void init(String id);
int queryDeviceInstCount(String nextDeviceCode);
} }

26
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); ((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;
}
} }

73
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 cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; 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.InstructionService;
import org.nl.acs.instruction.service.dto.Instruction; 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.DeviceAppService;
import org.nl.acs.opc.DeviceAppServiceImpl; import org.nl.acs.opc.DeviceAppServiceImpl;
import org.nl.acs.route.service.RouteLineService; import org.nl.acs.route.service.RouteLineService;
@ -107,6 +109,77 @@ public class AutoCreateInst {
next_point_code = next_device_code; 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(); Instruction instdto = new Instruction();
instdto.setInstruction_type(task_type); instdto.setInstruction_type(task_type);

Loading…
Cancel
Save