add: 添加AGV进入离开烘箱区域反馈,下发管芯托盘信息

This commit is contained in:
yanps
2024-06-27 17:01:01 +08:00
parent 2a92d9b11e
commit 3d1bada4c9
5 changed files with 230 additions and 26 deletions

View File

@@ -1,5 +1,6 @@
package org.nl.acs.auto.run; package org.nl.acs.auto.run;
import cn.hutool.core.collection.CollUtil;
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 lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -10,6 +11,8 @@ import org.nl.acs.device.service.DeviceService;
import org.nl.acs.device_driver.agv.ndcone.AgvNdcOneDeviceDriver; import org.nl.acs.device_driver.agv.ndcone.AgvNdcOneDeviceDriver;
import org.nl.acs.device_driver.agv.ndctwo.AgvNdcTwoDeviceDriver; import org.nl.acs.device_driver.agv.ndctwo.AgvNdcTwoDeviceDriver;
import org.nl.acs.device_driver.autodoor.standard_autodoor.StandardAutodoorDeviceDriver; import org.nl.acs.device_driver.autodoor.standard_autodoor.StandardAutodoorDeviceDriver;
import org.nl.acs.device_driver.conveyor.standard_inspect_site.StandardInspectSiteDeviceDriver;
import org.nl.acs.device_driver.two_conveyor.oven_manipulator.OvenGantryManipulatorDeviceDriver;
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.domain.Instruction; import org.nl.acs.instruction.domain.Instruction;
@@ -27,9 +30,13 @@ import org.springframework.stereotype.Component;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString; import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString;
@@ -52,6 +59,11 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
boolean bConnected = true; boolean bConnected = true;
boolean isReConnect = false; boolean isReConnect = false;
int i = 1 ;
boolean requireSucessRegion = false;
boolean requireSucessTake = false;
boolean requireSucessPut = false;
@Autowired @Autowired
ISysParamService paramService; ISysParamService paramService;
@@ -195,7 +207,7 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
if (agvDevice.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { if (agvDevice.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) {
agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) agvDevice.getDeviceDriver(); agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) agvDevice.getDeviceDriver();
agvNdcTwoDeviceDriver.setInstruction(null); agvNdcTwoDeviceDriver.setInstruction(null);
}else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) { } else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) {
agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver(); agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver();
agvNdcOneDeviceDriver.setInstruction(null); agvNdcOneDeviceDriver.setInstruction(null);
} }
@@ -231,18 +243,47 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
if (ObjectUtil.isNotEmpty(device)) { if (ObjectUtil.isNotEmpty(device)) {
if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) {
standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver();
try { String region = (String) standardAutodoorDeviceDriver.getDevice().getExtraValue().get("region");
standardAutodoorDeviceDriver.writing("to_open", "1"); if (StrUtil.isNotEmpty(region) && !(" ".equals(region))) {
standardAutodoorDeviceDriver.writing("to_close", "0"); String linkDeviceCode = (String) standardAutodoorDeviceDriver.getDevice().getExtraValue().get("link_device_code");
} catch (Exception e) { Device deviceByCode = deviceAppService.findDeviceByCode(linkDeviceCode);
log.info("下发电气信号失败:" + e.getMessage()); if (ObjectUtil.isNotEmpty(deviceByCode) && deviceByCode.getDeviceDriver() instanceof OvenGantryManipulatorDeviceDriver) {
e.printStackTrace(); OvenGantryManipulatorDeviceDriver hxhj = (OvenGantryManipulatorDeviceDriver) deviceByCode.getDeviceDriver();
} String s = Integer.parseInt(region) == 1 ? "one" : Integer.parseInt(region) == 2 ?
if (standardAutodoorDeviceDriver.getOpen() == 1 && standardAutodoorDeviceDriver.getToOpen() == 1 ) { "two" : Integer.parseInt(region) == 3 ? "three" : null;
log.info("下发开门信号值为:{},下发关门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getToClose()); Class<? extends OvenGantryManipulatorDeviceDriver> aClass = hxhj.getClass();
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); String regionCode = "region_" + s;
}else { String s1 = Integer.parseInt(region) == 1 ? "2" : Integer.parseInt(region) == 2 ?
log.info("未下发NDC信号原因: 下发开门信号值为:{},下发关门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getToClose()); "6" : Integer.parseInt(region) == 3 ? "8" : null;
if (StrUtil.isNotEmpty(s) && ((Integer) aClass.getField(regionCode).get(hxhj) == 0)) {
hxhj.writing("to_"+regionCode, s1);
log.info("下发AGV进入区域{}信号值为:{}", region, s1);
} else {
log.info("区域{}信号{}未清除,导致不满足下发AGV进入区域信号", region, regionCode);
}
if (hxhj.getMode() == 2 && StrUtil.isNotEmpty(s1) && ((Integer) aClass.getField(regionCode).get(hxhj) == 2)) {
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
requireSucessRegion = true;
} else {
log.error("AGV进入区域{}信号{}行架未接收{},请检查;或行架正在执行中:{}", region, regionCode,s1, hxhj.getMode());
}
} else {
log.error("未设置关联设备或关联的不是烘箱行架设备{}导致信号未反馈", linkDeviceCode);
}
} else {
try {
standardAutodoorDeviceDriver.writing("to_open", "1");
standardAutodoorDeviceDriver.writing("to_close", "0");
} catch (Exception e) {
log.info("下发电气信号失败:" + e.getMessage());
e.printStackTrace();
}
if (standardAutodoorDeviceDriver.getOpen() == 1 && standardAutodoorDeviceDriver.getToOpen() == 1) {
log.info("下发开门信号值为:{},下发关门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getToClose());
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
} else {
log.info("未下发NDC信号原因: 下发开门信号值为:{},下发关门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getToClose());
}
} }
} }
} else { } else {
@@ -257,19 +298,50 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
if (ObjectUtil.isNotEmpty(device)) { if (ObjectUtil.isNotEmpty(device)) {
if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) {
standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver();
try { String region = (String) standardAutodoorDeviceDriver.getDevice().getExtraValue().get("region");
standardAutodoorDeviceDriver.writing("to_close", "1"); if (StrUtil.isNotEmpty(region) && !(" ".equals(region))) {
standardAutodoorDeviceDriver.writing("to_open", "0"); String linkDeviceCode = (String) standardAutodoorDeviceDriver.getDevice().getExtraValue().get("link_device_code");
} catch (Exception e) { if(requireSucessTake || requireSucessPut){
log.info("下发电气信号失败:" + e.getMessage()); Device deviceByCode = deviceAppService.findDeviceByCode(linkDeviceCode);
e.printStackTrace(); if (ObjectUtil.isNotEmpty(deviceByCode) && deviceByCode.getDeviceDriver() instanceof OvenGantryManipulatorDeviceDriver) {
OvenGantryManipulatorDeviceDriver hxhj = (OvenGantryManipulatorDeviceDriver) deviceByCode.getDeviceDriver();
String s = Integer.parseInt(region) == 1 ? "one" : Integer.parseInt(region) == 2 ?
"two" : Integer.parseInt(region) == 3 ? "three" : null;
Class<? extends OvenGantryManipulatorDeviceDriver> aClass = hxhj.getClass();
String regionCode = "region_" + s;
if (StrUtil.isNotEmpty(s) && ((Integer) aClass.getField(regionCode).get(hxhj) != 0)) {
hxhj.writing("to_"+regionCode, "0");
log.info("下发AGV离开区域{}信号值为:{}", region, 0);
} else {
log.info("区域{}信号{}为0,不需要下发AGV离开区域信号", region, regionCode);
}
if (hxhj.getMode() == 2 && ((Integer) aClass.getField(regionCode).get(hxhj) == 0)) {
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
requireSucessPut = false;
requireSucessTake = false;
} else {
log.error("AGV离开区域{}信号{}行架未接收0,请检查;或行架正在执行中:{}", region, regionCode, hxhj.getMode());
}
} else {
log.error("未设置关联设备或关联的不是烘箱行架设备{}导致信号未反馈", linkDeviceCode);
}
}else{
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
}
} else {
try {
standardAutodoorDeviceDriver.writing("to_close", "1");
standardAutodoorDeviceDriver.writing("to_open", "0");
} catch (Exception e) {
log.info("下发电气信号失败:" + e.getMessage());
e.printStackTrace();
}
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
} }
data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0);
} }
} else { } else {
log.info(device_code + "对应设备号为空!"); log.info(device_code + "对应设备号为空!");
} }
} else { } else {
//上报异常信息 //上报异常信息
//不需要WCS反馈 //不需要WCS反馈
@@ -283,6 +355,13 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) {
agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver();
agvNdcTwoDeviceDriver.processSocket(arr); agvNdcTwoDeviceDriver.processSocket(arr);
if(phase == 0x05 && "3".equals(inst.getInstruction_type()) && requireSucessRegion){
requireSucessPut = true;
requireSucessRegion = false;
}else if(phase == 0x0E && "8".equals(inst.getInstruction_type()) && requireSucessRegion){
requireSucessTake = true;
requireSucessRegion = false;
}
} else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) { } else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) {
agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver(); agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver();
agvNdcOneDeviceDriver.processSocket(arr); agvNdcOneDeviceDriver.processSocket(arr);
@@ -298,12 +377,10 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable {
if (!ObjectUtil.isEmpty(data)) { if (!ObjectUtil.isEmpty(data)) {
write(data); write(data);
} }
} else { } else {
System.out.println("agv上报不是0073类型动作不处理"); System.out.println("agv上报不是0073类型动作不处理");
} }
} }
} catch (Exception e) { } catch (Exception e) {

View File

@@ -47,6 +47,7 @@ import org.nl.config.lucene.service.dto.LuceneLogDto;
import org.nl.system.service.param.ISysParamService; import org.nl.system.service.param.ISysParamService;
import org.nl.config.SpringContextHolder; import org.nl.config.SpringContextHolder;
import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
@@ -1543,7 +1544,23 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic
} else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) {
paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver();
try { try {
paperTubePickSiteDeviceDriver.writing(5); TaskDto byTaskCode = taskService.findByTaskCode(inst.getTask_code());
Map map = new HashMap();
if(StrUtil.isNotEmpty(byTaskCode.getInteraction_json())){
String interaction_json = byTaskCode.getInteraction_json();
JSONObject jsonObject = JSONObject.parseObject(interaction_json);
String to_material = jsonObject.getString("to_material");
String to_spec = jsonObject.getString("to_spec");
String to_qty = jsonObject.getString("to_qty");
map.put("to_command",5);
map.put("to_material",to_material);
map.put("to_spec",to_spec);
map.put("to_qty",to_qty);
paperTubePickSiteDeviceDriver.writing(map);
}else{
map.put("to_command",5);
paperTubePickSiteDeviceDriver.writing(map);
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -30,6 +30,13 @@ public class ItemProtocol {
public static String item_x_position = "x"; public static String item_x_position = "x";
//y轴坐标 //y轴坐标
public static String item_y_position = "y"; public static String item_y_position = "y";
//区域一
public static String item_region_one = "region_one";
//区域二
public static String item_region_two = "region_two";
//区域三
public static String item_region_three = "region_three";
//下发命令 //下发命令
public static String item_to_command = "to_command"; public static String item_to_command = "to_command";
@@ -37,6 +44,12 @@ public class ItemProtocol {
public static String item_to_onset = "to_onset"; public static String item_to_onset = "to_onset";
//下发目标站 //下发目标站
public static String item_to_target = "to_target"; public static String item_to_target = "to_target";
//下发区域一
public static String item_to_region_one = "to_region_one";
//下发区域二
public static String item_to_region_two = "to_region_two";
//下发区域三
public static String item_to_region_three = "to_region_three";
//下发任务号 //下发任务号
public static String item_to_task = "to_task"; public static String item_to_task = "to_task";
@@ -82,6 +95,30 @@ public class ItemProtocol {
return this.getOpcIntegerValue(item_to_target); return this.getOpcIntegerValue(item_to_target);
} }
public int getTo_region_one() {
return this.getOpcIntegerValue(item_to_region_one);
}
public int getTo_region_two() {
return this.getOpcIntegerValue(item_to_region_two);
}
public int getTo_region_three() {
return this.getOpcIntegerValue(item_to_region_three);
}
public int getRegion_one() {
return this.getOpcIntegerValue(item_region_one);
}
public int getRegion_two() {
return this.getOpcIntegerValue(item_region_two);
}
public int getRegion_three() {
return this.getOpcIntegerValue(item_region_three);
}
public int getTo_task() { public int getTo_task() {
return this.getOpcIntegerValue(item_to_task); return this.getOpcIntegerValue(item_to_task);
} }
@@ -150,6 +187,9 @@ public class ItemProtocol {
list.add(new ItemDto(item_task, "任务号", "DB1.D6")); list.add(new ItemDto(item_task, "任务号", "DB1.D6"));
list.add(new ItemDto(item_x_position, "x坐标", "DB1.REAL10")); list.add(new ItemDto(item_x_position, "x坐标", "DB1.REAL10"));
list.add(new ItemDto(item_y_position, "y坐标", "DB1.REAL14")); list.add(new ItemDto(item_y_position, "y坐标", "DB1.REAL14"));
list.add(new ItemDto(item_region_one, "区域一", "DB1.REAL18"));
list.add(new ItemDto(item_region_two, "区域二", "DB1.REAL22"));
list.add(new ItemDto(item_region_three, "区域三", "DB1.REAL26"));
return list; return list;
} }
@@ -159,6 +199,9 @@ public class ItemProtocol {
list.add(new ItemDto(item_to_onset, "下发起始站", "DB2.W2")); list.add(new ItemDto(item_to_onset, "下发起始站", "DB2.W2"));
list.add(new ItemDto(item_to_target, "下发目标站", "DB2.W4")); list.add(new ItemDto(item_to_target, "下发目标站", "DB2.W4"));
list.add(new ItemDto(item_to_task, "下发任务号", "DB2.D6")); list.add(new ItemDto(item_to_task, "下发任务号", "DB2.D6"));
list.add(new ItemDto(item_to_region_one, "下发区域一", "DB2.D6"));
list.add(new ItemDto(item_to_region_two, "下发区域二", "DB2.D6"));
list.add(new ItemDto(item_to_region_three, "下发区域三", "DB2.D6"));
return list; return list;
} }

View File

@@ -110,6 +110,19 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i
int last_heartbeat = 0; int last_heartbeat = 0;
int to_command = 0; int to_command = 0;
int last_to_command = 0; int last_to_command = 0;
public int region_one = 0;
public int last_region_one = 0;
public int region_two = 0;
public int last_region_two = 0;
public int region_three = 0;
public int last_region_three = 0;
public int to_region_one = 0;
public int last_to_region_one = 0;
public int to_region_two = 0;
public int last_to_region_two = 0;
public int to_region_three = 0;
public int last_to_region_three = 0;
int to_target = 0; int to_target = 0;
int last_to_target = 0; int last_to_target = 0;
@@ -183,6 +196,12 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i
to_onset = this.itemProtocol.getTo_onset(); to_onset = this.itemProtocol.getTo_onset();
x_position = this.itemProtocol.getX_position(); x_position = this.itemProtocol.getX_position();
y_position = this.itemProtocol.getY_position(); y_position = this.itemProtocol.getY_position();
region_one = this.itemProtocol.getRegion_one();
region_two = this.itemProtocol.getRegion_two();
region_three = this.itemProtocol.getRegion_three();
to_region_one = this.itemProtocol.getTo_region_one();
to_region_two = this.itemProtocol.getTo_region_two();
to_region_three = this.itemProtocol.getTo_region_three();
iserror = this.itemProtocol.device_status; iserror = this.itemProtocol.device_status;
if (mode != last_mode) { if (mode != last_mode) {
@@ -262,6 +281,10 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i
last_to_onset = to_onset; last_to_onset = to_onset;
last_x_position = x_position; last_x_position = x_position;
last_y_position = y_position; last_y_position = y_position;
last_region_one = region_one;
last_region_two = region_two;
last_region_three = region_three;
} }
public List<TaskDto> sortTask(List<TaskDto> taskDtos) { public List<TaskDto> sortTask(List<TaskDto> taskDtos) {

View File

@@ -50,11 +50,45 @@
</div> </div>
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px"> <el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="78px">
<el-row> <el-row>
<el-col :span="8"> <el-col :span="12">
<el-form-item label="电气调度号" label-width="150px"> <el-form-item label="电气调度号" label-width="150px">
<el-switch v-model="form.OPCServer" /> <el-switch v-model="form.OPCServer" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="选择区域" prop="region">
<el-select
v-model="form.region"
filterable
clearable
placeholder="请选择"
>
<el-option
v-for="item in region"
:key="item.region_number"
:label="item.region_name"
:value="item.region_number"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="关联设备" prop="device_code" label-width="135px">
<el-select
v-model="form.link_device_code"
filterable
clearable
placeholder="请选择"
>
<el-option
v-for="item in deviceList"
:key="item.device_name"
:label="item.device_code"
:value="item.device_code"
/>
</el-select>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
</el-card> </el-card>
@@ -161,6 +195,7 @@ import {
import { selectOpcList } from '@/api/acs/device/opc' import { selectOpcList } from '@/api/acs/device/opc'
import { selectPlcList } from '@/api/acs/device/opcPlc' import { selectPlcList } from '@/api/acs/device/opcPlc'
import { selectListByOpcID } from '@/api/acs/device/opcPlc' import { selectListByOpcID } from '@/api/acs/device/opcPlc'
import deviceCrud from '@/api/acs/device/device'
import crud from '@/mixins/crud' import crud from '@/mixins/crud'
@@ -184,6 +219,7 @@ export default {
configLoading: false, configLoading: false,
dataOpcservers: [], dataOpcservers: [],
dataOpcPlcs: [], dataOpcPlcs: [],
deviceList: [],
data1: [], data1: [],
data2: [], data2: [],
form: { form: {
@@ -195,7 +231,12 @@ export default {
is_pickup: true, is_pickup: true,
is_release: true is_release: true
}, },
rules: {} rules: {},
region: [
{ region_name: '区域一', region_number: '1' },
{ region_name: '区域二', region_number: '2' },
{ region_name: '区域三', region_number: '3' }
]
} }
}, },
created() { created() {
@@ -234,6 +275,9 @@ export default {
this.dataOpcservers = data this.dataOpcservers = data
this.opc_id = this.$props.parentForm.opc_server_id this.opc_id = this.$props.parentForm.opc_server_id
}) })
deviceCrud.selectDeviceList().then(data => {
this.deviceList = data
})
}) })
}, },
methods: { methods: {