Browse Source

更新

master
gengby 2 years ago
parent
commit
60b43bb231
  1. 2
      acs/nladmin-system/src/main/java/org/nl/acs/agv/server/XianGongAgvService.java
  2. 64
      acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/XianGongAgvServiceImpl.java
  3. 6
      acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java
  4. 73
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/agv/ItemProtocol.java
  5. 60
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/agv/MaGangAgvDefination.java
  6. 158
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/agv/MaGangAgvDeviceDriver.java
  7. 56
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/led/ItemProtocol.java
  8. 60
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/led/MaGangLedDefination.java
  9. 135
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/led/MaGangLedDeviceDriver.java
  10. 2
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/maGang/ItemProtocol.java
  11. 28
      acs/nladmin-system/src/main/java/org/nl/acs/device_driver/maGang/MaGangConveyorDeviceDriver.java
  12. 27
      acs/nladmin-system/src/main/java/org/nl/hand/amb/rest/HFHandController.java
  13. 8
      acs/nladmin-system/src/main/java/org/nl/hand/amb/service/HFHandService.java
  14. 19
      acs/nladmin-system/src/main/java/org/nl/hand/amb/service/impl/HFHandServiceImpl.java
  15. 20
      acs/nladmin-system/src/main/java/org/nl/hand/amb/wql/QJN_QUERY001.wql
  16. 134
      acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXZAgvDeviceStatus.java
  17. 6
      acs/nladmin-ui/src/views/acs/device/config.vue
  18. 455
      acs/nladmin-ui/src/views/acs/device/driver/magang_agv.vue
  19. 497
      acs/nladmin-ui/src/views/acs/device/driver/magang_led.vue

2
acs/nladmin-system/src/main/java/org/nl/acs/agv/server/XianGongAgvService.java

@ -81,4 +81,6 @@ public interface XianGongAgvService {
public JSONObject createOrederData(Instruction inst, String type); public JSONObject createOrederData(Instruction inst, String type);
public JSONArray blockGroupStatus(JSONObject param);
} }

64
acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/XianGongAgvServiceImpl.java

@ -114,59 +114,20 @@ public class XianGongAgvServiceImpl implements XianGongAgvService {
@Override @Override
public HttpResponse queryXZAgvDeviceStatus() { public HttpResponse queryXZAgvDeviceStatus() {
if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) { if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue().toString(), "1")) {
String agvurl = paramService.findByCode(AcsConfig.AGVURL).getValue(); String agvurl = paramService.findByCode(AcsConfig.AGVURL).getValue();
String agvport = paramService.findByCode(AcsConfig.AGVPORT).getValue(); String agvport = paramService.findByCode(AcsConfig.AGVPORT).getValue();
String agvurl1 = agvurl + ":" + agvport + "/api/route/vehicles"; agvurl = agvurl + ":" + agvport + "/robotsStatus";
String agvurl2 = agvurl + ":" + agvport + "/api/route/vehicleDetails";
HttpResponse result = HttpRequest.get(agvurl1)
.timeout(20000)//超时,毫秒
.execute();
HttpResponse result = HttpRequest.get(agvurl)
HttpResponse result2 = HttpRequest.get(agvurl2)
.timeout(20000)//超时,毫秒 .timeout(20000)//超时,毫秒
.execute(); .execute();
System.out.println("查询agv状态数据:" + result.body());
if (result.getStatus() == 200) {
JSONArray ja = (JSONArray) JSONArray.parse(result.body());
for (int i = 0; i < ja.size(); i++) {
JSONObject jo = (JSONObject) ja.get(i);
String name = jo.getString("name");
String state = jo.getString("state");
String energyLevel = jo.getString("energyLevel");
String transportOrder = jo.getString("transportOrder");
JSONObject detailjo = (JSONObject) JSONObject.parse(result2.body());
JSONObject item = (JSONObject) detailjo.get(name);
String x = item.getString("x");
String y = item.getString("y");
String angle = item.getString("angle");
AgvDto dto = new AgvDto();
dto.setName(name);
dto.setEnergyLevel(energyLevel);
dto.setState(state);
dto.setTransportOrder(transportOrder);
dto.setPositionAngle(angle);
dto.setPositionX(x);
dto.setPositionY(y);
if (AGVDeviceStatus.containsKey(name)) {
AGVDeviceStatus.remove(name);
AGVDeviceStatus.put(name, dto);
} else {
AGVDeviceStatus.put(name, dto);
}
}
}
return result; return result;
} else { } else {
return null; return null;
} }
} }
@LokiLog(type = LokiLogType.AGV) @LokiLog(type = LokiLogType.AGV)
@ -488,6 +449,25 @@ public class XianGongAgvServiceImpl implements XianGongAgvService {
return orderjo; return orderjo;
} }
@Override
@LokiLog(type = LokiLogType.AGV)
public JSONArray blockGroupStatus(JSONObject param) {
if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) {
String agvurl = paramService.findByCode(AcsConfig.AGVURL).getValue();
String agvport = paramService.findByCode(AcsConfig.AGVPORT).getValue();
agvurl = agvurl + ":" + agvport + "/transportOrders";
HttpResponse result = HttpRequest.get(agvurl)
.body(String.valueOf(param))//表单内容
.timeout(20000)//超时,毫秒
.execute();
return JSONArray.parseArray(result.body());
} else {
return null;
}
}
/** /**
* 返回一个点位操作子任务 先知使用 * 返回一个点位操作子任务 先知使用

6
acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java

@ -21,7 +21,11 @@ public enum DriverTypeEnum {
INSPECT_CONVEYOR_MONITOR(6, "standard_conveyor_monitor", "标准版-输送机-监控点", "conveyor"), INSPECT_CONVEYOR_MONITOR(6, "standard_conveyor_monitor", "标准版-输送机-监控点", "conveyor"),
MAGANG_CONVEYOR_CONTROL(7, "magang_conveyor_control", "马钢-输送机", "conveyor"); MAGANG_CONVEYOR_CONTROL(7, "magang_conveyor_control", "马钢-输送机", "conveyor"),
MAGANG_AGV(8, "magang_agv", "马钢-agv", "agv"),
MAGANG_LED(9, "magang_led", "马钢-led", "三色灯");
//驱动索引 //驱动索引
private int index; private int index;

73
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/agv/ItemProtocol.java

@ -0,0 +1,73 @@
package org.nl.acs.device_driver.agv;
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_status = "status";
public static String item_type = "type";
public static String item_x_coordinate = "x_coordinate";
public static String item_y_coordinate = "y_coordinate";
private MaGangAgvDeviceDriver driver;
public ItemProtocol(MaGangAgvDeviceDriver driver) {
this.driver = driver;
}
public int getStatus() {
return this.getOpcIntegerValue(item_status);
}
public int getType() {
return this.getOpcIntegerValue(item_type);
}
public int getX_coordinate() {
return this.getOpcIntegerValue(item_x_coordinate);
}
public int getY_coordinate() {
return this.getOpcIntegerValue(item_y_coordinate);
}
Boolean isonline;
public int getOpcIntegerValue(String protocol) {
Integer value = this.driver.getIntegeregerValue(protocol);
if (value == null) {
setIsonline(false);
} else {
setIsonline(true);
return value;
}
return 0;
}
public static List<ItemDto> getReadableItemDtos() {
ArrayList list = new ArrayList();
list.add(new ItemDto(item_status, "AGV状态", "DB620.W0"));
list.add(new ItemDto(item_type, "AGV任务类型", "DB620.W2"));
list.add(new ItemDto(item_x_coordinate, "AGVx坐标", "DB620.W4"));
list.add(new ItemDto(item_y_coordinate, "AGVy坐标", "DB620.W6"));
return list;
}
public static List<ItemDto> getWriteableItemDtos() {
ArrayList list = new ArrayList();
list.add(new ItemDto(item_status, "AGV状态", "DB620.W0"));
list.add(new ItemDto(item_type, "AGV任务类型", "DB620.W2"));
list.add(new ItemDto(item_x_coordinate, "AGVx坐标", "DB620.W4"));
list.add(new ItemDto(item_y_coordinate, "AGVy坐标", "DB620.W6"));
return list;
}
}

60
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/agv/MaGangAgvDefination.java

@ -0,0 +1,60 @@
package org.nl.acs.device_driver.agv;
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;
/**
* 马钢agv
*/
@Service
public class MaGangAgvDefination implements OpcDeviceDriverDefination {
@Override
public String getDriverCode() {
return "magang_agv";
}
@Override
public String getDriverName() {
return "马钢AGV";
}
@Override
public String getDriverDescription() {
return "马钢AGV";
}
@Override
public DeviceDriver getDriverInstance(Device device) {
return (new MaGangAgvDeviceDriver()).setDevice(device).setDriverDefination(this);
}
@Override
public Class<? extends DeviceDriver> getDeviceDriverType() {
return MaGangAgvDeviceDriver.class;
}
@Override
public List<DeviceType> getFitDeviceTypes() {
List<DeviceType> types = new LinkedList();
types.add(DeviceType.conveyor);
return types;
}
@Override
public List<ItemDto> getReadableItemDtos() {
return ItemProtocol.getReadableItemDtos();
}
@Override
public List<ItemDto> getWriteableItemDtos() {
return ItemProtocol.getWriteableItemDtos();
}
}

158
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/agv/MaGangAgvDeviceDriver.java

@ -0,0 +1,158 @@
package org.nl.acs.device_driver.agv;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.agv.server.AgvService;
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.ext.wms.service.impl.AcsToWmsServiceImpl;
import org.nl.acs.instruction.service.InstructionService;
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.task.service.TaskService;
import org.nl.modules.system.service.ParamService;
import org.nl.modules.wql.util.SpringContextHolder;
import org.openscada.opc.lib.da.Server;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.*;
/**
* 马钢agv
*/
@Slf4j
@Data
@RequiredArgsConstructor
public class MaGangAgvDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor {
protected ItemProtocol itemProtocol = new ItemProtocol(this);
@Autowired
DeviceAppService deviceAppservice = SpringContextHolder.getBean(DeviceAppService.class);
@Autowired
InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class);
@Autowired
DeviceService deviceservice = SpringContextHolder.getBean(DeviceService.class);
@Autowired
TaskService taskserver = SpringContextHolder.getBean(TaskService.class);
@Autowired
RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class);
@Autowired
AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class);
@Autowired
ParamService paramService = SpringContextHolder.getBean(ParamService.class);
@Autowired
DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class);
@Autowired
AgvService agvService = SpringContextHolder.getBean(AgvService.class);
private Date instruction_require_time = new Date();
private Date instruction_finished_time = new Date();
private Date instruction_apply_time = new Date();
private int instruction_require_time_out = 3000;
//agv工作状态
int status = 0;
int last_status = 0;
//AGV任务类型
int type = 0;
int last_type = 0;
//x坐标
int x_coordinate = 0;
int last_x_coordinate = 0;
//y坐标
int y_coordinate = 0;
int last_y_coordinate = 0;
Boolean isonline = true;
Boolean iserror = false;
//1-执行任务;2-取货完成;3-放货完成;
int flag;
String device_code;
@Override
public Device getDevice() {
return this.device;
}
//请求成功标记
Boolean requireSucess = false;
@Override
public void execute() throws Exception {
String message = null;
device_code = this.getDeviceCode();
status = this.itemProtocol.getStatus();
type = this.itemProtocol.getType();
x_coordinate = this.itemProtocol.getX_coordinate();
y_coordinate = this.itemProtocol.getY_coordinate();
}
protected void thingToNothing() {
}
public void writing(String param, String value) {
String to_command = 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<String, Object>();
itemMap.put(to_command, value);
ReadUtil.write(itemMap, server);
}
@Override
public JSONObject getDeviceStatusName() {
JSONObject jo = new JSONObject();
String status = "";
String type = "";
if (this.getStatus() == 1) {
status = "工作中";
} else if (this.getStatus() == 2) {
status = "充电中";
} else if (this.getStatus() == 3) {
status = "故障";
} else if (this.getStatus() == 4) {
status = "休息中";
}
if (this.getType() == 1) {
type = "5#镀锌送样";
} else if (this.getType() == 2) {
type = "1#连退送样";
} else if (this.getType() == 3) {
type = "2#连退送样";
} else if (this.getType() == 4) {
type = "重卷送样";
}
jo.put("device_name", this.getDevice().getDevice_name());
jo.put("type", type);
jo.put("status", status);
return jo;
}
@Override
public void setDeviceStatus(JSONObject data) {
}
}

56
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/led/ItemProtocol.java

@ -0,0 +1,56 @@
package org.nl.acs.device_driver.led;
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_D01 = "D01";
private MaGangLedDeviceDriver driver;
public ItemProtocol(MaGangLedDeviceDriver driver) {
this.driver = driver;
}
public int getD01() {
return this.getOpcIntegerValue(item_D01);
}
Boolean isonline;
public int getOpcIntegerValue(String protocol) {
Integer value = this.driver.getIntegeregerValue(protocol);
if (value == null) {
setIsonline(false);
} else {
setIsonline(true);
return value;
}
return 0;
}
public static List<ItemDto> getReadableItemDtos() {
ArrayList list = new ArrayList();
list.add(new ItemDto(item_D01, "LED", "00017", Boolean.valueOf(true)));
return list;
}
public static List<ItemDto> getWriteableItemDtos() {
ArrayList list = new ArrayList();
list.add(new ItemDto(item_D01, "LED", "00017", Boolean.valueOf(true)));
return list;
}
}

60
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/led/MaGangLedDefination.java

@ -0,0 +1,60 @@
package org.nl.acs.device_driver.led;
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;
/**
* 马钢led
*/
@Service
public class MaGangLedDefination implements OpcDeviceDriverDefination {
@Override
public String getDriverCode() {
return "magang_led";
}
@Override
public String getDriverName() {
return "马钢led";
}
@Override
public String getDriverDescription() {
return "马钢led";
}
@Override
public DeviceDriver getDriverInstance(Device device) {
return (new MaGangLedDeviceDriver()).setDevice(device).setDriverDefination(this);
}
@Override
public Class<? extends DeviceDriver> getDeviceDriverType() {
return MaGangLedDeviceDriver.class;
}
@Override
public List<DeviceType> getFitDeviceTypes() {
List<DeviceType> types = new LinkedList();
types.add(DeviceType.conveyor);
return types;
}
@Override
public List<ItemDto> getReadableItemDtos() {
return ItemProtocol.getReadableItemDtos();
}
@Override
public List<ItemDto> getWriteableItemDtos() {
return ItemProtocol.getWriteableItemDtos();
}
}

135
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/led/MaGangLedDeviceDriver.java

@ -0,0 +1,135 @@
package org.nl.acs.device_driver.led;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.agv.server.AgvService;
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.ext.wms.service.impl.AcsToWmsServiceImpl;
import org.nl.acs.instruction.service.InstructionService;
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.task.service.TaskService;
import org.nl.modules.system.service.ParamService;
import org.nl.modules.wql.util.SpringContextHolder;
import org.openscada.opc.lib.da.Server;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 马钢led
*/
@Slf4j
@Data
@RequiredArgsConstructor
public class MaGangLedDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor {
protected ItemProtocol itemProtocol = new ItemProtocol(this);
@Autowired
DeviceAppService deviceAppservice = SpringContextHolder.getBean(DeviceAppService.class);
@Autowired
InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class);
@Autowired
DeviceService deviceservice = SpringContextHolder.getBean(DeviceService.class);
@Autowired
TaskService taskserver = SpringContextHolder.getBean(TaskService.class);
@Autowired
RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class);
@Autowired
AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class);
@Autowired
ParamService paramService = SpringContextHolder.getBean(ParamService.class);
@Autowired
DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class);
@Autowired
AgvService agvService = SpringContextHolder.getBean(AgvService.class);
private Date instruction_require_time = new Date();
private Date instruction_finished_time = new Date();
private Date instruction_apply_time = new Date();
private int instruction_require_time_out = 3000;
//agv工作状态
int D01 = 0;
int last_D01 = 0;
Boolean isonline = true;
Boolean iserror = false;
//1-执行任务;2-取货完成;3-放货完成;
int flag;
String device_code;
@Override
public Device getDevice() {
return this.device;
}
//请求成功标记
Boolean requireSucess = false;
@Override
public void execute() throws Exception {
String message = null;
device_code = this.getDeviceCode();
D01 = this.itemProtocol.getD01();
}
protected void thingToNothing() {
}
public void writing(String param, int command) {
String to_command = 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<String, Object>();
itemMap.put(to_command, command);
ReadUtil.write(itemMap, server);
}
public void writing(String param, String value) {
String to_command = 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<String, Object>();
itemMap.put(to_command, value);
ReadUtil.write(itemMap, server);
}
@Override
public JSONObject getDeviceStatusName() {
JSONObject jo = new JSONObject();
String status = "";
String type = "";
jo.put("device_name", this.getDevice().getDevice_name());
jo.put("type", type);
jo.put("status", status);
return jo;
}
@Override
public void setDeviceStatus(JSONObject data) {
}
}

2
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/maGang/ItemProtocol.java

@ -18,6 +18,7 @@ public class ItemProtocol {
public static String item_error = "error"; public static String item_error = "error";
public static String item_to_heartbeat = "to_heartbeat";
public static String item_to_command = "to_command"; public static String item_to_command = "to_command";
@ -73,6 +74,7 @@ public class ItemProtocol {
public static List<ItemDto> getWriteableItemDtos() { public static List<ItemDto> getWriteableItemDtos() {
ArrayList list = new ArrayList(); ArrayList list = new ArrayList();
list.add(new ItemDto(item_to_heartbeat, "反馈心跳", "DB601.B0"));
list.add(new ItemDto(item_to_command, "下发命令", "DB601.W2")); list.add(new ItemDto(item_to_command, "下发命令", "DB601.W2"));
return list; return list;
} }

28
acs/nladmin-system/src/main/java/org/nl/acs/device_driver/maGang/MaGangConveyorDeviceDriver.java

@ -64,8 +64,12 @@ public class MaGangConveyorDeviceDriver extends AbstractOpcDeviceDriver implemen
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 Date instruction_apply_time = new Date(); private Date instruction_apply_time = new Date();
private Date feedHeartBeatTime = new Date();
private int feedHeartBeatTimeOut = 30000;
private int instruction_require_time_out = 3000; private int instruction_require_time_out = 3000;
int feedHeartbeat = 0;
int last_feedHeartbeat = 0;
int heartbeat = 0; int heartbeat = 0;
//工作模式 //工作模式
int mode = 0; int mode = 0;
@ -109,6 +113,20 @@ public class MaGangConveyorDeviceDriver extends AbstractOpcDeviceDriver implemen
move = this.itemProtocol.getItem_move(); move = this.itemProtocol.getItem_move();
action = this.itemProtocol.getItem_action(); action = this.itemProtocol.getItem_action();
error = this.itemProtocol.getItem_error(); error = this.itemProtocol.getItem_error();
String inspect_in_stocck = String.valueOf(this.getDevice().getExtraValue().get("inspect_in_stocck"));
if (StrUtil.isNotEmpty(inspect_in_stocck) && !StrUtil.equals(inspect_in_stocck, "null")) {
Date date = new Date();
if (date.getTime() - this.feedHeartBeatTime.getTime() >= (long) this.feedHeartBeatTimeOut) {
String feedHeart = "0";
if (last_feedHeartbeat == 0) {
feedHeart = "1";
}
this.feedHeartBeatTime = date;
this.writing("to_heartbeat", feedHeart);
last_feedHeartbeat = Integer.parseInt(feedHeart);
}
}
if (mode != last_mode) { if (mode != last_mode) {
if (mode == 3) { if (mode == 3) {
this.setRequireSucess(false); this.setRequireSucess(false);
@ -261,6 +279,16 @@ public class MaGangConveyorDeviceDriver extends AbstractOpcDeviceDriver implemen
ReadUtil.write(itemMap, server); ReadUtil.write(itemMap, server);
} }
public void writing(String type, String value) {
String param = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
+ "." + type;
String opcservcerid = this.getDevice().getOpc_server_id();
Server server = ReadUtil.getServer(opcservcerid);
Map<String, Object> itemMap = new HashMap<String, Object>();
itemMap.put(param, value);
ReadUtil.write(itemMap, server);
}
@Override @Override
public JSONObject getDeviceStatusName() { public JSONObject getDeviceStatusName() {
JSONObject jo = new JSONObject(); JSONObject jo = new JSONObject();

27
acs/nladmin-system/src/main/java/org/nl/hand/amb/rest/HFHandController.java

@ -39,6 +39,15 @@ public class HFHandController {
return new ResponseEntity<>(HandService.queryArea(null), HttpStatus.OK); return new ResponseEntity<>(HandService.queryArea(null), HttpStatus.OK);
} }
@PostMapping("/queryDevice")
@Log("查询区域点位")
@ApiOperation("查询区域点位")
@SaIgnore
//@PreAuthorize("@el.check('sect:list')")
public ResponseEntity<Object> queryDevice() {
return new ResponseEntity<>(HandService.queryPoint(), HttpStatus.OK);
}
@PostMapping("/point") @PostMapping("/point")
@Log("查询设备编号及状态") @Log("查询设备编号及状态")
@ApiOperation("查询设备编号及状态") @ApiOperation("查询设备编号及状态")
@ -50,15 +59,15 @@ public class HFHandController {
return new ResponseEntity<>(HandService.queryPointByArea(region), HttpStatus.OK); return new ResponseEntity<>(HandService.queryPointByArea(region), HttpStatus.OK);
} }
@PostMapping("/queryDevice") // @PostMapping("/queryDevice")
@Log("查询设备起点和终点") // @Log("查询设备起点和终点")
@ApiOperation("查询设备起点和终点") // @ApiOperation("查询设备起点和终点")
@SaIgnore // @SaIgnore
//@PreAuthorize("@el.check('sect:list')") // //@PreAuthorize("@el.check('sect:list')")
//@RequestBody JSONObject json // //@RequestBody JSONObject json
public ResponseEntity<Object> queryDevice() { // public ResponseEntity<Object> queryDevice() {
return new ResponseEntity<>(HandService.queryDevice(), HttpStatus.OK); // return new ResponseEntity<>(HandService.queryDevice(), HttpStatus.OK);
} // }
@PostMapping("/point/storage") @PostMapping("/point/storage")
@Log("查询设备扩展属性") @Log("查询设备扩展属性")

8
acs/nladmin-system/src/main/java/org/nl/hand/amb/service/HFHandService.java

@ -2,6 +2,8 @@
package org.nl.hand.amb.service; package org.nl.hand.amb.service;
import com.alibaba.fastjson.JSONObject;
import java.util.Map; import java.util.Map;
/** /**
@ -119,4 +121,10 @@ public interface HFHandService {
* @return Map<String, Object> * @return Map<String, Object>
*/ */
Map<String, Object> queryDevice(); Map<String, Object> queryDevice();
/**
* 查询区域点位
* @return json
*/
JSONObject queryPoint();
} }

19
acs/nladmin-system/src/main/java/org/nl/hand/amb/service/impl/HFHandServiceImpl.java

@ -70,6 +70,25 @@ public class HFHandServiceImpl implements HFHandService {
return jo; return jo;
} }
@Override
public JSONObject queryPoint() {
JSONObject result = new JSONObject();
// 1.查询区域
JSONArray regionArr = WQL.getWO("QJN_QUERY001").addParam("flag", "1").process().getResultJSONArray(0);
// 2.根据区域查询对应点位
JSONObject resultJson = new JSONObject();
for (int i = 0; i < regionArr.size(); i++) {
JSONObject jsonRegion = regionArr.getJSONObject(i);
JSONArray pointArr = WQL.getWO("QJN_QUERY001").addParam("flag", "6").addParam("region_id", jsonRegion.getString("region_code")).process().getResultJSONArray(0);
jsonRegion.put("deviceArr", pointArr);
}
resultJson.put("regionja", regionArr);
result.put("result", resultJson);
result.put("code", "1");
result.put("desc", "查询成功");
return result;
}
@Override @Override
public Map<String, Object> queryPointByArea(String dict_id) { public Map<String, Object> queryPointByArea(String dict_id) {
JSONArray resultArr = new JSONArray(); JSONArray resultArr = new JSONArray();

20
acs/nladmin-system/src/main/java/org/nl/hand/amb/wql/QJN_QUERY001.wql

@ -19,6 +19,7 @@
输入.start_point TYPEAS s_string 输入.start_point TYPEAS s_string
输入.next_point TYPEAS s_string 输入.next_point TYPEAS s_string
输入.detail_id TYPEAS s_string 输入.detail_id TYPEAS s_string
输入.region_id TYPEAS s_string
@ -203,3 +204,22 @@
ENDSELECT ENDSELECT
ENDQUERY ENDQUERY
ENDIF ENDIF
IF 输入.flag = "6"
QUERY
SELECT
device_id,
device_code,
device_name,
seq_num
FROM
acs_device
WHERE
is_config = 'true'
AND is_delete = '0'
OPTION 输入.region_id <> ""
region = 输入.region_id
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF

134
acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryXZAgvDeviceStatus.java

@ -0,0 +1,134 @@
package org.nl.modules.quartz.task;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.agv.server.XianGongAgvService;
import org.nl.acs.device_driver.agv.MaGangAgvDeviceDriver;
import org.nl.acs.device_driver.led.MaGangLedDeviceDriver;
import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.instruction.service.dto.Instruction;
import org.nl.acs.opc.Device;
import org.nl.acs.opc.DeviceAppService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 查询先工AGV设备状态
*/
@Slf4j
@Component
public class QueryXZAgvDeviceStatus {
@Autowired
InstructionService instructionService;
@Autowired
XianGongAgvService agvService;
@Autowired
DeviceAppService deviceAppService;
public void run() {
try {
HttpResponse response = agvService.queryXZAgvDeviceStatus();
if (ObjectUtil.isNotEmpty(response)) {
if (response.getStatus() == 200) {
JSONObject body = JSONObject.parseObject(response.body());
JSONArray ja = body.getJSONArray("report");
for (int i = 0; i < ja.size(); i++) {
JSONObject jo = ja.getJSONObject(i);
//机器人编码
String agv_code = jo.getString("uuid");
//机器人详细状态信息
JSONObject rbk_report = jo.getJSONObject("rbk_report");
//是否正在充电
Boolean charging = rbk_report.getBoolean("charging");
//是否正在执行任务
Boolean procBusiness = jo.getBoolean("procBusiness");
//agv是否故障
Boolean is_error = jo.getBoolean("is_error");
//执行运单信息
JSONObject current_order = jo.getJSONObject("current_order");
String inst_code = current_order.getString("id");
String task_type = "0";
if (StrUtil.isNotEmpty(inst_code)) {
Instruction inst = instructionService.findByCodeFromCache(inst_code);
//任务类型
task_type = inst.getInstruction_type();
}
//x坐标
int x = Double.valueOf(rbk_report.getString("x")).intValue();
//y坐标
int y = Double.valueOf(rbk_report.getString("y")).intValue();
String status = "0";
if (procBusiness) {
//工作中
status = "1";
} else {
if (charging) {
//充电中
status = "2";
} else {
if (is_error) {
//故障
status = "3";
} else {
//休息中
status = "4";
}
}
}
Device device = deviceAppService.findDeviceByCode(agv_code);
MaGangAgvDeviceDriver maGangAgvDeviceDriver;
if (device.getDeviceDriver() instanceof MaGangAgvDeviceDriver) {
maGangAgvDeviceDriver = (MaGangAgvDeviceDriver) device.getDeviceDriver();
maGangAgvDeviceDriver.writing("status", status);
maGangAgvDeviceDriver.writing("type", task_type);
maGangAgvDeviceDriver.writing("x_coordinate", String.valueOf(x));
maGangAgvDeviceDriver.writing("y_coordinate", String.valueOf(y));
}
}
}
}
} catch (Exception e) {
}
try {
JSONObject map = new JSONObject();
JSONArray blocks = new JSONArray();
map.put("blockGroup",blocks);
JSONArray jsonArray = agvService.blockGroupStatus(map);
if (ObjectUtil.isNotEmpty(jsonArray)){
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Boolean status = jsonObject.getBoolean("status");
if (status){
String name = jsonObject.getString("name");
Device device = deviceAppService.findDeviceByCode(name);
MaGangLedDeviceDriver maGangLedDeviceDriver;
if (device.getDeviceDriver() instanceof MaGangLedDeviceDriver){
maGangLedDeviceDriver = (MaGangLedDeviceDriver) device.getDeviceDriver();
maGangLedDeviceDriver.writing("D01","1");
}
}else {
String name = jsonObject.getString("name");
Device device = deviceAppService.findDeviceByCode(name);
MaGangLedDeviceDriver maGangLedDeviceDriver;
if (device.getDeviceDriver() instanceof MaGangLedDeviceDriver){
maGangLedDeviceDriver = (MaGangLedDeviceDriver) device.getDeviceDriver();
maGangLedDeviceDriver.writing("D01","0");
}
}
}
}
}catch (Exception e){
}
}
}

6
acs/nladmin-ui/src/views/acs/device/config.vue

@ -86,6 +86,8 @@ import haokai_auto_conveyor from '@/views/acs/device/driver/haokai_auto_conveyor
import cargo_lift_conveyor from '@/views/acs/device/driver/cargo_lift_conveyor' import cargo_lift_conveyor from '@/views/acs/device/driver/cargo_lift_conveyor'
import empty_vehicle_stacking_position from '@/views/acs/device/driver/empty_vehicle_stacking_position' import empty_vehicle_stacking_position from '@/views/acs/device/driver/empty_vehicle_stacking_position'
import magang_conveyor_control from '@/views/acs/device/driver/magang_conveyor_control' import magang_conveyor_control from '@/views/acs/device/driver/magang_conveyor_control'
import magang_agv from '@/views/acs/device/driver/magang_agv'
import magang_led from '@/views/acs/device/driver/magang_led'
export default { export default {
name: 'DeviceConfig', name: 'DeviceConfig',
@ -102,7 +104,9 @@ export default {
haokai_auto_conveyor, haokai_auto_conveyor,
cargo_lift_conveyor, cargo_lift_conveyor,
empty_vehicle_stacking_position, empty_vehicle_stacking_position,
magang_conveyor_control magang_conveyor_control,
magang_agv,
magang_led
}, },
dicts: ['device_type'], dicts: ['device_type'],
mixins: [crud], mixins: [crud],

455
acs/nladmin-ui/src/views/acs/device/driver/magang_agv.vue

@ -0,0 +1,455 @@
<template>
<!--货梯对接线-->
<div>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">设备协议</span>
</div>
<el-row>
<el-col :span="12">
OpcServer:
<el-select
v-model="opc_id"
placeholder="无"
clearable
filterable
@change="changeOpc"
>
<el-option
v-for="item in dataOpcservers"
:key="item.opc_id"
:label="item.opc_name"
:value="item.opc_id"
/>
</el-select>
</el-col>
<el-col :span="12">
PLC:
<el-select
v-model="plc_id"
placeholder="无"
clearable
@change="changePlc"
filterable
>
<el-option
v-for="item in dataOpcPlcs"
:key="item.plc_id"
:label="item.plc_name"
:value="item.plc_id"
/>
</el-select>
</el-col>
</el-row>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">输送系统</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="电气调度号" label-width="150px">
<el-input v-model="form.address" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">指令相关</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="检验有货">
<el-switch v-model="form.inspect_in_stocck" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="忽视取货校验" label-width="150px">
<el-switch v-model="form.ignore_pickup_check" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="忽视放货校验" label-width="150px">
<el-switch v-model="form.ignore_release_check" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="呼叫">
<el-switch v-model="form.apply_task" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="响应" label-width="150px">
<el-switch v-model="form.manual_create_task" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">AGV相关</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="取货">
<el-switch v-model="form.is_pickup" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="放货">
<el-switch v-model="form.is_release" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">PLC读取字段</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-table
v-loading="false"
:data="data1"
:max-height="550"
size="small"
style="width: 100%;margin-bottom: 15px"
>
<el-table-column prop="name" label="用途" />
<el-table-column prop="code" label="别名要求" />
<el-table-column prop="db" label="DB块">
<template slot-scope="scope">
<el-input
v-model="data1[scope.$index].db"
size="mini"
class="edit-input"
@input="finishReadEdit(data1[scope.$index])"
/>
</template>
</el-table-column>
<el-table-column prop="dbr_value">
<template slot="header">
<el-link type="primary" :underline="false" @click.native="test_read1()">测试读</el-link>
</template>
<template slot-scope="scope">
<el-input v-model="data1[scope.$index].dbr_value" size="mini" class="edit-input" />
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">PLC写入字段</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-table
v-loading="false"
:data="data2"
:max-height="550"
size="small"
style="width: 100%;margin-bottom: 15px"
>
<el-table-column prop="name" label="用途" />
<el-table-column prop="code" label="别名要求" />
<el-table-column prop="db" label="DB块">
<template slot-scope="scope">
<el-input
v-model="data2[scope.$index].db"
size="mini"
class="edit-input"
@input="finishWriteEdit(data2[scope.$index])"
/>
</template>
</el-table-column>
<el-table-column prop="dbw_value">
<template slot="header">
<el-link type="primary" :underline="false" @click.native="test_write1()">测试写</el-link>
</template>
<template slot-scope="scope">
<el-input v-model="data2[scope.$index].dbw_value" size="mini" class="edit-input" />
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span" />
<el-button
:loading="false"
icon="el-icon-check"
size="mini"
style="float: right; padding: 6px 9px"
type="primary"
@click="doSubmit"
>保存
</el-button>
</div>
</el-card>
</div>
</template>
<script>
import {
queryDriverConfig,
updateConfig,
testRead,
testwrite
} from '@/api/acs/device/driverConfig'
import { selectOpcList } from '@/api/acs/device/opc'
import { selectPlcList } from '@/api/acs/device/opcPlc'
import { selectListByOpcID } from '@/api/acs/device/opcPlc'
import crud from '@/mixins/crud'
import deviceCrud from '@/api/acs/device/device'
export default {
name: 'StandardConveyorControl',
mixins: [crud],
props: {
parentForm: {
type: Object,
require: true
}
},
data() {
return {
device_code: '',
device_id: '',
plc_id: '',
plc_code: '',
address: '',
opc_id: '',
doors: [{
key: '1',
label: '前门'
}, {
key: '2',
label: '后门'
}],
floors: [{
key: '1',
label: '1楼'
}, {
key: '2',
label: '2楼'
}],
opc_code: '',
configLoading: false,
dataOpcservers: [],
dataOpcPlcs: [],
deviceList: [],
data1: [],
data2: [],
form: {
inspect_in_stocck: true,
ignore_pickup_check: true,
ignore_release_check: true,
apply_task: true,
link_three_lamp: '',
manual_create_task: true,
is_pickup: true,
is_release: true,
link_device_code: '',
door: '',
floor: ''
},
rules: {}
}
},
created() {
this.$nextTick(() => {
//
this.device_id = this.$props.parentForm.device_id
this.device_code = this.$props.parentForm.device_code
queryDriverConfig(this.device_id, this.$props.parentForm.driver_code).then(data => {
//
if (data.form) {
const arr = Object.keys(data.form)
//
if (arr.length > 0) {
this.form = data.form
}
}
//
if (data.parentForm) {
const arr = Object.keys(data.parentForm)
//
if (arr.length > 0) {
this.opc_code = data.parentForm.opc_code
this.plc_code = data.parentForm.plc_code
}
}
this.data1 = data.rs
this.data2 = data.ws
this.sliceItem()
})
selectPlcList().then(data => {
this.dataOpcPlcs = data
this.plc_id = this.$props.parentForm.opc_plc_id
})
selectOpcList().then(data => {
this.dataOpcservers = data
this.opc_id = this.$props.parentForm.opc_server_id
})
deviceCrud.selectDeviceList().then(data => {
this.deviceList = data
})
})
},
methods: {
finishReadEdit(data) {
// code,mode
if (data.code.indexOf('mode') !== -1) {
const dbValue = data.db
// .
const beforeStr = dbValue.substring(0, 2)
// .
const afterStr = dbValue.substring(2)
for (const val in this.data1) {
if (this.data1[val].code.indexOf('move') !== -1) {
this.data1[val].db = beforeStr + (parseInt(afterStr) + 2)
}
if (this.data1[val].code.indexOf('action') !== -1) {
this.data1[val].db = beforeStr + (parseInt(afterStr) + 4)
}
if (this.data1[val].code.indexOf('error') !== -1) {
this.data1[val].db = beforeStr + (parseInt(afterStr) + 6)
}
if (this.data1[val].code.indexOf('task') !== -1) {
this.data1[val].db = beforeStr + (parseInt(afterStr) + 8)
}
}
}
},
finishWriteEdit(data) {
// code,mode
if (data.code.indexOf('to_command') !== -1) {
const dbValue = data.db
// .
const beforeStr = dbValue.substring(0, 2)
// .
const afterStr = dbValue.substring(2)
for (const val in this.data2) {
if (this.data2[val].code.indexOf('to_target') !== -1) {
this.data2[val].db = beforeStr + (parseInt(afterStr) + 2)
}
if (this.data2[val].code.indexOf('to_task') !== -1) {
this.data2[val].db = beforeStr + (parseInt(afterStr) + 4)
}
}
}
},
changeOpc(val) {
this.dataOpcservers.forEach(item => {
if (item.opc_id === val) {
this.opc_code = item.opc_code
}
})
selectListByOpcID(val).then(data => {
this.dataOpcPlcs = data
this.plc_id = ''
this.plc_code = ''
if (this.dataOpcPlcs && this.dataOpcPlcs.length > 0) {
this.plc_id = this.dataOpcPlcs[0].plc_id
this.plc_code = this.dataOpcPlcs[0].plc_code
}
this.sliceItem()
})
},
changePlc(val) {
this.dataOpcPlcs.forEach(item => {
if (item.plc_id === val) {
this.plc_code = item.plc_code
this.sliceItem()
return
}
})
},
test_read1() {
testRead(this.data1, this.opc_id).then(data => {
this.data1 = data
this.notify('操作成功!', 'success')
}).catch(err => {
console.log(err.response.data.message)
})
},
test_write1() {
testwrite(this.data2, this.opc_id).then(data => {
this.notify('操作成功!', 'success')
}).catch(err => {
console.log(err.response.data.message)
})
},
doSubmit() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.configLoading = true
//
const parentForm = this.parentForm
parentForm.is_route = true
parentForm.plc_id = this.plc_id
parentForm.opc_id = this.opc_id
updateConfig(parentForm, this.form, this.data1, this.data2).then(res => {
this.notify('保存成功', 'success')
this.configLoading = false
}).catch(err => {
this.configLoading = false
console.log(err.response.data.message)
})
}
})
},
sliceItem() { // DBItem
this.data1.forEach(item => {
const str = item.code
// .
if (str.search('.') !== -1) {
//
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + str.slice(str.lastIndexOf('.') + 1)
} else {
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + item.code
}
})
this.data2.forEach(item => {
const str = item.code
// .
if (str.search('.') !== -1) {
//
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + str.slice(str.lastIndexOf('.') + 1)
} else {
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + item.code
}
})
}
}
}
</script>
<style scoped>
</style>

497
acs/nladmin-ui/src/views/acs/device/driver/magang_led.vue

@ -0,0 +1,497 @@
<template>
<!--货梯对接线-->
<div>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">设备协议</span>
</div>
<el-row>
<el-col :span="12">
OpcServer:
<el-select
v-model="opc_id"
placeholder="无"
clearable
filterable
@change="changeOpc"
>
<el-option
v-for="item in dataOpcservers"
:key="item.opc_id"
:label="item.opc_name"
:value="item.opc_id"
/>
</el-select>
</el-col>
<el-col :span="12">
PLC:
<el-select
v-model="plc_id"
placeholder="无"
clearable
@change="changePlc"
filterable
>
<el-option
v-for="item in dataOpcPlcs"
:key="item.plc_id"
:label="item.plc_name"
:value="item.plc_id"
/>
</el-select>
</el-col>
</el-row>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">输送系统</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="电气调度号" label-width="150px">
<el-input v-model="form.address" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">指令相关</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="检验有货">
<el-switch v-model="form.inspect_in_stocck" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="忽视取货校验" label-width="150px">
<el-switch v-model="form.ignore_pickup_check" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="忽视放货校验" label-width="150px">
<el-switch v-model="form.ignore_release_check" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="呼叫">
<el-switch v-model="form.apply_task" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="响应" label-width="150px">
<el-switch v-model="form.manual_create_task" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="关联设备" prop="device_code">
<el-select
v-model="form.link_device_code"
clearable
filterable
placeholder="请选择"
>
<el-option
v-for="item in deviceList"
:key="item.device_code"
:label="item.device_name"
:value="item.device_code"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="关联三色灯" prop="device_code" label-width="100px">
<el-select
v-model="form.link_three_lamp"
filterable
clearable
placeholder="请选择"
>
<el-option
v-for="item in deviceList"
:key="item.device_code"
:label="item.device_name"
:value="item.device_code"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否输入物料" label-width="150px">
<el-switch v-model="form.input_material" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">AGV相关</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row>
<el-col :span="8">
<el-form-item label="取货">
<el-switch v-model="form.is_pickup" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="放货">
<el-switch v-model="form.is_release" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">PLC读取字段</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-table
v-loading="false"
:data="data1"
:max-height="550"
size="small"
style="width: 100%;margin-bottom: 15px"
>
<el-table-column prop="name" label="用途" />
<el-table-column prop="code" label="别名要求" />
<el-table-column prop="db" label="DB块">
<template slot-scope="scope">
<el-input
v-model="data1[scope.$index].db"
size="mini"
class="edit-input"
@input="finishReadEdit(data1[scope.$index])"
/>
</template>
</el-table-column>
<el-table-column prop="dbr_value">
<template slot="header">
<el-link type="primary" :underline="false" @click.native="test_read1()">测试读</el-link>
</template>
<template slot-scope="scope">
<el-input v-model="data1[scope.$index].dbr_value" size="mini" class="edit-input" />
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span">PLC写入字段</span>
</div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-table
v-loading="false"
:data="data2"
:max-height="550"
size="small"
style="width: 100%;margin-bottom: 15px"
>
<el-table-column prop="name" label="用途" />
<el-table-column prop="code" label="别名要求" />
<el-table-column prop="db" label="DB块">
<template slot-scope="scope">
<el-input
v-model="data2[scope.$index].db"
size="mini"
class="edit-input"
@input="finishWriteEdit(data2[scope.$index])"
/>
</template>
</el-table-column>
<el-table-column prop="dbw_value">
<template slot="header">
<el-link type="primary" :underline="false" @click.native="test_write1()">测试写</el-link>
</template>
<template slot-scope="scope">
<el-input v-model="data2[scope.$index].dbw_value" size="mini" class="edit-input" />
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span class="role-span" />
<el-button
:loading="false"
icon="el-icon-check"
size="mini"
style="float: right; padding: 6px 9px"
type="primary"
@click="doSubmit"
>保存
</el-button>
</div>
</el-card>
</div>
</template>
<script>
import {
queryDriverConfig,
updateConfig,
testRead,
testwrite
} from '@/api/acs/device/driverConfig'
import { selectOpcList } from '@/api/acs/device/opc'
import { selectPlcList } from '@/api/acs/device/opcPlc'
import { selectListByOpcID } from '@/api/acs/device/opcPlc'
import crud from '@/mixins/crud'
import deviceCrud from '@/api/acs/device/device'
export default {
name: 'StandardConveyorControl',
mixins: [crud],
props: {
parentForm: {
type: Object,
require: true
}
},
data() {
return {
device_code: '',
device_id: '',
plc_id: '',
plc_code: '',
address: '',
opc_id: '',
doors: [{
key: '1',
label: '前门'
}, {
key: '2',
label: '后门'
}],
floors: [{
key: '1',
label: '1楼'
}, {
key: '2',
label: '2楼'
}],
opc_code: '',
configLoading: false,
dataOpcservers: [],
dataOpcPlcs: [],
deviceList: [],
data1: [],
data2: [],
form: {
inspect_in_stocck: true,
ignore_pickup_check: true,
ignore_release_check: true,
apply_task: true,
link_three_lamp: '',
manual_create_task: true,
is_pickup: true,
is_release: true,
link_device_code: '',
door: '',
floor: ''
},
rules: {}
}
},
created() {
this.$nextTick(() => {
//
this.device_id = this.$props.parentForm.device_id
this.device_code = this.$props.parentForm.device_code
queryDriverConfig(this.device_id, this.$props.parentForm.driver_code).then(data => {
//
if (data.form) {
const arr = Object.keys(data.form)
//
if (arr.length > 0) {
this.form = data.form
}
}
//
if (data.parentForm) {
const arr = Object.keys(data.parentForm)
//
if (arr.length > 0) {
this.opc_code = data.parentForm.opc_code
this.plc_code = data.parentForm.plc_code
}
}
this.data1 = data.rs
this.data2 = data.ws
this.sliceItem()
})
selectPlcList().then(data => {
this.dataOpcPlcs = data
this.plc_id = this.$props.parentForm.opc_plc_id
})
selectOpcList().then(data => {
this.dataOpcservers = data
this.opc_id = this.$props.parentForm.opc_server_id
})
deviceCrud.selectDeviceList().then(data => {
this.deviceList = data
})
})
},
methods: {
finishReadEdit(data) {
// code,mode
if (data.code.indexOf('mode') !== -1) {
const dbValue = data.db
// .
const beforeStr = dbValue.substring(0, 2)
// .
const afterStr = dbValue.substring(2)
for (const val in this.data1) {
if (this.data1[val].code.indexOf('move') !== -1) {
this.data1[val].db = beforeStr + (parseInt(afterStr) + 2)
}
if (this.data1[val].code.indexOf('action') !== -1) {
this.data1[val].db = beforeStr + (parseInt(afterStr) + 4)
}
if (this.data1[val].code.indexOf('error') !== -1) {
this.data1[val].db = beforeStr + (parseInt(afterStr) + 6)
}
if (this.data1[val].code.indexOf('task') !== -1) {
this.data1[val].db = beforeStr + (parseInt(afterStr) + 8)
}
}
}
},
finishWriteEdit(data) {
// code,mode
if (data.code.indexOf('to_command') !== -1) {
const dbValue = data.db
// .
const beforeStr = dbValue.substring(0, 2)
// .
const afterStr = dbValue.substring(2)
for (const val in this.data2) {
if (this.data2[val].code.indexOf('to_target') !== -1) {
this.data2[val].db = beforeStr + (parseInt(afterStr) + 2)
}
if (this.data2[val].code.indexOf('to_task') !== -1) {
this.data2[val].db = beforeStr + (parseInt(afterStr) + 4)
}
}
}
},
changeOpc(val) {
this.dataOpcservers.forEach(item => {
if (item.opc_id === val) {
this.opc_code = item.opc_code
}
})
selectListByOpcID(val).then(data => {
this.dataOpcPlcs = data
this.plc_id = ''
this.plc_code = ''
if (this.dataOpcPlcs && this.dataOpcPlcs.length > 0) {
this.plc_id = this.dataOpcPlcs[0].plc_id
this.plc_code = this.dataOpcPlcs[0].plc_code
}
this.sliceItem()
})
},
changePlc(val) {
this.dataOpcPlcs.forEach(item => {
if (item.plc_id === val) {
this.plc_code = item.plc_code
this.sliceItem()
return
}
})
},
test_read1() {
testRead(this.data1, this.opc_id).then(data => {
this.data1 = data
this.notify('操作成功!', 'success')
}).catch(err => {
console.log(err.response.data.message)
})
},
test_write1() {
testwrite(this.data2, this.opc_id).then(data => {
this.notify('操作成功!', 'success')
}).catch(err => {
console.log(err.response.data.message)
})
},
doSubmit() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.configLoading = true
//
const parentForm = this.parentForm
parentForm.is_route = true
parentForm.plc_id = this.plc_id
parentForm.opc_id = this.opc_id
updateConfig(parentForm, this.form, this.data1, this.data2).then(res => {
this.notify('保存成功', 'success')
this.configLoading = false
}).catch(err => {
this.configLoading = false
console.log(err.response.data.message)
})
}
})
},
sliceItem() { // DBItem
this.data1.forEach(item => {
const str = item.code
// .
if (str.search('.') !== -1) {
//
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + str.slice(str.lastIndexOf('.') + 1)
} else {
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + item.code
}
})
this.data2.forEach(item => {
const str = item.code
// .
if (str.search('.') !== -1) {
//
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + str.slice(str.lastIndexOf('.') + 1)
} else {
item.code = this.opc_code + '.' + this.plc_code + '.' + this.device_code + '.' + item.code
}
})
}
}
}
</script>
<style scoped>
</style>
Loading…
Cancel
Save