From 71b5617841bd261905ab2743f917e57095a3db43 Mon Sep 17 00:00:00 2001 From: "USER-20220102CG\\noblelift" <546428999@qq.com> Date: Tue, 18 Jul 2023 09:49:41 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=8F=8C=E5=B7=A5=E4=BD=8DRGV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/acs/device/wql/task_inst.xls | Bin 156160 -> 157184 bytes ...alletizingManipulatorSiteDeviceDriver.java | 9 +- .../lnsh/lnsh_rgv/LnshRGVDeviceDriver.java | 644 +++++++++++++++--- .../wms/service/impl/WmsToAcsServiceImpl.java | 9 + .../service/InstructionService.java | 3 + .../service/dto/InstructionDto.java | 20 + .../service/impl/InstructionServiceImpl.java | 14 + .../org/nl/acs/task/service/dto/TaskDto.java | 20 + .../auto/run/NDCSocketConnectionAutoRun.java | 15 +- acs/qd/src/views/acs/instruction/index.vue | 2 + acs/qd/src/views/acs/task/index.vue | 2 + 11 files changed, 635 insertions(+), 103 deletions(-) diff --git a/acs/hd/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls b/acs/hd/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls index 8bc521daa27c02b1b141d6c1c2f6bb6e487dd918..d3f91c1be49eddfb1dcf79796089044d1ba55b60 100644 GIT binary patch delta 47103 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" + mode); } @@ -178,10 +219,18 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi logServer.deviceExecuteLog(this.device_code, "", "", "信号status:" + last_status + "->" + status); } if (move_1 != last_move_1) { + if(move_1 ==0){ + this.setRequireSucess1(false); + logServer.deviceExecuteLog(this.device_code, "", "", "前工位有货变无货,复位前工位请求标记requireSucess1:" + requireSucess1); + } logServer.deviceItemValue(this.device_code, "move_1", String.valueOf(move_1)); logServer.deviceExecuteLog(this.device_code, "", "", "信号move_1:" + last_move_1 + "->" + move_1); } if (move_2 != last_move_2) { + if(move_2 ==0){ + this.setRequireSucess2(false); + logServer.deviceExecuteLog(this.device_code, "", "", "后工位有货变无货,复位后工位请求标记requireSucess2:" + requireSucess2); + } logServer.deviceItemValue(this.device_code, "move_2", String.valueOf(move_2)); logServer.deviceExecuteLog(this.device_code, "", "", "信号move_2:" + last_move_2 + "->" + move_2); } @@ -241,96 +290,120 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi logServer.deviceItemValue(this.device_code, "specifications", specifications); logServer.deviceExecuteLog(this.device_code, "", "", "信号specifications:" + last_specifications + "->" + specifications); } - if (move_1 == 0 && task1 == 0) { - this.setRequireSucess1(false); - logServer.deviceExecuteLog(this.device_code, "", "", "前工位无货且无任务,复位前工位请求标记requireSucess1:" + requireSucess1); + + if (to_task1 != last_to_task1) { + logServer.deviceItemValue(this.device_code, "to_task1",String.valueOf(to_task1)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_task1:" + last_to_task1 + "->" + to_task1); } - if (move_2 == 0 && task2 == 0) { - this.setRequireSucess2(false); - logServer.deviceExecuteLog(this.device_code, "", "", "后工位无货且无任务,复位后工位请求标记requireSucess2:" + requireSucess1); + if (to_target1 != last_to_target1) { + logServer.deviceItemValue(this.device_code, "to_task1",String.valueOf(to_target1)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_target1:" + last_to_target1 + "->" + to_target1); + } + if (to_oneset1 != last_to_oneset1) { + logServer.deviceItemValue(this.device_code, "to_task1",String.valueOf(to_oneset1)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_oneset1:" + last_to_oneset1 + "->" + to_oneset1); + } + if (to_command1 != last_to_command1) { + logServer.deviceItemValue(this.device_code, "to_task1",String.valueOf(to_command1)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_command1:" + last_to_command1 + "->" + to_command1); + } + + if (to_task2 != last_to_task2) { + logServer.deviceItemValue(this.device_code, "to_task1",String.valueOf(to_task2)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_task2:" + last_to_task2 + "->" + to_task2); + } + if (to_target2 != last_to_target2) { + logServer.deviceItemValue(this.device_code, "to_task2",String.valueOf(to_task2)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_target2:" + last_to_target2 + "->" + to_target2); + } + if (to_oneset2 != last_to_oneset2) { + logServer.deviceItemValue(this.device_code, "to_task2",String.valueOf(to_oneset2)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_oneset2:" + last_to_oneset2 + "->" + to_oneset2); + } + if (to_command2 != last_to_command2) { + logServer.deviceItemValue(this.device_code, "to_command2",String.valueOf(to_command2)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号to_command2:" + last_to_command2 + "->" + to_command2); + } +// if (move_1 == 0 && task1 == 0) { +// this.setRequireSucess1(false); +// logServer.deviceExecuteLog(this.device_code, "", "", "前工位无货且无任务,复位前工位请求标记requireSucess1:" + requireSucess1); +// } +// if (move_2 == 0 && task2 == 0) { +// this.setRequireSucess2(false); +// logServer.deviceExecuteLog(this.device_code, "", "", "后工位无货且无任务,复位后工位请求标记requireSucess2:" + requireSucess1); +// } + + if(task1 > 0 || task2 > 0){ + update_instruction_status(); } - if (task1 > 0) { - //inst_message - inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); - if (inst1 != null) { - if (StrUtil.equals(inst1.getInstruction_status(), "0")) { - inst1.setInstruction_status("1"); - instructionService.update(inst1); - } + +// //执行双任务下的业务逻辑 +// //给后工位下发空盘放货信号 +// if (mode == 3 && action_1 == 2 && action_2 == 2 && move_1 != 0 && move_2 != 0 && task1 > 0 && task2 > 0) { +// if(to_command2 !=2 ){ +// writing("to_command2", "2"); +// } +// } +// //给前工位下发放货信号 +// if (mode == 3 && action_2 == 4 && move_1 != 0 && move_2 == 0 && task1 > 0) { +// if(to_command2 !=2 ) { +// writing("to_command1", "2"); +// } +// } +// +// //执行单任务下的业务逻辑 +// //给后工位下发空盘放货信号 +// //判断条件 前工位无任务、无货 后工位有任务取货完成 +// if (mode == 3 && action_2 == 2 && move_2 != 0 && move_1 == 0 && task2 > 0 && task1 == 0) { +// if(to_command2 !=2 ) { +// writing("to_command2", "2"); +// } +// } +// //给前工位取满托下发放货信号 +// if (mode == 3 && action_1 == 2 && move_1 != 0 && move_2 == 0 && task1 > 0 && task2 == 0) { +// if(to_command2 !=2 ) { +// writing("to_command1", "2"); +// } +// } + + //双任务下 后工位取货完成,然后给前工位下发取满盘任务取货命令 + if (mode == 3 && action_2 == 2 && action_1 == 0 && move_2 != 0 && move_1 == 0 && task2 > 0) { + if(to_command1 !=1 ){ + writing("to_command1", "1"); } } - if (action_1 == 4 && move_1 == 0 && task1 > 0) { - //inst_message - inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); - if (inst1 != null) { - try { - finish_instruction(inst1); - } catch (Exception e) { - log.error("RGV 前工位完成指令异常", e); - logServer.deviceExecuteLog(this.device_code, "", "", "前工位指令" + task1 + "完成异常,异常原因:" + e.getMessage()); - } - writing("to_command1", "0"); - writing("to_onset1", "0"); - writing("to_target1", "0"); - writing("to_task1", "0"); - - } - this.requireSucess1 = false; - } - - if (task2 > 0) { - //inst_message - inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); - if (inst2 != null) { - if (StrUtil.equals(inst2.getInstruction_status(), "0")) { - inst2.setInstruction_status("1"); - instructionService.update(inst2); - } + //双任务下发 前后工位取货完成 给后工位放货命令 + if (mode == 3 && action_2 == 2 && action_1 == 2 && move_2 != 0 && move_1 != 0 && task2 > 0 && task1 > 0) { + if(to_command2 !=2 ) { + writing("to_command2", "2"); } } - if (action_2 == 4 && move_2 == 0 && task2 > 0) { - //inst_message - inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); - if (inst2 != null) { - try { - finish_instruction(inst2); - } catch (Exception e) { - log.error("RGV 前工位完成指令异常", e); - logServer.deviceExecuteLog(this.device_code, "", "", "后工位指令" + task1 + "完成异常,异常原因:" + e.getMessage()); - } - writing("to_command2", "0"); - writing("to_onset2", "0"); - writing("to_target2", "0"); - writing("to_task2", "0"); + //双任务下发 后工位放货完成 给前工位下发放货 + if (mode == 3 && action_2 == 4 && action_1 == 2 && move_2 != 0 && move_1 != 0 && task2 > 0 && task1 > 0) { + if(to_command1 !=2 ) { + writing("to_command1", "2"); } - this.requireSucess2 = false; } - //执行双任务下的业务逻辑 - //给后工位下发空盘放货信号 - if (mode == 3 && action_1 == 2 && action_2 == 2 && move_1 != 0 && move_2 != 0 && task1 > 0 && task2 > 0) { - writing("to_command2", "2"); - } - //给前工位下发放货信号 - if (mode == 3 && action_2 == 4 && move_1 != 0 && move_2 == 0 && task1 > 0) { - writing("to_command1", "2"); + //后工位单任务下发 空托或者半托缓存任务 + if (mode == 3 && action_2 == 2 && action_1 == 0 && move_2 > 0 && move_1 == 0 && task2 > 0 && task1 == 0) { + if(to_command2 !=2 ) { + writing("to_command2", "2"); + } } - //执行单任务下的业务逻辑 - //给后工位下发空盘放货信号 - //判断条件 前工位无任务、无货 后工位有任务取货完成 - if (mode == 3 && action_2 == 2 && move_2 != 0 && move_1 == 0 && task2 > 0 && task1 == 0) { - writing("to_command2", "2"); - } - //给前工位取满托下发放货信号 - if (mode == 3 && action_1 == 2 && move_1 != 0 && move_2 == 0 && task1 > 0 && task2 == 0) { - writing("to_command1", "2"); + //前工位单任务下发 强制包装的任务 + if (mode == 3 && action_1 == 2 && action_2 == 0 && move_1 > 0 && move_2 == 0 && task1 > 0 && task2 == 0) { + if(to_command1 !=2 ) { + writing("to_command1", "2"); + } } + } catch (Exception var17) { return; } @@ -362,19 +435,19 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi return; case 2: //后工位申请任务 - if (move_2 == 0 && action_2 == 0 && !requireSucess2 && task2 == 0) { - instruction_require2(); - } - //前工位申请任务 - if (move_2 == 0 && action_2 == 0 && task2 == 0 && move_1 == 0 && task1 == 0 && action_1 == 0 && !requireSucess1 && !requireSucess2) { +// if (move_2 == 0 && action_2 == 0 && !requireSucess2 && task2 == 0) { +// instruction_require2(); +// } + // 申请任务 + if (move_1 == 0 && move_2 == 0 && action_1 == 0 && action_2 == 0 && task1 == 0 && task2 == 0 && !requireSucess1) { instruction_require(); } break; case 3: - //前工位申请任务 - if (move_1 == 0 && action_1 == 0 && task1 == 0 && ( action_2 == 1 || action_2 == 2 )&& !requireSucess1) { - instruction_require(); - } + //前工位申请任务 新增上后工位任务号>0的判断 +// if (move_1 == 0 && action_1 == 0 && task2> 0 && task1 == 0 && ( action_2 == 1 || action_2 == 2 )&& !requireSucess1 && requireSucess2) { +// instruction_require(); +// } break; } @@ -410,6 +483,15 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi last_specifications = specifications; last_batch = batch; last_qty = qty; + last_to_command1 = to_command1; + last_to_oneset1 = to_oneset1; + last_to_target1 = to_target1; + last_to_task1 = to_task1; + last_to_command2 = to_command2; + last_to_oneset2 = to_oneset2; + last_to_target2 = to_target2; + last_to_task2 = to_task2; + } @@ -426,12 +508,7 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi String demoArray[] = demosub.split(","); List device_code_list = Arrays.asList(demoArray); TaskDto task = null; - if (mode == 3) { - Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); - device_code_list = new ArrayList<>(); - device_code_list.add(inst2.getNext_device_code()); - logServer.deviceExecuteLog(device_code, "", "", "前工位申请起点为" + inst2.getNext_device_code() + "的任务"); - } + for (int i = 0; i < device_code_list.size(); i++) { if (ObjectUtil.isNotEmpty(taskserver.queryTaskByDeviceCode(device_code_list.get(i).replace("\"", "")))) { task = taskserver.queryTaskByDeviceCode(device_code_list.get(i).replace("\"", "")).get(0); @@ -445,11 +522,21 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi String priority = task.getPriority(); String start_point_code = task.getStart_point_code(); String start_device_code = task.getStart_device_code(); + String start_device_code2 = task.getStart_device_code2(); String route_plan_code = task.getRoute_plan_code(); String next_point_code = task.getNext_point_code(); String next_device_code = task.getNext_device_code(); + String next_device_code2 = task.getNext_device_code2(); Device startdevice = deviceAppservice.findDeviceByCode(start_device_code); Device nextdevice = deviceAppservice.findDeviceByCode(next_device_code); + Device startdevice2 = null; + Device nextdevice2 = null; + if(ObjectUtil.isNotEmpty(start_device_code2)){ + startdevice2 = deviceAppservice.findDeviceByCode(start_device_code2); + } + if(ObjectUtil.isNotEmpty(next_device_code2)){ + nextdevice2 = deviceAppservice.findDeviceByCode(next_device_code2); + } Instruction instdto = new Instruction(); instdto.setInstruction_id(IdUtil.simpleUUID()); @@ -467,6 +554,10 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi instdto.setNext_device_code(next_device_code); instdto.setStart_point_code(start_point_code); instdto.setNext_point_code(next_point_code); + instdto.setStart_device_code2(start_device_code2); + instdto.setNext_device_code2(next_device_code2); + instdto.setStart_point_code2(start_device_code2); + instdto.setNext_point_code2(next_device_code2); instdto.setPriority(priority); instdto.setInstruction_status("0"); instdto.setExecute_device_code(start_point_code); @@ -483,17 +574,266 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi //创建指令后修改任务状态 task.setTask_status("1"); taskserver.update(task); - requireSucess1 = true; - String start_addr = startdevice.getExtraValue().get("OPCServer").toString(); - String next_addr = nextdevice.getExtraValue().get("OPCServer").toString(); + //下发4个点任务 + if(ObjectUtil.isNotEmpty(start_device_code2) && ObjectUtil.isNotEmpty(next_device_code2) ){ + //前工位送满托任务 + String start_addr = startdevice.getExtraValue().get("OPCServer").toString(); + String next_addr = nextdevice.getExtraValue().get("OPCServer").toString(); + //后工位送空托盘任务 + String start_addr2 = startdevice2.getExtraValue().get("OPCServer").toString(); + String next_addr2 = nextdevice2.getExtraValue().get("OPCServer").toString(); - writing("to_command1", "1"); - writing("to_onset1", start_addr); - writing("to_target1", next_addr); - writing("to_task1", instdto.getInstruction_code()); - logServer.deviceExecuteLog(this.device_code, "", "", "申请前工位满料任务成功,requireSucess1" + requireSucess1 + ",指令号:" + instdto.getInstruction_code()); +// writing("to_command1", "1"); + writing("to_onset1", start_addr); + writing("to_target1", next_addr); + writing("to_task1", instdto.getInstruction_code()); + writing("to_command2", "1"); + writing("to_onset2", start_addr2); + writing("to_target1", next_addr2); + writing("to_task2", instdto.getInstruction_code()); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task2").toString() + , instdto.getInstruction_code())) { + writing("to_onset1", start_addr); + writing("to_target1", next_addr); + writing("to_task1", instdto.getInstruction_code()); + writing("to_command2", "1"); + writing("to_onset2", start_addr2); + writing("to_target2", next_addr2); + writing("to_task2", instdto.getInstruction_code()); + logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(instdto.getTask_code()))){ + requireSucess1 = false; + return false; + } + } + requireSucess1 = true; + logServer.deviceExecuteLog(this.device_code, "", "", "申请前后工位任务成功,requireSucess1" + requireSucess1 + ",指令号:" + instdto.getInstruction_code()); + } else { + String start_addr = startdevice.getExtraValue().get("OPCServer").toString(); + String next_addr = nextdevice.getExtraValue().get("OPCServer").toString(); + //如果终点是BZSLW 则用前工位 + if(StrUtil.equals("BZSLW",next_device_code)){ + writing("to_command1", "1"); + writing("to_onset1", start_addr); + writing("to_target1", next_addr); + writing("to_task1", instdto.getInstruction_code()); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task1").toString() + , instdto.getInstruction_code())) { + writing("to_command1", "1"); + writing("to_onset1", start_addr); + writing("to_target1", next_addr); + writing("to_task1", instdto.getInstruction_code()); + logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(instdto.getTask_code()))){ + requireSucess1 = false; + return false; + } + } + } else { + writing("to_command2", "1"); + writing("to_onset2", start_addr); + writing("to_target2", next_addr); + writing("to_task2", instdto.getInstruction_code()); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task1").toString() + , instdto.getInstruction_code())) { + writing("to_command2", "1"); + writing("to_onset2", start_addr); + writing("to_target2", start_addr); + writing("to_task2", instdto.getInstruction_code()); + logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(instdto.getTask_code()))){ + requireSucess1 = false; + return false; + } + } + } + requireSucess1 = true; + logServer.deviceExecuteLog(this.device_code, "", "", "申请后工位任务成功,requireSucess1" + requireSucess1 + ",指令号:" + instdto.getInstruction_code()); + } + } else { + //申请后工位任务 + String linkobj2 = (String) this.getDevice().getExtraValue().get("get_device_code2"); + String demosub2 = linkobj2.substring(1, linkobj2.length() - 1); + String demoArray2[] = demosub2.split(","); + List device_code_list2 = Arrays.asList(demoArray2); + TaskDto task2 = null; + for (int i = 0; i < device_code_list2.size(); i++) { + if (ObjectUtil.isNotEmpty(taskserver.queryTaskByDeviceCode(device_code_list2.get(i).replace("\"", "")))) { + task2 = taskserver.queryTaskByDeviceCode(device_code_list2.get(i).replace("\"", "")).get(0); + } + if (ObjectUtil.isNotEmpty(task2)) break; + } + if (!ObjectUtil.isEmpty(task2)) { + String taskid = task2.getTask_id(); + String taskcode = task2.getTask_code(); + String vehiclecode = task2.getVehicle_code(); + String priority = task2.getPriority(); + String start_point_code = task2.getStart_point_code(); + String start_device_code = task2.getStart_device_code(); + String start_device_code2 = task2.getStart_device_code2(); + String route_plan_code = task2.getRoute_plan_code(); + String next_point_code = task2.getNext_point_code(); + String next_device_code = task2.getNext_device_code(); + String next_device_code2 = task2.getNext_device_code2(); + Device startdevice = deviceAppservice.findDeviceByCode(start_device_code); + Device nextdevice = deviceAppservice.findDeviceByCode(next_device_code); + Device startdevice2 = null; + Device nextdevice2 = null; + if(ObjectUtil.isNotEmpty(start_device_code2)){ + startdevice2 = deviceAppservice.findDeviceByCode(start_device_code2); + } + if(ObjectUtil.isNotEmpty(next_device_code2)){ + nextdevice2 = deviceAppservice.findDeviceByCode(next_device_code2); + } + + Instruction instdto = new Instruction(); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(task2.getRemark()); + instdto.setMaterial(task2.getMaterial()); + instdto.setQuantity(task2.getQuantity()); + instdto.setTask_id(taskid); + instdto.setTask_code(taskcode); + instdto.setVehicle_code(vehiclecode); + String now = DateUtil.now(); + instdto.setCreate_time(now); + instdto.setCreate_by("auto"); + instdto.setStart_device_code(start_device_code); + instdto.setNext_device_code(next_device_code); + instdto.setStart_point_code(start_point_code); + instdto.setNext_point_code(next_point_code); + instdto.setStart_device_code2(start_device_code2); + instdto.setNext_device_code2(next_device_code2); + instdto.setStart_point_code2(start_device_code2); + instdto.setNext_point_code2(next_device_code2); + instdto.setPriority(priority); + instdto.setInstruction_status("0"); + instdto.setExecute_device_code(start_point_code); + + try { + instructionService.create(instdto); + } catch (Exception e) { + e.printStackTrace(); + } + + //创建指令后修改任务状态 + WQLObject taskwo = WQLObject.getWQLObject("acs_task"); + task2.setTask_status("1"); + //创建指令后修改任务状态 + task2.setTask_status("1"); + taskserver.update(task2); + + //下发4个点任务 + if(ObjectUtil.isNotEmpty(start_device_code2) && ObjectUtil.isNotEmpty(next_device_code2) ){ + //前工位送满托任务 + String start_addr = startdevice.getExtraValue().get("OPCServer").toString(); + String next_addr = nextdevice.getExtraValue().get("OPCServer").toString(); + //后工位送空托盘任务 + String start_addr2 = startdevice2.getExtraValue().get("OPCServer").toString(); + String next_addr2 = nextdevice2.getExtraValue().get("OPCServer").toString(); + +// writing("to_command1", "1"); + writing("to_onset1", start_addr); + writing("to_target1", next_addr); + writing("to_task1", instdto.getInstruction_code()); + writing("to_command2", "1"); + writing("to_onset2", start_addr2); + writing("to_target1", next_addr2); + writing("to_task2", instdto.getInstruction_code()); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task2").toString() + , instdto.getInstruction_code())) { + writing("to_onset1", start_addr); + writing("to_target1", next_addr); + writing("to_task1", instdto.getInstruction_code()); + writing("to_command2", "1"); + writing("to_onset2", start_addr2); + writing("to_target2", next_addr2); + writing("to_task2", instdto.getInstruction_code()); + logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(instdto.getTask_code()))){ + requireSucess1 = false; + return false; + } + } + requireSucess1 = true; + logServer.deviceExecuteLog(this.device_code, "", "", "申请前后工位任务成功,requireSucess1" + requireSucess1 + ",指令号:" + instdto.getInstruction_code()); + } else { + String start_addr = startdevice.getExtraValue().get("OPCServer").toString(); + String next_addr = nextdevice.getExtraValue().get("OPCServer").toString(); + //如果终点是BZSLW 则用前工位 + if(StrUtil.equals("BZSLW",next_device_code)){ + writing("to_command1", "1"); + writing("to_onset1", start_addr); + writing("to_target1", next_addr); + writing("to_task1", instdto.getInstruction_code()); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task1").toString() + , instdto.getInstruction_code())) { + writing("to_command1", "1"); + writing("to_onset1", start_addr); + writing("to_target1", next_addr); + writing("to_task1", instdto.getInstruction_code()); + logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(instdto.getTask_code()))){ + requireSucess1 = false; + return false; + } + } + } else { + writing("to_command2", "1"); + writing("to_onset2", start_addr); + writing("to_target2", next_addr); + writing("to_task2", instdto.getInstruction_code()); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task1").toString() + , instdto.getInstruction_code())) { + writing("to_command2", "1"); + writing("to_onset2", start_addr); + writing("to_target2", start_addr); + writing("to_task2", instdto.getInstruction_code()); + logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(instdto.getTask_code()))){ + requireSucess1 = false; + return false; + } + } + } + requireSucess1 = true; + logServer.deviceExecuteLog(this.device_code, "", "", "申请后工位任务成功,requireSucess1" + requireSucess1 + ",指令号:" + instdto.getInstruction_code()); + } + + requireSucess1 = true; + } } } return true; @@ -563,7 +903,6 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi //创建指令后修改任务状态 task.setTask_status("1"); taskserver.update(task); - requireSucess2 = true; String start_addr = startdevice.getExtraValue().get("OPCServer").toString(); @@ -574,6 +913,26 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi writing("to_target2", next_addr); writing("to_task2", instdto.getInstruction_code()); + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task2").toString() + , instdto.getInstruction_code())) { + + writing("to_command2", "1"); + writing("to_onset2", start_addr); + writing("to_target2", next_addr); + writing("to_task2", instdto.getInstruction_code()); + logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(instdto.getTask_code()))){ + requireSucess2 = false; + return false; + } + } + + requireSucess2 = true; logServer.deviceExecuteLog(this.device_code, "", "", "申请后工位空盘任务成功,requireSucess2" + requireSucess2 + ",指令号:" + instdto.getInstruction_code()); } @@ -781,4 +1140,95 @@ public class LnshRGVDeviceDriver extends AbstractOpcDeviceDriver implements Devi public void setDeviceStatus(JSONObject data) { } + + + /** + * 更新指令状态 + */ + public synchronized void update_instruction_status() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_update_time.getTime() < (long) this.instruction_update_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_update_time_out); + + } else { + this.instruction_update_time = date; + + if(task1 >0 && task2>0 && action_1 == 4 && action_2 == 4 && move_1 ==0 && move_2==0){ + //inst_message + inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst1 != null) { + try { + finish_instruction(inst1); + } catch (Exception e) { + log.error("RGV 前工位完成指令异常", e); + logServer.deviceExecuteLog(this.device_code, "", "", "前工位指令" + task1 + "完成异常,异常原因:" + e.getMessage()); + } + writing("to_command1", "0"); + writing("to_onset1", "0"); + writing("to_target1", "0"); + writing("to_task1", "0"); + writing("to_command2", "0"); + writing("to_onset2", "0"); + writing("to_target2", "0"); + writing("to_task2", "0"); + } + this.requireSucess1 = false; + //单独的后工位任务 + } else if (action_2 == 4 && move_2 == 0 && task2 > 0 && action_1 == 0 && move_2 == 0 && task1 == 0 ) { + //inst_message + inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); + if (inst2 != null) { + try { + finish_instruction(inst2); + } catch (Exception e) { + log.error("RGV 前工位完成指令异常", e); + logServer.deviceExecuteLog(this.device_code, "", "", "后工位指令" + task1 + "完成异常,异常原因:" + e.getMessage()); + } + writing("to_command2", "0"); + writing("to_onset2", "0"); + writing("to_target2", "0"); + writing("to_task2", "0"); + + } + this.requireSucess1 = false; + } else if (action_1 == 4 && move_1 == 0 && task1 > 0 && action_2 == 0 && move_2 == 0 && task2 == 0 ) { + inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst1 != null) { + try { + finish_instruction(inst1); + } catch (Exception e) { + log.error("RGV 前工位完成指令异常", e); + logServer.deviceExecuteLog(this.device_code, "", "", "前工位指令" + task1 + "完成异常,异常原因:" + e.getMessage()); + } + writing("to_command1", "0"); + writing("to_onset1", "0"); + writing("to_target1", "0"); + writing("to_task1", "0"); + } + this.requireSucess1 = false; + } + + + + if (task1 > 0) { + inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst1 != null) { + if (StrUtil.equals(inst1.getInstruction_status(), "0")) { + inst1.setInstruction_status("1"); + instructionService.update(inst1); + } + } + } + if (task2 > 0) { + inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); + if (inst2 != null) { + if (StrUtil.equals(inst2.getInstruction_status(), "0")) { + inst2.setInstruction_status("1"); + instructionService.update(inst2); + } + } + } + } + } + } diff --git a/acs/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/acs/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index d30e61d..8cada63 100644 --- a/acs/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/acs/hd/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -80,6 +80,11 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { task_code = task.getString("task_code"); String start_point_code = task.getString("start_device_code"); String next_point_code = task.getString("next_device_code"); + // 双工RGV任务 后工位任务 + String start_point_code2 = task.getString("start_device_code2"); + String next_point_code2 = task.getString("next_device_code2"); + String start_device_code2 = task.getString("start_device_code2"); + String next_device_code2 = task.getString("next_device_code2"); String start_device_code = ""; String next_device_code = ""; String start_parent_code = ""; @@ -153,6 +158,10 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { jo.put("next_parent_code", next_parent_code); jo.put("start_device_code", start_device_code); jo.put("next_device_code", next_device_code); + jo.put("start_point_code2", start_point_code2); + jo.put("next_point_code2", next_point_code2); + jo.put("start_device_code2", start_device_code2); + jo.put("next_device_code2", next_device_code2); jo.put("priority", priority); jo.put("vehicle_code", vehicle_code); jo.put("vehicle_type", vehicle_type); diff --git a/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java b/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java index 06f3e1a..f7dd1ee 100644 --- a/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java +++ b/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java @@ -71,6 +71,9 @@ public interface InstructionService { */ Instruction findById(String instruction_id); + Instruction findByTaskcodeAndStatus(String code); + + /** * 根据编码查询 * diff --git a/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/InstructionDto.java b/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/InstructionDto.java index 45aef48..2a43d6b 100644 --- a/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/InstructionDto.java +++ b/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/InstructionDto.java @@ -104,6 +104,26 @@ public class InstructionDto implements Serializable { */ private String next_device_code; + /** + * 起始点位编码2 + */ + private String start_point_code2; + + /** + * 起始设备编码2 + */ + private String start_device_code2; + + /** + * 目标点位编码 + */ + private String next_point_code2; + + /** + * 目标设备编码2 + */ + private String next_device_code2; + /** * 排 */ diff --git a/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index 796a770..91e4511 100644 --- a/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/acs/hd/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -203,6 +203,20 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu return obj; } + @Override + public Instruction findByTaskcodeAndStatus(String code) { + Iterator var3 = instructions.iterator(); + while (var3.hasNext()) { + Instruction instruction = (Instruction) var3.next(); + if (StrUtil.equals(instruction.getTask_code(), code) + && StrUtil.equals(instruction.getInstruction_status(), "0")) { + return instruction; + } + } + return null; + } + + @Override public Instruction findByCode(String code) { WQLObject wo = WQLObject.getWQLObject("acs_instruction"); diff --git a/acs/hd/nladmin-system/src/main/java/org/nl/acs/task/service/dto/TaskDto.java b/acs/hd/nladmin-system/src/main/java/org/nl/acs/task/service/dto/TaskDto.java index 96e79e0..8329db9 100644 --- a/acs/hd/nladmin-system/src/main/java/org/nl/acs/task/service/dto/TaskDto.java +++ b/acs/hd/nladmin-system/src/main/java/org/nl/acs/task/service/dto/TaskDto.java @@ -78,6 +78,16 @@ public class TaskDto implements Serializable { */ private String start_device_code; + /** + * 起始点位编码 + */ + private String start_point_code2; + + /** + * 起始设备编码 + */ + private String start_device_code2; + /** * 目标点位编码 */ @@ -88,6 +98,16 @@ public class TaskDto implements Serializable { */ private String next_device_code; + /** + * 目标点位编码2 + */ + private String next_point_code2; + + /** + * 目标设备编码2 + */ + private String next_device_code2; + /** * 排 */ diff --git a/acs/hd/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java b/acs/hd/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java index 6269334..fa0631d 100644 --- a/acs/hd/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java +++ b/acs/hd/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java @@ -32,6 +32,7 @@ import org.springframework.stereotype.Component; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.net.InetSocketAddress; import java.net.Socket; import java.util.Date; import java.util.Map; @@ -73,7 +74,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { return "NDC在线连接"; } - public void autoRun() { + public void autoRun() throws IOException { try { AcsConfigService acsConfigService = SpringContextHolder.getBean(AcsConfigServiceImpl.class); @@ -85,8 +86,11 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogServiceImpl.class); ip = acsConfigService.findConfigFromCache().get(AcsConfig.AGVURL); port = Integer.parseInt(acsConfigService.findConfigFromCache().get(AcsConfig.AGVPORT)); + InetSocketAddress socketAddress = new InetSocketAddress(ip, port); byte[] b = new byte[1028]; socket = new Socket(ip, port); + socket.connect(socketAddress,2*1000); + socket.setKeepAlive(true);//长链接 dos = new DataOutputStream(socket.getOutputStream()); dis = new DataInputStream(socket.getInputStream()); @@ -94,9 +98,14 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { int count = dis.read(b); if (count == -1) { + log.error("agv连接出现异常:服务端被关闭"); + if (ObjectUtil.isNotEmpty(socket)) { + socket.close(); + } break; } + int[] arr = new int[count]; StringBuffer bs = new StringBuffer(); @@ -858,7 +867,9 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { } catch (Exception e) { log.error("[NDC在线连接] 执行错误,请重新启动线程!", e); - + if (ObjectUtil.isNotEmpty(socket)) { + socket.close(); + } } } diff --git a/acs/qd/src/views/acs/instruction/index.vue b/acs/qd/src/views/acs/instruction/index.vue index e1be702..afae27d 100644 --- a/acs/qd/src/views/acs/instruction/index.vue +++ b/acs/qd/src/views/acs/instruction/index.vue @@ -129,6 +129,8 @@ + +