add: 添加反馈AGV状态驱动,AGV状态变化下发信号
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
package org.nl.acs.agv.server.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.json.JSONArray;
|
||||
@@ -16,10 +18,10 @@ import org.nl.acs.config.server.AcsConfigService;
|
||||
import org.nl.acs.device.service.DeviceService;
|
||||
import org.nl.acs.device.service.impl.DeviceServiceImpl;
|
||||
import org.nl.acs.device_driver.agv_site.AgvSiteDeviceDriver;
|
||||
import org.nl.acs.device_driver.feedback_agv_status.FeedbackAgvStatusDeviceDriver;
|
||||
import org.nl.acs.device_driver.lamp_three_color.LampThreecolorDeviceDriver;
|
||||
import org.nl.acs.device_driver.machines_site.MachinesSiteDeviceDriver;
|
||||
import org.nl.acs.device_driver.magic3.Magic3DeviceDriver;
|
||||
import org.nl.acs.device_driver.ndxy_special_two.NdxySpecialTwoDeviceDriver;
|
||||
import org.nl.acs.device_driver.special_ordinary_site.SpecialOrdinarySiteDeviceDriver;
|
||||
import org.nl.acs.device_driver.standard_autodoor.StandardAutodoorDeviceDriver;
|
||||
import org.nl.acs.device_driver.standard_inspect_site.StandardInspectSiteDeviceDriver;
|
||||
@@ -27,8 +29,6 @@ import org.nl.acs.device_driver.standard_inspect_site_smart200.StandardInspectSi
|
||||
import org.nl.acs.device_driver.standard_manipulator_inspect_site.StandardManipulatorInspectSiteDeviceDriver;
|
||||
import org.nl.acs.device_driver.standard_ordinary_site.StandardOrdinarySiteDeviceDriver;
|
||||
import org.nl.acs.device_driver.standard_storage.StandardStorageDeviceDriver;
|
||||
import org.nl.acs.device_driver.weighing_site.WeighingSiteDeviceDriver;
|
||||
import org.nl.acs.device_driver.ykbk_special.YkbkSpecialDeviceDriver;
|
||||
import org.nl.acs.device_driver.yzja_special.YzjaSpecialDeviceDriver;
|
||||
import org.nl.acs.ext.erp.service.AcsToErpService;
|
||||
import org.nl.acs.ext.wms.service.AcsToWmsService;
|
||||
@@ -49,10 +49,11 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@@ -78,10 +79,17 @@ public class AgvServiceImpl implements AgvService {
|
||||
|
||||
private final LogServer logServer;
|
||||
|
||||
private boolean startPointInget = false;
|
||||
private boolean startPointOutget = false;
|
||||
private boolean endPointInput = false;
|
||||
private boolean endPointOutput = false;
|
||||
private String instcode = null;
|
||||
|
||||
Map<String, AgvDto> AGVDeviceStatus = new HashMap();
|
||||
|
||||
@Value("${agvToAcs.addr}")
|
||||
private String addr;
|
||||
|
||||
/**
|
||||
* 获得之后num个天的时间
|
||||
*
|
||||
@@ -560,11 +568,25 @@ public class AgvServiceImpl implements AgvService {
|
||||
HttpResponse result = HttpRequest.get(agvurl)
|
||||
.timeout(20000)//超时,毫秒
|
||||
.execute();
|
||||
|
||||
log.info("查询agv状态:{}", result.body());
|
||||
System.out.println("查询agv状态数据:" + result.body());
|
||||
if (result.getStatus() == 200) {
|
||||
if (200 == 200) {
|
||||
com.alibaba.fastjson.JSONObject body = com.alibaba.fastjson.JSONObject.parseObject(result.body());
|
||||
com.alibaba.fastjson.JSONArray ja = body.getJSONArray("report");
|
||||
com.alibaba.fastjson.JSONObject alarms = body.getJSONObject("alarms");
|
||||
AtomicBoolean flag = new AtomicBoolean(false);
|
||||
if (ObjectUtil.isNotEmpty(alarms) && CollUtil.isNotEmpty(alarms.getJSONArray("errors"))) {
|
||||
com.alibaba.fastjson.JSONArray errors = alarms.getJSONArray("errors");
|
||||
errors.forEach(e -> {
|
||||
cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(e);
|
||||
String code = jsonObject.getStr("code");
|
||||
if (StrUtil.equals(code, "52106")) {
|
||||
flag.set(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
//0=可推送;1=正在更新场景;2=正在执行运单。
|
||||
Integer upload_scene_status = body.getInteger("upload_scene_status");
|
||||
for (int i = 0; i < ja.size(); i++) {
|
||||
com.alibaba.fastjson.JSONObject jo = ja.getJSONObject(i);
|
||||
//机器人编码
|
||||
@@ -583,36 +605,117 @@ public class AgvServiceImpl implements AgvService {
|
||||
//执行运单信息
|
||||
com.alibaba.fastjson.JSONObject current_order = jo.getJSONObject("current_order");
|
||||
int task_status = rbk_report.getInteger("task_status");
|
||||
//机器人是否被阻挡
|
||||
Boolean blocked = rbk_report.getBoolean("blocked");
|
||||
//true 表示急停按钮处于激活状态(按下), false 表示急停按钮处于非激活状态(拔起)
|
||||
Boolean emergency = rbk_report.getBoolean("emergency");
|
||||
String state = null;
|
||||
if (task_status == 0) {
|
||||
state = "NONE";
|
||||
}if(task_status==1){
|
||||
}
|
||||
if (task_status == 1) {
|
||||
state = "WAITING";
|
||||
}if(task_status==2){
|
||||
}
|
||||
if (task_status == 2) {
|
||||
state = "RUNNING";
|
||||
}if(task_status==3){
|
||||
}
|
||||
if (task_status == 3) {
|
||||
state = "SUSPENDED";
|
||||
}if(task_status==4){
|
||||
}
|
||||
if (task_status == 4) {
|
||||
state = "COMPLETED";
|
||||
}if(task_status==5){
|
||||
}
|
||||
if (task_status == 5) {
|
||||
state = "FAILED";
|
||||
}if(task_status==6){
|
||||
}
|
||||
if (task_status == 6) {
|
||||
state = "CANCELED";
|
||||
}
|
||||
//0表示断连,1表示连接上
|
||||
Integer connectionStatus = jo.getInteger("connection_status");
|
||||
String inst_code = current_order.getString("id");
|
||||
String inst_code = null;
|
||||
String taskNo = "0";
|
||||
Instruction inst = null;
|
||||
if (CollUtil.isNotEmpty(current_order)) {
|
||||
inst_code = current_order.getString("id");
|
||||
if (StrUtil.isNotEmpty(inst_code)) {
|
||||
Instruction inst = instructionService.findByCodeFromCache(inst_code);
|
||||
inst = instructionService.findByCodeFromCache(inst_code);
|
||||
if (ObjectUtil.isNotEmpty(inst)) {
|
||||
//任务号
|
||||
taskNo = inst.getTask_code();
|
||||
}
|
||||
}
|
||||
}
|
||||
//x坐标
|
||||
float x = rbk_report.getFloatValue("x");
|
||||
//y坐标
|
||||
float y = rbk_report.getFloatValue("y");
|
||||
//是否正在执行用户下发的运单
|
||||
Integer procBusiness = jo.getInteger("procBusiness");
|
||||
Device deviceByCode = deviceAppService.findDeviceByCode(agv_code);
|
||||
if (ObjectUtil.isNotNull(deviceByCode) && deviceByCode.getDeviceDriver() instanceof FeedbackAgvStatusDeviceDriver) {
|
||||
FeedbackAgvStatusDeviceDriver deviceDriver = (FeedbackAgvStatusDeviceDriver) deviceByCode.getDeviceDriver();
|
||||
if (deviceDriver.getWork() != procBusiness) {
|
||||
//工作中
|
||||
deviceDriver.writing("work", procBusiness);
|
||||
//休息中
|
||||
deviceDriver.writing("resting", procBusiness == 1 ? 0 : 1);
|
||||
} else if ((charging ? 1 : 0) != deviceDriver.getCharging()) {
|
||||
//充电中
|
||||
deviceDriver.writing("charging", charging ? 1 : 0);
|
||||
deviceDriver.writing("resting", charging ? 0 : 1);
|
||||
} else if ((CollUtil.isEmpty(alarms) ? 0 : 1) == deviceDriver.getError()) {
|
||||
//故障
|
||||
deviceDriver.writing("error", (ObjectUtil.isEmpty(alarms) ? 0 : 1));
|
||||
} else if ((connectionStatus == 0 && deviceDriver.getPick_up() == 0) || (connectionStatus == 1 && deviceDriver.getPick_up() == 1)) {
|
||||
//离线中
|
||||
deviceDriver.writing("pick_up", connectionStatus == 1 ? 0 : 1);
|
||||
} else if (task_status == 2 && deviceDriver.getTask_start() != 1) {
|
||||
//任务开始
|
||||
deviceDriver.writing("task_start", 1);
|
||||
deviceDriver.writing("ma", 0);
|
||||
} else if (task_status == 4 && deviceDriver.getMa() != 1) {
|
||||
//任务完成
|
||||
deviceDriver.writing("task_start", 0);
|
||||
deviceDriver.writing("ma", 1);
|
||||
deviceDriver.writing("tss", 0);
|
||||
deviceDriver.writing("eots", 0);
|
||||
deviceDriver.writing("rtg", 0);
|
||||
deviceDriver.writing("tric", 0);
|
||||
deviceDriver.writing("rap", 0);
|
||||
deviceDriver.writing("rtrtg", 0);
|
||||
startPointInget = false;
|
||||
endPointOutput = false;
|
||||
startPointOutget = false;
|
||||
endPointInput = false;
|
||||
} else if ((startPointOutget ? 1 : 0) != deviceDriver.getRtg() && Objects.equals(instcode, inst_code)) {
|
||||
//取货完成
|
||||
deviceDriver.writing("rtg", startPointOutget ? 1 : 0);
|
||||
} else if ((endPointOutput ? 1 : 0) != deviceDriver.getTric() && Objects.equals(inst_code, instcode)) {
|
||||
//放货完成
|
||||
deviceDriver.writing("tric", endPointOutput ? 1 : 0);
|
||||
} else if ((startPointInget ? 1 : 0) != deviceDriver.getRap() && Objects.equals(inst_code, instcode)) {
|
||||
//申请取货
|
||||
deviceDriver.writing("rap", startPointInget ? 1 : 0);
|
||||
} else if ((endPointInput ? 1 : 0) != deviceDriver.getRtrtg() && Objects.equals(inst_code, instcode)) {
|
||||
//申请放货
|
||||
deviceDriver.writing("rtrtg", endPointInput ? 1 : 0);
|
||||
} else if ((flag.get() ? 1 : 0) != deviceDriver.getCac()) {
|
||||
//被管制区域管制
|
||||
deviceDriver.writing("cac", flag.get() ? 1 : 0);
|
||||
} else if ((blocked ? 1 : 0) != deviceDriver.getBlocked()) {
|
||||
//被阻挡
|
||||
deviceDriver.writing("blocked", blocked ? 1 : 0);
|
||||
} else if ((emergency ? 1 : 0) != deviceDriver.getEs()) {
|
||||
//急停
|
||||
deviceDriver.writing("es", emergency ? 1 : 0);
|
||||
} else if (!StrUtil.equals(taskNo, "0") && ObjectUtil.isNotNull(inst)) {
|
||||
//任务开始站点
|
||||
deviceDriver.writing("tss", Integer.parseInt(inst.getStart_point_code()));
|
||||
//任务结束站点
|
||||
deviceDriver.writing("eots", Integer.parseInt(inst.getNext_point_code()));
|
||||
}
|
||||
}
|
||||
AgvDto dto = new AgvDto();
|
||||
dto.setName(agv_code);
|
||||
dto.setCurrent_map(current_map);
|
||||
@@ -627,7 +730,7 @@ public class AgvServiceImpl implements AgvService {
|
||||
AGVDeviceStatus.put(agv_code, dto);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return null;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
@@ -1040,6 +1143,7 @@ public class AgvServiceImpl implements AgvService {
|
||||
log.info("仙工AGV请求取放货,请求参数 - {}", requestParam);
|
||||
String instCode = requestParam.getString("task_code");
|
||||
Instruction inst = instructionService.findByCodeFromCache(instCode);
|
||||
instcode = instCode;
|
||||
if (ObjectUtil.isEmpty(inst)) {
|
||||
throw new BadRequestException("请求失败,未找到指令!");
|
||||
}
|
||||
@@ -1069,6 +1173,7 @@ public class AgvServiceImpl implements AgvService {
|
||||
if (responseCode == 200) {
|
||||
JSONObject jo2 = new JSONObject();
|
||||
jo2.put("status", 200);
|
||||
startPointInget = true;
|
||||
log.info("上位允许取货 请求结果{}", responseCode);
|
||||
return jo2;
|
||||
} else {
|
||||
@@ -1092,6 +1197,7 @@ public class AgvServiceImpl implements AgvService {
|
||||
if (responseCode == 200) {
|
||||
JSONObject jo2 = new JSONObject();
|
||||
jo2.put("status", 200);
|
||||
startPointOutget = true;
|
||||
log.info("上位允许取货离开 请求结果{}", responseCode);
|
||||
return jo2;
|
||||
} else {
|
||||
@@ -1116,6 +1222,7 @@ public class AgvServiceImpl implements AgvService {
|
||||
if (responseCode == 200) {
|
||||
JSONObject jo2 = new JSONObject();
|
||||
jo2.put("status", 200);
|
||||
endPointInput = true;
|
||||
log.info("上位允许放货 请求结果{}", responseCode);
|
||||
return jo2;
|
||||
} else {
|
||||
@@ -1139,6 +1246,7 @@ public class AgvServiceImpl implements AgvService {
|
||||
int responseCode = response.getInteger("status");
|
||||
if (responseCode == 200) {
|
||||
JSONObject jo2 = new JSONObject();
|
||||
endPointOutput = true;
|
||||
jo2.put("status", 200);
|
||||
log.info("上位允许放货离开 请求结果{}", responseCode);
|
||||
return jo2;
|
||||
@@ -1535,6 +1643,7 @@ public class AgvServiceImpl implements AgvService {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public com.alibaba.fastjson.JSONArray createBlocksData(Instruction inst) {
|
||||
com.alibaba.fastjson.JSONArray ja = new com.alibaba.fastjson.JSONArray();
|
||||
|
||||
@@ -1877,6 +1986,7 @@ public class AgvServiceImpl implements AgvService {
|
||||
}
|
||||
return ja;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpResponse addOrderSequences(Instruction inst) throws Exception {
|
||||
JSONObject orderjo = createOrederData(inst, "1");
|
||||
@@ -2273,12 +2383,9 @@ public class AgvServiceImpl implements AgvService {
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String address = "L1-01-01";
|
||||
if (address.indexOf("-") > 0) {
|
||||
String str = address.substring(address.indexOf("-"), address.length());
|
||||
address = address.substring(0, address.indexOf("-"));
|
||||
System.out.println(address);
|
||||
}
|
||||
String msg = null;
|
||||
String msg1 = null;
|
||||
System.out.println("msg = " + Objects.equals(msg,msg1));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -46,6 +46,8 @@ public enum DriverTypeEnum {
|
||||
|
||||
FEEDBACK_AGV_STATUS_SITE(19, "feedback_agv_status_site", "上报AGV状态站点", "conveyor"),
|
||||
|
||||
FEEDBACK_AGV_STATUS(42, "feedback_agv_status", "反馈AGV状态", "conveyor"),
|
||||
|
||||
MANIPULATOR_STACKING_SITE(20, "standard_manipulator_stacking_site", "机械手码垛驱动(区分托盘类型)", "conveyor"),
|
||||
|
||||
PHOTOELECTRIC_INSPECT_SITE(21, "standard_photoelectric_inspect_site", "光电检测站点(优先出库)", "conveyor"),
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
package org.nl.acs.device_driver.feedback_agv_status;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* 反馈agv状态
|
||||
*/
|
||||
@Service
|
||||
public class FeedbackAgvStatusDefination implements OpcDeviceDriverDefination {
|
||||
@Override
|
||||
public String getDriverCode() {
|
||||
return "feedback_agv_status";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDriverName() {
|
||||
return "反馈AGV状态";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDriverDescription() {
|
||||
return "反馈AGV状态";
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeviceDriver getDriverInstance(Device device) {
|
||||
return (new FeedbackAgvStatusDeviceDriver()).setDevice(device).setDriverDefination(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<? extends DeviceDriver> getDeviceDriverType() {
|
||||
return FeedbackAgvStatusDeviceDriver.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() {
|
||||
List<ItemDto> list = new ArrayList();
|
||||
list.add(new ItemDto(ItemProtocol.item_work, "工作中", "DB51.B0"));
|
||||
list.add(new ItemDto(ItemProtocol.item_charging, "充电中", "DB51.B2", Boolean.TRUE));
|
||||
list.add(new ItemDto(ItemProtocol.item_error, "故障", "DB51.B3"));
|
||||
list.add(new ItemDto(ItemProtocol.item_resting, "休息中", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_task_start, "离线中", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_pick_up, "任务开始", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_rtg, "取货完成", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_tric, "放货完成", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_rap, "请求取货", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_rtrtg, "请求放货", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_ma, "任务完成", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_cac, "被管制区域管制", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_blocked, "被阻挡", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_es, "急停", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_tss, "任务开始站点", "DB51.B5"));
|
||||
list.add(new ItemDto(ItemProtocol.item_eots, "任务结束站点", "DB51.B5"));
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemDto> getWriteableItemDtos() {
|
||||
return ItemProtocol.getWriteableItemDtos();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
package org.nl.acs.device_driver.feedback_agv_status;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.json.JSONObject;
|
||||
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.utils.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;
|
||||
|
||||
/**
|
||||
* 反馈agv状态
|
||||
*/
|
||||
@Slf4j
|
||||
@Data
|
||||
@RequiredArgsConstructor
|
||||
public class FeedbackAgvStatusDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver {
|
||||
protected ItemProtocol itemProtocol = new ItemProtocol(this);
|
||||
@Autowired
|
||||
InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl");
|
||||
@Autowired
|
||||
DeviceService deviceservice = SpringContextHolder.getBean("deviceServiceImpl");
|
||||
@Autowired
|
||||
RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl");
|
||||
@Autowired
|
||||
TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl");
|
||||
String devicecode;
|
||||
int work;
|
||||
int charging;
|
||||
int error;
|
||||
int resting;
|
||||
int task_start;
|
||||
int pick_up;
|
||||
int rtg;
|
||||
int tric;
|
||||
int rap;
|
||||
int rtrtg;
|
||||
int ma;
|
||||
int cac;
|
||||
int blocked;
|
||||
int es;
|
||||
int tss;
|
||||
int eots;
|
||||
|
||||
@Override
|
||||
public Device getDevice() {
|
||||
return this.device;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
String message = null;
|
||||
work = itemProtocol.getWork();
|
||||
charging = itemProtocol.getCharging();
|
||||
error = itemProtocol.getError();
|
||||
resting = itemProtocol.getResting();
|
||||
task_start = itemProtocol.getTaskStart();
|
||||
pick_up = itemProtocol.getPickUp();
|
||||
rtg = itemProtocol.getRtg();
|
||||
tric = itemProtocol.getTric();
|
||||
rap = itemProtocol.getRap();
|
||||
rtrtg = itemProtocol.getRtrtg();
|
||||
ma = itemProtocol.getMa();
|
||||
cac = itemProtocol.getCac();
|
||||
blocked = itemProtocol.getBlocked();
|
||||
es = itemProtocol.getEs();
|
||||
tss = itemProtocol.getTss();
|
||||
eots = itemProtocol.getEots();
|
||||
}
|
||||
|
||||
public synchronized String getStatus() {
|
||||
JSONObject jo = new JSONObject();
|
||||
return jo.toString();
|
||||
}
|
||||
|
||||
|
||||
public void writing(String name,int command) {
|
||||
String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
|
||||
+ "." + name;
|
||||
String opcservcerid = this.getDevice().getOpc_server_id();
|
||||
Server server = ReadUtil.getServer(opcservcerid);
|
||||
Map<String, Object> itemMap = new HashMap<>();
|
||||
itemMap.put(to_command, command);
|
||||
ReadUtil.write(itemMap, server);
|
||||
log.info("下发PLC信号:{},{}", to_command, command);
|
||||
System.out.println("设备:" + devicecode + ",下发PLC信号:" + to_command + ",value:" + command);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
package org.nl.acs.device_driver.feedback_agv_status;
|
||||
|
||||
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_work = "work";
|
||||
/**
|
||||
* 充电中
|
||||
*/
|
||||
public static String item_charging = "charging";
|
||||
/**
|
||||
* 故障
|
||||
*/
|
||||
public static String item_error = "error";
|
||||
/**
|
||||
* 休息中
|
||||
*/
|
||||
public static String item_resting = "resting";
|
||||
/**
|
||||
* 离线中
|
||||
*/
|
||||
public static String item_pick_up = "pick_up";
|
||||
/**
|
||||
* 任务开始
|
||||
*/
|
||||
public static String item_task_start = "task_start";
|
||||
/**
|
||||
* 取货完成
|
||||
*/
|
||||
public static String item_rtg = "rtg";
|
||||
/**
|
||||
* 放货完成
|
||||
*/
|
||||
public static String item_tric = "tric";
|
||||
/**
|
||||
* 请求取货
|
||||
*/
|
||||
public static String item_rap = "rap";
|
||||
/**
|
||||
* 请求放货
|
||||
*/
|
||||
public static String item_rtrtg = "rtrtg";
|
||||
/**
|
||||
* 任务完成
|
||||
*/
|
||||
public static String item_ma = "ma";
|
||||
/**
|
||||
* 被管制区域管制
|
||||
*/
|
||||
public static String item_cac = "cac";
|
||||
/**
|
||||
* 被阻挡
|
||||
*/
|
||||
public static String item_blocked = "blocked";
|
||||
/**
|
||||
* 急停
|
||||
*/
|
||||
public static String item_es = "es";
|
||||
/**
|
||||
* 任务开始站点
|
||||
*/
|
||||
public static String item_tss = "tss";
|
||||
/**
|
||||
* 任务结束站点
|
||||
*/
|
||||
public static String item_eots = "eots";
|
||||
|
||||
|
||||
private FeedbackAgvStatusDeviceDriver driver;
|
||||
|
||||
public ItemProtocol(FeedbackAgvStatusDeviceDriver driver) {
|
||||
this.driver = driver;
|
||||
}
|
||||
|
||||
public int getWork() {
|
||||
return this.getOpcIntegerValue(item_work);
|
||||
}
|
||||
|
||||
public int getCharging() {
|
||||
return this.getOpcIntegerValue(item_charging);
|
||||
}
|
||||
|
||||
public int getError() {
|
||||
return this.getOpcIntegerValue(item_error);
|
||||
}
|
||||
|
||||
public int getResting() {
|
||||
return this.getOpcIntegerValue(item_resting);
|
||||
}
|
||||
|
||||
public int getTaskStart() {
|
||||
return this.getOpcIntegerValue(item_task_start);
|
||||
}
|
||||
|
||||
public int getPickUp() {
|
||||
return this.getOpcIntegerValue(item_pick_up);
|
||||
}
|
||||
public int getRtg() {
|
||||
return this.getOpcIntegerValue(item_rtg);
|
||||
}
|
||||
public int getTric() {
|
||||
return this.getOpcIntegerValue(item_tric);
|
||||
}
|
||||
public int getRap() {
|
||||
return this.getOpcIntegerValue(item_rap);
|
||||
}
|
||||
public int getRtrtg() {
|
||||
return this.getOpcIntegerValue(item_rtrtg);
|
||||
}
|
||||
public int getMa() {
|
||||
return this.getOpcIntegerValue(item_ma);
|
||||
}
|
||||
public int getCac() {
|
||||
return this.getOpcIntegerValue(item_cac);
|
||||
}
|
||||
public int getBlocked() {
|
||||
return this.getOpcIntegerValue(item_blocked);
|
||||
}
|
||||
|
||||
public int getEs() {
|
||||
return this.getOpcIntegerValue(item_es);
|
||||
}
|
||||
|
||||
public int getTss() {
|
||||
return this.getOpcIntegerValue(item_tss);
|
||||
}
|
||||
|
||||
public int getEots() {
|
||||
return this.getOpcIntegerValue(item_eots);
|
||||
}
|
||||
|
||||
|
||||
public int getOpcIntegerValue(String protocol) {
|
||||
Integer value = this.driver.getIntegerValue(protocol);
|
||||
if (value == null) {
|
||||
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
public static List<ItemDto> getReadableItemDtos() {
|
||||
ArrayList list = new ArrayList();
|
||||
list.add(new ItemDto(item_work, "工作中", "DB51.B0"));
|
||||
list.add(new ItemDto(item_charging, "充电中", "DB51.B2", Boolean.TRUE));
|
||||
list.add(new ItemDto(item_error, "故障", "DB51.B3"));
|
||||
list.add(new ItemDto(item_resting, "休息中", "DB51.B5"));
|
||||
list.add(new ItemDto(item_task_start, "离线中", "DB51.B5"));
|
||||
list.add(new ItemDto(item_pick_up, "任务开始", "DB51.B5"));
|
||||
list.add(new ItemDto(item_rtg, "取货完成", "DB51.B5"));
|
||||
list.add(new ItemDto(item_tric, "放货完成", "DB51.B5"));
|
||||
list.add(new ItemDto(item_rap, "请求取货", "DB51.B5"));
|
||||
list.add(new ItemDto(item_rtrtg, "请求放货", "DB51.B5"));
|
||||
list.add(new ItemDto(item_ma, "任务完成", "DB51.B5"));
|
||||
list.add(new ItemDto(item_cac, "被管制区域管制", "DB51.B5"));
|
||||
list.add(new ItemDto(item_blocked, "被阻挡", "DB51.B5"));
|
||||
list.add(new ItemDto(item_es, "急停", "DB51.B5"));
|
||||
list.add(new ItemDto(item_tss, "任务开始站点", "DB51.B5"));
|
||||
list.add(new ItemDto(item_eots, "任务结束站点", "DB51.B5"));
|
||||
return list;
|
||||
}
|
||||
|
||||
public static List<ItemDto> getWriteableItemDtos() {
|
||||
ArrayList list = new ArrayList();
|
||||
list.add(new ItemDto(item_work, "工作中", "DB51.B0"));
|
||||
list.add(new ItemDto(item_charging, "充电中", "DB51.B2", Boolean.TRUE));
|
||||
list.add(new ItemDto(item_error, "故障", "DB51.B3"));
|
||||
list.add(new ItemDto(item_resting, "休息中", "DB51.B5"));
|
||||
list.add(new ItemDto(item_task_start, "离线中", "DB51.B5"));
|
||||
list.add(new ItemDto(item_pick_up, "任务开始", "DB51.B5"));
|
||||
list.add(new ItemDto(item_rtg, "取货完成", "DB51.B5"));
|
||||
list.add(new ItemDto(item_tric, "放货完成", "DB51.B5"));
|
||||
list.add(new ItemDto(item_rap, "请求取货", "DB51.B5"));
|
||||
list.add(new ItemDto(item_rtrtg, "请求放货", "DB51.B5"));
|
||||
list.add(new ItemDto(item_ma, "任务完成", "DB51.B5"));
|
||||
list.add(new ItemDto(item_cac, "被管制区域管制", "DB51.B5"));
|
||||
list.add(new ItemDto(item_blocked, "被阻挡", "DB51.B5"));
|
||||
list.add(new ItemDto(item_es, "急停", "DB51.B5"));
|
||||
list.add(new ItemDto(item_tss, "任务开始站点", "DB51.B5"));
|
||||
list.add(new ItemDto(item_eots, "任务结束站点", "DB51.B5"));
|
||||
return list;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -93,6 +93,7 @@ import non_line_manipulator_inspect_site from '@/views/acs/device/driver/non_lin
|
||||
import non_line_inspect_site from '@/views/acs/device/driver/non_line_inspect_site'
|
||||
import manipulator_inspect_site_NDC from '@/views/acs/device/driver/manipulator_inspect_site_NDC'
|
||||
import feedback_agv_status_site from '@/views/acs/device/driver/feedback_agv_status_site'
|
||||
import feedback_agv_status from '@/views/acs/device/driver/feedback_agv_status'
|
||||
import standard_manipulator_stacking_site from '@/views/acs/device/driver/standard_manipulator_stacking_site'
|
||||
import standard_photoelectric_inspect_site from '@/views/acs/device/driver/standard_photoelectric_inspect_site'
|
||||
import ndxy_special from '@/views/acs/device/driver/ndxy_special'
|
||||
@@ -120,7 +121,7 @@ export default {
|
||||
standard_emptypallet_site, standard_manipulator_inspect_site, standard_special_inspect_site,
|
||||
lamp_three_color, standard_storage, special_ordinary_site, standard_scanner, standard_conveyor_control_with_scanner,
|
||||
standard_conveyor_control_with_plcscanner, standard_conveyor_control, standard_conveyor_monitor, weighing_site, machines_site, non_line_manipulator_inspect_site,
|
||||
non_line_inspect_site, manipulator_inspect_site_NDC, feedback_agv_status_site, standard_manipulator_stacking_site,
|
||||
non_line_inspect_site, manipulator_inspect_site_NDC, feedback_agv_status_site, feedback_agv_status, standard_manipulator_stacking_site,
|
||||
standard_photoelectric_inspect_site, ndxy_special, hailiang_labeling, ndxy_special_two, whxr_storage_conveyor, whxr_ball_mill, whxr_spary_tower, whxr_weight,
|
||||
electric_fence, oumulong_plc, traffic_light, standard_rgv, ykbk_special, ssj_cache_site, magic3, agv_site, whxr_weighing, jmagv, yzja_special },
|
||||
dicts: ['device_type'],
|
||||
|
||||
352
qd/src/views/acs/device/driver/feedback_agv_status.vue
Normal file
352
qd/src/views/acs/device/driver/feedback_agv_status.vue
Normal file
@@ -0,0 +1,352 @@
|
||||
<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
|
||||
@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"
|
||||
>
|
||||
<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-switch v-model="form.OPCServer" />
|
||||
</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'
|
||||
|
||||
export default {
|
||||
name: 'ElectricFence',
|
||||
mixins: [crud],
|
||||
props: {
|
||||
parentForm: {
|
||||
type: Object,
|
||||
require: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
device_code: '',
|
||||
device_id: '',
|
||||
plc_id: '',
|
||||
plc_code: '',
|
||||
opc_id: '',
|
||||
opc_code: '',
|
||||
configLoading: false,
|
||||
dataOpcservers: [],
|
||||
dataOpcPlcs: [],
|
||||
data1: [],
|
||||
data2: [],
|
||||
form: {
|
||||
inspect_in_stocck: true,
|
||||
ignore_pickup_check: true,
|
||||
ignore_release_check: true,
|
||||
apply_task: true,
|
||||
manual_create_task: true,
|
||||
is_pickup: true,
|
||||
is_release: true
|
||||
},
|
||||
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
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
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()
|
||||
})
|
||||
},
|
||||
finishReadEdit(data) {
|
||||
// 编辑的是code列,并且值包含mode
|
||||
if (data.code.indexOf('mode') !== -1) {
|
||||
const dbValue = data.db
|
||||
// .之前的字符串
|
||||
const beforeStr = dbValue.match(/(\S*)\./)[1]
|
||||
// .之后的字符串
|
||||
const afterStr = dbValue.match(/\.(\S*)/)[1]
|
||||
// 取最后数字
|
||||
const endNumber = afterStr.substring(1)
|
||||
// 最后为非数字
|
||||
if (isNaN(parseInt(endNumber))) {
|
||||
return
|
||||
}
|
||||
for (const val in this.data1) {
|
||||
if (this.data1[val].code.indexOf('action') !== -1) {
|
||||
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 1)
|
||||
}
|
||||
if (this.data1[val].code.indexOf('error') !== -1) {
|
||||
this.data1[val].db = beforeStr + '.' + afterStr.substring(0, 1) + (parseInt(endNumber) + 2)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
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() { // 拼接DB的Item值
|
||||
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>
|
||||
Reference in New Issue
Block a user