src/main/java/com/zy/asrs/controller/SiteController.java
@@ -2,16 +2,21 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.Cools; import com.core.common.R; import com.zy.asrs.domain.vo.PlcErrorTableVo; import com.zy.asrs.domain.vo.SiteTableVo; import com.zy.asrs.domain.vo.SteDataVo; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.BasSte; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.BasSteService; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; import com.zy.core.model.DevpSlave; import com.zy.core.model.SteSlave; import com.zy.core.model.Task; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; @@ -33,6 +38,8 @@ @RequestMapping("/site") public class SiteController { @Autowired private BasSteService basSteService; @Autowired private SlaveProperties slaveProperties; @Autowired @@ -201,5 +208,27 @@ return R.error("plc已掉线"); } @GetMapping("/detl/{steNo}") public R steDetl(@PathVariable("steNo") Integer steNo){ SteDataVo vo = new SteDataVo(); for (SteSlave ste : slaveProperties.getSte()) { if (steNo.equals(ste.getId())) { vo.setSteNo(ste.getId()); BasSte basSte = basSteService.selectById(ste.getId()); if (!Cools.isEmpty(basSte)) { vo.setRow(basSte.getRow()); vo.setBay(basSte.getBay()); vo.setLev(basSte.getLev()); vo.setCrnNo(basSte.getCrnNo()); vo.setWorkNo(basSte.getWrkNo()); vo.setPakMk(basSte.getPakMk()); } break; } } return R.ok().add(vo); } } src/main/java/com/zy/asrs/controller/SteController.java
New file @@ -0,0 +1,304 @@ package com.zy.asrs.controller; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.CrnStatusType; import com.zy.asrs.domain.param.SteModeParam; import com.zy.asrs.domain.param.SteOperatorParam; import com.zy.asrs.domain.vo.SteDataVo; import com.zy.asrs.domain.vo.SteMsgTableVo; import com.zy.asrs.domain.vo.SteStateTableVo; import com.zy.asrs.entity.BasSte; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.BasSteService; import com.zy.asrs.service.WrkMastService; import com.zy.core.News; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; import com.zy.core.enums.SteTaskModeType; import com.zy.core.model.SteSlave; import com.zy.core.model.Task; import com.zy.core.model.command.SteCommand; import com.zy.core.model.protocol.SteProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.properties.SystemProperties; import com.zy.core.thread.SteThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 穿梭车接口 * Created by vincent on 2022/3/14 */ @Slf4j @RestController @RequestMapping("/ste") public class SteController { @Autowired private SlaveProperties slaveProperties; @Autowired private BasSteService basSteService; @Autowired private WrkMastService wrkMastService; @PostMapping("/table/ste/state") @ManagerAuth(memo = "穿梭车信息表") public R steStateTable(){ List<SteStateTableVo> list = new ArrayList<>(); List<BasSte> stes = basSteService.selectList(new EntityWrapper<BasSte>().orderBy("ste_no")); for (BasSte basSte : stes) { // 表格行 SteStateTableVo vo = new SteStateTableVo(); vo.setSteNo(basSte.getSteNo()); // 穿梭车号 list.add(vo); // 获取穿梭车信息 SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, basSte.getSteNo()); if (steThread == null) { continue; } SteProtocol steProtocol = steThread.getSteProtocol(); if (steProtocol == null) { continue; } vo.setTaskNo(steProtocol.getTaskNo().intValue()); // 任务号 vo.setStatusVal(steProtocol.getMode().intValue()); // 在线状态 vo.setStatusType(steProtocol.mode == 0 ? "离线" : "在线"); // 模式状态 if (!Cools.isEmpty(steProtocol.getStatus())) { vo.setStatus(steProtocol.getStatusType().desc); // 状态 } if (!Cools.isEmpty(steProtocol.getLoad())) { vo.setLoading(steProtocol.getLoad()==1?"✔":"×"); // 有物 } if (!Cools.isEmpty(steProtocol.getWaiting())) { vo.setWaiting(steProtocol.getWaiting()?"✔":"×"); } vo.setRow(steProtocol.getRow()); vo.setBay(steProtocol.getBay()); vo.setLev(steProtocol.getLev()); vo.setCharge(steProtocol.getCharge() + "%"); if (!Cools.isEmpty(steProtocol.getLoca())) { vo.setLoca(steProtocol.getLocaType().desc); } vo.setSpeed(steProtocol.getSpeed()); vo.setCloser(steProtocol.getCloser()); if (!Cools.isEmpty(steProtocol.getPos())) { vo.setPos(steProtocol.getPos()==0?"低位":"高位"); } if (!Cools.isEmpty(steProtocol.getTrack())) { vo.setTrack(steProtocol.getTrack()==0?"✔":"×"); } if (!Cools.isEmpty(steProtocol.getChargeStatus())) { vo.setChargeStatus(steProtocol.getChargeStatus()==1?"✔":"×"); } if (!Cools.isEmpty(steProtocol.getAlarm())) { vo.setAlarm1(String.valueOf(steProtocol.getAlarm())); } if (!Cools.isEmpty(steProtocol.getAlarm0())) { vo.setAlarm2(String.valueOf(steProtocol.getAlarm0())); } } return R.ok().add(list); } @PostMapping("/table/ste/msg") @ManagerAuth(memo = "穿梭车数据表") public R steMsgTable(){ List<SteMsgTableVo> list = new ArrayList<>(); List<BasSte> stes = basSteService.selectList(new EntityWrapper<BasSte>().orderBy("ste_no")); for (BasSte basSte : stes) { // 表格行 SteMsgTableVo vo = new SteMsgTableVo(); vo.setSteNo(basSte.getSteNo()); // 穿梭车号 list.add(vo); // 获取穿梭车信息 SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, basSte.getSteNo()); if (steThread == null) { continue; } SteProtocol steProtocol = steThread.getSteProtocol(); if (steProtocol == null) { continue; } vo.setWorkNo(steProtocol.getTaskNo().intValue()); // 任务号 if (steProtocol.getTaskNo() > 0) { WrkMast wrkMast = wrkMastService.selectById(steProtocol.getTaskNo()); if (wrkMast != null) { vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc()); // 模式状态 vo.setSourceStaNo(wrkMast.getSourceStaNo$()); // 源站 vo.setStaNo(wrkMast.getStaNo$()); // 目标站 vo.setSourceLocNo(wrkMast.getSourceLocNo()); // 源库位 vo.setLocNo(wrkMast.getLocNo()); // 目标库位 } } else { vo.setStatus(steProtocol.mode == 1? CrnStatusType.MACHINE_AUTO.getDesc(): CrnStatusType.MACHINE_UN_AUTO.getDesc()); // 模式状态 } vo.setSpeed(steProtocol.getSpeed()); // 速度 vo.setCloser(steProtocol.getCloser()); // 近点距离 vo.setPakMk(steProtocol.getPakMk()); // 作业标记 } return R.ok().add(list); } @PostMapping("/output/ste") @ManagerAuth public R steOutput(){ StringBuilder str = new StringBuilder(); String s; int i = 0; while((s = OutputQueue.STE.poll()) != null && i <=10) { str.append("\n").append(s); i++; } return R.ok().add(str.toString()); } @GetMapping("/detl/{steNo}") public R steDetl(@PathVariable("steNo") Integer steNo){ SteDataVo vo = new SteDataVo(); for (SteSlave ste : slaveProperties.getSte()) { if (steNo.equals(ste.getId())) { vo.setSteNo(ste.getId()); BasSte basSte = basSteService.selectById(ste.getId()); if (!Cools.isEmpty(basSte)) { vo.setRow(basSte.getRow()); vo.setBay(basSte.getBay()); vo.setLev(basSte.getLev()); vo.setCrnNo(basSte.getCrnNo()); vo.setWorkNo(basSte.getWrkNo()); vo.setPakMk(basSte.getPakMk()); } break; } } return R.ok().add(vo); } @PostMapping("/detl/update") @ManagerAuth public R steUpdate(SteDataVo vo){ BasSte basSte = basSteService.selectById(vo.getSteNo()); if (basSte == null) { return R.error(); } // 获取穿梭车信息 SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, vo.getSteNo()); SteProtocol steProtocol = steThread.getSteProtocol(); if (steProtocol == null) { throw new CoolException(vo.getSteNo() + "号穿梭车不在线,无法保存"); } if (!Cools.isEmpty(vo.getRow(), vo.getBay(), vo.getLev())) { if (!steThread.modifyPosHandle(vo.getRow(), vo.getBay(), vo.getLev())) { throw new CoolException("服务器错误"); } } SteCommand steCommand = new SteCommand(); steCommand.setTaskNo(vo.getWorkNo()); if (MessageQueue.offer(SlaveType.Ste, vo.getSteNo(), new Task(2, steCommand))) { } else { throw new CoolException("命令下发失败"); } basSte.setRow(vo.getRow()); basSte.setBay(vo.getBay()); basSte.setLev(vo.getLev()); basSte.setPakMk(vo.getPakMk()); basSte.setWrkNo(vo.getWorkNo()); basSte.setCrnNo(vo.getCrnNo()); basSte.setUpdateTime(new Date()); if (!basSteService.updateById(basSte)) { throw new CoolException("修改失败"); } return R.ok(); } /****************************************************************/ /************************** 手动操作 ******************************/ /****************************************************************/ @PostMapping("/mode/switch") @ManagerAuth public R crnDemo(SteModeParam param) throws InterruptedException { if (Cools.isEmpty(param.getSteNo())){ return R.error(); } if (Cools.isEmpty(param.getPassword())){ return R.error("请输入口令"); } if (!param.getPassword().equals(SystemProperties.WCS_PASSWORD)){ return R.error("口令错误"); } Thread.sleep(200L); for (SteSlave steSlave : slaveProperties.getSte()) { if (steSlave.getId().equals(param.getSteNo())) { // 获取穿梭车信息 SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steSlave.getId()); SteProtocol steProtocol = steThread.getSteProtocol(); if (steProtocol == null) { continue; } SteCommand steCommand = new SteCommand(); steCommand.setSteNo(param.getSteNo()); // 穿梭车编号 if (MessageQueue.offer(SlaveType.Ste, param.getSteNo(), new Task(2, steCommand))) { return R.ok(); } else { throw new CoolException("命令下发失败"); } } } return R.ok(); } @ManagerAuth(memo = "手动操作") @PostMapping("/operator/ste") public R steOperator(SteOperatorParam param){ if (Cools.isEmpty(param.getSteNo(), param.getSteTaskMode())) { return R.parse(BaseRes.PARAM); } for (SteSlave ste : slaveProperties.getSte()) { // 获取堆垛机信息 if (param.getSteNo().equals(ste.getId())) { SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, ste.getId()); if (steThread == null) { throw new CoolException("穿梭车不在线"); } SteProtocol steProtocol = steThread.getSteProtocol(); if (steProtocol == null) { throw new CoolException("穿梭车不在线"); } SteTaskModeType steTaskModeType = SteTaskModeType.get(param.getSteTaskMode()); SteCommand steCommand = new SteCommand(); steCommand.setSteNo(ste.getId()); // 穿梭车编号 if (param.getSteTaskMode() == 16) { steCommand.setComplete(true); } else { if (steTaskModeType == null) { throw new CoolException("任务类型错误"); } steCommand.setTaskNo(param.getTaskNo()); // 工作号 steCommand.setTaskMode(steTaskModeType); } if (MessageQueue.offer(SlaveType.Ste, ste.getId(), new Task(2, steCommand))) { return R.ok(); } else { throw new CoolException("命令下发失败"); } } } return R.error(); } } src/main/java/com/zy/asrs/domain/param/SteModeParam.java
New file @@ -0,0 +1,19 @@ package com.zy.asrs.domain.param; import lombok.Data; /** * 堆垛机演示操作入参 * Created by vincent on 2020-06-03 */ @Data public class SteModeParam { private Integer steNo; // 密码口令 private String password; private Boolean opt; } src/main/java/com/zy/asrs/domain/param/SteOperatorParam.java
New file @@ -0,0 +1,32 @@ package com.zy.asrs.domain.param; import lombok.Data; /** * Created by vincent on 2020-06-02 */ @Data public class SteOperatorParam { // 穿梭车号 private Integer steNo; // 命令类型 private Short steTaskMode; // 任务号 private Integer taskNo = 0; // 目标库位-排 private Short row; // 目标库位-列 private Short bay; // 目标库位-层 private Short lev; // 所属堆垛机 private Integer crnNo; } src/main/java/com/zy/asrs/domain/vo/SteDataVo.java
New file @@ -0,0 +1,27 @@ package com.zy.asrs.domain.vo; import lombok.Data; /** * Created by vincent on 2020-06-02 */ @Data public class SteDataVo { // 穿梭车号 private Integer steNo; // 工作号 private Integer workNo; private Integer row; private Integer bay; private Integer lev; private Integer crnNo; private String pakMk; } src/main/java/com/zy/asrs/domain/vo/SteMsgTableVo.java
New file @@ -0,0 +1,50 @@ package com.zy.asrs.domain.vo; import lombok.Data; /** * Created by vincent on 2020-06-02 */ @Data public class SteMsgTableVo { // 穿梭车号 private Integer steNo; // 工作号 private Integer workNo = 0; // 状态 private String status = "-"; // 源站 private String sourceStaNo = "-"; // 目标站 private String staNo = "-"; // 源库位 private String sourceLocNo = "-"; // 目标库位 private String locNo = "-"; // 异常 private String error = ""; // 原点 private String origin = ""; // 命令 private String command = ""; // 速度 private Double speed = 0.0D; // 近点距离 public Double closer = 0.0D; // 作业标记 private String pakMk = "-"; } src/main/java/com/zy/asrs/domain/vo/SteStateTableVo.java
New file @@ -0,0 +1,92 @@ package com.zy.asrs.domain.vo; import lombok.Data; /** * Created by vincent on 2020-06-02 */ @Data public class SteStateTableVo { // 穿梭车号 private Integer steNo; // 在线状态 private Integer statusVal; // 模式 private String statusType = "-"; // 状态 private String status = "-"; // 有物 private String loading = "-"; /** * 任务号 */ public Integer taskNo; // 正在执行任务 private String execute; // 任务完成,等待WCS确认 private String waiting; // 排 private Short row; // 列 private Short bay; // 层 private Short lev; // 异常码1 private String alarm1 = "-"; // 异常码2 private String alarm2 = "-"; /** * 电池电量 */ public String charge = "-"; /** * 电池馈电 */ public String feed = "-"; /** * 当前位置 1,近点,2远点,3A点,4B点 */ public String loca = "-"; /** * 近点距离 */ public Double closer; /** * 当前速度 */ public Double speed; /** * 高低位 0,低位,1高位 */ public String pos = "-"; /** * 在轨道上 0不在,1在 */ public String track = "-"; /** * 充电状态 */ public String chargeStatus = "-"; } src/main/java/com/zy/core/MainProcess.java
@@ -57,41 +57,42 @@ // 入出库模式切换函数 // mainService.ioConvert(); // 入库 ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档 mainService.generateStoreWrkFile(); // 组托 mainService.generateStoreWrkFileSingle(); // 组托 双工位单伸 小料箱 mainService.generateStoreWrkFileLarge(); // 组托 双工位单伸 大料箱 mainService.generateStoreWrkFile0(); // WMS入库 // 出库 ===>> 堆垛机出库站到出库站 mainService.crnStnToOutStn(); // 出库 ===>> 堆垛机出库站到出库站 工位2 mainService.crnStnToOutStnTwo(); // 入出库 ===>> 堆垛机入出库作业下发 mainService.crnIoExecute(); // 入出库 ===>> 堆垛机入出库作业下发 双工位堆垛机 mainService.crnIoExecuteTwo(); // 入出库 ===>> 堆垛机入出库作业下发 双工位堆垛机 拆分执行任务下发 mainService.crnIoExecuteTwoExecute(i);//Execute if (i%2==0){ // 入库 ===>> 执行对工作档的完成操作 mainService.storeFinished(); }else { // 入库 ===>> 执行对工作档的完成操作 工位2 mainService.storeFinishedTwo(); } // // 异常信息记录 // mainService.recErr(); // 入库 ===>> 空栈板初始化入库 mainService.storeEmptyPlt(); // 入库 ===>> 空栈板初始化入库 双工位单伸 小料箱 mainService.storeEmptyPltSingle(); // 入库 ===>> 空栈板初始化入库 双工位单伸 大料箱 mainService.storeEmptyPltLarge(); // 出库 ===>> 工作档信息写入led显示器 mainService.ledExecute(); // 其他 ===>> LED显示器复位,显示默认信息 mainService.ledReset(); // mainService.generateStoreWrkFile(); // 组托 // mainService.generateStoreWrkFileSingle(); // 组托 双工位单伸 小料箱 // mainService.generateStoreWrkFileLarge(); // 组托 双工位单伸 大料箱 // mainService.generateStoreWrkFile0(); // WMS入库 // // 出库 ===>> 堆垛机出库站到出库站 // mainService.crnStnToOutStn(); // // 出库 ===>> 堆垛机出库站到出库站 工位2 // mainService.crnStnToOutStnTwo(); // // 入出库 ===>> 堆垛机入出库作业下发 // mainService.crnIoExecute(); // // 入出库 ===>> 堆垛机入出库作业下发 双工位堆垛机 // mainService.crnIoExecuteTwo(); // // 入出库 ===>> 堆垛机入出库作业下发 双工位堆垛机 拆分执行任务下发 // mainService.crnIoExecuteTwoExecute(i);//Execute // if (i%2==0){ // // 入库 ===>> 执行对工作档的完成操作 // mainService.storeFinished(); // }else { // // 入库 ===>> 执行对工作档的完成操作 工位2 // mainService.storeFinishedTwo(); // } // // //// // 异常信息记录 //// mainService.recErr(); // // 入库 ===>> 空栈板初始化入库 // mainService.storeEmptyPlt(); // // 入库 ===>> 空栈板初始化入库 双工位单伸 小料箱 // mainService.storeEmptyPltSingle(); // // 入库 ===>> 空栈板初始化入库 双工位单伸 大料箱 // mainService.storeEmptyPltLarge(); // // 出库 ===>> 工作档信息写入led显示器 // mainService.ledExecute(); // // 其他 ===>> LED显示器复位,显示默认信息 // mainService.ledReset(); /************************************JAR调度************************************/ //JarWrkMastExecute任务完成 src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -194,6 +194,9 @@ */ private void readStatus(){ try { if (true){ return; } OperateResultExOne<byte[]> result = new OperateResultExOne<byte[]>(); if (slave.getId()>2 && slave.getId()<6){ result = siemensNet.Read("DB101.0", (short) 66); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -292,6 +292,7 @@ staProtocol.setBarcodeErr(status[6]);// 扫码失败 } } if (slave.getId()==2){ Thread.sleep(200); int[] staNosRgv = {623,624,625,626}; @@ -305,20 +306,25 @@ staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setEndRow(siemensS7Net.getByteTransform().TransInt16(result.Content, 0)); // 小车目标位 try{ staProtocol.setEndRow(siemensS7Net.getByteTransform().TransInt16(resultRgv.Content, 0)); // 小车目标位 staProtocol.setNowRow(siemensS7Net.getByteTransform().TransInt16(result.Content, 2)); // 目标站 staProtocol.setNowRow(siemensS7Net.getByteTransform().TransInt16(resultRgv.Content, 2)); // 目标站 boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, 4, 1); boolean[] status = siemensS7Net.getByteTransform().TransBool(resultRgv.Content, 4, 1); staProtocol.setRGV1(status[0]); // 自动 staProtocol.setRGV2(status[1]); // 有物 staProtocol.setRGV3(status[2]); // 可入 staProtocol.setRGV4(status[3]);// staProtocol.setRGV5(status[4]); // staProtocol.setRGV6(status[5]); // 满托盘 }catch (Exception e){ System.out.println(e.getMessage()); } } } } //条码扫描器 Thread.sleep(200); src/main/java/com/zy/core/thread/SteThread.java
@@ -123,7 +123,7 @@ */ private void readStatus(){ try { OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) 22); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) 27); if (result.IsSuccess) { if (null == steProtocol) { steProtocol = new SteProtocol(); src/main/resources/application.yml
@@ -553,14 +553,14 @@ # ste1 ste[0]: id: 1 ip: 10.10.10.10 ip: 10.10.10.170 port: 502 rack: 0 slot: 0 # ste2 ste[1]: id: 2 ip: 10.10.10.10 ip: 10.10.10.175 port: 502 rack: 0 slot: 0 src/main/webapp/views/ste.html
@@ -21,17 +21,17 @@ <!-- 日志监控板 --> <div class="log-board"> <div class="command-log"> <div data-steNo="1" class="ste-command-item"> <div data-steNo="1" class="ste-command-item" style="margin-top: 30px"> <label>1#</label> <button class="demoBtn pos-btn">数据维护</button> <!-- <button id="mode-1" class="demoBtn mode-btn" > - </button>--> </div> <div data-steNo="2" class="ste-command-item"> <div data-steNo="2" class="ste-command-item" style="margin-top: 30px"> <label>2#</label> <button class="demoBtn pos-btn">数据维护</button> <!-- <button id="mode-2" class="demoBtn mode-btn" > - </button>--> </div> <div data-steNo="3" class="ste-command-item"> <div data-steNo="3" class="ste-command-item" style="margin-top: 30px"> <label>3#</label> <button class="demoBtn pos-btn">数据维护</button> <!-- <button id="mode-3" class="demoBtn mode-btn" > - </button>--> @@ -55,7 +55,7 @@ <th>定位</th> <th>充电状态</th> <th>报警信息1</th> <th>报警信息2</th> <th>设备信息</th> </tr> </thead> <tbody> @@ -109,27 +109,26 @@ <fieldset> <legend>手动操作</legend> <div class="button-group"> <button class="item" onclick="steOperator(99)">联机</button> <button class="item" onclick="steOperator(100)">脱机</button> <button class="item" onclick="steOperator(1)">向右出库</button> <button class="item" onclick="steOperator(2)">向左出库</button> <button class="item" onclick="steOperator(3)">从右入库</button> <button class="item" onclick="steOperator(4)">从左入库</button> <button class="item" onclick="steOperator(5)">左移库</button> <button class="item" onclick="steOperator(6)">右移库</button> <button class="item" onclick="steOperator(7)">去右端</button> <button class="item" onclick="steOperator(8)">去左端</button> <button class="item" onclick="steOperator(9)">右待机</button> <button class="item" onclick="steOperator(10)">左待机</button> <!-- <button class="item" onclick="steOperator(99)">联机</button>--> <!-- <button class="item" onclick="steOperator(100)">脱机</button>--> <!-- <button class="item" onclick="steOperator(1)">向左出库</button>--> <!-- <button class="item" onclick="steOperator(2)">向右出库</button>--> <!-- <button class="item" onclick="steOperator(3)">从左入库</button>--> <!-- <button class="item" onclick="steOperator(4)">从右入库</button>--> <!-- <button class="item" onclick="steOperator(5)">左移库</button>--> <!-- <button class="item" onclick="steOperator(6)">右移库</button>--> <!-- <button class="item" onclick="steOperator(8)">去左端</button>--> <!-- <button class="item" onclick="steOperator(7)">去右端</button>--> <!-- <button class="item" onclick="steOperator(10)">左待机</button>--> <!-- <button class="item" onclick="steOperator(9)">右待机</button>--> <!-- <button class="item" onclick="steOperator(11)">左搬移</button>--> <!-- <button class="item" onclick="steOperator(12)">右搬移</button>--> <!-- <button class="item" onclick="steOperator(13)">左充电</button>--> <!-- <button class="item" onclick="steOperator(14)">右充电</button>--> <button class="item" onclick="steOperator(20)">断开充电桩</button> <button class="item" onclick="steOperator(21)">小车充电结束</button> <!-- <button class="item" onclick="steOperator(17)">断开充电</button>--> <!-- <button class="item" onclick="steOperator(14)">左盘点</button>--> <!-- <button class="item" onclick="steOperator(15)">右盘点</button>--> <button class="item" onclick="steOperator(16)">任务完成</button> <!-- <button class="item" onclick="steOperator(16)">任务完成</button>--> </div> </fieldset> @@ -191,7 +190,7 @@ <button class="form-button" id="save">保存</button> <button class="form-button" id="cancel" style="background-color: #D0D0D0">取消</button> </div> </di> </div> </div> </body> </html>