自动化立体仓库 - WCS系统
#
lsh
2024-06-26 9e5f9371ed18a317eb5fcbbd94bc174837e561a3
#
6个文件已添加
7个文件已修改
878 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/SiteController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/SteController.java 304 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/SteModeParam.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/SteOperatorParam.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SteDataVo.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SteMsgTableVo.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SteStateTableVo.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SteThread.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/ste.html 223 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,21 +306,26 @@
                        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);
                    staProtocol.setRGV1(status[0]);  // 自动
                    staProtocol.setRGV2(status[1]);  // 有物
                    staProtocol.setRGV3(status[2]); // 可入
                    staProtocol.setRGV4(status[3]);//
                    staProtocol.setRGV5(status[4]);  //
                    staProtocol.setRGV6(status[5]);  // 满托盘
                        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);
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.840",(short)(barcodeSize*8));
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
@@ -13,135 +13,134 @@
    <script type="text/javascript" src="../static/js/common.js"></script>
</head>
<body>
    <div style="padding: 10px;height: 100%;float: left;width: 6%">
        <div class="button-window"></div>
    </div>
    <div style="height: 100%;padding-left: 6%">
        <div style="padding: 10px;height: 100%">
            <!-- 日志监控板 -->
            <div class="log-board">
                <div class="command-log">
                    <div data-steNo="1" class="ste-command-item">
                        <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">
                        <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">
                        <label>3#</label>
                        <button class="demoBtn pos-btn">数据维护</button>
<!--                        <button id="mode-3" class="demoBtn mode-btn" > - </button>-->
                    </div>
<div style="padding: 10px;height: 100%;float: left;width: 6%">
    <div class="button-window"></div>
</div>
<div style="height: 100%;padding-left: 6%">
    <div style="padding: 10px;height: 100%">
        <!-- 日志监控板 -->
        <div class="log-board">
            <div class="command-log">
                <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 class="ste-state">
                    <table id="ste-state-table">
                        <thead>
                            <tr>
                                <th>穿梭车</th>
                                <th>模式</th>
                                <th>状态</th>
                                <th>有物</th>
                                <th>在轨</th>
                                <th>电量</th>
                                <th>排</th>
                                <th>列</th>
                                <th>层</th>
                                <th>等待WCS确认</th>
                                <th>定位</th>
                                <th>充电状态</th>
                                <th>报警信息1</th>
                                <th>报警信息2</th>
                            </tr>
                        </thead>
                        <tbody>
                        </tbody>
                    </table>
                <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" style="margin-top: 30px">
                    <label>3#</label>
                    <button class="demoBtn pos-btn">数据维护</button>
                    <!--                        <button id="mode-3" class="demoBtn mode-btn" > - </button>-->
                </div>
            </div>
            <!-- 穿梭车状态 -->
            <div class="ste-msg">
                <table id="ste-msg-table">
            <!-- 堆垛机状态位信息 -->
            <div class="ste-state">
                <table id="ste-state-table">
                    <thead>
                        <tr>
                            <th>穿梭车</th>
                            <th>工作号</th>
                            <th>状态</th>
                            <th>源站</th>
                            <th>目标站</th>
                            <th>源库位</th>
                            <th>目标库位</th>
                            <th>速度</th>
                            <th>近点距离</th>
                            <th>作业标记</th>
                        </tr>
                    <tr>
                        <th>穿梭车</th>
                        <th>模式</th>
                        <th>状态</th>
                        <th>有物</th>
                        <th>在轨</th>
                        <th>电量</th>
                        <th>排</th>
                        <th>列</th>
                        <th>层</th>
                        <th>等待WCS确认</th>
                        <th>定位</th>
                        <th>充电状态</th>
                        <th>报警信息1</th>
                        <th>设备信息</th>
                    </tr>
                    </thead>
                    <tbody>
                    </tbody>
                </table>
            </div>
            <!-- 手动操作 -->
            <div class="ste-operation">
                <!-- 遮罩层 -->
                <div class="ste-operation-shade">
        </div>
        <!-- 穿梭车状态 -->
        <div class="ste-msg">
            <table id="ste-msg-table">
                <thead>
                <tr>
                    <th>穿梭车</th>
                    <th>工作号</th>
                    <th>状态</th>
                    <th>源站</th>
                    <th>目标站</th>
                    <th>源库位</th>
                    <th>目标库位</th>
                    <th>速度</th>
                    <th>近点距离</th>
                    <th>作业标记</th>
                </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        </div>
        <!-- 手动操作 -->
        <div class="ste-operation">
            <!-- 遮罩层 -->
            <div class="ste-operation-shade">
                    <span class="ste-operation-shade-span">
                        WCS 系统运行中,请停止后操作
                    </span>
                </div>
                <!-- 设备任务选择 -->
                <div class="task-select">
                    <!-- 选择 -->
                    <div id="ste-select" class="operator-item">
                        <span class="select-title">穿梭车号</span>
                        <div class="select-container">
                            <label><input type="radio" name="steSelect" value="1" checked>&nbsp;1号穿梭车</label>
                            <label><input type="radio" name="steSelect" value="2">&nbsp;2号穿梭车</label>
                            <label><input type="radio" name="steSelect" value="3">&nbsp;3号穿梭车</label>
                        </div>
            </div>
            <!-- 设备任务选择 -->
            <div class="task-select">
                <!-- 选择 -->
                <div id="ste-select" class="operator-item">
                    <span class="select-title">穿梭车号</span>
                    <div class="select-container">
                        <label><input type="radio" name="steSelect" value="1" checked>&nbsp;1号穿梭车</label>
                        <label><input type="radio" name="steSelect" value="2">&nbsp;2号穿梭车</label>
                        <label><input type="radio" name="steSelect" value="3">&nbsp;3号穿梭车</label>
                    </div>
                </div>
                <!-- 设备任务操作 -->
                <div class="task-operator">
                    <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(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(14)">左盘点</button>-->
<!--                            <button class="item" onclick="steOperator(15)">右盘点</button>-->
                            <button class="item" onclick="steOperator(16)">任务完成</button>
                        </div>
                    </fieldset>
                </div>
            </div>
            <!-- 穿梭车日志输出 -->
            <div class="ste-output-board">
                <textarea id="ste-output"></textarea>
            <!-- 设备任务操作 -->
            <div class="task-operator">
                <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(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(17)">断开充电</button>-->
                        <!--                            <button class="item" onclick="steOperator(14)">左盘点</button>-->
                        <!--                            <button class="item" onclick="steOperator(15)">右盘点</button>-->
<!--                        <button class="item" onclick="steOperator(16)">任务完成</button>-->
                    </div>
                </fieldset>
            </div>
        </div>
        <!-- 穿梭车日志输出 -->
        <div class="ste-output-board">
            <textarea id="ste-output"></textarea>
        </div>
    </div>
</div>
    <div id="ste-detl" style="display: none">
        <div>
@@ -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>