src/main/java/com/zy/asrs/controller/CommandInfoController.java
@@ -15,6 +15,7 @@ import com.core.common.R; import com.zy.common.web.BaseController; import com.zy.core.cache.MessageQueue; import com.zy.core.enums.CommandStatusType; import com.zy.core.enums.SlaveType; import com.zy.core.model.Task; import com.zy.core.model.command.CommandPackage; @@ -149,7 +150,7 @@ return R.error("指令不存在"); } commandInfo.setCommandStatus(2);//执行状态 commandInfo.setCommandStatus(CommandStatusType.EXECUTE.id);//执行状态 commandInfo.setExecuteTime(new Date()); if (commandInfoService.updateById(commandInfo)) { //将指令进行投递 @@ -181,7 +182,7 @@ return R.error("指令不存在"); } commandInfo.setCommandStatus(3);//完成状态 commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);//完成状态 commandInfo.setCompleteTime(new Date()); commandInfoService.updateById(commandInfo); return R.ok(); src/main/java/com/zy/asrs/controller/CrnController.java
@@ -1,10 +1,7 @@ package com.zy.asrs.controller; import HslCommunication.Profinet.Siemens.SiemensS7Net; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.core.annotations.ManagerAuth; import com.core.common.Cools; import com.core.common.R; @@ -22,8 +19,8 @@ import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.MainServiceImpl; import com.zy.asrs.utils.CommandUtils; import com.zy.asrs.utils.VersionUtils; import com.zy.common.utils.HttpHandler; import com.zy.core.CrnThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; @@ -575,7 +572,7 @@ crnCommand.setCommand((short) 0); // 任务完成确认位 // 延时发送 Thread.sleep(1000L); if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) { if (CommandUtils.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand), false)) { return R.ok(); } else { throw new CoolException("命令下发失败"); @@ -685,7 +682,7 @@ } // 空闲判断 // if (crnProtocol.getStatusType().equals(com.zy.core.enums.CrnStatusType.IDLE) && crnProtocol.getTaskNo() == 0) { if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(4, command))) { if (CommandUtils.offer(SlaveType.Crn, crn.getId(), new Task(4, command), false)) { return true; } else { throw new CoolException("命令下发失败"); @@ -719,11 +716,11 @@ } // 空闲判断 // if (crnProtocol.getStatusType().equals(com.zy.core.enums.CrnStatusType.IDLE) && crnProtocol.getTaskNo() == 0) { if (MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, command))) { return true; } else { throw new CoolException("命令下发失败"); } if (CommandUtils.offer(SlaveType.Crn, crn.getId(), new Task(2, command), false)) { return true; } else { throw new CoolException("命令下发失败"); } // } else { // throw new CoolException("堆垛机不在空闲状态"); // } src/main/java/com/zy/asrs/controller/SiteController.java
@@ -8,6 +8,7 @@ import com.zy.asrs.domain.vo.SiteTableVo; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.utils.CommandUtils; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; @@ -236,7 +237,7 @@ basDevp.setOutEnable(outEnable ? "Y" : "N"); } basDevpService.updateById(basDevp); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); boolean result = CommandUtils.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol), false); if (result) { return R.ok(); } else { src/main/java/com/zy/asrs/entity/CommandInfo.java
@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotations.TableField; import java.text.SimpleDateFormat; import java.util.Date; import com.zy.core.enums.CommandType; import org.springframework.format.annotation.DateTimeFormat; import io.swagger.annotations.ApiModelProperty; @@ -181,5 +183,12 @@ } } public String getCommandType$() { if (Cools.isEmpty(this.commandType)) { return ""; } return CommandType.get(this.commandType).desc; } } src/main/java/com/zy/asrs/mapper/CommandInfoMapper.java
@@ -17,4 +17,6 @@ List<CommandInfo> selectByTaskNo(String taskNo); List<CommandInfo> selectCompleteManualCommand();//查询已完成的手动命令 } src/main/java/com/zy/asrs/mapper/TaskWrkMapper.java
@@ -38,4 +38,6 @@ int saveToHistory(String taskNo);//将任务转历史日志 List<TaskWrk> selectWorkingTask();//获取工作中的任务 } src/main/java/com/zy/asrs/service/CommandInfoService.java
@@ -15,4 +15,8 @@ int saveToHistory(String taskNo);//将指令转日志 boolean saveToHistory(Integer id);//将指令转日志 List<CommandInfo> selectCompleteManualCommand();//查询已完成的手动命令 } src/main/java/com/zy/asrs/service/impl/CommandInfoServiceImpl.java
@@ -49,4 +49,20 @@ } return count; } @Override public boolean saveToHistory(Integer id) { CommandInfo commandInfo = this.baseMapper.selectById(id); String jsonString = JSON.toJSONString(commandInfo); CommandInfoLog commandInfoLog = JSON.parseObject(jsonString, CommandInfoLog.class); commandInfoLog.setId(null); boolean result1 = commandInfoLogService.insert(commandInfoLog); Integer result2 = this.baseMapper.deleteById(id); return result1 && result2 > 0; } @Override public List<CommandInfo> selectCompleteManualCommand() { return this.baseMapper.selectCompleteManualCommand(); } } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam; import com.zy.asrs.mapper.*; @@ -74,6 +75,8 @@ private ConfigService configService; @Autowired private StaDescMapper staDescMapper; @Autowired private CommandInfoService commandInfoService; @Value("${wms.url}") private String wmsUrl; @@ -203,31 +206,21 @@ && crnProtocol.forkPosType == CrnForkPosType.HOME) { // 命令下发区 -------------------------------------------------------------------------- // 下发站点信息 staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue()); String targetPoint = taskWrk.getTargetPoint(); int i = Integer.parseInt(targetPoint); staProtocol.setStaNo((short)i); if (!CommandUtils.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { continue; //取出输送线命令 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); if (commandInfos.isEmpty()) { continue;//命令空 } Integer commandStep = taskWrk.getCommandStep(); CommandInfo commandInfo = commandInfos.get(commandStep); StaProtocol staProtocol1 = JSON.parseObject(commandInfo.getCommand(), StaProtocol.class); if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol1))) { log.error("输送线命令下方失败!!! [工作号:{}]", taskWrk.getWrkNo()); continue;//命令下发失败 } // 更新工作档状态为14 taskWrk.setWrkSts(14); if (taskWrkMapper.updateById(taskWrk) != 0) { // 复位堆垛机 crnThread.setResetFlag(true); //更新库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); locMast.setLocSts("O");//O.空库位 locMast.setBarcode("");//托盘码 locMast.setModiTime(new Date()); locMast.setModiUser(9999L); locMastService.updateById(locMast); } else { log.error("更新工作档的工作状态为14失败!!! [工作号:{}]", taskWrk.getWrkNo()); } // 复位堆垛机 crnThread.setResetFlag(true); } } @@ -328,20 +321,16 @@ continue; } // 命令下发区 -------------------------------------------------------------------------- CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(crnStn.getBay().shortValue()); // 源库位列 crnCommand.setSourcePosY(crnStn.getLev().shortValue()); // 源库位层 crnCommand.setSourcePosZ(crnStn.getRow().shortValue()); // 源库位排 crnCommand.setDestinationPosX(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位列 crnCommand.setDestinationPosY(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位层 crnCommand.setDestinationPosZ(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位排 crnCommand.setCommand((short)1); if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { //取出命令 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); Integer commandStep = taskWrk.getCommandStep(); if (commandInfos.isEmpty()) { continue;//命令空 } CommandInfo commandInfo = commandInfos.get(commandStep); CrnCommand crnCommand = JSON.parseObject(commandInfo.getCommand(), CrnCommand.class);//取出命令报文 if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); } else { // 修改工作档状态 2.设备上走 => 3.吊车入库中 @@ -352,6 +341,31 @@ log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); } } // // 命令下发区 -------------------------------------------------------------------------- // CrnCommand crnCommand = new CrnCommand(); // crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 // crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 // crnCommand.setAckFinish((short) 0); // 任务完成确认位 // crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 // crnCommand.setSourcePosX(crnStn.getBay().shortValue()); // 源库位列 // crnCommand.setSourcePosY(crnStn.getLev().shortValue()); // 源库位层 // crnCommand.setSourcePosZ(crnStn.getRow().shortValue()); // 源库位排 // crnCommand.setDestinationPosX(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位列 // crnCommand.setDestinationPosY(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位层 // crnCommand.setDestinationPosZ(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位排 // crnCommand.setCommand((short)1); // if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { // log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); // } else { // // 修改工作档状态 2.设备上走 => 3.吊车入库中 // Date now = new Date(); // taskWrk.setWrkSts(3); // taskWrk.setModiTime(now); // if (taskWrkMapper.updateById(taskWrk) == 0) { // log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); // } // } } return; @@ -447,20 +461,16 @@ } } // 1.堆垛机开始移动 CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(Utils.getBayShort(taskWrk.getStartPoint())); // 源库位排 crnCommand.setSourcePosY(Utils.getLevShort(taskWrk.getStartPoint())); // 源库位列 crnCommand.setSourcePosZ(Utils.getRowShort(taskWrk.getStartPoint())); // 源库位层 crnCommand.setDestinationPosX(crnStn.getBay().shortValue()); // 目标库位排 crnCommand.setDestinationPosY(crnStn.getLev().shortValue()); // 目标库位列 crnCommand.setDestinationPosZ(crnStn.getRow().shortValue()); // 目标库位层 crnCommand.setCommand((short)1); if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { //取出命令 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); Integer commandStep = taskWrk.getCommandStep(); if (commandInfos.isEmpty()) { continue;//命令空 } CommandInfo commandInfo = commandInfos.get(commandStep); CrnCommand crnCommand = JSON.parseObject(commandInfo.getCommand(), CrnCommand.class);//取出命令报文 if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); } else { // 修改工作档状态 11.生成出库ID => 12.吊车出库中 @@ -550,37 +560,68 @@ if (crnProtocol == null) { continue; } // 状态:等待确认 并且 任务完成位 = 1 if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) { // 获取入库待确认工作档 TaskWrk taskWrk = taskWrkMapper.selectCrnNoWorking(crn.getId(),crnProtocol.getTaskNo().intValue()); if (Cools.isEmpty(taskWrk)) { log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); //获取指令ID Integer commandId = crnProtocol.getCommandId(); CommandInfo commandInfo = commandInfoService.selectById(commandId); if (commandInfo == null) { //指令不存在 continue; } // 入库 + 库位转移 ==> 4.入库完成 if ((taskWrk.getWrkSts() == 3 && taskWrk.getIoType() == 1) || (taskWrk.getWrkSts() == 12 && taskWrk.getIoType() == 3)) { taskWrk.setWrkSts(4); } else { continue; } Date now = new Date(); taskWrk.setModiTime(now); Integer integerTaskWrk = taskWrkMapper.updateById(taskWrk); // 修改成功后复位堆垛机 if (integerTaskWrk > 0) { commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);//指令完成 commandInfo.setCompleteTime(new Date());//指令完成时间 if (commandInfoService.updateById(commandInfo)) {//修改成功后复位堆垛机 // 堆垛机复位 crnThread.setResetFlag(true); //更新库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); locMast.setLocSts("F");//F.在库 locMast.setBarcode(taskWrk.getBarcode());//托盘码 locMast.setModiTime(now); locMast.setModiUser(9999L); locMastService.updateById(locMast); } } } } // /** // * 执行对工作档的完成操作 // */ // @Async // public void storeFinished() { // for (CrnSlave crn : slaveProperties.getCrn()) { // // 获取堆垛机信息 // CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); // CrnProtocol crnProtocol = crnThread.getCrnProtocol(); // if (crnProtocol == null) { continue; } // // 状态:等待确认 并且 任务完成位 = 1 // if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) { // // 获取入库待确认工作档 // TaskWrk taskWrk = taskWrkMapper.selectCrnNoWorking(crn.getId(),crnProtocol.getTaskNo().intValue()); // if (Cools.isEmpty(taskWrk)) { // log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); // continue; // } // // 入库 + 库位转移 ==> 4.入库完成 // if ((taskWrk.getWrkSts() == 3 && taskWrk.getIoType() == 1) || (taskWrk.getWrkSts() == 12 && taskWrk.getIoType() == 3)) { // taskWrk.setWrkSts(4); // } else { // continue; // } // Date now = new Date(); // taskWrk.setModiTime(now); // Integer integerTaskWrk = taskWrkMapper.updateById(taskWrk); // // 修改成功后复位堆垛机 // if (integerTaskWrk > 0) { // // 堆垛机复位 // crnThread.setResetFlag(true); // // //更新库位状态 // LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); // locMast.setLocSts("F");//F.在库 // locMast.setBarcode(taskWrk.getBarcode());//托盘码 // locMast.setModiTime(now); // locMast.setModiUser(9999L); // locMastService.updateById(locMast); // } // } // } // } /** * 堆垛机异常信息记录 @@ -721,5 +762,55 @@ } } //自动完成任务 public synchronized void autoCompleteTask() { List<TaskWrk> taskWrks = taskWrkMapper.selectWorkingTask(); for (TaskWrk taskWrk : taskWrks) { //获取命令集合 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); if ((taskWrk.getCommandStep() + 1) != commandInfos.size()) { continue;//当前步序没有到达最后一条命令 } //判断末端命令是否执行完成 CommandInfo commandInfo = commandInfos.get(commandInfos.size() - 1); if (commandInfo.getCommandStatus() != CommandStatusType.COMPLETE.id) { continue;//指令未完成 } Date now = new Date(); //指令已完成,更新任务 if (taskWrk.getIoType() == 1) { //入库任务 taskWrk.setWrkSts(4);//3.吊车入库中 => 4.入库完成 taskWrk.setStatus(TaskStatusType.COMPLETE.id); taskWrk.setModiTime(now); taskWrkService.updateById(taskWrk); //更新库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); locMast.setLocSts("F");//F.在库 locMast.setBarcode(taskWrk.getBarcode());//托盘码 locMast.setModiTime(now); locMast.setModiUser(9999L); locMastService.updateById(locMast); } else if (taskWrk.getIoType() == 2) { //出库任务 taskWrk.setWrkSts(14);//12.吊车出库中 => 14.出库完成 taskWrk.setStatus(TaskStatusType.COMPLETE.id); taskWrk.setModiTime(now); taskWrkService.updateById(taskWrk); //更新库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint()); locMast.setLocSts("O");//O.空库位 locMast.setBarcode("");//托盘码 locMast.setModiTime(now); locMast.setModiUser(9999L); locMastService.updateById(locMast); } } } } src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java
@@ -1,5 +1,6 @@ package com.zy.asrs.service.impl; import com.alibaba.fastjson.JSON; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.domain.enums.WorkNoType; @@ -9,7 +10,18 @@ import com.zy.asrs.service.StaDescService; import com.zy.asrs.service.TaskWrkService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.zy.asrs.utils.CommandUtils; import com.zy.asrs.utils.Utils; import com.zy.common.service.CommonService; import com.zy.core.DevpThread; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.CrnTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.CrnSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.protocol.StaProtocol; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,6 +29,7 @@ import java.util.Date; import java.util.List; @Slf4j @Service("taskWrkService") public class TaskWrkServiceImpl extends ServiceImpl<TaskWrkMapper, TaskWrk> implements TaskWrkService { @@ -75,7 +88,7 @@ //入库任务派发 StaDesc staDesc = staDescService.queryCrn(taskWrk.getIoType(), Integer.parseInt(taskWrk.getStartPoint())); if (staDesc == null) { return;//不存在路径 throw new CoolException("入库路径不存在"); } int workNo = commonService.getWorkNo(WorkNoType.PAKIN.type);//获取入库工作号 taskWrk.setWrkNo(workNo);//工作号 @@ -86,6 +99,28 @@ taskWrk.setModiTime(new Date()); taskWrk.setModiUser(userId); updateById(taskWrk); CrnSlave.CrnStn crnStn = Utils.getCrnStnByStaNo(staDesc.getCrnStn(), true); if (crnStn == null) { throw new CoolException("堆垛机入库站不存在"); } // 命令下发区 -------------------------------------------------------------------------- CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(staDesc.getCrnNo()); // 堆垛机编号 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(crnStn.getBay().shortValue()); // 源库位列 crnCommand.setSourcePosY(crnStn.getLev().shortValue()); // 源库位层 crnCommand.setSourcePosZ(crnStn.getRow().shortValue()); // 源库位排 crnCommand.setDestinationPosX(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位列 crnCommand.setDestinationPosY(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位层 crnCommand.setDestinationPosZ(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位排 crnCommand.setCommand((short)1); if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); throw new CoolException("堆垛机命令生成失败"); } } @Override @@ -104,6 +139,38 @@ taskWrk.setModiTime(new Date()); taskWrk.setModiUser(userId); updateById(taskWrk); CrnSlave.CrnStn crnStn = Utils.getCrnStnByStaNo(staDesc.getCrnStn(), false); if (crnStn == null) { throw new CoolException("堆垛机出库站不存在"); } //生成堆垛机出库命令 CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(taskWrk.getCrnNo()); // 堆垛机编号 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(Utils.getBayShort(taskWrk.getStartPoint())); // 源库位排 crnCommand.setSourcePosY(Utils.getLevShort(taskWrk.getStartPoint())); // 源库位列 crnCommand.setSourcePosZ(Utils.getRowShort(taskWrk.getStartPoint())); // 源库位层 crnCommand.setDestinationPosX(crnStn.getBay().shortValue()); // 目标库位排 crnCommand.setDestinationPosY(crnStn.getLev().shortValue()); // 目标库位列 crnCommand.setDestinationPosZ(crnStn.getRow().shortValue()); // 目标库位层 crnCommand.setCommand((short)1); if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); throw new CoolException("堆垛机命令生成失败"); } //生成输送线命令 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone(); staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue()); staProtocol.setStaNo((short) Integer.parseInt(taskWrk.getTargetPoint())); if (!CommandUtils.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { log.error("输送线命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); throw new CoolException("输送线命令生成失败"); } } @Override src/main/java/com/zy/asrs/task/TaskLogScheduler.java
@@ -14,6 +14,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; /** * 定时将任务(完成、取消)转成日志 */ @@ -55,4 +57,15 @@ } } //清理手动命令 @Scheduled(cron = "0/3 * * * * ? ") public void ManualCommandClean() { List<CommandInfo> commandInfos = commandInfoService.selectCompleteManualCommand(); for (CommandInfo commandInfo : commandInfos) { //指令转日志 commandInfoService.saveToHistory(commandInfo.getId()); } } } src/main/java/com/zy/asrs/utils/CommandUtils.java
@@ -7,6 +7,8 @@ import com.zy.asrs.service.CommandInfoService; import com.zy.asrs.service.TaskWrkService; import com.zy.core.cache.MessageQueue; import com.zy.core.enums.CommandStatusType; import com.zy.core.enums.CommandType; import com.zy.core.enums.SlaveType; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; @@ -18,6 +20,10 @@ public class CommandUtils { public static boolean offer(SlaveType type, Integer id, Task task) { return offer(type, id, task, true); } public static boolean offer(SlaveType type, Integer id, Task task, Boolean auto) { CommandInfoService commandInfoService = SpringUtils.getBean(CommandInfoService.class); if (commandInfoService == null) { return false; @@ -36,7 +42,7 @@ CommandPackage<CrnCommand> commandPackage = new CommandPackage<>(); CrnCommand command = (CrnCommand) task.getData(); wrkNo = command.getTaskNo(); if (wrkNo != 0) { if (auto && wrkNo != 0) { taskWrk = taskWrkService.selectByWrkNo(wrkNo); taskNo = taskWrk.getTaskNo(); } @@ -44,9 +50,10 @@ commandInfo = new CommandInfo(); commandInfo.setWrkNo(wrkNo); commandInfo.setTaskNo(taskNo); commandInfo.setCommandStatus(1); commandInfo.setCommandStatus(CommandStatusType.CREATE.id); commandInfo.setStartTime(new Date()); commandInfo.setDevice(SlaveType.Crn.toString()); commandInfo.setCommandType(auto? CommandType.AUTO.id : CommandType.MANUAL.id); commandInfoService.insert(commandInfo);//插入指令 @@ -57,16 +64,18 @@ commandInfo.setCommand(JSON.toJSONString(commandPackage)); commandInfoService.updateById(commandInfo); //将指令进行投递 if (!MessageQueue.offer(type, id, task)) { return false; if (!auto) { //将指令进行投递 if (!MessageQueue.offer(type, id, task)) { return false; } } return true; } else if (type == SlaveType.Devp) { CommandPackage<StaProtocol> commandPackage = new CommandPackage<>(); StaProtocol staProtocol = (StaProtocol) task.getData(); wrkNo = staProtocol.getWorkNo(); if (wrkNo != 0) { if (auto && wrkNo != 0) { taskWrk = taskWrkService.selectByWrkNo(wrkNo); taskNo = taskWrk.getTaskNo(); } @@ -74,9 +83,10 @@ commandInfo = new CommandInfo(); commandInfo.setWrkNo(wrkNo); commandInfo.setTaskNo(taskNo); commandInfo.setCommandStatus(1); commandInfo.setCommandStatus(CommandStatusType.CREATE.id); commandInfo.setStartTime(new Date()); commandInfo.setDevice(SlaveType.Devp.toString()); commandInfo.setCommandType(auto? CommandType.AUTO.id : CommandType.MANUAL.id); commandInfoService.insert(commandInfo);//插入指令 @@ -87,9 +97,11 @@ commandInfo.setCommand(JSON.toJSONString(commandPackage));//保存命令报文 commandInfoService.updateById(commandInfo); //将指令进行投递 if (!MessageQueue.offer(type, id, task)) { return false; if (!auto) { //将指令进行投递 if (!MessageQueue.offer(type, id, task)) { return false; } } return true; } src/main/java/com/zy/asrs/utils/Utils.java
@@ -2,6 +2,8 @@ import com.core.common.Arith; import com.core.common.Cools; import com.core.common.SpringUtils; import com.zy.core.model.CrnSlave; import com.zy.core.properties.SlaveProperties; import java.text.DecimalFormat; @@ -275,6 +277,26 @@ } public static CrnSlave.CrnStn getCrnStnByStaNo(Integer staNo, Boolean pakIn) { SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class); for (CrnSlave crn : slaveProperties.getCrn()) { List<CrnSlave.CrnStn> crnInStn = null; if (pakIn) { crnInStn = crn.getCrnInStn(); }else { crnInStn = crn.getCrnOutStn(); } for (CrnSlave.CrnStn crnStn : crnInStn) { if (crnStn.getStaNo().equals(staNo)) { return crnStn; } } } return null; } public static void main(String[] args) { // SlaveProperties slaveProperties = new SlaveProperties(); // slaveProperties.setDoubleDeep(true); src/main/java/com/zy/core/MainProcess.java
@@ -70,6 +70,8 @@ //自动派发任务 mainService.autoDistribute(); //自动完成任务 mainService.autoCompleteTask(); } catch (Exception e) { e.printStackTrace(); src/main/java/com/zy/core/enums/CommandStatusType.java
New file @@ -0,0 +1,45 @@ package com.zy.core.enums; /** * 指令类型枚举 */ public enum CommandStatusType { CREATE(1, "指令创建"), //创建 EXECUTE(2, "指令执行中"), //执行 COMPLETE(3, "指令完成"), //完成 ; public Integer id; public String desc; CommandStatusType(Integer id, String desc) { this.id = id; this.desc = desc; } public static CommandStatusType get(Integer id) { if (null == id) { return null; } for (CommandStatusType type : CommandStatusType.values()) { if (type.id.equals(id)) { return type; } } return null; } public static CommandStatusType get(CommandStatusType type) { if (null == type) { return null; } for (CommandStatusType type1 : CommandStatusType.values()) { if (type1 == type) { return type1; } } return null; } } src/main/java/com/zy/core/enums/CommandType.java
New file @@ -0,0 +1,43 @@ package com.zy.core.enums; public enum CommandType { AUTO(1, "自动命令"), //自动命令 MANUAL(2, "手动命令"), //手动命令 ; public Integer id; public String desc; CommandType(Integer id, String desc) { this.id = id; this.desc = desc; } public static CommandType get(Integer id) { if (null == id) { return null; } for (CommandType type : CommandType.values()) { if (type.id.equals(id)) { return type; } } return null; } public static CommandType get(CommandType type) { if (null == type) { return null; } for (CommandType type1 : CommandType.values()) { if (type1 == type) { return type1; } } return null; } } src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -303,6 +303,9 @@ */ public Float yDuration = 0F; //指令ID private Integer commandId; public void setMode(Short mode) { this.mode = mode; this.modeType = CrnModeType.get(mode); src/main/java/com/zy/core/thread/LedThread.java
@@ -11,6 +11,7 @@ import com.zy.core.Slave; import com.zy.core.ThreadHandler; import com.zy.core.cache.MessageQueue; import com.zy.core.enums.CommandStatusType; import com.zy.core.enums.SlaveType; import com.zy.core.model.Task; import com.zy.core.model.command.LedCommand; @@ -120,7 +121,7 @@ //更新指令状态 CommandInfoService commandInfoService = SpringUtils.getBean(CommandInfoService.class); CommandInfo commandInfo = command.getCommandInfo(); commandInfo.setCommandStatus(2); commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id); commandInfoService.updateById(commandInfo); } src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -474,22 +474,24 @@ CommandInfoLogService commandInfoLogService = SpringUtils.getBean(CommandInfoLogService.class); CommandInfoService commandInfoService = SpringUtils.getBean(CommandInfoService.class); CommandInfo commandInfo = commandInfoService.selectById(command.getCommandId()); CommandInfoLog commandInfoLog = new CommandInfoLog(); if (commandInfo != null) { commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class); commandInfoLog.setId(null); }else { Date now = new Date(); commandInfoLog.setCommand(JSON.toJSONString(command)); commandInfoLog.setCommandStatus(3); commandInfoLog.setStartTime(now); commandInfoLog.setExecuteTime(now); commandInfoLog.setCompleteTime(now); commandInfoLog.setDevice(SlaveType.Devp.toString()); commandInfoLog.setWrkNo(9999); commandInfoLog.setTaskNo("9999"); commandInfoLog.setCommandDesc("手动命令"); } CommandInfoLog commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class); commandInfoLog.setId(null); // CommandInfoLog commandInfoLog = new CommandInfoLog(); // if (commandInfo != null) { // commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class); // commandInfoLog.setId(null); // }else { // Date now = new Date(); // commandInfoLog.setCommand(JSON.toJSONString(command)); // commandInfoLog.setCommandStatus(3); // commandInfoLog.setStartTime(now); // commandInfoLog.setExecuteTime(now); // commandInfoLog.setCompleteTime(now); // commandInfoLog.setDevice(SlaveType.Devp.toString()); // commandInfoLog.setWrkNo(9999); // commandInfoLog.setTaskNo("9999"); // commandInfoLog.setCommandDesc("手动命令"); // } if (result.IsSuccess) { @@ -500,6 +502,13 @@ commandInfoLog.setDeviceLog("指令下发成功"); commandInfoLogService.insert(commandInfoLog); //线程暂存指令ID crnProtocol.setCommandId(command.getCommandId()); //更新指令状态 commandInfo.setCommandStatus(CommandStatusType.EXECUTE.id);//执行中 commandInfoService.updateById(commandInfo); //更新任务步序 TaskWrkService taskWrkService = SpringUtils.getBean(TaskWrkService.class); TaskWrk taskWrk = taskWrkService.selectByWrkNo(command.getTaskNo().intValue()); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -19,6 +19,7 @@ import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.CommandStatusType; import com.zy.core.enums.IoModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.DevpSlave; @@ -423,22 +424,24 @@ CommandInfoLogService commandInfoLogService = SpringUtils.getBean(CommandInfoLogService.class); CommandInfoService commandInfoService = SpringUtils.getBean(CommandInfoService.class); CommandInfo commandInfo = commandInfoService.selectById(staProtocol.getCommandId()); CommandInfoLog commandInfoLog = new CommandInfoLog(); if (commandInfo != null) { commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class); commandInfoLog.setId(null); }else { Date now = new Date(); commandInfoLog.setCommand(JSON.toJSONString(staProtocol)); commandInfoLog.setCommandStatus(3); commandInfoLog.setStartTime(now); commandInfoLog.setExecuteTime(now); commandInfoLog.setCompleteTime(now); commandInfoLog.setDevice(SlaveType.Devp.toString()); commandInfoLog.setWrkNo(9999); commandInfoLog.setTaskNo("9999"); commandInfoLog.setCommandDesc("手动命令"); } CommandInfoLog commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class); commandInfoLog.setId(null); // CommandInfoLog commandInfoLog = new CommandInfoLog(); // if (commandInfo != null) { // commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class); // commandInfoLog.setId(null); // }else { // Date now = new Date(); // commandInfoLog.setCommand(JSON.toJSONString(staProtocol)); // commandInfoLog.setCommandStatus(3); // commandInfoLog.setStartTime(now); // commandInfoLog.setExecuteTime(now); // commandInfoLog.setCompleteTime(now); // commandInfoLog.setDevice(SlaveType.Devp.toString()); // commandInfoLog.setWrkNo(9999); // commandInfoLog.setTaskNo("9999"); // commandInfoLog.setCommandDesc("手动命令"); // } OperateResult writeResult; //任务下发次数 @@ -461,12 +464,32 @@ //任务命令写入成功 writeFlag = true; log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); //更新指令状态 commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);//输送线直接完成状态 commandInfoService.updateById(commandInfo); //更新指令日志 commandInfoLog.setDeviceLog("指令下发成功"); commandInfoLogService.insert(commandInfoLog); //更新任务步序 TaskWrkService taskWrkService = SpringUtils.getBean(TaskWrkService.class); TaskWrk taskWrk = taskWrkService.selectByWrkNo(staProtocol.getWorkNo().intValue()); if (taskWrk != null) { taskWrk.setCommandStep(taskWrk.getCommandStep() + 1);//更新指令步序 taskWrkService.updateById(taskWrk); } break; } else {//返回结果是成功了,但是真实值不相同 writeCount++; OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={1},站点数据={2},写入次数={3}", slave.getId(), JSON.toJSON(staProtocol),writeCount)); log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); //更新指令日志 commandInfoLog.setDeviceLog("指令下发成功"); commandInfoLogService.insert(commandInfoLog); } } else { writeCount++; src/main/resources/mapper/CommandInfoMapper.xml
@@ -34,4 +34,10 @@ where task_no = #{taskNo} </select> <select id="selectCompleteManualCommand" resultMap="BaseResultMap"> select * from wcs_command_info where command_type = 2 and command_status = 3 </select> </mapper> src/main/resources/mapper/TaskWrkMapper.xml
@@ -126,4 +126,11 @@ insert into wcs_task_wrk_log select * from wcs_task_wrk where task_no = #{taskNo} and (status=3 or status=4) </insert> <select id="selectWorkingTask" resultMap="BaseResultMap"> select * from dbo.wcs_task_wrk where (wrk_sts=3 and io_type = 1) or (wrk_sts=12 and io_type = 2) order by io_pri desc,create_time,wrk_no ASC </select> </mapper> src/main/webapp/views/commandManage/commandManage.html
@@ -63,7 +63,7 @@ </el-table-column> <el-table-column show-overflow-tooltip property="durationTime" label="持续时长"> </el-table-column> <el-table-column property="commandType" label="指令类型"> <el-table-column property="commandType$" label="指令类型"> </el-table-column> <el-table-column property="device" label="设备"> </el-table-column> @@ -196,7 +196,7 @@ break; case "completeCommand": //完成指令 this.completeWrk(row) this.completeCommand(row) break; } }, src/main/webapp/views/taskWrk/commandManage.html
@@ -155,28 +155,30 @@ } }); $.ajax({ url: baseUrl + "/taskWrk/" + this.tableSearchParam.wrk_no + "/auth", headers: { 'token': localStorage.getItem('token') }, data: data, dataType: 'json', contentType: 'application/json;charset=UTF-8', method: 'GET', success: function(res) { if (res.code == 200) { that.commandStep = parseInt(res.data.commandStep) } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { that.$message({ message: res.msg, type: 'error' }); if (this.tableSearchParam.wrk_no != null) { $.ajax({ url: baseUrl + "/taskWrk/" + this.tableSearchParam.wrk_no + "/auth", headers: { 'token': localStorage.getItem('token') }, data: data, dataType: 'json', contentType: 'application/json;charset=UTF-8', method: 'GET', success: function(res) { if (res.code == 200) { that.commandStep = parseInt(res.data.commandStep) } else if (res.code === 403) { top.location.href = baseUrl + "/"; } else { that.$message({ message: res.msg, type: 'error' }); } } } }); }); } }, handleSizeChange(val) { console.log(`每页 ${val} 条`); src/main/webapp/views/taskWrk/taskWrk.html
@@ -277,7 +277,7 @@ }); }, completeWrk(row){ //派发任务 //完成任务 let that = this $.ajax({ url: baseUrl + "/taskWrk/complete/auth",