src/main/java/com/zy/asrs/entity/BasRgvMap.java
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.core.common.SpringUtils; import com.zy.asrs.service.BasRgvMapService; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -77,8 +79,10 @@ this.lockEndRoute = lockEndRoute; } public Integer getRgvNoOther(){ return 3-this.rgvNo; public Integer getRgvNoOther(Integer rgvNo){ BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class); BasRgvMap basRgvMap = basRgvMapService.selectByOtherRgvNo(rgvNo); return basRgvMap.getRgvNo(); } src/main/java/com/zy/asrs/mapper/BasRgvMapMapper.java
@@ -11,4 +11,6 @@ public interface BasRgvMapMapper extends BaseMapper<BasRgvMap> { BasRgvMap selectByRgvNo(@Param("rgvNo") Integer rgvNo); BasRgvMap selectByOtherRgvNo(@Param("rgvNo") Integer rgvNo); } src/main/java/com/zy/asrs/service/BasRgvMapService.java
@@ -7,4 +7,5 @@ public interface BasRgvMapService extends IService<BasRgvMap> { BasRgvMap selectByRgvNo(Integer rgvNo); BasRgvMap selectByOtherRgvNo(Integer rgvNo); } src/main/java/com/zy/asrs/service/impl/BasRgvMapServiceImpl.java
@@ -13,4 +13,11 @@ public BasRgvMap selectByRgvNo(Integer rgvNo) { return this.baseMapper.selectByRgvNo(rgvNo); } @Override public BasRgvMap selectByOtherRgvNo(Integer rgvNo) { return this.baseMapper.selectByOtherRgvNo(rgvNo); } } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -221,7 +221,7 @@ StartupDto dto = jsonObject.getObject("data", StartupDto.class); barcodeThread.setBarcode(""); staProtocol.setWorkNo(dto.getWorkNo()); staProtocol.setStaNo(dto.getStaNo().shortValue()); staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(),dto.getSourceStaNo())); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发2:"+dto.getWorkNo()+","+dto.getStaNo()); @@ -238,10 +238,10 @@ // MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); // // if (ledThread != null) { // String errorMsg = jsonObject.getString("msg"); // if (!Cools.isEmpty(errorMsg)) { // MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); // } String errorMsg = jsonObject.getString("msg"); if (!Cools.isEmpty(errorMsg)) { MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); } // } // News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); } @@ -392,7 +392,7 @@ StaDesc staDesc = staDescService.selectOne(wrapper); if (Cools.isEmpty(staDesc)) { News.error(""+mark+" - 2"+" - 入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo()); staProtocol.setWorkNo(9989); staProtocol.setWorkNo(wrkNo++); staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue()-(short)1)); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); @@ -402,7 +402,7 @@ // led 异常显示 if (ledThread != null) { String errorMsg = "此为拣料、并板、盘点再入库.请放在"+pickSta.getBackSta().shortValue()+"站点"; MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(5, errorMsg)); MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg)); } continue; } @@ -449,7 +449,7 @@ // 更新站点信息 且 下发plc命令 staProtocol.setWorkNo(wrkMast.getWrkNo()); staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); staProtocol.setStaNo((short) 161); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo()); @@ -505,7 +505,7 @@ if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue()) && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.forkPosType == CrnForkPosType.HOME) { News.warnNoLog(""+mark+" - 0"+" - 开始执行"); News.error("堆垛机出库完成 - 开始执行"); // 命令下发区 -------------------------------------------------------------------------- @@ -521,6 +521,7 @@ wrkMast.setCrnEndTime(new Date()); if (wrkMastMapper.updateById(wrkMast) != 0) { // 复位堆垛机 News.error("出库任务完成下发堆垛机复位", wrkMast.getWrkNo()); crnThread.setResetFlag(true); } else { News.error(""+mark+" - 1"+" - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo()); @@ -1400,7 +1401,7 @@ ledCommand.setLocNo(dto.getLocNo()); ledCommand.setStaNo(dto.getStaNo()); commands.add(ledCommand); MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, commands)); MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(1, commands)); // ledThread.errorReset(); } } else { @@ -1413,12 +1414,12 @@ // throw new CoolException("更新plc站点信息失败"); // } // // if (ledThread != null) { // String errorMsg = jsonObject.getString("msg"); // if (!Cools.isEmpty(errorMsg)) { // MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(5, errorMsg)); // } // } if (ledThread != null) { String errorMsg = jsonObject.getString("msg"); if (!Cools.isEmpty(errorMsg)) { MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg)); } } // News.error(""+mark+" - 3"+" - 请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); } } catch (Exception e) { @@ -1440,7 +1441,6 @@ * 出库 ===>> 工作档信息写入led显示器 */ public synchronized void ledExecute(Integer mark) { for (LedSlave led : slaveProperties.getLed()) { // 获取输送线plc线程 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); @@ -1458,11 +1458,7 @@ } // 获取工作档数据 WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo()); // if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; } if (null == wrkMast) { continue; } News.warnNoLog(""+mark+" - 0"+" - 开始执行:出库 ===>> 工作档信息写入led显示器"); if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; } wrkMasts.add(wrkMast); // 组装命令 LedCommand ledCommand = new LedCommand(); @@ -1470,12 +1466,6 @@ ledCommand.setIoType(wrkMast.getIoType()); // 出库模式 switch (wrkMast.getIoType()) { case 1: ledCommand.setTitle("全板入库"); break; case 10: ledCommand.setTitle("空板入库"); break; case 101: ledCommand.setTitle("全板出库"); break; @@ -1493,16 +1483,34 @@ ledCommand.setEmptyMk(true); break; default: News.error(""+mark+" - 1"+" - 任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType()); News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType()); break; } ledCommand.setSourceLocNo(wrkMast.getSourceLocNo()); ledCommand.setLocNo(wrkMast.getLocNo()); ledCommand.setStaNo(wrkMast.getStaNo()); // ledCommand.setSourceStaNo(wrkMast.getSourceStaNo()); if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) { ledCommand.setBarcode(wrkMast.getBarcode()); if (wrkMast.getIoType() != 110) { List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo()); wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(),wrkDetl.getSpecs()))); wrkDetls.forEach(wrkDetl -> { Double total = 0.0; EntityWrapper<LocDetl> wrapper = new EntityWrapper<>(); LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr())); if (Cools.isEmpty(locDetl)) { total = wrkDetl.getAnfme(); } else { total = locDetl.getAnfme(); } if (wrkMast.getIoType() == 101) { ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); } if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) { ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); } if (wrkMast.getIoType() == 107) { ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total)); } }); } commands.add(ledCommand); } @@ -1513,32 +1521,11 @@ if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) { continue; } // 命令下发 ------------------------------------------------------------------------------- // if (!commands.isEmpty()) { // if (led.getId() < 7) { // if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) { // News.error(""+mark+" - 2"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); // continue; // } else { // ledThread.setLedMk(false); // } // } else { // if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) { // News.error(""+mark+" - 3"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); // continue; // } else { // ledThread.setLedMk(false); // } // } // // } // 命令下发 ------------------------------------------------------------------------------- if (!commands.isEmpty()) { if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) { if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) { News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); continue; }else { ledThread.setLedMk(false); } } @@ -1548,7 +1535,6 @@ wrkMast.setOveMk("Y"); wrkMast.setModiTime(new Date()); if (wrkMastMapper.updateById(wrkMast) == 0) { News.errorNoLog(""+mark+" - 4"+" - 更新工作档失败"); throw new CoolException("更新工作档失败"); } } @@ -1562,17 +1548,13 @@ } } // News.infoNoLog(""+mark+" - 0"+" - 出库 ===>> 工作档信息写入led显示器执行完成"); } /** * 其他 ===>> LED显示器复位,显示默认信息 */ public synchronized void ledReset(Integer mark) { // News.warnNoLog(""+mark+" - 0"+" - 开始执行:其他 ===>> LED显示器复位,显示默认信息"); public synchronized void ledReset() { for (LedSlave led : slaveProperties.getLed()) { // 获取输送线plc线程 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); // 命令集合 @@ -1580,27 +1562,25 @@ for (Integer staNo : led.getStaArr()) { // 获取叉车站点 StaProtocol staProtocol = devpThread.getStation().get(staNo); if (staProtocol == null) { continue; } if (staProtocol.getWorkNo() != 0 && staProtocol.isLoading()) { if (staProtocol == null) { continue; } if (staProtocol.getWorkNo() != 0) { reset = false; break; } } // 获取led线程 LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId()); LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getDevpPlcId()); // led显示默认内容 if (reset && !ledThread.isLedMk()) { ledThread.setLedMk(true); if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(4, new ArrayList<>()))) { News.error(""+mark+" - 1"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); } else { if (reset) { if (ledThread == null) { continue; } ledThread.errorReset(); if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) { News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); } } } // News.infoNoLog(""+mark+" - 0"+" - 执行完成:其他 ===>> LED显示器复位,显示默认信息"); } /** @@ -2082,7 +2062,7 @@ String data = jsonObject.get("data").toString(); News.info((String) jsonObject.get("msg")+","+data); } else { News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1","", response); News.warnNoLog("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1","", response); } } catch (Exception e) { e.printStackTrace(); @@ -2159,7 +2139,7 @@ basRgvMapMapper.updateById(basRgvMapCurrent); //更新另一台小车地图 Integer rgvNoOther = basRgvMapCurrent.getRgvNoOther(); Integer rgvNoOther = basRgvMapCurrent.getRgvNoOther(basRgvMapCurrent.getRgvNo()); BasRgvMap basRgvMapOther = basRgvMapMapper.selectById(rgvNoOther); List<Integer> integers = RouteUtils.RouteMapCurrentFar(fallMerge, basRgvMapCurrent.getLockStartRoute()); Integer lockEndRoute = RouteUtils.RouteMapOtherFarStnNo(integers, basRgvMapCurrent.getLockStartRoute());//另一台小车可活动最远位置 @@ -2193,10 +2173,11 @@ } // 只有当RGV空闲、自动,工位一无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 && (rgvProtocol.getTaskNo1()==0 || rgvProtocol.getTaskNo1()==9999) if ( // rgvProtocol.getStatusType() == RgvStatusType.IDLE rgvProtocol.getModeType() == RgvModeType.AUTO // && rgvProtocol.getLoaded1()==0 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 // && (rgvProtocol.getTaskNo1()==0 || rgvProtocol.getTaskNo1()==9999) ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); @@ -2327,6 +2308,7 @@ if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 && rgvProtocol.getTaskNo1() == 0 ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { @@ -2535,11 +2517,11 @@ if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){ continue; } if (rgvProtocol.getRgvNo()==1 && rgvProtocol.getRgvPosI().equals(100)){ continue; } else if (rgvProtocol.getRgvNo()==2 && rgvProtocol.getRgvPosI().equals(157) ){ continue; } // if (rgvProtocol.getRgvNo()==1 && rgvProtocol.getRgvPosI().equals(100)){ // continue; // } else if (rgvProtocol.getRgvNo()==2 && rgvProtocol.getRgvPosI().equals(157) ){ // continue; // } rgvAvoidanceXY(rgvProtocol.getRgvNo()); rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); } @@ -2555,7 +2537,7 @@ * */ public synchronized boolean rgvAvoidanceXY(Integer rgvId){ BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo(rgvId); if (basRgvMap.getStartRoute() == 100){ if (basRgvMap.getStartRoute() == 100 || basRgvMap.getStartRoute() == 101){ try{ // 命令下发区 -------------------------------------------------------------------------- @@ -2565,7 +2547,7 @@ rgvCommand.setTaskNo1((short)32222); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 回原点 //basRgvMap.getLockStartRoute().shortValue() rgvCommand.setSourceStaNo1( (short)100); rgvCommand.setSourceStaNo1( (short)101); rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 @@ -2587,7 +2569,7 @@ rgvCommand.setTaskNo1((short)32222); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 回原点 //basRgvMap.getLockStartRoute().shortValue() rgvCommand.setSourceStaNo1( (short)157); rgvCommand.setSourceStaNo1( (short)161); rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -247,6 +247,13 @@ } } public static Short SouStaEnd(Integer endSta,Integer souSta){ if (souSta == 159) { return (short)161; } return souSta.shortValue(); } public static void main(String[] arge){ src/main/java/com/zy/common/model/LocTypeDto.java
@@ -34,7 +34,7 @@ // if (staProtocol.isHigh() == staProtocol.isLow()) { // throw new CoolException("plc高低检测异常"); // } if (staProtocol.getSiteId() == 106){ if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){ this.locType1 = 2; // 高库位 }else { this.locType1 = 1; // 低库位 src/main/java/com/zy/common/model/MatDto.java
@@ -14,17 +14,33 @@ // 物料名称 private String maknx; // 库位规格 private String batch; private String specs; // 客户信息 private String manu; // 备注 private String memo; // 物料数量 private Double count; // 库位数量 private Double total; public MatDto() { } public MatDto(String matnr, String maknx, String batch, String specs, String manu, String memo, Double count, Double total) { this.matnr = matnr; this.maknx = maknx; this.batch = batch; this.specs = specs; this.manu = manu; this.memo = memo; this.count = count; this.total = total; } public MatDto(String matNo, String maknx, Double count) { this.matnr = matNo; src/main/java/com/zy/core/MainProcess.java
@@ -72,14 +72,18 @@ // 出库 ===>> 工作档信息写入led显示器 mainService.ledExecute(9); // 其他 ===>> LED显示器复位,显示默认信息 mainService.ledReset(10); mainService.ledReset(); mainService.outOfDevp(11); //空托盘自动出库 // mainService.autoEmptyOut(); // //空托盘自动入库 // mainService.autoEmptyIn(); if (i>10){ //空托盘自动出库 mainService.autoEmptyOut(); //空托盘自动入库 mainService.autoEmptyIn(); i=0; } i++; // 其他 ===>> 入出库模式切换 // i++; src/main/java/com/zy/core/model/command/LedCommand.java
@@ -1,5 +1,6 @@ package com.zy.core.model.command; import com.core.common.Cools; import com.zy.common.model.MatDto; import lombok.Data; @@ -30,4 +31,23 @@ private boolean emptyMk = false; private Integer ioType; private String barcode; @Override public String toString() { StringBuffer s = new StringBuffer(); s.append("工作号[" + this.workNo + "]\n"); s.append("工作类型[" + this.title + "]\n"); if (!Cools.isEmpty(this.barcode)) { s.append("托盘码[" + this.barcode + "]\n"); } if (!this.emptyMk){ for (MatDto matDto : matDtos) { s.append("[商品编码:" + matDto.getMatnr() + ", 数量:" + matDto.getCount() + "]\n"); } } return s.toString(); } } src/main/java/com/zy/core/thread/LedThread.java
@@ -36,13 +36,7 @@ public class LedThread implements Runnable, ThreadHandler { private Slave slave; private Bx5GScreenClient screen; ProgramBxFile pf; TextCaptionBxArea area; DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]); private Set<Integer> workNos = new HashSet<>(); private boolean ledMk = false; private boolean resetStatus = false; // 复位状态 // 显示器 private StringBuffer stringBuffer = new StringBuffer(); @@ -52,20 +46,12 @@ public LedThread(Slave slave) { this.slave = slave; try { // Bx5GEnv.initial(3000); // screen = new Bx5GScreenClient("my"); } catch (Exception e) { e.printStackTrace(); News.info("Led"+" - 1"+" - led连接构造器错误 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); } } @Override @SuppressWarnings({"InfiniteLoopStatement", "unchecked"}) public void run() { // connect(); close(); while (true) { try { Task task = MessageQueue.poll(SlaveType.Led, slave.getId()); @@ -79,131 +65,24 @@ case 2: reset(); break; // 写数据 液晶 case 3: write7((List<LedCommand>)task.getData()); break; // 复位 液晶 case 4: reset7(); break; case 5: error((String) task.getData()); break; case 6: case 4: errorReset(); break; default: break; } } Thread.sleep(400); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } } private void write(List<LedCommand> list) throws Bx5GException { if (!connect()) { return; } pf = new ProgramBxFile( 0, screen.getProfile()); pf.setFrameShow(false); // 分别输入X,Y,width,height area = new TextCaptionBxArea( 0,0,96,48, screen.getProfile()); // 创建一个数据页 TextBxPage page = new TextBxPage(); for (LedCommand command : list) { page.newLine(command.getTitle() +"("+command.getWorkNo()+")"); page.newLine("库位:"+ (command.getIoType() < 100 ? command.getLocNo() : command.getSourceLocNo())); page.newLine("目标站:"+command.getStaNo()); if (!command.isEmptyMk()) { for (MatDto matDto : command.getMatDtos()) { //去掉小数点 String strQty = matDto.getCount().toString(); int idx = strQty.lastIndexOf("."); if(idx >= 0){ strQty.substring(0,idx); } page.newLine(matDto.getMaknx() + "[数量" + strQty +"]"); // page.newLine(matDto.getMaknx() + "【数量" + matDto.getCount() +"】"); } } page.newLine("\n"); } // 设置字体 page.setFont(new Font("宋体",Font.PLAIN,12)); // 设置文本颜色 page.setForeground(Color.red); // 设置显示特技为快速打出 page.setDisplayStyle(styles[6]); area.clearPages(); area.addPage(page); pf.addArea(area); if (pf.validate() != null) { News.info("Led"+" - 2"+" - pf out of range"); } else { // 更新节目 screen.writeProgram(pf); // resetStatus = false; } close(); } private void reset() throws Bx5GException { if (!connect()) { return; } // if (resetStatus) { // return; // } pf = new ProgramBxFile( 0, screen.getProfile()); pf.setFrameShow(false); // 分别输入X,Y,width,height area = new TextCaptionBxArea( 0,0,96,48, screen.getProfile()); // 创建一个数据页 TextBxPage page = new TextBxPage(); // List<String> list = null; // try { // String ledDefaultMsg = Parameter.get().getLedDefaultMsg(); // list = JSON.parseArray(ledDefaultMsg, String.class); // } catch (Exception ignore) { // } // if (!Cools.isEmpty(list)) { // for (String str : list) { // page.newLine(str); // } // } else { // page.newLine("自动化立体仓库"); // page.newLine("西格迈股份有限公司"); // } page.newLine("力源智能仓储"); // 设置字体 page.setFont(new Font("宋体",Font.PLAIN,13)); // 设置文本颜色 page.setForeground(Color.red); // 设置显示特技为快速打出 page.setDisplayStyle(styles[6]); area.clearPages(); area.addPage(page); pf.addArea(area); // 更新节目 if (pf.validate() != null) { News.info("Led"+" - 3"+" - pf out of range"); } else { // 更新节目 screen.writeProgram(pf); // resetStatus = true; } close(); } private void write7(List<LedCommand> list) { private void write(List<LedCommand> list) { commandList = list; StringBuilder sb = new StringBuilder(); @@ -213,9 +92,7 @@ sb.append("目标站:").append(command.getStaNo()).append("\n"); if (!command.isEmptyMk()) { for (MatDto matDto : command.getMatDtos()) { sb.append("物料编码:").append(matDto.getMatnr()).append("\n"); sb.append("数量:").append(matDto.getCount()).append("\n"); sb.append("规格:").append(matDto.getSpecs()).append("\n"); sb.append(matDto.getSpecs()).append("-").append(matDto.getBatch()).append("\n"); } } sb.append("\n"); @@ -227,7 +104,7 @@ } private void reset7() { private void reset() { commandList = null; stringBuffer.delete(0, stringBuffer.length()); @@ -245,238 +122,11 @@ @Override public boolean connect() { boolean connRes = false; try { connRes = screen.connect(slave.getIp(),slave.getPort()); screen.turnOn(); } catch (Exception ignore) { } if (connRes) { News.info("Led"+" - 4"+" - led连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); } else { News.error("Led"+" - 5"+" - led连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); } return connRes; return true; } @Override public void close() { } public static void main(String[] args) throws Exception { String strQty = "1234"; int index = strQty.lastIndexOf("."); if(index>=0) { strQty=strQty.substring(0, index); } System.out.println("2==>>"+strQty); Bx5GEnv.initial(3000); Bx5GScreenClient screen = new Bx5GScreenClient("my"); DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]); if (!screen.connect("192.168.10.101",5005)) { System.err.println("连接失败!!!!"); return; } screen.turnOn(); while (true) { Thread.sleep(5000L); ProgramBxFile pf = new ProgramBxFile( 0, screen.getProfile()); pf.setFrameShow(false); // 分别输入X,Y,width,heigth TextCaptionBxArea area = new TextCaptionBxArea( 0,0,192,96,screen.getProfile()); // 创建一个数据页 // 第一行数据 TextBxPage page = new TextBxPage("出库任务(303)"); page.newLine("源库位:0100204"); page.newLine("目标站:1000"); // 设置字体 page.setFont( new Font("宋体",Font.PLAIN,15)); // 设置文本颜色 page.setForeground(Color.red); // 设置显示特技为快速打出 page.setDisplayStyle(styles[6]); area.clearPages(); area.addPage(page); pf.addArea( area ); // 更新节目 // 更新节目 if (pf.validate() != null) { System.out.println("pf out of range"); News.info("Led"+" - 6"+" - pf out of range"); } else { // 更新节目 screen.writeProgram(pf); } } // 继开与控制器之间的链接 // screen.disconnect(); } public static void main1(String[] args) throws Exception { Bx5GEnv.initial(3000); // 创建screen对象,用于对控制器进行访问,客户端模式 Bx5GScreenClient screen = new Bx5GScreenClient("my"); // 创建screen对象,用于对控制器进行访问,串口模式 // Bx5GScreenRS screen = new Bx5GScreenRS("MyScreen"); // 在对控制器交互之前,需要先与控制器建立连接 boolean conn = screen.connect("192.168.10.61",5005); System.out.println(conn); // 与控制器交互完成后,需断开与控制器之间的连接 // screen.disconnect(); // 以下为一些简单控制命令的使用方法 // 开关机命令 // screen.turnOff();// 关机 screen.turnOn();// 开机 // screen.syncTime();// 校时 // screen.ping();// ping命令 // // 查询控制器状态 // screen.checkControllerStatus(); // // 查询控制器当前固件版本 // screen.checkFirmware(); // // 查询控制器内存 // screen.checkMemVolumes(); // // 锁定屏幕当前画面 // screen.lock(); // // 解除锁定屏幕当前画面 // screen.unlock(); Bx5GScreen.Result <ReturnControllerStatus> result1 = screen.checkControllerStatus(); if (result1.isOK()) { ReturnControllerStatus status = result1.reply; System.out.println(status.getBrightness()); System.out.println(status.getRtcDay()); System.out.println(status.getScreenOnOff()); // // status 还有很对其他接口,可以根据实际需求再次调用以获取相应状态 } // // 以下是静态区部分 Demo // 创建节目文件 ProgramBxFile pf = new ProgramBxFile( 0,screen.getProfile() ); // 是否显示节目边框 pf.setFrameShow(true); // 节目边框的移动速度 pf.setFrameSpeed(20); // 使用第几个内置边框 pf.loadFrameImage(13); DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]); // 创建一个文本区 // 分别输入X,Y,width,heigth // 注意区域坐标和宽度高度,不要越界 TextCaptionBxArea area = new TextCaptionBxArea( 0,0,160,64,screen.getProfile() ); // 创建一个数据页 // 第一行数据 TextBxPage page = new TextBxPage("入库"); // 第二行数据 page.newLine( "物料:" ); page.newLine("接收器 RX18 XH 6V (数量:2)"); page.newLine("中控 BM蓝牙 英文 6V (数量:1)"); page.newLine("线束 S2588-1-XX 无实物(数量:5)"); page.newLine("目标库位:0100204"); // 设置字体 page.setFont( new Font("宋体",Font.PLAIN,12) ); // 设置显示特技为快速打出 page.setDisplayStyle( styles[2] ); // 数据页可以是图片 // ImageFileBxPage iPage = new ImageFileBxPage( "E;a/001.bmp" ); // // // 数据页可以是txt文件 // TextFileBxPage tPage = new TextFileBxPage("E:a/001.txt"); // 将前面的page添加到area中 area中可以添加多个page 其中page可以是字符串,可以是txt文件,可以是图片,不可以是表格,如果需要Led屏上显示表格,请先将表格绘制成图片 area.addPage( page ); // area.addPage( iPage ); // area.addPage( tPage ); // 将area添加到节目中 节目中可以添加多个area pf.addArea( area ); // 更新节目 screen.writeProgram( pf ); // // 以下是动态区部分 Demo // 动态区的特点 // DynamicBxAreaRule(id, runMode, immediatePlay, timeout) // runMode 运行模式: // 0:循环显示。 // 1:显示完成后静止显示最后一页数据。 // 2:循环显示,超过设定时间后数据仍未更新时不再显示。 // 3:循环显示,超过设定时间后数据仍未更新时显示 Logo 信息。 // 4:循环显示,显示完最后一页后就不再显示。 // immediatePlay 是否立即播放: // 0:与异步节目一起播放。 // 1:异步节目停止播放,仅播放动态区域。 // 2:当播放完节目编号最高的异步节目后播放该动态区域。 // // 定义一个动态区 // 可以通过ID来更新不同的动态区内容, 此处 ID 为 0 // DynamicBxAreaRule dynRule = new DynamicBxAreaRule(0, (byte) 0, (byte) 1, 0); //dArea.addProgram("P000"); //dArea.addProgram("P001"); // int posX = 440; // int posY = 4; // TextCaptionBxArea dAreaContent = new TextCaptionBxArea(posX, posY, 64, 16, screen.getProfile()); // TextBxPage page = new TextBxPage("动态第一次尝试"); // page.setDisplayStyle(DisplayStyleFactory.getStyle(4)); // dAreaContent.addPage(page); // // // 发送动态区之前,如果需要删除之前的动态区,可以调用以下接口 // // 通常如果动态区的位置或大小没有发生改变,不用删除 // screen.deleteAllDynamic(); // // // 更新动态区 // screen.writeDynamic(dynRule, dAreaContent); // Thread.sleep(15000); // // // // // 下面模拟再次更新动态区 // page = new TextBxPage("再次尝试"); // TextBxPage page2 = new TextBxPage("成功"); // // dAreaContent.clearPages(); // dAreaContent.addPage(page); // dAreaContent.addPage(page2); // // // 更新动态区 // screen.writeDynamic(dynRule, dAreaContent); // // 继开与控制器之间的链接 screen.disconnect(); } } src/main/java/com/zy/core/thread/RgvThread.java
@@ -11,6 +11,7 @@ import com.zy.asrs.entity.BasRgvOpt; import com.zy.asrs.service.BasRgvOptService; import com.zy.asrs.service.BasRgvService; import com.zy.common.utils.News; import com.zy.core.ThreadHandler; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; @@ -19,6 +20,7 @@ import com.zy.core.enums.SlaveType; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.RgvProtocol; import lombok.Data; @@ -342,12 +344,92 @@ OperateResult result = siemensNet.Write("DB100.0", array); if (command.getAckFinish1() == 0) { short commandFinish = 1; //工位1任务写入 Thread.sleep(200); result = siemensNet.Write("DB100.10", commandFinish); if (!result.IsSuccess){ News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command)); MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(4,command)); Thread.sleep(100); readStatus(); return false; } //RGV任务写入后,回读一次,看是否成功 Thread.sleep(400); try { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 12); if (resultRead.IsSuccess){ RgvCommand one = new RgvCommand(); // one.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0)); one.setTaskNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); one.setTaskMode1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); if ( !command.getTaskNo1().equals(one.getTaskNo1()) || !command.getTaskMode1().equals(one.getTaskMode1()) || !command.getSourceStaNo1().equals(one.getSourceStaNo1()) || !command.getDestinationStaNo1().equals(one.getDestinationStaNo1()) ){ try{ News.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); }catch (Exception e){ try{ News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead)); }catch (Exception e1){ News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); } } News.error("Rgv命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(4, command)); Thread.sleep(100); readStatus(); return false; }else { News.info("RGV命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); } } }catch (Exception e){ News.error("RGV命令地址写入后回读出错"); } if (command.getAckFinish1() == 0) { if (result.IsSuccess) { Thread.sleep(300); //任务下发次数 int writeCount2 = 0; do { writeCount2++; short commandFinish = (short) 1; result = siemensNet.Write("DB100.10", commandFinish); if(result.IsSuccess){ //RGV任务写入后,回读一次,看是否成功 Thread.sleep(200); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.10", (short) 2); if (resultRead.IsSuccess) { commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0); if (commandFinish != 1){ News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次"); }else{ //任务命令写入成功 News.info("RGV任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次"); break; } }else { News.error("RGV任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次"); } } else { News.error("RGV任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次"); } }while (writeCount2<5); } } // if (command.getAckFinish1() == 0) { // short commandFinish = 1; //工位1任务写入 // Thread.sleep(200); // result = siemensNet.Write("DB100.10", commandFinish); // } try { // 日志记录 BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -231,12 +231,12 @@ } } BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class); //RGV小车 Thread.sleep(200); //RGV小车1 Thread.sleep(100); OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB50.200",(short)10); if (result3.IsSuccess) { BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result3.Content, 0)); if (!Cools.isEmpty(basRgvMap) && basRgvMap.getStartRoute() == 100){ if (!Cools.isEmpty(basRgvMap)){ Integer siteId = 1; StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { @@ -248,12 +248,12 @@ staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8))); } } //RGV小车 Thread.sleep(200); //RGV小车2 Thread.sleep(100); OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB50.212",(short)10); if (result4.IsSuccess) { BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result4.Content, 0)); if (!Cools.isEmpty(basRgvMap) && (basRgvMap.getStartRoute() == 161 || basRgvMap.getStartRoute() == 157)){ if (!Cools.isEmpty(basRgvMap)){ Integer siteId = 2; StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { @@ -266,6 +266,24 @@ } } //RGV小车3 Thread.sleep(100); OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB50.224",(short)10); if (result5.IsSuccess) { BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result5.Content, 0)); if (!Cools.isEmpty(basRgvMap)){ Integer siteId = 3; StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setAutoing(true); staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result5.Content, 8))); } } //条码扫描器 ArrayList<Integer> barcodeList = BarcodeList; OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.840", (short) (barcodeList.size() * 8)); src/main/resources/application.yml
@@ -198,33 +198,33 @@ devpPlcId: ${wcs-slave.devp[0].id} staNo: 103 # RGV穿梭车2 # rgv[2]: # id: 3 # ip: 10.10.10.66 # port: 502 # rack: 0 # slot: 0 # #RGV入库源站点 # rgvInSStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 100 # rgvInSStn[1]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 101 # #RGV出库源站点 # rgvOutSStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 110 # rgvOutSStn[1]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 112 # #RGV目标站点 # rgvDestStn[0]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 102 # rgvDestStn[1]: # devpPlcId: ${wcs-slave.devp[0].id} # staNo: 103 rgv[2]: id: 3 ip: 10.10.10.66 port: 502 rack: 0 slot: 0 #RGV入库源站点 rgvInSStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 100 rgvInSStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 101 #RGV出库源站点 rgvOutSStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 110 rgvOutSStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 112 #RGV目标站点 rgvDestStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 102 rgvDestStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 103 # 输送线1 devp[0]: id: 1 @@ -246,32 +246,43 @@ led: ${wcs-slave.led[1].id} # 拣料入库口1 pickSta[0]: staNo: 106 barcode: ${wcs-slave.barcode[0].id} led: ${wcs-slave.led[1].id} backSta: 105 staNo: 159 barcode: ${wcs-slave.barcode[2].id} led: ${wcs-slave.led[5].id} backSta: 160 # 入库口1 inSta[1]: staNo: 107 barcode: ${wcs-slave.barcode[1].id} backSta: 108 led: ${wcs-slave.led[1].id} led: ${wcs-slave.led[2].id} # 空板入库口1 emptyInSta[1]: staNo: 107 barcode: ${wcs-slave.barcode[1].id} backSta: 108 led: ${wcs-slave.led[1].id} # 拣料入库口1 pickSta[1]: staNo: 107 barcode: ${wcs-slave.barcode[1].id} led: ${wcs-slave.led[1].id} backSta: 108 led: ${wcs-slave.led[2].id} inSta[2]: staNo: 159 barcode: ${wcs-slave.barcode[2].id} backSta: 160 led: ${wcs-slave.led[5].id} # # 拣料入库口1 # pickSta[1]: # staNo: 107 # barcode: ${wcs-slave.barcode[1].id} # led: ${wcs-slave.led[1].id} # backSta: 108 # 出库口1 outSta[0]: staNo: 100 led: ${wcs-slave.led[0].id} outSta[1]: staNo: 152 led: ${wcs-slave.led[3].id} outSta[2]: staNo: 156 led: ${wcs-slave.led[4].id} # 条码扫描仪1 barcode[0]: @@ -291,35 +302,42 @@ # LED1 led[0]: id: 1 ip: 10.10.10.249 ip: 10.10.10.101 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 100 # LED2 led[1]: id: 2 ip: 10.10.10.248 ip: 10.10.10.102 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 106 # LED3 led[2]: id: 3 ip: 10.10.10.247 ip: 10.10.10.103 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 107 # LED4 led[3]: id: 4 ip: 10.10.10.246 ip: 10.10.10.104 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 126 staArr: 152 # LED5 led[4]: id: 5 ip: 10.10.10.245 ip: 10.10.10.105 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 134 staArr: 156 # LED6 led[5]: id: 6 ip: 10.10.10.106 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 160 src/main/resources/mapper/BasRgvMapMapper.xml
@@ -17,5 +17,9 @@ select * from asr_bas_rgv_map where rgv_no = #{rgvNo} </select> <select id="selectByOtherRgvNo" resultMap="BaseResultMap"> select * from asr_bas_rgv_map where rgv_no != #{rgvNo} </select> </mapper> src/main/webapp/static/js/console.map.js
@@ -625,11 +625,19 @@ "left": 270, "width": 6, "height": 742 },{ "type": "stn", "id": "site-3", "text": "3", "top": -20, "left": 220, "width": 60, "height": 19 }, { "type": "stn", "id": "site-2", "text": "2", "top": 398, "top": -20, "left": 220, "width": 60, "height": 19 @@ -637,7 +645,7 @@ "type": "stn", "id": "site-1", "text": "1", "top": 698, "top": -20, "left": 220, "width": 60, "height": 19 src/main/webapp/views/console.html
@@ -568,7 +568,7 @@ siteEl.html(sites[i].siteId); } if (sites[i].siteId === '1' || sites[i].siteId === '2') { if (sites[i].siteId === '1' || sites[i].siteId === '2' || sites[i].siteId === '3') { carAnimate(Number(sites[i].siteId), Number(sites[i].nearbySta)); } @@ -715,7 +715,7 @@ function carAnimate(id, target) { // debugger var targetTop = 0; if (id === 1 || id === '1' || id === '2' || id === 2) { if (id === 1 || id === '1' || id === '2' || id === 2 || id === '3' || id === 3) { switch (target) { case 1: targetTop += 792; src/main/webapp/views/rgv.html
@@ -166,10 +166,10 @@ <!-- <span>排</span>--> <!-- <label><input id="sourceRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>--> <!-- </div>--> <div class="select-container-item"> <span>工位2源站</span> <label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label> </div> <!-- <div class="select-container-item">--> <!-- <span>工位2源站</span>--> <!-- <label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>--> <!-- </div>--> <!-- <div class="select-container-item">--> <!-- <span>层</span>--> <!-- <label><input id="sourceLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>--> @@ -188,10 +188,10 @@ <!-- <span>排</span>--> <!-- <label><input id="row" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>--> <!-- </div>--> <div class="select-container-item"> <span>工位2目标站</span> <label><input id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label> </div> <!-- <div class="select-container-item">--> <!-- <span>工位2目标站</span>--> <!-- <label><input id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>--> <!-- </div>--> <!-- <div class="select-container-item">--> <!-- <span>层</span>--> <!-- <label><input id="lev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>--> @@ -206,8 +206,8 @@ <legend>手动操作</legend> <div class="button-group"> <button class="item" onclick="put()">取放货</button> <button class="item" onclick="take()">取货</button> <button class="item" onclick="stockMove()">放货</button> <!-- <button class="item" onclick="take()">取货</button>--> <!-- <button class="item" onclick="stockMove()">放货</button>--> <!-- <button class="item" onclick="siteMove()">站到站</button>--> <!-- <button class="item" onclick="bacOrigin()">回原点</button>--> <!-- <button class="item" onclick="reverseOrigin()">反原点</button>--> @@ -215,7 +215,7 @@ <button class="item" onclick="taskComplete()">任务完成</button> <!-- <button class="item" onclick="pause()">暂停</button>--> <!-- <button class="item" onclick="boot()">启动</button>--> <button class="item" onclick="clearCommand()">清除命令</button> <!-- <button class="item" onclick="clearCommand()">清除命令</button>--> <button class="item" onclick="handleReset()">复位</button> </div> </fieldset>