20fa3d6b92c1d03365b8472b1a85bd34d03f9b88..f23352f53b2c06313ac9808c62399c7de0d44e3a
2025-06-06 lsh
*
f23352 对比 | 目录
2025-06-06 lsh
*
c3aa50 对比 | 目录
2025-06-06 lsh
*
3951ad 对比 | 目录
2025-06-06 lsh
*
ca1971 对比 | 目录
2025-06-06 lsh
*
c23950 对比 | 目录
2025-06-06 lsh
*
b40ae9 对比 | 目录
2025-06-06 lsh
*
2b3b3f 对比 | 目录
2025-06-06 lsh
*
23b4e7 对比 | 目录
2025-06-06 lsh
*
bb6bc1 对比 | 目录
2025-06-06 lsh
*
83023a 对比 | 目录
2025-06-06 lsh
*
95a871 对比 | 目录
2025-06-06 lsh
*
813e31 对比 | 目录
2025-06-06 lsh
*
9cf46e 对比 | 目录
12个文件已修改
494 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/RgvController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvErrLog.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvOpt.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/RgvTaskReportingHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/index.html 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -10,10 +10,7 @@
import com.zy.asrs.domain.vo.*;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.BasRgvErrMapper;
import com.zy.asrs.service.BasCircularShuttleService;
import com.zy.asrs.service.BasDevpPositionService;
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.MainServiceImpl;
import com.zy.asrs.utils.NumUtils;
import com.zy.asrs.utils.Utils;
@@ -57,6 +54,10 @@
    private WrkMastService wrkMastService;
    @Autowired
    private BasRgvErrMapper basRgvErrMapper;
    @Autowired
    private BasRgvErrLogService basRgvErrLogService;
    @Autowired
    private BasRgvOptService basRgvOptService;
    @Autowired
    private BasRgvService basRgvService;
    @Autowired
@@ -452,6 +453,19 @@
        return R.ok().add(result);
    }
    @PostMapping("/ring/through/task/wrk/mast/position/data/v1")
//    @ManagerAuth(memo = "作业信息")
    public R ringThroughTaskWrkMastV1(){
        List<BasRgvOpt> result = new ArrayList<>();
        for (int i = 1 ; i<11; i ++){
            BasRgvOpt basRgvOpt = basRgvOptService.selectOne(new EntityWrapper<BasRgvOpt>().eq("rgv_no", i).orderBy("id", false));
            if (basRgvOpt!=null){
                result.add(basRgvOpt);
            }
        }
        return R.ok().add(result);
    }
    @PostMapping("/task/rgv/circular/shuttle/mast/position/data")
//    @ManagerAuth(memo = "作业信息")
    public R rgvCircularShuttle(){
@@ -468,6 +482,21 @@
                        if (rgvCircularShuttleParam.getStatus()==0){
                            rgvCircularShuttleParam.setStatus$(rgvProtocol.statusType.desc);
                        }
                        if (rgvProtocol.getAlarmList().isEmpty()){
                            rgvCircularShuttleParam.setError(0);
                            rgvCircularShuttleParam.setError$("-");
                        } else {
                            StringBuilder alarmList = new StringBuilder();
                            for (Integer alarm : rgvProtocol.getAlarmList()){
                                BasRgvErr rgvErr = basRgvErrMapper.selectById(alarm);
                                alarmList.append((rgvErr==null || rgvErr.getErrName()==null)? "未知异常:"+alarm:rgvErr.getErrName());
                                if (alarm.equals(rgvProtocol.getAlarmList().get(rgvProtocol.getAlarmList().size() - 1))){
                                    break;
                                }
                                alarmList.append("---");
                            }
                            rgvCircularShuttleParam.setError$(alarmList.toString());
                        }
                    }
                }
            }
@@ -476,6 +505,19 @@
        return R.ok().add(result);
    }
    @PostMapping("/task/rgv/circular/shuttle/mast/position/data/v1")
//    @ManagerAuth(memo = "作业信息")
    public R rgvCircularShuttleV1(){
        List<BasRgvErrLog> result = new ArrayList<>();
        for (int i = 1 ; i<11; i ++){
            BasRgvErrLog basRgvErrLog = basRgvErrLogService.selectOne(new EntityWrapper<BasRgvErrLog>().eq("rgv_no", i).orderBy("id", false));
            if (basRgvErrLog!=null){
                result.add(basRgvErrLog);
            }
        }
        return R.ok().add(result);
    }
    @PostMapping("/disable/rgv/status")
//    @ManagerAuth(memo = "修改RGV状态")
src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
@@ -25,7 +25,9 @@
     * 0:正常,1:禁用
     */
    private Integer status;
    private Integer error;
    private String status$ = "未知";
    private String error$ = "-";
    private Long position = 0L;
    public RgvCircularShuttleParam(){};
src/main/java/com/zy/asrs/entity/BasRgvErrLog.java
@@ -5,11 +5,15 @@
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.core.common.SpringUtils;
import com.zy.asrs.mapper.BasRgvErrMapper;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import java.util.List;
@Data
@TableName("asr_bas_rgv_err_log")
@@ -169,6 +173,33 @@
    public BasRgvErrLog() {}
    public BasRgvErrLog(List<Integer> alarmLists , Short taskNo,Integer rgvNo) {
        BasRgvErrMapper basRgvErrMapper = SpringUtils.getBean(BasRgvErrMapper.class);
        StringBuilder alarmList = new StringBuilder();
        for (Integer alarm : alarmLists){
            BasRgvErr rgvErr = basRgvErrMapper.selectById(alarm);
            alarmList.append((rgvErr==null || rgvErr.getErrName()==null)? "未知异常:"+alarm:rgvErr.getErrName());
            if (alarm.equals(alarmLists.get(alarmLists.size() - 1))){
                this.errCode = alarm;
                break;
            }
            alarmList.append("---");
        }
        this.error = alarmList.toString();
        Date now = new Date();
        this.uuid = String.valueOf(now.getTime());
        this.wrkNo = taskNo.intValue();
        this.startTime = now;
        this.endTime = now;
        this.rgvNo = rgvNo;
        this.status = 1;
        this.createTime = now;
        this.createBy = 9999L;
        this.updateTime = now;
        this.updateBy = 9999L;
        this.memo = "异常自动记录";
    }
    public BasRgvErrLog(String uuid,Integer wrkNo,Date startTime,Date endTime,Long wrkSts,Integer ioType,Integer rgvNo,Integer plcNo,String locNo,Integer staNo,Integer sourceStaNo,String sourceLocNo,String barcode,Integer errCode,String error,Integer status,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
        this.uuid = uuid;
        this.wrkNo = wrkNo;
src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -5,6 +5,10 @@
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.RgvProtocol;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -149,6 +153,30 @@
    private String memo;
    public BasRgvOpt() {}
    public BasRgvOpt(RgvProtocol rgvProtocol, RgvCommand command) {
        Date now = new Date();
        this.wrkNo1 = rgvProtocol.getTaskNo1().intValue();
        this.rgvNo = rgvProtocol.getRgvNo();
        this.sendTime = now;
        this.mode = command.getTaskModeType1().name();
        this.sourceSta = command.getSourceStaNo1().intValue();
        this.posSta = command.getDestinationStaNo1().intValue();
        this.updateTime = now;
        this.updateBy = 9999L;
        this.memo = "任务下发自动生成指令日志";
    }
    public BasRgvOpt(RgvProtocol rgvProtocol, Long command) {
        Date now = new Date();
        this.wrkNo1 = rgvProtocol.getTaskNo1().intValue();
        this.rgvNo = rgvProtocol.getRgvNo();
        this.sendTime = now;
        this.mode = "取放货";
        this.sourceSta = rgvProtocol.getRgvPosI();
        this.posSta = command.intValue();
        this.updateTime = now;
        this.updateBy = 9999L;
        this.memo = "漫游任务触发";
    }
    public BasRgvOpt(Integer wrkNo1,Integer wrkNo2,Integer rgvNo,Date sendTime,String mode,Integer sourceRow,Integer sourceBay,Integer sourceLev,Integer sourceSta,Integer posRow,Integer posBay,Integer posLev,Integer posSta,Integer response,Date updateTime,Long updateBy,String memo) {
        this.wrkNo1 = wrkNo1;
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -234,7 +234,7 @@
                return;
            }
            long differenceInSeconds = TimeCalculatorUtils.differenceInMilliseconds(wrkMasts.get(0).getModiTime(), new Date());
            if (differenceInSeconds <= 100) {
            if (differenceInSeconds <= 1000) {
                return;
            }
@@ -270,6 +270,8 @@
            try {
                List<WrkMast> wrkMastlistA = new ArrayList<>();
                List<WrkMast> wrkMastlistB = new ArrayList<>();
                List<WrkMast> wrkMastlistC = new ArrayList<>();
                List<WrkMast> wrkMastlistD = new ArrayList<>();
                for (BasDevpPosition basDevpPosition : basDevpPositionsListUN) {
                    List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("sta_no", basDevpPosition.getDevNo()).eq("wrk_sts", 1L).orderBy("modi_time", true));
                    for (WrkMast wrkMast : wrkMastList) {
@@ -283,12 +285,22 @@
                                } else {
                                    continue;
                                }
                                long differenceInSeconds = TimeCalculatorUtils.differenceInMilliseconds(wrkMast.getModiTime(), new Date());
                                if (SortTheExecutionOfTheCarUtil.devpNoSortbj(basDevpPositionsListUN, wrkMast.getSourceStaNo(), wrkMast.getStaNo())) {
                                    sourceStaNoList.add(wrkMast.getSourceStaNo());
                                    wrkMastlistA.add(wrkMast);
                                    if (differenceInSeconds>600000){
                                        wrkMastlistA.add(wrkMast);
                                    } else {
                                        wrkMastlistC.add(wrkMast);
                                    }
                                } else {
                                    sourceStaNoList.add(wrkMast.getSourceStaNo());
                                    wrkMastlistB.add(wrkMast);
                                    if (differenceInSeconds>600000){
                                        wrkMastlistB.add(wrkMast);
                                    } else {
                                        wrkMastlistD.add(wrkMast);
                                    }
                                }
                            }
                        }
@@ -296,6 +308,8 @@
                }
                wrkMastLists.add(wrkMastlistA);
                wrkMastLists.add(wrkMastlistB);
                wrkMastLists.add(wrkMastlistC);
                wrkMastLists.add(wrkMastlistD);
//                return wrkMastLists;
                wrkMastListAll.add(wrkMastLists);
            } catch (Exception e) {
@@ -562,6 +576,9 @@
                            if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
                                //
                                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                                wrkMast.setLogErrTime(new Date());
                                wrkMast.setLogErrMemo("RGV命令下发失败,RGV号={"+rgvId+"}===>跳过");
                                wrkMastService.updateById(wrkMast);
                                break runRgv;
                            }
                            log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
@@ -602,9 +619,11 @@
                        && rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getTaskNo1() == 0
                        && rgvProtocol.getAlarm() == 0) {
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(4,devperimeter))) {
                        log.error("RGV漫游启动命令下发失败,RGV号={},任务数据={}", rgvNo, "漫游指令");
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(5,devperimeter))) {
                        log.error("RGV漫游启动命令下发失败,RGV号={},任务数据={}", rgvNo, "漫游指令,目的地:"+devperimeter);
                        break;
                    } else {
                        log.info("RGV漫游启动命令下发成功,RGV号={},任务数据={}", rgvNo, "漫游指令,目的地:"+devperimeter);
                    }
                }
            }
@@ -661,7 +680,7 @@
                                    wrkMastService.updateById(wrkMast);
                                    continue;
                                }else {
                                    log.error("工作号"+wrkMast.getWrkNo()+"任务完成信息上传处理失败");
                                    log.error("工作号"+wrkMast.getWrkNo()+"任务完成信息上传处理失败1");
                                }
                            } else {
                                //测试用
src/main/java/com/zy/asrs/task/handler/RgvTaskReportingHandler.java
@@ -47,7 +47,7 @@
                wrkMastService.updateById(wrkMast);
                return SUCCESS;
            }else {
                log.error("任务完成信息上传失败");
                log.error("工作号"+wrkMast.getWrkNo()+"任务完成信息上传处理失败2");
            }
        }catch (Exception e){
            log.error("任务完成信息上传异常!!!"+e);
src/main/java/com/zy/core/MainProcess.java
@@ -10,6 +10,7 @@
import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.Date;
/**
 * WCS主流程
@@ -51,9 +52,10 @@
                try {
                    // 间隔
                    Thread.sleep(200);
//                    System.out.println("开始:"+new Date().getTime());
                    // 系统运行状态判断
                    if (SystemProperties.WCS_RUNNING_STATUS.get()) {
                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
                        continue;
                    }
@@ -67,6 +69,8 @@
                    mainService.rgvCompleteWrkMastSta(autoZ);
                    //更新位置信息
                    mainService.updateStePosition();
//                    System.out.println("结束:"+new Date().getTime());
                } catch (Exception e) {
                    e.printStackTrace();
src/main/java/com/zy/core/ServerBootstrap.java
@@ -137,8 +137,25 @@
        @Scheduled(cron = "0 0 4 * * ?")
        public void licenseVerify() {
            int licenseVerifySignCount = 0;
            boolean licenseVerifySign = false;
            if (!new LicenseVerify().verify()){
                SystemProperties.WCS_RUNNING_STATUS.set(Boolean.FALSE);
                for (licenseVerifySignCount = 0;!licenseVerifySign && licenseVerifySignCount<10; licenseVerifySignCount++){
                    try{
                        Thread.sleep(1000);
                    }catch (Exception e){
                    }
                    if (!new LicenseVerify().verify()){
                        log.info("++++++++ 验证许可证失败 ++++++++");
                    } else {
                        log.info("++++++++ 验证许可证成功 ++++++++");
                        licenseVerifySign = true;
                    }
                }
                if (licenseVerifySignCount>10 && !licenseVerifySign){
                    SystemProperties.WCS_RUNNING_STATUS.set(Boolean.FALSE);
                }
            }
        }
    }
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -4,6 +4,9 @@
import com.zy.core.enums.*;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by vincent on 2020/8/7
 */
@@ -104,6 +107,7 @@
     * 异常码
     */
    public Short alarm;
    public List<Integer> alarmList = new ArrayList<>();
    /**
     * 心跳指令 1-2每秒切换一次
src/main/java/com/zy/core/thread/RgvThread.java
@@ -8,7 +8,9 @@
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.entity.BasRgvErrLog;
import com.zy.asrs.entity.BasRgvOpt;
import com.zy.asrs.service.BasRgvErrLogService;
import com.zy.asrs.service.BasRgvOptService;
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.utils.NumUtils;
@@ -27,7 +29,10 @@
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
/**
 * RGV线程
@@ -49,6 +54,7 @@
     */
    private boolean resetFlag2 = false;
    private boolean connectRgv = false;
    private boolean alarmChangeSign = false;
    public RgvThread(RgvSlave slave) {
        this.slave = slave;
@@ -98,13 +104,16 @@
                    step = task.getStep();
                }
                switch (step) {
                    // 读数据
                    //漫游任务完成信号
                    case 1:
//                        readStatus();
                        taskComplete();
                        break;
                    //工位1写入数据
                    case 2:
                        write((RgvCommand) task.getData());
                        RgvCommand command2 = (RgvCommand) task.getData();
                        rgvOpt(command2);
                        write(command2);
                        break;
                    // 复位
                    case 3:
@@ -118,25 +127,14 @@
                        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo1((short)0);     // 源站
                        command.setDestinationStaNo1((short)0);     // 目标站
                        rgvOpt(command);
                        write3(command);
                        break;
                    // 复位
                    case 4:
                        RgvCommand command4 = (RgvCommand) task.getData();
                        if (null == command4) {
                            command4 = new RgvCommand();
                        }
                        command4.setRgvNo(slave.getId()); // RGV编号
                        command4.setTaskNo1((short) 0); // 工作号
                        command4.setAckFinish1((short) 1);  // 任务完成确认位
                        command4.setTaskMode1(RgvTaskModeType.X_MOVE); // 任务模式
                        command4.setSourceStaNo1((short)0);     // 源站
                        command4.setDestinationStaNo1((short)0);     // 目标站
                        write3(command4);
                        break;
                    // 漫游
                    case 5:
                        write5((Long) task.getData());
                        Long aLong = (Long) task.getData();
                        rgvOpt(aLong);
                        write5(aLong);
                        break;
                    default:
                        break;
@@ -250,6 +248,7 @@
            OperateResultExOne<byte[]> result = siemensNet.Read("DB100.0", (short) 20);
            OperateResultExOne<byte[]> resultV = siemensNet.Read("DB20.16", (short) 2);
            OperateResultExOne<byte[]> resultE = siemensNet.Read("DB20.26", (short) 2);
            OperateResultExOne<byte[]> resultError = siemensNet.Read("DB13.0", (short) 13);
            if (result.IsSuccess && resultV.IsSuccess && resultE.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
@@ -266,8 +265,21 @@
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransUInt32(result.Content, 16));
                rgvProtocol.setInstantaneousSpeed(Double.valueOf(siemensNet.getByteTransform().TransInt16(resultV.Content, 0)));
                rgvProtocol.setEndStaM(siemensNet.getByteTransform().TransInt16(resultE.Content, 0));
                boolean[] statusAlarmList = siemensNet.getByteTransform().TransBool(resultError.Content, 0, 13);
                int alarmCount = 0;
                List<Integer> alarmList = new ArrayList<>();
                for (boolean alarmSign : statusAlarmList){
                    alarmCount++;
                    if (alarmSign){
                        alarmList.add(alarmCount);
                    }
                }
                alarmChangeSign = new HashSet<>(alarmList).equals(new HashSet<>(rgvProtocol.getAlarmList()));
                rgvProtocol.setAlarmList(alarmList);
//                rgvProtocol.setRgvPos((long)NumUtils.GetRandomIntInRange(1737000));
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                try {
                    // 根据实时信息更新数据库
@@ -279,6 +291,16 @@
                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){
                        log.error("RGV plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                    }
                    try{
                        if (!alarmChangeSign && !alarmList.isEmpty()){
                            BasRgvErrLogService basRgvErrLogService = SpringUtils.getBean(BasRgvErrLogService.class);
                            BasRgvErrLog basRgvErrLog = new BasRgvErrLog(rgvProtocol.getAlarmList(), rgvProtocol.getTaskNo1(), rgvProtocol.getRgvNo());
                            basRgvErrLogService.insert(basRgvErrLog);
                        }
                    } catch (Exception e){
                        log.error("RGV异常信息保存失败!!");
                    }
                } catch (Exception ignore) {
                }
@@ -299,6 +321,24 @@
    /**
     * 工位1写入数据
     */
    private void rgvOpt(RgvCommand command) {
        try{
            BasRgvOptService basRgvOptService = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(rgvProtocol, command);
            basRgvOptService.insert(basRgvOpt);
        }catch (Exception e){
            log.error("RGV写入命令保存失败!!");
        }
    }
    private void rgvOpt(Long command) {
        try{
            BasRgvOptService basRgvOptService = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(rgvProtocol, command);
            basRgvOptService.insert(basRgvOpt);
        }catch (Exception e){
            log.error("RGV写入命令保存失败!!");
        }
    }
    private boolean write(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
@@ -361,12 +401,33 @@
            return false;
        }
    }
    /**
     * 完成
     */
    private void taskComplete() {
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB24.11", (short) 1);
            boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 0, 1);
            if (status[0]){
                OperateResult result4 = siemensNet.Write("DB24.11.0", false);
            }
        } catch (Exception e) {
            log.error("RGV数据任务下发复位线程异常!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }
    private void write5(Long devperimeter){
        try {
            siemensNet.Write("DB24.10.0", false);
            siemensNet.Write("DB24.10.0", devperimeter.intValue());
        } catch (Exception ignore) {}
            siemensNet.Write("DB24.12", devperimeter.intValue());
            Thread.sleep(10L);
            siemensNet.Write("DB24.11.0", true);
        } catch (Exception ignore) {
            log.error("写入RGV plc工位1漫游数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }
    private boolean write3(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
src/main/resources/application.yml
@@ -57,7 +57,7 @@
  # 小车数
  rgvCount: 10
  # 延迟时间
  rgvDate: 1
  rgvDate: 0.5
# 下位机配置
wcs-slave:
src/main/webapp/views/index.html
@@ -100,9 +100,35 @@
            z-index: 1000; /* 确保在其他元素之上 */
        }
        .task-bar-left1 {
            position: fixed;
            top: 8%;
            /*transform: translateY(-50%);*/
            width: 25%; /* 设置宽度 */
            background-color: rgba(255, 255, 255, 0); /* 半透明背景 */
            border-radius: 5px;
            padding: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0);
            z-index: 1000; /* 确保在其他元素之上 */
        }
        .task-bar-right {
            position: fixed;
            top: 1%;
            /*transform: translateY(-50%);*/
            width: 25%; /* 设置宽度 */
            background-color: rgba(255, 255, 255, 0); /* 半透明背景 */
            border-radius: 5px;
            padding: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0);
            z-index: 1000; /* 确保在其他元素之上 */
        }
        .task-bar-right1 {
            position: fixed;
            top: 5%;
            /*transform: translateY(-50%);*/
            width: 25%; /* 设置宽度 */
            background-color: rgba(255, 255, 255, 0); /* 半透明背景 */
@@ -317,6 +343,50 @@
                </el-table>
            </div>
        </div>
        <div class="task-bar-left1 left-task-bar" >
            <div>
                <el-tooltip :content="'Switch value: ' + valueLeft1" placement="top">
                    <el-switch
                            v-model="valueLeft1"
                            active-color="#13ce66"
                            inactive-color="#ff4949"
                            active-value="100"
                            inactive-value="0">
                    </el-switch>
                </el-tooltip>
            </div>
            <div v-if="valueLeft1 === '100' " class="task-bar-div1">
                <el-table
                        :data="tableDataLeft1"
                        style="width: 100%"
                        :row-class-name="tableRowClassName">
                    <el-table-column
                            prop="wrkNo1"
                            label="工作号">
                    </el-table-column>
                    <el-table-column
                            prop="rgvNo"
                            label="RGV号">
                    </el-table-column>
                    <el-table-column
                            prop="sendTime"
                            label="下发时间">
                    </el-table-column>
                    <el-table-column
                            prop="mode"
                            label="类型">
                    </el-table-column>
                    <el-table-column
                            prop="sourceSta"
                            label="起点">
                    </el-table-column>
                    <el-table-column
                            prop="posSta"
                            label="终点">
                    </el-table-column>
                </el-table>
            </div>
        </div>
        <!-- Right Task Bar -->
        <div class="task-bar-right right-task-bar">
@@ -354,6 +424,10 @@
                            label="状态">
                    </el-table-column>
                    <el-table-column
                            prop="error$"
                            label="异常">
                    </el-table-column>
                    <el-table-column
                            label="操作"
                            type="template">
                        <template slot-scope="scope">
@@ -368,6 +442,38 @@
                </el-table>
            </div>
        </div>
        <div class="task-bar-right1 right-task-bar">
            <div>
                <el-tooltip :content="'Switch value: ' + valueRight1" placement="top">
                    <el-switch
                            v-model="valueRight1"
                            active-color="#13ce66"
                            inactive-color="#ff4949"
                            active-value="100"
                            inactive-value="0">
                    </el-switch>
                </el-tooltip>
            </div>
            <div v-if="valueRight1 === '100' " class="task-bar-div1">
                <el-table
                        :data="tableDataRight1"
                        style="width: 100%"
                        :row-class-name="tableRowClassName">
                    <el-table-column
                            prop="rgvNo"
                            label="小车号">
                    </el-table-column>
                    <el-table-column
                            prop="error"
                            label="异常">
                    </el-table-column>
                    <el-table-column
                            prop="createTime$"
                            label="记录日期">
                    </el-table-column>
                </el-table>
            </div>
        </div>
    </div>
    <script>
@@ -376,7 +482,9 @@
            data: {
                activeNames: ['1'],
                valueLeft: '0',
                valueLeft1: '0',
                valueRight: '0',
                valueRight1: '0',
                licenseDay: '已过期',
                licenseDayI: 100,
                valueSystem: false,
@@ -384,7 +492,9 @@
                tableDataDev: [],
                energyGatheringRing: [],
                tableDataLeft: [],
                tableDataLeft1: [],
                tableDataRight: [],
                tableDataRight1: [],
                devpPos1:[
                    {dev_no: 116,pos:633980},
                    {dev_no: 117,pos:604043},
@@ -439,7 +549,9 @@
                    this.getTableDataDev()
                    this.getTableDataTrack()
                    this.getTableDataLeft()
                    this.getTableDataLeft1()
                    this.getTableDataRight()
                    this.getTableDataRight1()
                    this.getValueSystem()
                    this.getLicenseDays()
@@ -448,11 +560,29 @@
                        this.getTableDataDev()
                        this.getTableDataTrack()
                        this.getTableDataLeft()
                        this.getTableDataLeft1()
                        this.getTableDataRight()
                        this.getTableDataRight1()
                        this.getValueSystem()
                        this.getLicenseDays()
                    }, 1000)
                },
                verifyPassword(callback) {
                    this.$prompt('请输入管理员密码: root', '验证', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        inputType: 'password',
                        inputPattern: /^root$/,
                        inputErrorMessage: '密码错误'
                    }).then(({ value }) => {
                        if (value === 'root') {
                            callback();
                        }
                    }).catch(() => {
                        this.$message.info('已取消操作');
                    });
                },
                handleChange(val) {
                    console.log(val);
@@ -463,6 +593,18 @@
                        if (val.length >= 1){
                            this.handleChangeValueRight(1)
                        }
                    }
                },
                handleChange1(val) {
                    console.log(val);
                    if (val.length === 0){
                        valueRight1 = '0';
                    } else {
                        console.log("2222"+val);
                        if (val.length >= 1){
                            this.handleChangeValueRight1(1)
                        }
                    }
                },
@@ -537,6 +679,22 @@
                            valueRight = '0';
                    }
                },
                handleChangeValueRight1(val) {
                    console.log("33333"+val);
                    switch (val){
                        case 1:
                            valueRight1 = '100';
                        case 2:
                            valueRight1 = '100';
                        case 3:
                            valueRight1 = '100';
                        case 4:
                            valueRight1 = '100';
                        default:
                            valueRight1 = '0';
                    }
                },
                tableRowClassName({row, rowIndex}) {
                    if (rowIndex === 1) {
                        return 'warning-row';
@@ -586,20 +744,22 @@
                },
                upDateValueSystem(){
                    let that = this;
                    let operatorTypeI = 0;
                    if (that.valueSystem){
                        operatorTypeI = 1;
                    }
                    $.ajax({
                        url: baseUrl + "/console/system/switch",
                        headers: {'token': localStorage.getItem('token')},
                        data: {operatorType : operatorTypeI},
                        method: 'POST',
                        success: function (res) {
                            if (res.code === 200) {
                                that.valueSystem = res.data.status;
                            }
                    this.verifyPassword(() => {
                        let operatorTypeI = 0;
                        if (that.valueSystem){
                            operatorTypeI = 1;
                        }
                        $.ajax({
                            url: baseUrl + "/console/system/switch",
                            headers: {'token': localStorage.getItem('token')},
                            data: {operatorType : operatorTypeI},
                            method: 'POST',
                            success: function (res) {
                                if (res.code === 200) {
                                    that.valueSystem = res.data.status;
                                }
                            }
                        });
                    });
                },
                getTableDataLeft() {
@@ -618,6 +778,22 @@
                        }
                    });
                },
                getTableDataLeft1() {
                    let that = this;
                    $.ajax({
                        url: baseUrl + "/rgv/ring/through/task/wrk/mast/position/data/v1",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
                        data: {},
                        dataType: 'json',
                        contentType: 'application/json;charset=UTF-8',
                        method: 'post',
                        success: function (res) {
                            that.tableDataLeft1 = res.data
                        }
                    });
                },
                getTableDataRight() {
                    let that = this;
                    $.ajax({
@@ -634,6 +810,22 @@
                        }
                    });
                },
                getTableDataRight1() {
                    let that = this;
                    $.ajax({
                        url: baseUrl + "/rgv/task/rgv/circular/shuttle/mast/position/data/v1",
                        headers: {
                            'token': localStorage.getItem('token')
                        },
                        data: {},
                        dataType: 'json',
                        contentType: 'application/json;charset=UTF-8',
                        method: 'post',
                        success: function (res) {
                            that.tableDataRight1 = res.data
                        }
                    });
                },
                getTableDataRgv() {
                    let that = this;
                    // that.tableDataRgv = busPsto