| | |
| | | import com.zy.core.model.Task; |
| | | import com.zy.core.model.command.*; |
| | | import com.zy.core.model.protocol.ForkLiftProtocol; |
| | | import com.zy.core.model.protocol.ForkLiftStaProtocol; |
| | | import com.zy.core.model.protocol.LiftStaProtocol; |
| | | import com.zy.core.properties.SlaveProperties; |
| | | import com.zy.core.thread.ForkLiftThread; |
| | |
| | | continue; |
| | | } |
| | | JSONObject data = JSON.parseObject(JSON.toJSONString(forkLiftProtocol)); |
| | | List<ForkLiftStaProtocol> forkLiftStaProtocols = forkLiftThread.getForkLiftStaProtocols(); |
| | | data.put("forkLiftStaProtocols", forkLiftStaProtocols); |
| | | baseObj.putAll(data); |
| | | } |
| | | return R.ok().add(list); |
| | |
| | | continue; |
| | | } |
| | | |
| | | vo.setWorkNo(forkLiftProtocol.getTaskNo().intValue());//任务号 |
| | | vo.setWorkNo(forkLiftProtocol.getTaskNo());//任务号 |
| | | vo.setPakMk(forkLiftProtocol.getPakMk()?"Y" : "N"); // 作业标记 |
| | | vo.setForkLiftStaProtocols(forkLiftThread.getForkLiftStaProtocols()); |
| | | } |
| | | return R.ok().add(list); |
| | | } |
| | |
| | | package com.zy.asrs.domain.vo; |
| | | |
| | | import com.zy.core.model.protocol.ForkLiftStaProtocol; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class LiftMsgTableVo { |
| | |
| | | private String pakMk = "-"; |
| | | |
| | | /** |
| | | * 任务地址 |
| | | * 站点信息 |
| | | */ |
| | | private Short taskAddress; |
| | | |
| | | /** |
| | | * 目的地址 |
| | | */ |
| | | private Short distAddress; |
| | | |
| | | /** |
| | | * 已完成的任务号 |
| | | */ |
| | | private Short completeTaskNo; |
| | | |
| | | /** |
| | | * 层 |
| | | */ |
| | | private Short lev; |
| | | private List<ForkLiftStaProtocol> forkLiftStaProtocols; |
| | | |
| | | /** |
| | | * 穿梭车号 |
| | | */ |
| | | private Integer shuttleNo; |
| | | |
| | | /** |
| | | * 令牌 |
| | | */ |
| | | private Integer token; |
| | | |
| | | |
| | | } |
| | |
| | | @TableField(value = "wms_wrk_no") |
| | | private String wmsWrkNo; |
| | | |
| | | /** |
| | | * 系统消息 |
| | | */ |
| | | @ApiModelProperty(value= "系统消息") |
| | | @TableField(value = "system_msg") |
| | | private String systemMsg; |
| | | |
| | | public String getWrkSts$(){ |
| | | BasWrkStatusMapper mapper = SpringUtils.getBean(BasWrkStatusMapper.class); |
| | | BasWrkStatus entity = mapper.selectById(this.wrkSts); |
| | |
| | | @TableField(value = "wms_wrk_no") |
| | | private String wmsWrkNo; |
| | | |
| | | /** |
| | | * 系统消息 |
| | | */ |
| | | @ApiModelProperty(value= "系统消息") |
| | | @TableField(value = "system_msg") |
| | | private String systemMsg; |
| | | |
| | | public WrkMastLog() {} |
| | | |
| | | public String getWrkSts$(){ |
| | |
| | | |
| | | //小车处于空闲状态 |
| | | if (!shuttleThread.isIdle()) { |
| | | News.info("{}任务,{}小车,小车忙碌中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | return false; |
| | | } |
| | | |
| | |
| | | //判断提升机是否有其他任务(该任务需要换层必须提前独占提升机) |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftSta.getLiftNo()); |
| | | if (liftWrkMast != null) { |
| | | News.info("{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), liftSta.getLiftNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), liftSta.getLiftNo()); |
| | | return false;//当前提升机存在未完成任务,等待下一次轮询 |
| | | } |
| | | |
| | |
| | | //获取小车到输送站点行走命令 |
| | | List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), liftSta.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | News.info("{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | return false;//路径解锁失败 |
| | | } |
| | | |
| | |
| | | return false; |
| | | } |
| | | if (!forkLiftThread.isIdle()) { |
| | | News.info("{}任务,{}号提升机,提升机忙碌中,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机忙碌中,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo()); |
| | | return false; |
| | | } |
| | | //判断提升机是否有其他任务 |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo()); |
| | | if (liftWrkMast != null) { |
| | | if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//提升机任务和当前任务不相同 |
| | | News.info("{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo()); |
| | | return false;//当前提升机存在未完成任务,等待下一次轮询 |
| | | } |
| | | } |
| | |
| | | //获取目标站 |
| | | ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); |
| | | if (sourceLiftSta == null || liftSta == null) { |
| | | News.info("{}任务,缺少站点信息,禁止派发", wrkMast.getWrkNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,缺少站点信息,禁止派发", wrkMast.getWrkNo()); |
| | | return false;//缺少站点信息 |
| | | } |
| | | |
| | |
| | | |
| | | //小车处于空闲状态 |
| | | if (!shuttleThread.isIdle()) { |
| | | News.info("{}任务,{}小车,小车忙碌中,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | return false; |
| | | } |
| | | |
| | |
| | | List<NavigateNode> nodeList = navigateUtils.calc(startLocNo, endLocNo, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startLocNo)), null); |
| | | if (nodeList == null) { |
| | | News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo); |
| | | shuttleThread.offerSystemMsg("{} dash {} can't find navigate path!", startLocNo, endLocNo); |
| | | return null; |
| | | } |
| | | |
| | |
| | | boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(startLocNo), shuttleNo, allNode, true);//锁定路径 |
| | | if (!result) { |
| | | News.error("{} dash {} can't lock path!", startLocNo, endLocNo); |
| | | shuttleThread.offerSystemMsg("{} dash {} can't lock path!", startLocNo, endLocNo); |
| | | return null;//路径锁定失败 |
| | | } |
| | | return commands; |
| | |
| | | boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(endLocNo), shuttleProtocol.getShuttleNo(), unlockPath, false);//所使用的路径进行解锁 |
| | | if (!lockResult) { |
| | | News.error("{} dash {} can't find unlock path!", startLocNo, endLocNo); |
| | | shuttleThread.offerSystemMsg("{} dash {} can't find unlock path!", startLocNo, endLocNo); |
| | | return null;//解锁失败 |
| | | } |
| | | |
| | |
| | | List<NavigateNode> nodeList = navigateUtils.calc(startLocNo, endLocNo, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startLocNo)), null); |
| | | if (nodeList == null) { |
| | | News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo); |
| | | shuttleThread.offerSystemMsg("{} dash {} can't find navigate path!", startLocNo, endLocNo); |
| | | return null; |
| | | } |
| | | |
| | |
| | | package com.zy.core; |
| | | |
| | | import com.core.common.SpringUtils; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.lang.reflect.Array; |
| | |
| | | offer(NewsLevel.ERROR, format, arguments); |
| | | } |
| | | |
| | | public static void taskInfo(Integer wrkNo, String format, Object... arguments) { |
| | | info(format, arguments); |
| | | offerTask(wrkNo, format, arguments); |
| | | } |
| | | |
| | | public static void taskWarn(Integer wrkNo, String format, Object... arguments) { |
| | | warn(format, arguments); |
| | | offerTask(wrkNo, format, arguments); |
| | | } |
| | | |
| | | public static void taskError(Integer wrkNo, String format, Object... arguments) { |
| | | error(format, arguments); |
| | | offerTask(wrkNo, format, arguments); |
| | | } |
| | | |
| | | public static String printStr() { |
| | | StringBuilder sb = new StringBuilder("["); |
| | | List<NewsDomain> domains = NEWS_QUEUE.data(); |
| | |
| | | return res; |
| | | } |
| | | |
| | | private static boolean offerTask(Integer wrkNo, String msg, Object[] args) { |
| | | WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class); |
| | | if (wrkMastService == null) { |
| | | return false; |
| | | } |
| | | |
| | | WrkMast wrkMast = wrkMastService.selectByWorkNo(wrkNo); |
| | | if (wrkMast == null) { |
| | | return false; |
| | | } |
| | | String systemMsg = replace(msg, args); |
| | | if (systemMsg.equals(wrkMast.getSystemMsg())) { |
| | | wrkMast.setSystemMsg(systemMsg); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | private static boolean offer(NewsLevel level, String msg, Object[] args) { |
| | | return NEWS_QUEUE.offer(new NewsDomain(level, replace(msg, args), (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date()))); |
| | | } |
| | | |
| | | private static String replace(String str, Object[] objs){ |
| | | public static String replace(String str, Object[] objs){ |
| | | if (null == objs || objs.length == 0 || null == str || "".equals(str.trim())) { |
| | | return str; |
| | | } else { |
| | |
| | | */ |
| | | private Object extend; |
| | | |
| | | /** |
| | | * 系统消息 |
| | | */ |
| | | private String systemMsg; |
| | | |
| | | public String getProtocolStatus$() { |
| | | if (this.protocolStatusType == null) { |
| | | return ""; |
| | |
| | | |
| | | boolean enableDemo(boolean enable);//演示模式 |
| | | |
| | | boolean offerSystemMsg(String format, Object... arguments); |
| | | |
| | | //***************获取命令***************** |
| | | |
| | | ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes);//获取移动命令 |
| | |
| | | } |
| | | |
| | | @Override |
| | | public boolean offerSystemMsg(String format, Object... arguments) { |
| | | String msg = News.replace(format, arguments); |
| | | shuttleProtocol.setSystemMsg(msg); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes) { |
| | | NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); |
| | | NyShuttleHttpCommand httpStandard = getHttpStandard(slave.getId(), taskNo); |
| | |
| | | OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】{1}读取货叉提升机状态信息失败", DateUtils.convert(new Date()), slave.getId())); |
| | | } |
| | | |
| | | OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB102.0", (short) 8); |
| | | if (result2.IsSuccess) { |
| | | for (int i = 0; i < this.slave.getSta().size(); i++) { |
| | | ForkLiftSlave.Sta sta = this.slave.getSta().get(i); |
| | | if (forkLiftStaProtocols.isEmpty()) { |
| | | continue; |
| | | } |
| | | |
| | | ForkLiftStaProtocol forkLiftStaProtocol = forkLiftStaProtocols.get(i); |
| | | boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result2.Content, i * 2, 2); |
| | | forkLiftStaProtocol.setHasTray(status1[0]); |
| | | forkLiftStaProtocol.setHasCar(status1[1]); |
| | | } |
| | | } |
| | | |
| | | if (System.currentTimeMillis() - forkLiftProtocol.getDeviceDataLog() > 1000 * 5) { |
| | | //采集时间超过5s,保存一次数据记录 |
| | | //保存数据记录 |
| | |
| | | array[3] = command.getPut();//放货数据 |
| | | OperateResult result = siemensS7Net.Write("DB103.0", array); |
| | | if (result.IsSuccess) { |
| | | OperateResult result2 = siemensS7Net.Write("DB103.16", command.getConfirm()); |
| | | OperateResult result2 = siemensS7Net.Write("DB103.8", command.getConfirm()); |
| | | if (result2.IsSuccess) { |
| | | response.setResult(true); |
| | | } |
| | |
| | | port: 102 |
| | | rack: 0 |
| | | slot: 0 |
| | | staRow: 10 |
| | | staRow: 9 |
| | | staBay: 6 |
| | | sta[0]: |
| | | staNo: 101 |
| | |
| | | <result column="lift_no" property="liftNo" /> |
| | | <result column="shuttle_no" property="shuttleNo" /> |
| | | <result column="wms_wrk_no" property="wmsWrkNo" /> |
| | | <result column="system_msg" property="systemMsg" /> |
| | | </resultMap> |
| | | |
| | | </mapper> |
| | |
| | | <result column="shuttle_no" property="shuttleNo" /> |
| | | <result column="lift_no" property="liftNo" /> |
| | | <result column="wms_wrk_no" property="wmsWrkNo" /> |
| | | <result column="system_msg" property="systemMsg" /> |
| | | |
| | | </resultMap> |
| | | |
| | |
| | | <tr> |
| | | <th>提升机</th> |
| | | <th>工作号</th> |
| | | <th>任务地址</th> |
| | | <th>目的地址</th> |
| | | <th>已完成的任务号</th> |
| | | <th>层</th> |
| | | <th>站点信息</th> |
| | | <th>作业标记</th> |
| | | <th>穿梭车号</th> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | |
| | | } |
| | | for (var i=1;i<=table.length;i++){ |
| | | var tr = tableEl.find("tr").eq(i); |
| | | let staDiv = ""; |
| | | table[i-1].forkLiftStaProtocols.forEach((item) => { |
| | | let hasTray = item.hasTray ? "Y" : "N"; |
| | | let hasCar = item.hasCar ? "Y" : "N"; |
| | | staDiv += "<div>" + item.lev + "层,托盘:" + hasTray + ",小车:" + hasCar + "</div>" |
| | | }) |
| | | |
| | | setVal(tr.children("td").eq(0), table[i-1].liftNo); |
| | | setVal(tr.children("td").eq(1), table[i-1].workNo); |
| | | setVal(tr.children("td").eq(2), table[i-1].taskAddress); |
| | | setVal(tr.children("td").eq(3), table[i-1].distAddress); |
| | | setVal(tr.children("td").eq(4), table[i-1].completeTaskNo); |
| | | setVal(tr.children("td").eq(5), table[i-1].lev); |
| | | setVal(tr.children("td").eq(6), table[i-1].pakMk); |
| | | setVal(tr.children("td").eq(7), table[i-1].shuttleNo); |
| | | setVal(tr.children("td").eq(2), staDiv); |
| | | setVal(tr.children("td").eq(3), table[i-1].pakMk); |
| | | } |
| | | } else if (res.code === 403){ |
| | | window.location.href = baseUrl+"/login"; |