From 06bd2d6dbd31315b68e768d6b59139c753f8ff96 Mon Sep 17 00:00:00 2001 From: Junjie <fallin.jie@qq.com> Date: 星期一, 27 三月 2023 09:28:38 +0800 Subject: [PATCH] 四向穿梭车线程代码逻辑 --- src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java | 14 +- src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java | 35 +++++ src/main/java/com/zy/asrs/controller/ShuttleController.java | 2 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 97 ++------------- src/main/java/com/zy/core/thread/ShuttleThread.java | 171 +++++++++++++++++++++++---- src/main/java/com/zy/core/ServerBootstrap.java | 5 6 files changed, 205 insertions(+), 119 deletions(-) diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java index d1d94ea..f6b7fe7 100644 --- a/src/main/java/com/zy/asrs/controller/ShuttleController.java +++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java @@ -124,7 +124,7 @@ } } vo.setSpeed(shuttleProtocol.getCurrentMoveServoSpeed()); // 閫熷害 - vo.setPakMk(shuttleProtocol.getPakMk()); // 浣滀笟鏍囪 + vo.setPakMk(shuttleProtocol.getPakMk().toString()); // 浣滀笟鏍囪 } return R.ok().add(list); } diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java index 538cced..b76cabc 100644 --- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java @@ -22,10 +22,7 @@ import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.*; import com.zy.core.model.*; -import com.zy.core.model.command.CrnCommand; -import com.zy.core.model.command.LedCommand; -import com.zy.core.model.command.ShuttleCommand; -import com.zy.core.model.command.SteCommand; +import com.zy.core.model.command.*; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.ShuttleProtocol; import com.zy.core.model.protocol.StaProtocol; @@ -631,85 +628,23 @@ //鍒嗛厤鐩爣搴撲綅 shuttleProtocol.setLocNo(wrkSts.getLocNo()); - //璁$畻璺緞 - List<NavigateNode> calc = NavigateUtils.calc(wrkSts.getSourceLocNo(), wrkSts.getLocNo(), "in"); - //鑾峰彇鍒嗘璺緞 - ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc); - //灏嗘map瀛樺叆redis涓� - HashMap<String, Object> map = new HashMap<>(); - //鎵ц姝ュ簭 - map.put("step", 0); - //璺緞鏁版嵁 - map.put("path", data); - //宸ヤ綔鍙� - map.put("wrk_no", wrkSts.getWrkNo()); - //浠诲姟鏁版嵁淇濆瓨鍒皉edis - redisUtil.set("wrk_no_" + wrkSts.getWrkNo().shortValue(), JSON.toJSONString(map)); + + ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); + //鍥涘悜绌挎杞﹀彿 + assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); + //浠诲姟鍙� + assignCommand.setTaskNo(wrkSts.getWrkNo().shortValue()); + //鍏ュ嚭搴撴ā寮� + assignCommand.setTaskMode(0); + //婧愬簱浣� + assignCommand.setSourceLocNo(wrkSts.getSourceLocNo()); + //鐩爣搴撲綅 + assignCommand.setDistLocNo(wrkSts.getLocNo()); + + //涓嬪彂浠诲姟 + MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); } - } else if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE && shuttleProtocol.getTaskNo() != 0) { - //鍥涘悜绌挎杞︾┖闂� 骞朵笖鏈変换鍔� - Object o = redisUtil.get("wrk_no_" + shuttleProtocol.getTaskNo()); - HashMap map = JSON.parseObject(o.toString(), HashMap.class); - //褰撳墠姝ュ簭 - int step = Integer.parseInt(map.get("step").toString()); - //褰撳墠璺緞鏁版嵁 - Object data = map.get("path"); - ArrayList pathList = JSON.parseObject(data.toString(), ArrayList.class); - //鍙栫涓�鏉¤矾寰� - Object o1 = pathList.get(step); - ArrayList path = JSON.parseObject(o1.toString(), ArrayList.class); - - int size = path.size(); - //寮�濮嬭矾寰� - JSONObject startPath = JSON.parseObject(path.get(0).toString()); - System.out.println(startPath); - //鐩爣璺緞 - JSONObject endPath = JSON.parseObject(path.get(size - 1).toString()); - System.out.println(endPath); - - //涓嬪彂鍛戒护 - ShuttleCommand command = new ShuttleCommand(); - command.setCommandWord((short) 1); - command.setStartCodeNum(NavigatePositionConvert.xyToPosition(startPath.getIntValue("x"), startPath.getIntValue("y"))); - command.setMiddleCodeNum((short) 0); - command.setDistCodeNum(NavigatePositionConvert.xyToPosition(endPath.getIntValue("x"), endPath.getIntValue("y"))); - command.setStartToDistDistance(1000); - command.setMiddleToDistDistance(1000); - command.setRunDirection(ShuttleRunDirection.get(startPath.get("direction").toString()).id); - command.setPalletLift((short) 1); - command.setForceMoveDistance(1000); - command.setChargeSwitch((short) 2); - command.setIOControl((short) 0); - command.setRunSpeed((short) 1000); - command.setRadarTmp((short) 0); - command.setCommandEnd((short) 1); - - if (!MessageQueue.offer(SlaveType.Shuttle, shuttleProtocol.getShuttleNo().intValue(), new Task(2, command))) { - News.error("鍥涘悜绌挎杞﹀懡浠や笅鍙戝け璐ワ紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); - } else { - News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙戞垚鍔燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); - - //鍒ゆ柇鏁版嵁鏄惁鎵ц瀹屾垚 - if (step < size) { - //鏇存柊redis鏁版嵁 - //姝ュ簭澧炲姞 - step++; - map.put("step", step); - //浠诲姟鏁版嵁淇濆瓨鍒皉edis - redisUtil.set("wrk_no_" + map.get("wrk_no").toString(), JSON.toJSONString(map)); - }else { - //宸叉墽琛屽畬鎴� - //淇濆瓨鏁版嵁鍒版暟鎹簱鍋氭祦姘� - //鍒犻櫎redis - redisUtil.del("wrk_no_" + map.get("wrk_no").toString()); - - //銆傘�傘�� - //1銆佸懡浠や笅鏂归渶瑕佸垽鏂皬杞︾┖闂茬姸鎬� - //2銆� - } - - } } } diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java index 024304c..1958d24 100644 --- a/src/main/java/com/zy/core/ServerBootstrap.java +++ b/src/main/java/com/zy/core/ServerBootstrap.java @@ -1,5 +1,6 @@ package com.zy.core; +import com.zy.common.utils.RedisUtil; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; @@ -25,6 +26,8 @@ private SlaveProperties slaveProperties; @Autowired private MainProcess mainProcess; + @Autowired + private RedisUtil redisUtil; @PostConstruct @@ -108,7 +111,7 @@ // 鍒濆鍖栧洓鍚戠┛姊溅 News.info("鍒濆鍖栧洓鍚戠┛姊溅......................................................"); for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) { - ShuttleThread shuttleThread = new ShuttleThread(shuttleSlave); + ShuttleThread shuttleThread = new ShuttleThread(shuttleSlave,redisUtil); new Thread(shuttleThread).start(); SlaveConnection.put(SlaveType.Shuttle, shuttleSlave.getId(), shuttleThread); } diff --git a/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java b/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java new file mode 100644 index 0000000..556bd23 --- /dev/null +++ b/src/main/java/com/zy/core/model/command/ShuttleAssignCommand.java @@ -0,0 +1,35 @@ +package com.zy.core.model.command; + +import lombok.Data; + +@Data +public class ShuttleAssignCommand { + + /** + * 鍥涘悜绌挎杞﹀彿 + */ + private Short shuttleNo = 0; + + /** + * 浠诲姟鍙� + */ + private Short taskNo = 0; + + /** + * 浣滀笟绫诲瀷 + * 0: 鍏ュ簱 + * 1锛� 鍑哄簱 + */ + private Integer taskMode = 0; + + /** + * 婧愬簱浣� + */ + private String sourceLocNo; + + /** + * 鐩爣搴撲綅 + */ + private String distLocNo; + +} diff --git a/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java index 5f70de8..5412f9c 100644 --- a/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java +++ b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java @@ -19,32 +19,32 @@ /** * 浠诲姟鍙� */ - public Short taskNo = 0; + private Short taskNo = 0; /** * 婧愬簱浣� */ - public String sourceLocNo; + private String sourceLocNo; /** * 鐩爣搴撲綅 */ - public String locNo; + private String locNo; /** * 鎺� */ - public Short row; + private Short row; /** * 鍒� */ - public Short bay; + private Short bay; /** * 灞� */ - public Short lev; + private Short lev; /** * 灏忚溅蹇欑姸鎬佷綅 @@ -142,7 +142,7 @@ /** * 浣滀笟鏍囪 */ - private String pakMk = "-"; + private Boolean pakMk = true; // 浠诲姟淇℃伅 --------------------------------------------------------- /** diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java index cbc2bf8..bbf61c4 100644 --- a/src/main/java/com/zy/core/thread/ShuttleThread.java +++ b/src/main/java/com/zy/core/thread/ShuttleThread.java @@ -5,23 +5,34 @@ import HslCommunication.Core.Types.OperateResultExOne; import HslCommunication.ModBus.ModbusTcpNet; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.core.common.DateUtils; import com.core.exception.CoolException; +import com.zy.common.model.NavigateNode; import com.zy.common.utils.CommonUtils; +import com.zy.common.utils.NavigatePositionConvert; +import com.zy.common.utils.NavigateUtils; +import com.zy.common.utils.RedisUtil; import com.zy.core.News; import com.zy.core.ThreadHandler; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; +import com.zy.core.enums.ShuttleRunDirection; +import com.zy.core.enums.ShuttleStatusType; import com.zy.core.enums.SlaveType; import com.zy.core.model.ShuttleSlave; import com.zy.core.model.Task; +import com.zy.core.model.command.ShuttleAssignCommand; import com.zy.core.model.command.ShuttleCommand; import com.zy.core.model.protocol.ShuttleProtocol; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; +import java.util.List; /** * 鍥涘悜绌挎杞︾嚎绋� @@ -33,9 +44,11 @@ private ModbusTcpNet modbusTcpNet; private ShuttleSlave slave; private ShuttleProtocol shuttleProtocol; + private RedisUtil redisUtil; - public ShuttleThread(ShuttleSlave slave) { + public ShuttleThread(ShuttleSlave slave,RedisUtil redisUtil) { this.slave = slave; + this.redisUtil = redisUtil; } @Override @@ -53,9 +66,13 @@ case 1: readStatus(); break; - // 鍐欏叆鏁版嵁 - case 2: - write((ShuttleCommand) task.getData()); +// // 鍐欏叆鏁版嵁 +// case 2: +// write((ShuttleCommand) task.getData()); +// break; + //涓嬪彂浠诲姟 + case 3: + assignWork((ShuttleAssignCommand) task.getData()); break; default: break; @@ -145,8 +162,16 @@ OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId())); log.info(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId())); - // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴� - //..... + //灏忚溅澶勪簬蹇欑鐘舵�侊紝灏嗘爣璁扮疆涓簍rue + if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.BUSY) { + shuttleProtocol.setPakMk(true); + } + + //鍥涘悜绌挎杞︾┖闂层�佹湁浠诲姟涓旀爣璁颁负true锛岄渶瑕佹墽琛屼换鍔$殑涓嬩竴鏉℃寚浠� + if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE && shuttleProtocol.getTaskNo() != 0 && shuttleProtocol.getPakMk()) { + //鎵ц涓嬩竴姝ユ寚浠� + executeWork(shuttleProtocol.getTaskNo()); + } }else { OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆憑1}鍥涘悜绌挎杞lc鐘舵�佷俊鎭け璐�", DateUtils.convert(new Date()), slave.getId())); @@ -226,9 +251,97 @@ if (null == shuttleProtocol) { shuttleProtocol = new ShuttleProtocol(); } -// shuttleProtocol.setShuttleNo(slave.getId().shortValue()); -// shuttleProtocol.setBusyStatus(ShuttleStatusType.BUSY); -// shuttleProtocol.setCurrentCode("0"); + } + + //鍒嗛厤浠诲姟 + private void assignWork(ShuttleAssignCommand assignCommand) { + //璁$畻璺緞 + List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getDistLocNo(), "in"); + //鑾峰彇鍒嗘璺緞 + ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc); + //灏嗘map瀛樺叆redis涓� + HashMap<String, Object> map = new HashMap<>(); + //鍛戒护鎵ц姝ュ簭 + map.put("commandStep", 0); + //璺緞鏁版嵁 + map.put("path", data); + //宸ヤ綔鍙� + map.put("wrk_no", assignCommand.getTaskNo()); + //浠诲姟鏁版嵁淇濆瓨鍒皉edis + redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map)); + + //鎵ц涓嬪彂浠诲姟 + executeWork(assignCommand.getTaskNo()); + } + + //鎵ц涓嬪彂鐨勬寚浠� + private void executeWork(Short taskNo) { + //璇诲彇redis鏁版嵁 + Object o = redisUtil.get("wrk_no_" + taskNo); + HashMap map = JSON.parseObject(o.toString(), HashMap.class); + //褰撳墠姝ュ簭 + int commandStep = Integer.parseInt(map.get("commandStep").toString()); + //褰撳墠璺緞鏁版嵁 + Object data = map.get("path"); + ArrayList pathList = JSON.parseObject(data.toString(), ArrayList.class); + //鍙栫涓�鏉¤矾寰� + Object o1 = pathList.get(commandStep); + ArrayList path = JSON.parseObject(o1.toString(), ArrayList.class); + + int size = path.size(); + //寮�濮嬭矾寰� + JSONObject startPath = JSON.parseObject(path.get(0).toString()); + System.out.println(startPath); + //鐩爣璺緞 + JSONObject endPath = JSON.parseObject(path.get(size - 1).toString()); + System.out.println(endPath); + + //涓嬪彂鍛戒护 + ShuttleCommand command = new ShuttleCommand(); + command.setCommandWord((short) 1); + command.setStartCodeNum(NavigatePositionConvert.xyToPosition(startPath.getIntValue("x"), startPath.getIntValue("y"))); + command.setMiddleCodeNum((short) 0); + command.setDistCodeNum(NavigatePositionConvert.xyToPosition(endPath.getIntValue("x"), endPath.getIntValue("y"))); + command.setStartToDistDistance(1000); + command.setMiddleToDistDistance(1000); + command.setRunDirection(ShuttleRunDirection.get(startPath.get("direction").toString()).id); + command.setPalletLift((short) 1); + command.setForceMoveDistance(1000); + command.setChargeSwitch((short) 2); + command.setIOControl((short) 0); + command.setRunSpeed((short) 1000); + command.setRadarTmp((short) 0); + command.setCommandEnd((short) 1); + + //涓嬪彂鍛戒护 + if (!write(command)) { + News.error("鍥涘悜绌挎杞﹀懡浠や笅鍙戝け璐ワ紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); + } else { + News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙戞垚鍔燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); + + //灏嗘爣璁扮疆涓篺alse(闃叉閲嶅彂) + shuttleProtocol.setPakMk(false); + + //鍒ゆ柇鏁版嵁鏄惁鎵ц瀹屾垚 + if (commandStep < size) { + //鏇存柊redis鏁版嵁 + //姝ュ簭澧炲姞 + commandStep++; + map.put("commandStep", commandStep); + //浠诲姟鏁版嵁淇濆瓨鍒皉edis + redisUtil.set("wrk_no_" + map.get("wrk_no").toString(), JSON.toJSONString(map)); + }else { + //宸叉墽琛屽畬鎴� + //淇濆瓨鏁版嵁鍒版暟鎹簱鍋氭祦姘� + //鍒犻櫎redis + redisUtil.del("wrk_no_" + map.get("wrk_no").toString()); + + //銆傘�傘�� + //1銆佸懡浠や笅鏂归渶瑕佸垽鏂皬杞︾┖闂茬姸鎬� + //2銆� + } + + } } /******************************************************************************************/ @@ -239,26 +352,26 @@ slave.setId(1); slave.setIp("192.168.4.24"); slave.setPort(502); - ShuttleThread thread = new ShuttleThread(slave); - thread.connect(); - thread.readStatus(); - - ShuttleCommand command = new ShuttleCommand(); - command.setCommandWord((short) 0); - command.setStartCodeNum((short) 12323); - command.setMiddleCodeNum((short) 22323); - command.setDistCodeNum((short) 29999); - command.setStartToDistDistance(109999); - command.setMiddleToDistDistance(5000); - command.setRunDirection((short) 1); - command.setPalletLift((short) 2); - command.setForceMoveDistance(3000); - command.setChargeSwitch((short) 2); - command.setIOControl((short) 0); - command.setRunSpeed((short) 0); - command.setRadarTmp((short) 0); - command.setCommandEnd((short) 1); - thread.write(command); +// ShuttleThread thread = new ShuttleThread(slave); +// thread.connect(); +// thread.readStatus(); +// +// ShuttleCommand command = new ShuttleCommand(); +// command.setCommandWord((short) 0); +// command.setStartCodeNum((short) 12323); +// command.setMiddleCodeNum((short) 22323); +// command.setDistCodeNum((short) 29999); +// command.setStartToDistDistance(109999); +// command.setMiddleToDistDistance(5000); +// command.setRunDirection((short) 1); +// command.setPalletLift((short) 2); +// command.setForceMoveDistance(3000); +// command.setChargeSwitch((short) 2); +// command.setIOControl((short) 0); +// command.setRunSpeed((short) 0); +// command.setRadarTmp((short) 0); +// command.setCommandEnd((short) 1); +// thread.write(command); } } -- Gitblit v1.9.1