自动化立体仓库 - WCS系统
#
Junjie
2023-12-07 a05a58973d6dc855bfb203ee16189d48238fea62
#
19个文件已添加
10个文件已修改
1937 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasRgv.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvOpt.java 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasRgvMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasRgvOptMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasRgvOptService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasRgvService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasRgvOptServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/RgvThread.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvModeType.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvStatusType.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvTaskModeType.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvWalkPosType.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/SlaveType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/RgvSlave.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/RgvCommand.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/properties/SlaveProperties.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ZyRgvThread.java 402 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasRgvMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasRgvOptMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgv.java
New file
@@ -0,0 +1,236 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_bas_rgv")
public class BasRgv implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * RGV编号
     */
    @ApiModelProperty(value= "RGV编号")
    @TableId(value = "rgv_no", type = IdType.INPUT)
    @TableField("rgv_no")
    private Integer rgvNo;
    /**
     * 模式
     */
    @ApiModelProperty(value= "模式")
    private Integer mode;
    /**
     * 状态
     */
    @ApiModelProperty(value= "状态")
    private Integer status;
    /**
     * 工位1工作号
     */
    @ApiModelProperty(value= "工位1工作号")
    @TableField("task_no1")
    private Integer taskNo1;
    /**
     * 工位1有物信号
     */
    @ApiModelProperty(value= "工位1有物信号")
    private Integer loaded1;
    /**
     * RGV当前位置
     */
    @ApiModelProperty(value= "RGV当前位置")
    @TableField("rgv_pos")
    private Integer rgvPos;
    /**
     * 走行在定位
     */
    @ApiModelProperty(value= "走行在定位")
    @TableField("walk_pos")
    private Integer walkPos;
    /**
     * 工位2工作号
     */
    @ApiModelProperty(value= "工位2工作号")
    @TableField("task_no2")
    private Integer taskNo2;
    /**
     * 工位2有物信号
     */
    @ApiModelProperty(value= "工位2有物信号")
    private Integer loaded2;
    /**
     * 工位1任务完成信号
     */
    @ApiModelProperty(value= "工位1任务完成信号")
    @TableField("task_finish1")
    private Integer taskFinish1;
    /**
     * 工位2任务完成信号
     */
    @ApiModelProperty(value= "工位2任务完成信号")
    @TableField("task_finish2")
    private Integer taskFinish2;
    /**
     * 异常码
     */
    @ApiModelProperty(value= "异常码")
    private Integer alarm;
    /**
     * 心跳
     */
    @ApiModelProperty(value= "心跳")
    private Integer heart;
    /**
     * 备用1
     */
    @ApiModelProperty(value= "备用1")
    private Integer temp1;
    /**
     * 备用2
     */
    @ApiModelProperty(value= "备用2")
    private Integer temp2;
    /**
     * 备用3
     */
    @ApiModelProperty(value= "备用3")
    private Integer temp3;
    /**
     * 备用4
     */
    @ApiModelProperty(value= "备用4")
    private Integer temp4;
    /**
     * 备用5
     */
    @ApiModelProperty(value= "备用5")
    private Integer temp5;
    /**
     * 创建时间
     */
    @ApiModelProperty(value= "创建时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 创建人员
     */
    @ApiModelProperty(value= "创建人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * 更新时间
     */
    @ApiModelProperty(value= "更新时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 更新人员
     */
    @ApiModelProperty(value= "更新人员")
    @TableField("update_by")
    private Long updateBy;
    public BasRgv() {}
    public BasRgv(Integer rgvNo,Integer mode,Integer status,Integer taskNo1,Integer loaded1,Integer rgvPos,Integer walkPos,Integer taskNo2,Integer loaded2,Integer taskFinish1,Integer taskFinish2,Integer alarm,Integer heart,Integer temp1,Integer temp2,Integer temp3,Integer temp4,Integer temp5,Date createTime,Long createBy,Date updateTime,Long updateBy) {
        this.rgvNo = rgvNo;
        this.mode = mode;
        this.status = status;
        this.taskNo1 = taskNo1;
        this.loaded1 = loaded1;
        this.rgvPos = rgvPos;
        this.walkPos = walkPos;
        this.taskNo2 = taskNo2;
        this.loaded2 = loaded2;
        this.taskFinish1 = taskFinish1;
        this.taskFinish2 = taskFinish2;
        this.alarm = alarm;
        this.heart = heart;
        this.temp1 = temp1;
        this.temp2 = temp2;
        this.temp3 = temp3;
        this.temp4 = temp4;
        this.temp5 = temp5;
        this.createTime = createTime;
        this.createBy = createBy;
        this.updateTime = updateTime;
        this.updateBy = updateBy;
    }
//    BasRgv basRgv = new BasRgv(
//            null,    // RGV编号[非空]
//            null,    // 模式
//            null,    // 状态
//            null,    // 工位1工作号
//            null,    // 工位1有物信号
//            null,    // RGV当前位置
//            null,    // 走行在定位
//            null,    // 工位2工作号
//            null,    // 工位2有物信号
//            null,    // 工位1任务完成信号
//            null,    // 工位2任务完成信号
//            null,    // 异常码
//            null,    // 心跳
//            null,    // 备用1
//            null,    // 备用2
//            null,    // 备用3
//            null,    // 备用4
//            null,    // 备用5
//            null,    // 创建时间
//            null,    // 创建人员
//            null,    // 更新时间
//            null    // 更新人员
//    );
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
}
src/main/java/com/zy/asrs/entity/BasRgvOpt.java
New file
@@ -0,0 +1,207 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_bas_rgv_opt")
public class BasRgvOpt implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value= "")
    @TableId(value = "id", type = IdType.INPUT)
    private Long id;
    /**
     * RGV编号
     */
    @ApiModelProperty(value= "RGV编号")
    @TableField("rgv_no")
    private Integer rgvNo;
    /**
     * 任务完成确认位
     */
    @ApiModelProperty(value= "任务完成确认位")
    @TableField("ack_finish")
    private Integer ackFinish;
    /**
     * 工位1工作号
     */
    @ApiModelProperty(value= "工位1工作号")
    @TableField("task_no1")
    private Integer taskNo1;
    /**
     * 工位1模式
     */
    @ApiModelProperty(value= "工位1模式")
    @TableField("task_mode1")
    private Integer taskMode1;
    /**
     * 工位1源站
     */
    @ApiModelProperty(value= "工位1源站")
    @TableField("source_sta_no1")
    private Integer sourceStaNo1;
    /**
     * 工位1目标站
     */
    @ApiModelProperty(value= "工位1目标站")
    @TableField("destination_sta_no_1")
    private Integer destinationStaNo1;
    /**
     * 工位2工作号
     */
    @ApiModelProperty(value= "工位2工作号")
    @TableField("task_no2")
    private Integer taskNo2;
    /**
     * 工位2模式
     */
    @ApiModelProperty(value= "工位2模式")
    @TableField("task_mode2")
    private Integer taskMode2;
    /**
     * 工位2源站
     */
    @ApiModelProperty(value= "工位2源站")
    @TableField("source_sta_no2")
    private Integer sourceStaNo2;
    /**
     * 工位2目标站
     */
    @ApiModelProperty(value= "工位2目标站")
    @TableField("destination_sta_no2")
    private Integer destinationStaNo2;
    /**
     * 任务确认
     */
    @ApiModelProperty(value= "任务确认")
    private Integer command;
    /**
     * 创建时间
     */
    @ApiModelProperty(value= "创建时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 创建人员
     */
    @ApiModelProperty(value= "创建人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * 更新时间
     */
    @ApiModelProperty(value= "更新时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 更新人员
     */
    @ApiModelProperty(value= "更新人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * 响应结果 1: 正常  0: 失败
     */
    @ApiModelProperty(value= "响应结果 1: 正常  0: 失败  ")
    private Integer response;
    public BasRgvOpt() {}
    public BasRgvOpt(Integer rgvNo,Integer ackFinish,Integer taskNo1,Integer taskMode1,Integer sourceStaNo1,Integer destinationStaNo1,Integer taskNo2,Integer taskMode2,Integer sourceStaNo2,Integer destinationStaNo2,Integer command,Date createTime,Long createBy,Date updateTime,Long updateBy,Integer response) {
        this.rgvNo = rgvNo;
        this.ackFinish = ackFinish;
        this.taskNo1 = taskNo1;
        this.taskMode1 = taskMode1;
        this.sourceStaNo1 = sourceStaNo1;
        this.destinationStaNo1 = destinationStaNo1;
        this.taskNo2 = taskNo2;
        this.taskMode2 = taskMode2;
        this.sourceStaNo2 = sourceStaNo2;
        this.destinationStaNo2 = destinationStaNo2;
        this.command = command;
        this.createTime = createTime;
        this.createBy = createBy;
        this.updateTime = updateTime;
        this.updateBy = updateBy;
        this.response = response;
    }
//    BasRgvOpt basRgvOpt = new BasRgvOpt(
//            null,    // [非空]
//            null,    // RGV编号
//            null,    // 任务完成确认位
//            null,    // 工位1工作号
//            null,    // 工位1模式
//            null,    // 工位1源站
//            null,    // 工位1目标站
//            null,    // 工位2工作号
//            null,    // 工位2模式
//            null,    // 工位2源站
//            null,    // 工位2目标站
//            null,    // 任务确认
//            null,    // 创建时间
//            null,    // 创建人员
//            null,    // 更新时间
//            null,    // 更新人员
//            null    // 响应结果
//    );
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public String getResponse$(){
        if (null == this.response){ return null; }
        switch (this.response){
            case 1:
                return "正常";
            case 0:
                return "失败";
            default:
                return String.valueOf(this.response);
        }
    }
}
src/main/java/com/zy/asrs/mapper/BasRgvMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasRgv;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasRgvMapper extends BaseMapper<BasRgv> {
}
src/main/java/com/zy/asrs/mapper/BasRgvOptMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasRgvOpt;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasRgvOptMapper extends BaseMapper<BasRgvOpt> {
}
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -122,4 +122,7 @@
    List<WrkMast> selectLaneWrkMastIn();//查询入库任务
    List<WrkMast> selectLaneWrkMastOut();//查询出库任务
    WrkMast selectByWrkNo(Integer wrkNo);
}
src/main/java/com/zy/asrs/service/BasRgvOptService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasRgvOpt;
import com.baomidou.mybatisplus.service.IService;
public interface BasRgvOptService extends IService<BasRgvOpt> {
}
src/main/java/com/zy/asrs/service/BasRgvService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasRgv;
import com.baomidou.mybatisplus.service.IService;
public interface BasRgvService extends IService<BasRgv> {
}
src/main/java/com/zy/asrs/service/impl/BasRgvOptServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasRgvOptMapper;
import com.zy.asrs.entity.BasRgvOpt;
import com.zy.asrs.service.BasRgvOptService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basRgvOptService")
public class BasRgvOptServiceImpl extends ServiceImpl<BasRgvOptMapper, BasRgvOpt> implements BasRgvOptService {
}
src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasRgvMapper;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.service.BasRgvService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basRgvService")
public class BasRgvServiceImpl extends ServiceImpl<BasRgvMapper, BasRgv> implements BasRgvService {
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -27,18 +27,18 @@
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.*;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.LedSlave;
import com.zy.core.model.Task;
import com.zy.core.model.*;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.LedThread;
import com.zy.core.thread.SiemensDevpThread;
import com.zy.core.thread.ZyRgvThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -483,8 +483,13 @@
                            continue;
                        }
                        // 更新工作档状态为14失败
                        wrkMast.setWrkSts(14L);
                        if (crnStn.getStaNo() == 1016 || crnStn.getStaNo() == 1019) {
                            // 更新工作档状态为13.RGV搬运中
                            wrkMast.setWrkSts(13L);
                        }else {
                            // 更新工作档状态为14
                            wrkMast.setWrkSts(14L);
                        }
                        wrkMast.setCrnEndTime(new Date());
                        if (wrkMastMapper.updateById(wrkMast) != 0) {
                            // 复位堆垛机
@@ -1950,16 +1955,259 @@
    }
    public synchronized void outOfDevp() {
        List<WrkMast> wrkMasts = wrkMastMapper.selectPick();
        for (WrkMast wrkMast : wrkMasts) {
            if (basDevpService.selectCount(new EntityWrapper<BasDevp>().eq("wrk_no", wrkMast.getWrkNo())) == 0) {
                wrkMast.setCtnNo("Y");
                if (wrkMastMapper.updateById(wrkMast) == 0) {
                    log.error("修改{}工作档失败,ctn_no", wrkMast.getWrkNo());
    //RGV搬运
    public synchronized void rgvIoExecute() {
        for (RgvSlave slave : slaveProperties.getRgv()) {
            ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getId());
            if (rgvThread == null) {
                return;
            }
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                return;
            }
            // 判断RGV是否空闲
            if (rgvProtocol.getModeType() == RgvModeType.COMPUTER
                    && rgvProtocol.getStatusType() == RgvStatusType.IDLE) {
                // 如果最近一次是入库模式,则优先扫描出库站点
                if (rgvProtocol.getLastIo().equals("I")) {
                    this.rgvOutExecute(rgvThread, rgvProtocol);//出库
                    rgvProtocol.setLastIo("O");
                }else {
                    this.rgvInExecute(rgvThread, rgvProtocol);//入库
                    rgvProtocol.setLastIo("I");
                }
                //检查是否存在工位1任务超时没下发
                if (rgvProtocol.getTaskNo1() > 0 && rgvProtocol.getTaskNo2() == 0) {
                    if (System.currentTimeMillis() - rgvProtocol.getTask1SendTime() > (1000*60)) {
                        //工位1下发时间超过60s
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号
                        rgvCommand.setCommand((short) 1);//工位1确认
                        if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(4, rgvCommand))) {
                            log.error("RGV确认命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                            return;
                        }
                        log.error("RGV确认命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                    }
                }
            }
        }
    }
    //rgv入库
    public synchronized void rgvInExecute(ZyRgvThread rgvThread, RgvProtocol rgvProtocol) {
        for (RgvSlave.Sta sta : rgvThread.getSlave().getInStn()) {
            if (rgvProtocol.getTaskNo1() > 0) {
                //检测rgv工位1是否为入库任务
                WrkMast wrkMast1 = wrkMastMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue());
                if (wrkMast1.getWrkSts() > 100) {
                    continue;//出库任务跳过
                }
            }
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, sta.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(sta.getSourceStaNo());
            //判断输送线是否自动、有物、可入、有工作号
            if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isOutEnable() && (staProtocol.getWorkNo() > 0))) {
                continue;
            }
            //搜索工作档
            WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo().intValue());
            if (wrkMast == null) {
                continue;//工作档不存在
            }
            //获取RGV放货站点
            Integer staNo = Utils.getRgvStaNo(rgvProtocol.getRgvNo(), sta.getSourceStaNo(), staProtocol.getStaNo().intValue(), true);
            if (staNo == null) {
                continue;//RGV放货站点不存在
            }
            //判断目标站是否自动、可入、无物、无工作号
            StaProtocol staProtocol1 = devpThread.getStation().get(staNo);
            if (!(staProtocol1.isAutoing() && staProtocol1.isInEnable() && !staProtocol1.isLoading() && (staProtocol1.getWorkNo() == 0))) {
                continue;
            }
            // 命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号
            rgvCommand.setAckFinish((short) 0);
            //判断rgv工位1是否可用
            if (rgvProtocol.getTaskNo1() == 0) {
                rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());//工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货
                rgvCommand.setSourceStaNo1(staProtocol.getStaNo());//源站
                rgvCommand.setDestinationStaNo1(staNo.shortValue());//目标站
                rgvCommand.setCommand((short) 0);//工位1暂不确认
            } else if (rgvProtocol.getTaskNo2() == 0) {//判断rgv工位2是否可用
                rgvCommand.setTaskNo2(wrkMast.getWrkNo().shortValue());//工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货
                rgvCommand.setSourceStaNo2(staProtocol.getStaNo());//源站
                rgvCommand.setDestinationStaNo2(staNo.shortValue());//目标站
                rgvCommand.setCommand((short) 1);//工位2确认
            }else {
                continue;//没有可用RGV工位
            }
            if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(2, rgvCommand))) {
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                continue;
            }
            log.error("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
        }
    }
    //rgv出库
    public synchronized void rgvOutExecute(ZyRgvThread rgvThread, RgvProtocol rgvProtocol) {
        for (RgvSlave.Sta sta : rgvThread.getSlave().getOutStn()) {
            if (rgvProtocol.getTaskNo1() > 0) {
                //检测rgv工位1是否为出库任务
                WrkMast wrkMast1 = wrkMastMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue());
                if (wrkMast1.getWrkSts() < 100) {
                    continue;//入库任务跳过
                }
            }
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, sta.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(sta.getSourceStaNo());
            //判断输送线是否自动、有物、可出、有工作号
            if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isOutEnable() && (staProtocol.getWorkNo() > 0))) {
                continue;
            }
            //搜索工作档
            WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo().intValue());
            if (wrkMast == null) {
                continue;//工作档不存在
            }
            //获取RGV放货站点
            Integer staNo = Utils.getRgvStaNo(rgvProtocol.getRgvNo(), sta.getSourceStaNo(), staProtocol.getStaNo().intValue(), false);
            if (staNo == null) {
                continue;//RGV放货站点不存在
            }
            //判断目标站是否自动、可出、无物、无工作号
            StaProtocol staProtocol1 = devpThread.getStation().get(staNo);
            if (!(staProtocol1.isAutoing() && staProtocol1.isOutEnable() && !staProtocol1.isLoading() && (staProtocol1.getWorkNo() == 0))) {
                continue;
            }
            // 命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号
            rgvCommand.setAckFinish((short) 0);
            //判断rgv工位1是否可用
            if (rgvProtocol.getTaskNo1() == 0) {
                rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());//工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货
                rgvCommand.setSourceStaNo1(staProtocol.getStaNo());//源站
                rgvCommand.setDestinationStaNo1(staNo.shortValue());//目标站
                rgvCommand.setCommand((short) 0);//工位1暂不确认
            } else if (rgvProtocol.getTaskNo2() == 0) {//判断rgv工位2是否可用
                rgvCommand.setTaskNo2(wrkMast.getWrkNo().shortValue());//工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货
                rgvCommand.setSourceStaNo2(staProtocol.getStaNo());//源站
                rgvCommand.setDestinationStaNo2(staNo.shortValue());//目标站
                rgvCommand.setCommand((short) 1);//工位2确认
            }else {
                continue;//没有可用RGV工位
            }
            if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(2, rgvCommand))) {
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                continue;
            }
            log.error("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
        }
    }
    //RGV工作完成
    public synchronized void rgvFinished() {
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        for (RgvSlave slave : slaveProperties.getRgv()) {
            ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getId());
            if (rgvThread == null) {
                return;
            }
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                return;
            }
            //  状态:等待确认
            if (rgvProtocol.getStatusType() == RgvStatusType.WAITING) {
                if (rgvProtocol.getTaskNo1() == 9999) {
                    // RGV复位
                    rgvThread.setResetFlag1(true);
                }else {
                    // 获取待确认工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(rgvProtocol.getTaskNo1().intValue());
                    if (wrkMast == null) {
                        log.error("RGV处于等待确认且任务完成状态,但未找到工作档。RGV号={},工作号={}", rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1());
                        continue;
                    }
                    if (rgvProtocol.getTaskNo1() > 0 && rgvProtocol.getTaskFinish1() == 1) {
                        //工位1任务完成
                        // RGV复位
                        rgvThread.setResetFlag1(true);
                        //给目标站输送线写入数据
                        Short destinationPos1 = rgvProtocol.getDestinationPos1();//获取工位1目标站
                        StaProtocol staProtocol = devpThread.getStation().get(destinationPos1.intValue()).clone();
                        staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());//写入工作号
                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());//写入目标站
                        if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                            log.info("{}任务,RGV搬运成功,写入输送数据失败{}", wrkMast.getWrkNo(), JSON.toJSONString(staProtocol));
                        }
                        //2号RGV和3号RGV工作完成后需要更新工作档状态
                        if (rgvProtocol.getRgvNo() == 2 || rgvProtocol.getRgvNo() == 3) {
                            if (wrkMast.getWrkSts() == 13) {//13.RGV搬运中 => 14.已出库
                                wrkMast.setWrkSts(14L);
                                wrkMast.setModiTime(new Date());
                                wrkMastMapper.updateById(wrkMast);
                            }
                        }
                    }
                    if (rgvProtocol.getTaskNo2() > 0 && rgvProtocol.getTaskFinish2() == 1) {
                        //工位2任务完成
                        // RGV复位
                        rgvThread.setResetFlag2(true);
                        //给目标站输送线写入数据
                        Short destinationPos2 = rgvProtocol.getDestinationPos2();//获取工位2目标站
                        StaProtocol staProtocol = devpThread.getStation().get(destinationPos2.intValue()).clone();
                        staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());//写入工作号
                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());//写入目标站
                        if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                            log.info("{}任务,RGV搬运成功,写入输送数据失败{}", wrkMast.getWrkNo(), JSON.toJSONString(staProtocol));
                        }
                        //2号RGV和3号RGV工作完成后需要更新工作档状态
                        if (rgvProtocol.getRgvNo() == 2 || rgvProtocol.getRgvNo() == 3) {
                            if (wrkMast.getWrkSts() == 13) {//13.RGV搬运中 => 14.已出库
                                wrkMast.setWrkSts(14L);
                                wrkMast.setModiTime(new Date());
                                wrkMastMapper.updateById(wrkMast);
                            }
                        }
                    }
                }
            }
        }
    }
src/main/java/com/zy/asrs/utils/Utils.java
@@ -6,6 +6,7 @@
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
@@ -186,6 +187,63 @@
        return 0;
    }
    //获取RGV放货站点
    public static Integer getRgvStaNo(Integer rgvNo, Integer sourceStaNo, Integer staNo, Boolean pakIn) {
        if (pakIn) {
            return getRgvStaNoPakIn(rgvNo, sourceStaNo, staNo);
        } else {
            return getRgvStaNoPakOut(rgvNo, sourceStaNo, staNo);
        }
    }
    private static Integer getRgvStaNoPakIn(Integer rgvNo, Integer sourceStaNo, Integer staNo) {
        //获取RGV放货站点
        Integer rgvStaNo = null;
        if (rgvNo == 1) {
            switch (staNo) {
                case 1022:
                    rgvStaNo = 1020;
                    break;
                case 1025:
                    rgvStaNo = 1023;
                    break;
            }
        } else if (rgvNo == 2) {
            rgvStaNo = 2402;
        } else if (rgvNo == 3) {
            if (sourceStaNo == 2102) {
                rgvStaNo = 2103;
            } else if (sourceStaNo == 4007 || sourceStaNo == 4016) {
                rgvStaNo = 2301;
            }
        }
        return rgvStaNo;
    }
    private static Integer getRgvStaNoPakOut(Integer rgvNo, Integer sourceStaNo, Integer staNo) {
        //获取RGV放货站点
        Integer rgvStaNo = null;
        if (rgvNo == 1) {
            if (staNo == 3007 || staNo == 3012) {
                rgvStaNo = 2401;
            }else {
                rgvStaNo = 2013;
            }
        } else if (rgvNo == 2) {
            rgvStaNo = 3001;
        } else if (rgvNo == 3) {
            if (sourceStaNo == 2003 && staNo == 2001) {
                rgvStaNo = 2002;
            } else if (sourceStaNo == 2003 && staNo == 4001) {
                rgvStaNo = 4001;
            } else if (sourceStaNo == 2003 && staNo == 4010) {
                rgvStaNo = 4010;
            }
        }
        return rgvStaNo;
    }
    public static void main(String[] args) {
        SlaveProperties slaveProperties = new SlaveProperties();
        slaveProperties.setDoubleDeep(true);
src/main/java/com/zy/common/CodeBuilder.java
@@ -1,6 +1,7 @@
package com.zy.common;
import com.core.generators.CoolGenerator;
import com.core.generators.constant.SqlOsType;
/**
 * Created by vincent on 2019-06-04
@@ -15,11 +16,17 @@
//        generator.password="xltys1995";
//        generator.table="sys_host";
        // sqlserver
        generator.url="192.168.3.208:1433;databasename=cool";
        generator.sqlOsType = SqlOsType.SQL_SERVER;
        generator.url="192.168.4.15:1433;databasename=mdqdasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="asr_wrk_detl";
        generator.table="asr_bas_rgv_opt";
        generator.packagePath="com.zy.asrs";
        generator.html = false;
        generator.htmlDetail = false;
        generator.js = false;
        generator.sql = false;
        generator.controller = false;
        generator.build();
    }
src/main/java/com/zy/core/MainProcess.java
@@ -58,6 +58,12 @@
                    mainService.crnIoExecute();
                    // 入库  ===>> 执行对工作档的完成操作
                    mainService.storeFinished();
                    //RGV搬运
                    mainService.rgvIoExecute();
                    //RGV工作完成
                    mainService.rgvFinished();
                    // 堆垛机异常信息记录
                    mainService.recCrnErr();
                    // 入库  ===>> 空栈板初始化入库,叉车入库站放货
@@ -66,7 +72,6 @@
                    mainService.ledExecute();
                    // 其他  ===>> LED显示器复位,显示默认信息
                    mainService.ledReset();
//                    mainService.outOfDevp();
                } catch (Exception e) {
                    e.printStackTrace();
src/main/java/com/zy/core/RgvThread.java
New file
@@ -0,0 +1,9 @@
package com.zy.core;
public interface RgvThread extends ThreadHandler {
    void setResetFlag1(boolean flag);
    void setResetFlag2(boolean flag);
}
src/main/java/com/zy/core/ServerBootstrap.java
@@ -6,6 +6,7 @@
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.LedSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.*;
import lombok.extern.slf4j.Slf4j;
@@ -51,6 +52,10 @@
        for (Slave crn : slaveProperties.getCrn()) {
            MessageQueue.init(SlaveType.Crn, crn);
        }
        // 初始化RGVmq
        for (Slave rgv : slaveProperties.getRgv()) {
            MessageQueue.init(SlaveType.Rgv, rgv);
        }
        // 初始化输送线mq
        for (Slave devp : slaveProperties.getDevp()) {
            MessageQueue.init(SlaveType.Devp, devp);
@@ -81,6 +86,12 @@
            new Thread((Runnable) crnThread).start();
            SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread);
        }
        log.info("初始化RGV线程...................................................");
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            RgvThread rgvThread = new ZyRgvThread(rgv);
            new Thread((Runnable) rgvThread).start();
            SlaveConnection.put(SlaveType.Rgv, rgv.getId(), rgvThread);
        }
        // 初始化输送线线程
        log.info("初始化输送线线程...................................................");
        for (DevpSlave devp : slaveProperties.getDevp()) {
src/main/java/com/zy/core/enums/RgvModeType.java
New file
@@ -0,0 +1,45 @@
package com.zy.core.enums;
/**
 * RGV模式枚举
 */
public enum RgvModeType {
    STOP((short) 0, "停机模式"),
    MANUAL((short) 1, "手动模式"),
    AUTO((short) 2, "自动模式"),
    COMPUTER((short) 3, "电脑模式"),
    ;
    public Short id;
    public String desc;
    RgvModeType(Short id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static RgvModeType get(Short id) {
        if (null == id) {
            return null;
        }
        for (RgvModeType type : RgvModeType.values()) {
            if (type.id.equals(id)) {
                return type;
            }
        }
        return null;
    }
    public static RgvModeType get(RgvModeType type) {
        if (null == type) {
            return null;
        }
        for (RgvModeType type1 : RgvModeType.values()) {
            if (type1 == type) {
                return type1;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/RgvStatusType.java
New file
@@ -0,0 +1,52 @@
package com.zy.core.enums;
/**
 * RGV状态枚举
 */
public enum RgvStatusType {
    OFFLINE((short) -1, "离线"),
    IDLE((short) 0, "空闲"),
    PICK_WALK((short) 1, "取货走行"),
    PICK_WAIT((short) 2, "取货等待"),
    PICK_WORKING((short) 3, "取货中"),
    RELEASE_WALK((short) 4, "放货走行"),
    RELEASE_WAIT((short) 5, "放货等待"),
    RELEASE_WORKING((short) 6, "放货中"),
    WALKING((short) 9, "走行中"),
    WAITING((short) 90, "任务完成等待WCS确认"),
    ALARM((short) 99, "报警"),
    OTHER((short) 100, "其他"),
    ;
    public Short id;
    public String desc;
    RgvStatusType(Short id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static RgvStatusType get(Short id) {
        if (null == id) {
            return null;
        }
        for (RgvStatusType type : RgvStatusType.values()) {
            if (type.id.equals(id)) {
                return type;
            }
        }
        return null;
    }
    public static RgvStatusType get(RgvStatusType type) {
        if (null == type) {
            return null;
        }
        for (RgvStatusType type1 : RgvStatusType.values()) {
            if (type1 == type) {
                return type1;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/RgvTaskModeType.java
New file
@@ -0,0 +1,42 @@
package com.zy.core.enums;
public enum RgvTaskModeType {
    NONE((short) 0, "无"),
    PICK((short) 1, "取货"),
    RELEASE((short) 2, "放货"),
    PICK_RELEASE((short) 3, "取放货"),
    MOVE((short) 4, "移动(发工位1任务即可)"),
    ;
    public Short id;
    public String desc;
    RgvTaskModeType(Short id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static RgvTaskModeType get(Short id) {
        if (null == id) {
            return null;
        }
        for (RgvTaskModeType type : RgvTaskModeType.values()) {
            if (type.id.equals(id)) {
                return type;
            }
        }
        return null;
    }
    public static RgvTaskModeType get(RgvTaskModeType type) {
        if (null == type) {
            return null;
        }
        for (RgvTaskModeType type1 : RgvTaskModeType.values()) {
            if (type1 == type) {
                return type1;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/RgvWalkPosType.java
New file
@@ -0,0 +1,44 @@
package com.zy.core.enums;
/**
 * RGV走行定位枚举
 */
public enum RgvWalkPosType {
    POSITION((short) 0, "在定位"),
    NONE((short) 1, "不在定位"),
    ;
    public Short id;
    public String desc;
    RgvWalkPosType(Short id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static RgvWalkPosType get(Short id) {
        if (null == id) {
            return null;
        }
        for (RgvWalkPosType type : RgvWalkPosType.values()) {
            if (type.id.equals(id)) {
                return type;
            }
        }
        return null;
    }
    public static RgvWalkPosType get(RgvWalkPosType type) {
        if (null == type) {
            return null;
        }
        for (RgvWalkPosType type1 : RgvWalkPosType.values()) {
            if (type1 == type) {
                return type1;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/SlaveType.java
@@ -8,6 +8,7 @@
    Led,
    Scale,
    Car,
    Rgv,
    ;
    public static SlaveType findInstance(String s){
src/main/java/com/zy/core/model/RgvSlave.java
New file
@@ -0,0 +1,33 @@
package com.zy.core.model;
import com.zy.core.Slave;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.ArrayList;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class RgvSlave  extends Slave {
    private Integer rack;
    private Integer slot;
    private List<Sta> inStn = new ArrayList<>();
    private List<Sta> outStn = new ArrayList<>();
    @Data
    public static class Sta {
        private Integer staNo;//目标站
        private Integer sourceStaNo;//源站
        private Integer devpPlcId;
    }
}
src/main/java/com/zy/core/model/command/RgvCommand.java
New file
@@ -0,0 +1,95 @@
package com.zy.core.model.command;
import com.alibaba.fastjson.annotation.JSONField;
import com.zy.core.enums.RgvTaskModeType;
import lombok.Data;
/**
 * RGV命令报文
 */
@Data
public class RgvCommand {
    // RGV编号
    private Integer rgvNo = 0;
    // 任务完成确认位
    private Short ackFinish = 0;
    //**************工位1**************
    // 工位1工作号
    private Short taskNo1 = 0;
    /**
     * 任务模式:
     * 0 = 无
     * 1 = 取货
     * 2 = 放货
     * 3 = 取放货
     * 4 = 移动(发工位1任务即可)
     */
    private Short taskMode1 = 0;
    @JSONField(serialize = false)
    private RgvTaskModeType taskModeType1;
    // 工位1源站
    private Short sourceStaNo1 = 0;
    // 工位1目标站
    private Short destinationStaNo1 = 0;
    //**************工位1**************
    //**************工位2**************
    // 工位2工作号
    private Short taskNo2 = 0;
    /**
     * 任务模式:
     * 0 = 无
     * 1 = 取货
     * 2 = 放货
     * 3 = 取放货
     * 4 = 移动(发工位1任务即可)
     */
    private Short taskMode2 = 0;
    @JSONField(serialize = false)
    private RgvTaskModeType taskModeType2;
    // 工位1源站
    private Short sourceStaNo2 = 0;
    // 工位1目标站
    private Short destinationStaNo2 = 0;
    //**************工位2**************
    // 任务确认 0:未确认 1:已确认
    private Short command = 0;
    public void setTaskMode1(Short taskMode){
        this.taskMode1 = taskMode;
        this.taskModeType1 = RgvTaskModeType.get(taskMode);
    }
    public void setTaskMode1(RgvTaskModeType type) {
        this.taskModeType1 = type;
        this.taskMode1 = RgvTaskModeType.get(type).id;
    }
    public void setTaskMode2(Short taskMode){
        this.taskMode2 = taskMode;
        this.taskModeType2 = RgvTaskModeType.get(taskMode);
    }
    public void setTaskMode2(RgvTaskModeType type) {
        this.taskModeType2 = type;
        this.taskMode2 = RgvTaskModeType.get(type).id;
    }
}
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
New file
@@ -0,0 +1,134 @@
package com.zy.core.model.protocol;
import com.zy.core.enums.RgvModeType;
import com.zy.core.enums.RgvStatusType;
import com.zy.core.enums.RgvWalkPosType;
import lombok.Data;
import java.util.Date;
@Data
public class RgvProtocol {
    //RGV编号
    private Integer rgvNo;
    //模式
    private Short mode;
    //RGV模式枚举
    private RgvModeType modeType;
    //RGV状态
    private Short status;
    //RGV状态枚举
    private RgvStatusType statusType;
    //工位1工作号
    private Short taskNo1;
    //工位1有物信号
    private Short loaded1;
    //RGV当前位置
    private Short rgvPos;
    //走行在定位 0:在定位,1:不在定位
    private Short walkPos;
    //RGV走行枚举
    private RgvWalkPosType walkPosType;
    //工位2工作号
    private Short taskNo2;
    //工位2有物信号
    private Short loaded2;
    //工位1任务完成信号
    private Short taskFinish1;
    //工位2任务完成信号
    private Short taskFinish2;
    //异常码
    private Short alarm;
    //心跳
    private Short heart;
    //备用1
    private Short temp1;
    //备用2
    private Short temp2;
    //备用3
    private Short temp3;
    //备用4
    private Short temp4;
    //备用5
    private Short temp5;
    //工位1任务模式
    private Short taskMode1;
    //工位1源站
    private Short sourceStn1;
    //工位1目标站
    private Short destinationPos1;
    //工位2任务模式
    private Short taskMode2;
    //工位2源站
    private Short sourceStn2;
    //工位2目标站
    private Short destinationPos2;
    //工位1下发时间
    private Long task1SendTime;
    /**
     * 最近一次入出库类型
     *       I:入库
     *       O:出库
     */
    private String lastIo = "I";
    public void setMode(Short mode) {
        this.mode = mode;
        this.modeType = RgvModeType.get(mode);
    }
    public void setMode(RgvModeType type) {
        this.mode = type.id;
        this.modeType = type;
    }
    public void setStatus(Short status) {
        this.status = status;
        this.statusType = RgvStatusType.get(status);
    }
    public void setStatus(RgvStatusType type) {
        this.status = type.id;
        this.statusType = type;
    }
    public void setWalkPos(Short walkPos) {
        this.walkPos = walkPos;
        this.walkPosType = RgvWalkPosType.get(walkPos);
    }
    public void setWalkPos(RgvWalkPosType type) {
        this.walkPos = type.id;
        this.walkPosType = type;
    }
}
src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -4,6 +4,7 @@
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.LedSlave;
import com.zy.core.model.RgvSlave;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@@ -42,4 +43,6 @@
    private List<Slave> car = new ArrayList<>();
    private List<RgvSlave> rgv = new ArrayList<>();
}
src/main/java/com/zy/core/thread/ZyRgvThread.java
New file
@@ -0,0 +1,402 @@
package com.zy.core.thread;
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.entity.BasRgvOpt;
import com.zy.asrs.service.BasRgvOptService;
import com.zy.asrs.service.BasRgvService;
import com.zy.core.RgvThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.RgvStatusType;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.RgvProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.Date;
/**
 * RGV线程
 */
@Data
@Slf4j
public class ZyRgvThread implements Runnable, RgvThread {
    private SiemensS7Net siemensNet;
    private RgvSlave slave;
    private RgvProtocol rgvProtocol;
    private boolean resetFlag1 = false;//工位1复位信号
    private boolean resetFlag2 = false;//工位2复位信号
    public ZyRgvThread(RgvSlave slave) {
        this.slave = slave;
    }
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        this.connect();
        while (true) {
            try {
                int step = 1;
                Task task = MessageQueue.poll(SlaveType.Rgv, slave.getId());
                if (task != null) {
                    step = task.getStep();
                }
                switch (step) {
                    // 读数据
                    case 1:
                        readStatus();
                        break;
                    // 写入数据
                    case 2:
                        write((RgvCommand) task.getData());
                        break;
                    // 复位
                    case 3:
                        RgvCommand command = (RgvCommand) task.getData();
                        if (null == command) {
                            command = new RgvCommand();
                        }
                        command.setRgvNo(slave.getId()); // 堆垛机编号
                        command.setTaskNo1((short) 0); // 工作号
                        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo1((short) 0);//源站
                        command.setDestinationStaNo1((short) 0);//目标站
                        command.setTaskNo2((short) 0); // 工作号
                        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo2((short) 0);//源站
                        command.setDestinationStaNo2((short) 0);//目标站
                        command.setAckFinish((short) 1);  // 任务完成确认位
                        write(command);
                        break;
                    //写入数据确认命令
                    case 4:
                        writeCommand((RgvCommand) task.getData());
                        break;
                    default:
                        break;
                }
                Thread.sleep(500);
            } catch (Exception e) {
//                e.printStackTrace();
            }
        }
    }
    @Override
    public boolean connect() {
        boolean result = false;
        siemensNet = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
        siemensNet.setRack(slave.getRack().byteValue());
        siemensNet.setSlot(slave.getSlot().byteValue());
        OperateResult connect = siemensNet.ConnectServer();
        if(connect.IsSuccess){
            result = true;
            OutputQueue.CRN.offer(MessageFormat.format( "【{0}】RGV plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            log.info("RGV plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】RGV plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            log.error("RGV plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            initRgv();
        }
        return result;
    }
    /**
     * 读取状态
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 34);
            if (result.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
                    rgvProtocol.setRgvNo(slave.getId());
                }
                rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));//模式
                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2));//RGV状态
                rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4));//工位1工作号
                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 6));//工位1有物
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 8));//RGV当前位置
                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));//走行在定位
                rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt16(result.Content, 12));//工位2工作号
                rgvProtocol.setLoaded2(siemensNet.getByteTransform().TransInt16(result.Content, 14));//工位2有物
                rgvProtocol.setTaskFinish1(siemensNet.getByteTransform().TransInt16(result.Content, 16));//工位1任务完成
                rgvProtocol.setTaskFinish2(siemensNet.getByteTransform().TransInt16(result.Content, 18));//工位2任务完成
                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20));//异常码
                rgvProtocol.setHeart(siemensNet.getByteTransform().TransInt16(result.Content, 22));//RGV心跳信号
                rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24));//备用1
                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26));//备用2
                rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28));//备用3
                rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30));//备用4
                rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32));//备用5
                OperateResultExOne<byte[]> result2 = siemensNet.Read("DB100.0", (short) 22);
                if (result2.IsSuccess) {
                    rgvProtocol.setTaskMode1(siemensNet.getByteTransform().TransInt16(result.Content, 4));//工位1任务模式
                    rgvProtocol.setSourceStn1(siemensNet.getByteTransform().TransInt16(result.Content, 6));//工位1源站
                    rgvProtocol.setDestinationPos1(siemensNet.getByteTransform().TransInt16(result.Content, 8));//工位1目标站
                    rgvProtocol.setTaskMode2(siemensNet.getByteTransform().TransInt16(result.Content, 14));//工位2任务模式
                    rgvProtocol.setSourceStn2(siemensNet.getByteTransform().TransInt16(result.Content, 16));//工位2源站
                    rgvProtocol.setDestinationPos2(siemensNet.getByteTransform().TransInt16(result.Content, 18));//工位2目标站
                }
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                // 复位信号
                if (rgvProtocol.getStatusType().equals(RgvStatusType.WAITING)) {
                    if (resetFlag1) {
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setAckFinish((short) 2);//工位1任务结束已接收
                        if (write(rgvCommand)) {
                            resetFlag1 = false;
                        }
                    }
                    if (resetFlag2) {
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setAckFinish((short) 3);//工位2任务结束已接收
                        if (write(rgvCommand)) {
                            resetFlag2 = false;
                        }
                    }
                }
                try {
                    // 根据实时信息更新数据库
                    BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
                    BasRgv basRgv = new BasRgv();
                    basRgv.setRgvNo(slave.getId());
                    basRgv.setMode(rgvProtocol.getMode().intValue());
                    basRgv.setStatus(rgvProtocol.getStatus().intValue());
                    basRgv.setTaskNo1(rgvProtocol.getTaskNo1().intValue());
                    basRgv.setLoaded1(rgvProtocol.getLoaded1().intValue());
                    basRgv.setRgvPos(rgvProtocol.getRgvPos().intValue());
                    basRgv.setWalkPos(rgvProtocol.getWalkPos().intValue());
                    basRgv.setTaskNo2(rgvProtocol.getTaskNo2().intValue());
                    basRgv.setLoaded2(rgvProtocol.getLoaded2().intValue());
                    basRgv.setTaskFinish1(rgvProtocol.getTaskFinish1().intValue());
                    basRgv.setTaskFinish2(rgvProtocol.getTaskFinish2().intValue());
                    basRgv.setAlarm(rgvProtocol.getAlarm().intValue());
                    basRgv.setHeart(rgvProtocol.getHeart().intValue());
                    basRgv.setTemp1(rgvProtocol.getTemp1().intValue());
                    basRgv.setTemp2(rgvProtocol.getTemp2().intValue());
                    basRgv.setTemp3(rgvProtocol.getTemp3().intValue());
                    basRgv.setTemp4(rgvProtocol.getTemp4().intValue());
                    basRgv.setTemp5(rgvProtocol.getTemp5().intValue());
                    if (!basRgvService.updateById(basRgv)){
                        log.error("RGV plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                    }
                } catch (Exception ignore){}
            } else {
                initRgv();
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取RGV plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
                log.error("读取RGV plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            }
        } catch (Exception e) {
            e.printStackTrace();
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取RGV plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("读取RGV plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initRgv();
        }
    }
    /**
     * 写入数据
     */
    private boolean write(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
        command.setRgvNo(slave.getId());
        OperateResult result = null;
        if (command.getTaskNo1() > 0 && command.getTaskNo2() == 0) {
            //只有工位1存在任务且任务没有被确认,工位1开始计时
            if (command.getCommand() == 0) {
                rgvProtocol.setTask1SendTime(System.currentTimeMillis());
            }
            short[] array = new short[10];
            array[0] = command.getAckFinish(); // 任务完成确认位
            array[1] = command.getTaskNo1();  // 工位1任务号
            array[2] = command.getTaskMode1();  // 工位1模式
            array[3] = command.getSourceStaNo1(); // 工位1源站
            array[4] = command.getDestinationStaNo1(); // 工位1目标站
            array[5] = 0; // 工位2任务号
            array[6] = 0;  // 工位2模式
            array[7] = 0; // 工位2源站
            array[8] = 0; // 工位2目标站
            array[9] = command.getCommand();// 任务确认位
            result = siemensNet.Write("DB100.0", array);
            log.info("RGV命令下发[id:{}] >>>>> {}", slave.getId(), array);
        } else if (command.getTaskNo2() > 0 && command.getTaskNo1() == 0) {
            //只有工位2存在任务
            short[] array = new short[5];
            array[0] = command.getTaskNo2(); // 工位2任务号
            array[1] = command.getTaskMode2();  // 工位2模式
            array[2] = command.getSourceStaNo2(); // 工位2源站
            array[3] = command.getDestinationStaNo2(); // 工位2目标站
            array[4] = command.getCommand();// 任务确认位
            result = siemensNet.Write("DB100.12", array);
            log.info("RGV命令下发[id:{}] >>>>> {}", slave.getId(), array);
        }else {
            //工位1和工位2任务
            short[] array = new short[10];
            array[0] = command.getAckFinish(); // 任务完成确认位
            array[1] = command.getTaskNo1();  // 工位1任务号
            array[2] = command.getTaskMode1();  // 工位1模式
            array[3] = command.getSourceStaNo1(); // 工位1源站
            array[4] = command.getDestinationStaNo1(); // 工位1目标站
            array[5] = command.getTaskNo2(); // 工位2任务号
            array[6] = command.getTaskMode2();  // 工位2模式
            array[7] = command.getSourceStaNo2(); // 工位2源站
            array[8] = command.getDestinationStaNo2(); // 工位2目标站
            array[9] = command.getCommand();// 任务确认位
            result = siemensNet.Write("DB100.0", array);
            log.info("RGV命令下发[id:{}] >>>>> {}", slave.getId(), array);
        }
        if (command.getCommand() == 1) {
            //任务被确认
            rgvProtocol.setTask1SendTime(0L);//重置工位1下发时间
        }
        if(!result.IsSuccess){
            log.error("写入RGV plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(2, command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        try {
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
            Date now = new Date();
            BasRgvOpt basRgvOpt = new BasRgvOpt(
                    command.getRgvNo(),    // RGV[非空]
                    command.getAckFinish().intValue(),    // 任务完成确认位
                    command.getTaskNo1().intValue(),    // 任务号
                    command.getTaskMode1().intValue(),    // 模式
                    command.getSourceStaNo1().intValue(),    // 源站
                    command.getDestinationStaNo1().intValue(),    // 目标站
                    command.getTaskNo2().intValue(),    // 任务号
                    command.getTaskMode2().intValue(),    // 模式
                    command.getSourceStaNo2().intValue(),    // 源站
                    command.getDestinationStaNo2().intValue(),    // 目标站
                    command.getCommand().intValue(),
                    now,    // 下发时间
                    null, // 下发人员
                    now,    // 修改时间
                    null,    // 修改人员
                    null //响应
            );
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    /**
     * 写入数据确认命令
     */
    private boolean writeCommand(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
        command.setRgvNo(slave.getId());
        short[] array = new short[1];
        array[0] = command.getCommand();// 任务确认位
        OperateResult result = siemensNet.Write("DB100.20", array);
        log.info("RGV命令下发[id:{}] >>>>> {}", slave.getId(), array);
        if(!result.IsSuccess){
            log.error("写入RGV plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(2, command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        try {
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
            Date now = new Date();
            BasRgvOpt basRgvOpt = new BasRgvOpt(
                    command.getRgvNo(),    // RGV[非空]
                    command.getAckFinish().intValue(),    // 任务完成确认位
                    command.getTaskNo1().intValue(),    // 任务号
                    command.getTaskMode1().intValue(),    // 模式
                    command.getSourceStaNo1().intValue(),    // 源站
                    command.getDestinationStaNo1().intValue(),    // 目标站
                    command.getTaskNo2().intValue(),    // 任务号
                    command.getTaskMode2().intValue(),    // 模式
                    command.getSourceStaNo2().intValue(),    // 源站
                    command.getDestinationStaNo2().intValue(),    // 目标站
                    command.getCommand().intValue(),
                    now,    // 下发时间
                    null, // 下发人员
                    now,    // 修改时间
                    null,    // 修改人员
                    null //响应
            );
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    /**
     * 初始化堆垛机状态
     */
    private void initRgv() {
        if (null == rgvProtocol) {
            rgvProtocol = new RgvProtocol();
        }
        rgvProtocol.setMode((short) 0);
        rgvProtocol.setStatus((short) -1);
        rgvProtocol.setWalkPos((short) 1);
    }
    @Override
    public void close() {
        siemensNet.ConnectClose();
    }
}
src/main/resources/application.yml
@@ -61,6 +61,13 @@
      row: 2
      bay: 1
      lev: 1
    # 堆垛机入库站2
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1022
      row: 3
      bay: 1
      lev: 3
    # 堆垛机出库站点1
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
@@ -68,6 +75,13 @@
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点2
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1016
      row: 3
      bay: 1
      lev: 3
  # 堆垛机2
  crn[1]:
    id: 2
@@ -85,6 +99,13 @@
      row: 7
      bay: 1
      lev: 1
    # 堆垛机入库站2
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1025
      row: 6
      bay: 1
      lev: 3
    # 堆垛机出库站点1
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
@@ -92,6 +113,13 @@
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点2
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1019
      row: 6
      bay: 1
      lev: 3
  # 输送线1
  devp[0]:
    id: 1
@@ -111,18 +139,97 @@
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1011
      led: ${wcs-slave.led[3].id}
    # 入库口3
    inSta[2]:
      staNo: 3007
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 3007
      led: ${wcs-slave.led[4].id}
    # 入库口4
    inSta[3]:
      staNo: 3012
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 3012
      led: ${wcs-slave.led[5].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 102
    # 出库口1
    outSta[0]:
      staNo: 101
    # 拣料入库口1
    pickSta[0]:
      staNo: 102
      staNo: 1003
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 102
      backSta: 1001
      led: ${wcs-slave.led[0].id}
    # 拣料入库口2
    pickSta[1]:
      staNo: 1013
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1011
      led: ${wcs-slave.led[3].id}
    # 拣料入库口3
    pickSta[2]:
      staNo: 3007
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 3007
      led: ${wcs-slave.led[4].id}
    # 拣料入库口4
    pickSta[3]:
      staNo: 3012
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 3012
      led: ${wcs-slave.led[5].id}
  # RGV1
  rgv[0]:
    id: 1
    ip: 10.10.10.120
    port: 102
    rack: 0
    slot: 0
    inStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 2401
    inStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 2114
    outStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 1014
    outStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 1017
  # RGV2
  rgv[1]:
    id: 2
    ip: 10.10.10.121
    port: 102
    rack: 0
    slot: 0
    inStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 3001
    outStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 2402
  # RGV1
  rgv[2]:
    id: 3
    ip: 10.10.10.122
    port: 102
    rack: 0
    slot: 0
    inStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 2102
    inStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 4007
    inStn[2]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 4016
    outStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      sourceStaNo: 2003
  # 条码扫描仪1
  barcode[0]:
@@ -132,6 +239,16 @@
  # 条码扫描仪2
  barcode[1]:
    id: 2
    ip: 10.10.10.3
    port: 51236
  # 条码扫描仪3
  barcode[2]:
    id: 3
    ip: 10.10.10.3
    port: 51236
  # 条码扫描仪4
  barcode[3]:
    id: 4
    ip: 10.10.10.3
    port: 51236
@@ -162,4 +279,18 @@
    ip: 10.10.10.206
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 1013
    staArr: 1013
  # LED5
  led[4]:
    id: 5
    ip: 10.10.10.206
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 3007
  # LED6
  led[5]:
    id: 6
    ip: 10.10.10.206
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 3012
src/main/resources/mapper/BasRgvMapper.xml
New file
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasRgvMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgv">
        <result column="rgv_no" property="rgvNo" />
        <result column="mode" property="mode" />
        <result column="status" property="status" />
        <result column="task_no1" property="taskNo1" />
        <result column="loaded1" property="loaded1" />
        <result column="rgv_pos" property="rgvPos" />
        <result column="walk_pos" property="walkPos" />
        <result column="task_no2" property="taskNo2" />
        <result column="loaded2" property="loaded2" />
        <result column="task_finish1" property="taskFinish1" />
        <result column="task_finish2" property="taskFinish2" />
        <result column="alarm" property="alarm" />
        <result column="heart" property="heart" />
        <result column="temp1" property="temp1" />
        <result column="temp2" property="temp2" />
        <result column="temp3" property="temp3" />
        <result column="temp4" property="temp4" />
        <result column="temp5" property="temp5" />
        <result column="create_time" property="createTime" />
        <result column="create_by" property="createBy" />
        <result column="update_time" property="updateTime" />
        <result column="update_by" property="updateBy" />
    </resultMap>
</mapper>
src/main/resources/mapper/BasRgvOptMapper.xml
New file
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.BasRgvOptMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvOpt">
        <result column="id" property="id" />
        <result column="rgv_no" property="rgvNo" />
        <result column="ack_finish" property="ackFinish" />
        <result column="task_no1" property="taskNo1" />
        <result column="task_mode1" property="taskMode1" />
        <result column="source_sta_no1" property="sourceStaNo1" />
        <result column="destination_sta_no_1" property="destinationStaNo1" />
        <result column="task_no2" property="taskNo2" />
        <result column="task_mode2" property="taskMode2" />
        <result column="source_sta_no2" property="sourceStaNo2" />
        <result column="destination_sta_no2" property="destinationStaNo2" />
        <result column="command" property="command" />
        <result column="create_time" property="createTime" />
        <result column="create_by" property="createBy" />
        <result column="update_time" property="updateTime" />
        <result column="update_by" property="updateBy" />
        <result column="response" property="response" />
    </resultMap>
</mapper>
src/main/resources/mapper/WrkMastMapper.xml
@@ -203,4 +203,8 @@
    <select id="selectLaneWrkMastOut" resultMap="BaseResultMap">
        select * from dbo.asr_wrk_mast where wrk_sts in (11,12,13,14) and io_type>100 order by io_pri desc,io_time,wrk_no asc
    </select>
    <select id="selectByWrkNo" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_no = #{wrkNo} order by io_pri desc,io_time,wrk_no asc
    </select>
</mapper>