src/main/java/com/zy/asrs/controller/SiteController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/utils/Utils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/StaProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/NyShuttleThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/SiemensDevpThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/WrkMastMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/pipeline.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -104,6 +104,7 @@ vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N"); // 空板信号 vo.setStaNo(staProtocol.getStaNo()); // 目标站 vo.setLocType1(staProtocol.getLocType1()==null?"-":staProtocol.getLocType1().toString()); // 高低信号 vo.setOutInModel(staProtocol.getOutInModel()==null?"-":staProtocol.getOutInModel().toString()); // 出入库模式 } return R.ok().add(list); } src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
@@ -44,4 +44,7 @@ //高低信号 private String locType1 = "-"; //出入库模式 private String outInModel = "-"; } src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -76,4 +76,6 @@ WrkMast selectShuttleWorking(@Param("shuttleNo") Integer shuttleNo);//是否有穿梭车任务(移库任务除外) WrkMast selectByBarcode(String barcode); List<WrkMast> selectInWrkMastByLiftNo(Integer liftNo);//搜索指定提升机的入库任务 } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -863,6 +863,12 @@ return false;//出库站点不可出 } Integer liftNo = basDevp.getLiftNo();//搜索出库提升机是否存在入库任务,如存在禁止出库 List<WrkMast> liftWrkMasts = wrkMastMapper.selectInWrkMastByLiftNo(liftNo); if (!liftWrkMasts.isEmpty()) { return false;//存在入库任务,禁止出库 } //获取源站 LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(basDevp.getLiftNo(), Utils.getLev(wrkMast.getSourceLocNo())); if (liftStaProtocol == null) { @@ -1109,6 +1115,18 @@ return false;//站点不可入 } //判断提升机整个三楼是否都处于入库模式 Integer outInModel1 = Utils.getOutInModelByLift(sourceBasDevp.getLiftNo(), 1); Integer outInModel2 = Utils.getOutInModelByLift(sourceBasDevp.getLiftNo(), 5); Integer outInModel3 = Utils.getOutInModelByLift(sourceBasDevp.getLiftNo(), 8); if (outInModel1 == null || outInModel2 == null || outInModel3 == null) { return false;//不存在出入库模式 } if (outInModel1 == 2 || outInModel2 == 2 && outInModel3 == 2) { return false;//只要有一个处于出库模式,禁止入库 } LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, sourceBasDevp.getLiftNo()); if (liftThread == null) { return false; src/main/java/com/zy/asrs/utils/Utils.java
@@ -20,6 +20,7 @@ import com.zy.common.utils.NavigatePositionConvert; import com.zy.common.utils.NavigateUtils; import com.zy.common.utils.ShuttleDispatchUtils; import com.zy.core.DevpThread; import com.zy.core.Slave; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; @@ -32,15 +33,13 @@ import com.zy.core.model.command.ShuttleCommand; import com.zy.core.model.protocol.NyShuttleProtocol; import com.zy.core.model.protocol.ShuttleProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.NyShuttleThread; import com.zy.core.thread.ShuttleThread; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.*; /** * Created by vincent on 2020/8/27 @@ -547,4 +546,51 @@ return null; } //通过提升机号和楼层获取出入库模式 public static Integer getOutInModelByLift(Integer liftNo, Integer lev) { ArrayList<Integer> lev1 = new ArrayList<Integer>() {{ add(100);add(103); add(105); }}; ArrayList<Integer> lev2 = new ArrayList<Integer>() {{ add(200);add(203); add(205); }}; ArrayList<Integer> lev3 = new ArrayList<Integer>() {{ add(341);add(346); }}; Integer staNo = null; if (lev <= 4) { staNo = lev1.get(liftNo - 1); } else if (lev >= 5 && lev <= 7) { staNo = lev2.get(liftNo - 1); } else if ((lev >=8 && lev <= 10) && liftNo != 1) { staNo = lev3.get(liftNo - 2); } if (staNo != null) { DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol = devpThread.getStation().get(staNo); if (staProtocol == null) { return null; } if (staNo == 100 || staNo == 200) {//1号提升机100站和200站默认全是出库模式 return 2;//出库模式 } if (staNo == 341) { return 1;//341站默认只能入库模式 } if (staProtocol.getOutInModel() == null) { return null;//没有出入库信号 } return staProtocol.getOutInModel().intValue(); } return null; } } src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -78,7 +78,7 @@ // 扫码失败 private boolean barcodeErr; //出入库模式 //出入库模式1、入库,2、出库 private Short outInModel; //输送线联动转动方向,0:停止转动,1:正向转动,2:反向转动 src/main/java/com/zy/core/thread/NyShuttleThread.java
@@ -413,6 +413,11 @@ // nodes.addAll(command.getNodes()); // } if (nodes != null) { NavigateNode targetNode = assignCommand.getNodes().get(assignCommand.getNodes().size() - 1);//最终节点 NavigateNode node = nodes.get(nodes.size() - 1); if (!(targetNode.getX() == node.getX() && targetNode.getY() == node.getY())) { nodes.remove(nodes.size() - 1);//剔除尾节点 } boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(shuttleProtocol.getCurrentLocNo()), nodes, false);//解锁路径 if (!result) { return false;//解锁失败 src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -67,6 +67,14 @@ add(346); }}; //出入库模式 public static final ArrayList<Integer> outInModelStaNos = new ArrayList<Integer>() {{ add(100);add(103); add(105);add(200); add(203);add(205); add(341);add(346); }}; public boolean charge0; public boolean charge1; @@ -93,11 +101,6 @@ // 写数据 ID+目标站 case 2: write((StaProtocol) task.getData()); read(); break; // 出入库模式 case 3: write3((StaProtocol) task.getData()); read(); break; default: @@ -203,6 +206,17 @@ } } //读出入库模式 Thread.sleep(100); OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB1002.0", (short) (outInModelStaNos.size()*2)); if (result4.IsSuccess) { for (int i = 0; i < outInModelStaNos.size(); i++) { Integer siteId = outInModelStaNos.get(i); // 站点编号 StaProtocol staProtocol = station.get(siteId); staProtocol.setOutInModel(siemensS7Net.getByteTransform().TransInt16(result4.Content, i * 2));//读取出入库模式 } } if (result.IsSuccess && result1.IsSuccess) { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); @@ -226,110 +240,6 @@ OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); // News.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } /** * 写入 ID+目标站 =====> 单站点写入 */ private void write3(StaProtocol staProtocol) throws InterruptedException { if (Cools.isEmpty(staProtocol)) { return; } OperateResult writeResult = null; //任务下发次数 int writeCount = 0; //任务下发成功标识 boolean writeFlag = false; Short outAndIn = staProtocol.getOutInModel(); Integer siteId = staProtocol.getSiteId(); Short run = 0;//停止转动 String address = ""; if (staProtocol.getRotationDire() != null) { run = staProtocol.getRotationDire().shortValue();//转动方向 } switch (siteId) { case 102: address = "DB100.300"; break; case 105: address = "DB100.302"; break; case 106: address = "DB100.304"; break; case 107: address = "DB100.306"; break; case 108: address = "DB100.308"; break; } while(writeCount < 5){ writeResult = siemensS7Net.Write(address, run); if (writeResult == null) { log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); continue; } if(writeResult.IsSuccess){ Thread.sleep(200); OperateResultExOne<byte[]> readResult = siemensS7Net.Read(address, (short) 2); if(readResult.IsSuccess){ short run2 = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0); if(run.equals(run2)){ //任务命令写入成功 writeFlag = true; if (staProtocol.getStaNo() != null && staProtocol.getWorkNo() != null) { write(staProtocol);//写入工作号和目标站 } log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); 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); } } 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); } } 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); } Thread.sleep(200); } //写命令尝试了5次还是失败了 if(!writeFlag){ staProtocol = station.get(staProtocol.getSiteId()); if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) { staProtocol.setPakMk(true); } OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令尝试5次失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol))); log.error("写入输送线命令尝试5次失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol)); //重新添加数据到任务队列 boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(3, staProtocol)); read();//读取1次设备状态 return; } else { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发成功 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol))); log.info("输送线命令下发 [id:{}] >>>>> 命令下发成功: {}", slave.getId(), JSON.toJSON(staProtocol)); staProtocol = station.get(siteId); if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) { staProtocol.setPakMk(true); } } } /** src/main/resources/mapper/WrkMastMapper.xml
@@ -225,4 +225,13 @@ and barcode = #{barcode} order by io_pri desc,io_time,wrk_no asc </select> <select id="selectInWrkMastByLiftNo" resultMap="BaseResultMap"> select * from dbo.asr_wrk_mast where 1=1 and lift_no = #{liftNo} and io_type <= 100 and wrk_sts in (1,2,3,4,5) order by io_pri desc,io_time,wrk_no asc </select> </mapper> src/main/webapp/views/pipeline.html
@@ -99,7 +99,7 @@ <th>有物</th> <th>可入</th> <th>可出</th> <th>入库标记</th> <th>出入库模式</th> <th>空板信号</th> <th>目标站</th> <th>提升机到位信号</th> @@ -286,7 +286,7 @@ setVal(tr.children("td").eq(3), table[i-1].loading); setVal(tr.children("td").eq(4), table[i-1].inEnable); setVal(tr.children("td").eq(5), table[i-1].outEnable); setVal(tr.children("td").eq(6), table[i-1].pakMk); setVal(tr.children("td").eq(6), table[i-1].outInModel); setVal(tr.children("td").eq(7), table[i-1].emptyMk); setVal(tr.children("td").eq(8), table[i-1].staNo); setVal(tr.children("td").eq(9), table[i-1].liftArrival);