#
zjj
2024-04-25 5a3218fc35dd3e949bb017c77839aedda8c528c8
#
12个文件已修改
10个文件已添加
1684 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasRgv.java 271 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvErr.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvOpt.java 285 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSta.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasRgvErrService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastStaService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastStaServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/OutputQueue.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DevpSlave.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/RgvCommand.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ZyRgvThread.java 351 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasRgvErrMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastStaMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgv.java
@@ -3,9 +3,15 @@
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -29,194 +35,152 @@
    private Integer rgvNo;
    /**
     * 模式
     * 可入
     */
    @ApiModelProperty(value= "模式")
    private Integer mode;
    @ApiModelProperty(value= "可入")
    @TableField("in_enable")
    private Integer inEnable;
    /**
     * 状态
     * 可出
     */
    @ApiModelProperty(value= "状态")
    @ApiModelProperty(value= "可出")
    @TableField("out_enable")
    private Integer outEnable;
    /**
     * 作业态
     */
    @ApiModelProperty(value= "作业态")
    @TableField("rgv_sts")
    private Integer rgvSts;
    /**
     * 任务号
     */
    @ApiModelProperty(value= "任务号")
    @TableField("wrk_no1")
    private Integer wrkNo1;
    /**
     * 堆垛机号
     */
    @ApiModelProperty(value= "堆垛机号")
    @TableField("wrk_no2")
    private Integer wrkNo2;
    /**
     * 错误码
     */
    @ApiModelProperty(value= "错误码")
    @TableField("rgv_err")
    private Long rgvErr;
    /**
     * 标记
     */
    @ApiModelProperty(value= "标记")
    @TableField("pak_mk")
    private String pakMk;
    /**
     * 状态 1: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 禁用  ")
    private Integer status;
    /**
     * 工位1工作号
     * 添加人员
     */
    @ApiModelProperty(value= "工位1工作号")
    @TableField("task_no1")
    private Integer taskNo1;
    @ApiModelProperty(value= "添加人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * 工位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= "创建时间")
    @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_by")
    private Long updateBy;
    /**
     * 更新时间
     * 修改时间
     */
    @ApiModelProperty(value= "更新时间")
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 更新人员
     * 备注
     */
    @ApiModelProperty(value= "更新人员")
    @TableField("update_by")
    private Long updateBy;
    @ApiModelProperty(value= "备注")
    private String memo;
    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) {
    public BasRgv(Integer rgvNo,Integer inEnable,Integer outEnable,Integer rgvSts,Integer wrkNo1,Integer wrkNo2,Long rgvErr,String pakMk,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.rgvNo = rgvNo;
        this.mode = mode;
        this.inEnable = inEnable;
        this.outEnable = outEnable;
        this.rgvSts = rgvSts;
        this.wrkNo1 = wrkNo1;
        this.wrkNo2 = wrkNo2;
        this.rgvErr = rgvErr;
        this.pakMk = pakMk;
        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.createTime = createTime;
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
    }
//    BasRgv basRgv = new BasRgv(
//            null,    // RGV编号[非空]
//            null,    // 模式
//            null,    // 可入
//            null,    // 可出
//            null,    // 作业态
//            null,    // 任务号
//            null,    // 堆垛机号
//            null,    // 错误码
//            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    // 更新人员
//            null,    // 添加人员
//            null,    // 添加时间
//            null,    // 修改人员
//            null,    // 修改时间
//            null    // 备注
//    );
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "正常";
            case 0:
                return "禁用";
            default:
                return String.valueOf(this.status);
        }
    }
    public String getCreateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.createBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
@@ -225,6 +189,15 @@
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.updateBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
src/main/java/com/zy/asrs/entity/BasRgvErr.java
New file
@@ -0,0 +1,127 @@
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 com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
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_err")
public class BasRgvErr implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 异常码
     */
    @ApiModelProperty(value= "异常码")
    @TableId(value = "error_code", type = IdType.INPUT)
    @TableField("error_code")
    private Long errorCode;
    /**
     * 异常
     */
    @ApiModelProperty(value= "异常")
    @TableField("err_name")
    private String errName;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("modi_user")
    private Long modiUser;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("modi_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date modiTime;
    /**
     * 添加人员
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("appe_user")
    private Long appeUser;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("appe_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date appeTime;
    public BasRgvErr() {}
    public BasRgvErr(Long errorCode,String errName,Long modiUser,Date modiTime,Long appeUser,Date appeTime) {
        this.errorCode = errorCode;
        this.errName = errName;
        this.modiUser = modiUser;
        this.modiTime = modiTime;
        this.appeUser = appeUser;
        this.appeTime = appeTime;
    }
//    BasRgvErr basRgvErr = new BasRgvErr(
//            null,    // 异常码[非空]
//            null,    // 异常
//            null,    // 修改人员
//            null,    // 修改时间
//            null,    // 添加人员
//            null    // 添加时间
//    );
    public String getModiUser$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.modiUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getModiTime$(){
        if (Cools.isEmpty(this.modiTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
    }
    public String getAppeUser$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.appeUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getAppeTime$(){
        if (Cools.isEmpty(this.appeTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
    }
}
src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -1,13 +1,16 @@
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 com.core.common.Cools;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 com.core.common.SpringUtils;
import com.zy.system.service.UserService;
import com.zy.system.entity.User;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -20,115 +23,93 @@
    private static final long serialVersionUID = 1L;
    /**
     * 任务号
     */
    @ApiModelProperty(value= "任务号")
    @TableField("wrk_no1")
    private Integer wrkNo1;
    @ApiModelProperty(value= "")
    @TableId(value = "id", type = IdType.INPUT)
    private Long id;
    @TableField("wrk_no2")
    private Integer wrkNo2;
    /**
     * RGV编号
     * 穿梭车
     */
    @ApiModelProperty(value= "RGV编号")
    @ApiModelProperty(value= "穿梭车")
    @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")
    @ApiModelProperty(value= "下发时间")
    @TableField("send_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    private Date sendTime;
    /**
     * 创建人员
     * 作业
     */
    @ApiModelProperty(value= "创建人员")
    @TableField("create_by")
    private Long createBy;
    @ApiModelProperty(value= "作业")
    private String mode;
    /**
     * 更新时间
     * 源排
     */
    @ApiModelProperty(value= "更新时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    @ApiModelProperty(value= "源排")
    @TableField("source_row")
    private Integer sourceRow;
    /**
     * 更新人员
     * 源列
     */
    @ApiModelProperty(value= "更新人员")
    @TableField("update_by")
    private Long updateBy;
    @ApiModelProperty(value= "源列")
    @TableField("source_bay")
    private Integer sourceBay;
    /**
     * 源层
     */
    @ApiModelProperty(value= "源层")
    @TableField("source_lev")
    private Integer sourceLev;
    /**
     * 源站
     */
    @ApiModelProperty(value= "源站")
    @TableField("source_sta")
    private Integer sourceSta;
    /**
     * 目标排
     */
    @ApiModelProperty(value= "目标排")
    @TableField("pos_row")
    private Integer posRow;
    /**
     * 目标列
     */
    @ApiModelProperty(value= "目标列")
    @TableField("pos_bay")
    private Integer posBay;
    /**
     * 目标层
     */
    @ApiModelProperty(value= "目标层")
    @TableField("pos_lev")
    private Integer posLev;
    /**
     * 目标站
     */
    @ApiModelProperty(value= "目标站")
    @TableField("pos_sta")
    private Integer posSta;
    /**
     * 响应结果 1: 正常  0: 失败  
@@ -136,59 +117,79 @@
    @ApiModelProperty(value= "响应结果 1: 正常  0: 失败  ")
    private Integer response;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    @ApiModelProperty(value= "")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    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) {
    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;
        this.wrkNo2 = wrkNo2;
        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.sendTime = sendTime;
        this.mode = mode;
        this.sourceRow = sourceRow;
        this.sourceBay = sourceBay;
        this.sourceLev = sourceLev;
        this.sourceSta = sourceSta;
        this.posRow = posRow;
        this.posBay = posBay;
        this.posLev = posLev;
        this.posSta = posSta;
        this.response = response;
        this.updateTime = updateTime;
        this.updateBy = updateBy;
        this.response = response;
        this.memo = memo;
    }
//    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    // 响应结果
//            null,    // 任务号
//            null,    //
//            null,    // 穿梭车
//            null,    // 下发时间
//            null,    // 作业
//            null,    // 源排
//            null,    // 源列
//            null,    // 源层
//            null,    // 源站
//            null,    // 目标排
//            null,    // 目标列
//            null,    // 目标层
//            null,    // 目标站
//            null,    // 响应结果
//            null,    // 修改时间
//            null,    // 修改人员
//            null,    // 备注
//    );
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
    public String getSendTime$(){
        if (Cools.isEmpty(this.sendTime)){
            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);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
    }
    public String getResponse$(){
@@ -203,5 +204,21 @@
        }
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public String getUpdateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.updateBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
}
src/main/java/com/zy/asrs/entity/WrkMastSta.java
New file
@@ -0,0 +1,178 @@
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 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_wrk_mast_sta")
public class WrkMastSta implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 工作号
     */
    @ApiModelProperty(value= "工作号")
    @TableField("wrk_no")
    private Long wrkNo;
    /**
     * 工作档开始位置
     */
    @ApiModelProperty(value= "工作档开始位置")
    @TableField("wrk_start")
    private Integer wrkStart;
    /**
     * 工作档结束位置
     */
    @ApiModelProperty(value= "工作档结束位置")
    @TableField("wrk_end")
    private Integer wrkEnd;
    /**
     * 小车接货位置
     */
    @ApiModelProperty(value= "小车接货位置")
    @TableField("sta_start")
    private Integer staStart;
    /**
     * 小车放货位置
     */
    @ApiModelProperty(value= "小车放货位置")
    @TableField("sta_end")
    private Integer staEnd;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 类型 0:满版  1:空板
     */
    @ApiModelProperty(value= "类型 0:满版  1:空板")
    private Integer type;
    /**
     * 工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成
     */
    @ApiModelProperty(value= "工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成")
    @TableField("wrk_sts")
    private Integer wrkSts;
    /**
     * 行号
     */
    @ApiModelProperty(value= "行号")
    @TableField("line_number")
    private Integer lineNumber;
    /**
     * 工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘
     */
    @ApiModelProperty(value= "工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘")
    @TableField("wrk_type")
    private Integer wrkType;
    /**
     * 标记时间
     */
    @ApiModelProperty(value= "标记时间")
    @TableField("bign_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date bignTime;
    @ApiModelProperty(value= "")
    @TableField("wrk_crn")
    private Integer wrkCrn;
    public WrkMastSta() {}
    public WrkMastSta(Long wrkNo,Integer wrkStart,Integer wrkEnd,Integer staStart,Integer staEnd,Date createTime,Date updateTime,Integer type,Integer wrkSts,Integer lineNumber,Integer wrkType,Date bignTime,Integer wrkCrn) {
        this.wrkNo = wrkNo;
        this.wrkStart = wrkStart;
        this.wrkEnd = wrkEnd;
        this.staStart = staStart;
        this.staEnd = staEnd;
        this.createTime = createTime;
        this.updateTime = updateTime;
        this.type = type;
        this.wrkSts = wrkSts;
        this.lineNumber = lineNumber;
        this.wrkType = wrkType;
        this.bignTime = bignTime;
        this.wrkCrn = wrkCrn;
    }
//    WrkMastSta wrkMastSta = new WrkMastSta(
//            null,    // 工作号[非空]
//            null,    // 工作档开始位置[非空]
//            null,    // 工作档结束位置[非空]
//            null,    // 小车接货位置[非空]
//            null,    // 小车放货位置[非空]
//            null,    // 添加时间
//            null,    // 修改时间
//            null,    // 类型 0:满版  1:空板[非空]
//            null,    // 工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成[非空]
//            null,    // 行号[非空]
//            null,    // 工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘[非空]
//            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 getBignTime$(){
        if (Cools.isEmpty(this.bignTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.bignTime);
    }
}
src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.BasRgvErr;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasRgvErrMapper extends BaseMapper<BasRgvErr> {
}
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.WrkMastSta;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface WrkMastStaMapper extends BaseMapper<WrkMastSta> {
}
src/main/java/com/zy/asrs/service/BasRgvErrService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasRgvErr;
import com.baomidou.mybatisplus.service.IService;
public interface BasRgvErrService extends IService<BasRgvErr> {
}
src/main/java/com/zy/asrs/service/WrkMastStaService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.WrkMastSta;
import com.baomidou.mybatisplus.service.IService;
public interface WrkMastStaService extends IService<WrkMastSta> {
}
src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.BasRgvErrMapper;
import com.zy.asrs.entity.BasRgvErr;
import com.zy.asrs.service.BasRgvErrService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("basRgvErrService")
public class BasRgvErrServiceImpl extends ServiceImpl<BasRgvErrMapper, BasRgvErr> implements BasRgvErrService {
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -603,6 +603,7 @@
                        if (crn.getId() == 5){
                            continue;
                        }
                        this.crnStnToLoc(crn, crnProtocol); //  入库
                        crnProtocol.setLastIo("O");
                    }
@@ -2020,261 +2021,11 @@
    }
    //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/service/impl/WrkMastStaServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.WrkMastStaMapper;
import com.zy.asrs.entity.WrkMastSta;
import com.zy.asrs.service.WrkMastStaService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("wrkMastStaService")
public class WrkMastStaServiceImpl extends ServiceImpl<WrkMastStaMapper, WrkMastSta> implements WrkMastStaService {
}
src/main/java/com/zy/common/CodeBuilder.java
@@ -17,10 +17,10 @@
//        generator.table="sys_host";
        // sqlserver
        generator.sqlOsType = SqlOsType.SQL_SERVER;
        generator.url="192.168.4.15:1433;databasename=mdqdasrs";
        generator.url="127.0.0.1:1433;databasename=mdqdasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="asr_bas_rgv_opt";
        generator.table="asr_wrk_mast_sta";
        generator.packagePath="com.zy.asrs";
        generator.html = false;
        generator.htmlDetail = false;
src/main/java/com/zy/core/MainProcess.java
@@ -61,10 +61,7 @@
                    // 入库  ===>> 执行对工作档的完成操作
                    mainService.storeFinished();
                    //RGV搬运
                    mainService.rgvIoExecute();
                    //RGV工作完成
                    mainService.rgvFinished();
                    // 堆垛机异常信息记录
                    mainService.recCrnErr();
src/main/java/com/zy/core/cache/OutputQueue.java
@@ -11,6 +11,8 @@
    // 堆垛机输出日志
    public static ArrayBlockingQueue<String> CRN = new ArrayBlockingQueue<>(32);
    public static ArrayBlockingQueue<String> RGV = new ArrayBlockingQueue<>(32);
    // 输送线输出日志
    public static ArrayBlockingQueue<String> DEVP = new ArrayBlockingQueue<>(32);
    // 条码器输出日志
src/main/java/com/zy/core/model/DevpSlave.java
@@ -21,6 +21,8 @@
    private List<Sta> inSta = new ArrayList<>();
    private List<Sta> rgvSta = new ArrayList<>();
    private List<Sta> emptyInSta = new ArrayList<>();
    private List<Sta> outSta = new ArrayList<>();
src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -14,12 +14,12 @@
    private Integer rgvNo = 0;
    // 任务完成确认位
    private Short ackFinish = 0;
    private boolean ackFinish = false;
    //**************工位1**************
    // 工位1工作号
    private Short taskNo1 = 0;
    private Integer taskNo1 = 0;
    /**
     * 任务模式:
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -26,7 +26,7 @@
    private RgvStatusType statusType;
    //工位1工作号
    private Short taskNo1;
    private Integer taskNo1;
    //工位1有物信号
    private Short loaded1;
@@ -59,7 +59,7 @@
    private Short heart;
    //备用1
    private Short temp1;
    private Integer temp1;
    //备用2
    private Short temp2;
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -43,36 +43,6 @@
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
//    public static final ArrayList<Integer> staNoseee1 = new ArrayList<Integer>() {{
//        add(1001);add(1002);add(1003);add(1004);add(1005);
//        add(1006);add(1007);add(1008);add(1009);add(1010);
//        add(1011);add(1012);add(1013);add(1014);add(1015);
//        add(1016);add(1017);add(1018);add(1019);add(1020);
//        add(1021);add(1022);add(1023);add(1024);add(1025);
//
//        add(2001);add(2002);add(2003);add(2004);add(2005);
//        add(2006);add(2007);add(2008);add(2009);add(2010);
//        add(2011);add(2012);add(2013);
//
//        add(2101);add(2102);add(2103);add(2104);add(2105);
//        add(2106);add(2107);add(2108);add(2109);add(2110);
//        add(2111);add(2112);add(2113);add(2114);
//
//        add(2301);add(2302);add(2303);add(2304);add(2305);
//        add(2306);
//
//        add(2401);add(2402);add(2403);
//
//        add(3001);add(3002);add(3003);add(3004);add(3005);
//        add(3006);add(3007);add(3008);add(3009);add(3010);
//        add(3011);add(3012);
//
//        add(4001);add(4002);add(4003);add(4004);add(4005);
//        add(4006);add(4007);
//
//        add(4010);add(4011);add(4012);add(4013);add(4014);
//        add(4015);add(4016);
//    }};
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        add(1001);add(1002);add(1003);add(1004);add(1005);
@@ -83,9 +53,9 @@
    }};
    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
        add(2001);add(2002);add(2003);add(2004);add(2005);add(2006);
        add(2101);add(2102);add(2103);add(2104);add(2105);add(2106);add(2107);
        add(2301);add(2302);add(2303);add(2304);add(2305);add(2306);
        add(2001);add(2002);add(2101);add(2102);add(2301);add(2302);
        add(2303);add(2304);add(2305);add(2306);add(2003);add(2004);add(2005);
        add(2006);add(2103);add(2104);add(2105);add(2106);add(2107);
    }};
    public static final ArrayList<Integer> staNos3 = new ArrayList<Integer>() {{
src/main/java/com/zy/core/thread/ZyRgvThread.java
@@ -7,10 +7,10 @@
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.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;
@@ -71,7 +71,7 @@
                            command = new RgvCommand();
                        }
                        command.setRgvNo(slave.getId()); // 堆垛机编号
                        command.setTaskNo1((short) 0); // 工作号
                        command.setTaskNo1(0); // 工作号
                        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo1((short) 0);//源站
                        command.setDestinationStaNo1((short) 0);//目标站
@@ -79,13 +79,10 @@
                        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo2((short) 0);//源站
                        command.setDestinationStaNo2((short) 0);//目标站
                        command.setAckFinish((short) 1);  // 任务完成确认位
                        command.setAckFinish(true);  // 任务完成确认位
                        write(command);
                        break;
                    //写入数据确认命令
                    case 4:
                        writeCommand((RgvCommand) task.getData());
                        break;
                    default:
                        break;
                }
@@ -121,86 +118,56 @@
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 34);
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30);
            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.setTaskNo1(siemensNet.getByteTransform().TransInt32(result.Content, 2));//工位1工作号
                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 6));//RGV状态
                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目标站
                }
                rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt32(result.Content, 12));//备用1
                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 16));//工位1有物
                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18));//异常码
                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 20));//备用2
                rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24));//备用3
                rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 28));//备用4
                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());
                    }
//                    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());
//                    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());
//                    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 {
@@ -224,164 +191,116 @@
            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[5];
        array[0] = command.getSourceStaNo1();
        array[1] = command.getSourceStaNo2();
        array[2] = command.getDestinationStaNo1();
        array[3] = command.getDestinationStaNo2();
        array[4] = command.getTaskMode1();
        OperateResult result1 = siemensNet.Write("DB100.0",array);
        OperateResult result2 = siemensNet.Write("DB100.10",command.getTaskNo1());
        OperateResult result3 = siemensNet.Write("DB100.18.1",command.isAckFinish());
        if (!result1.IsSuccess && !result2.IsSuccess && !result3.IsSuccess){
            log.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(2,command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
            OperateResultExOne<byte[]> resultReadAck = siemensNet.Read("DB100.18.1", (short) 1);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
                one.setAckFinish(siemensNet.getByteTransform().TransBool(resultReadAck.Content, 0));
                one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
                one.setSourceStaNo2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setDestinationStaNo2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setTaskMode1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 10));
//                one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                if (    !command.isAckFinish() == one.isAckFinish() ||
                        !command.getTaskNo1().equals(one.getTaskNo1()) ||
                        !command.getTaskMode1().equals(one.getTaskMode1()) ||
                        !command.getSourceStaNo1().equals(one.getSourceStaNo1()) ||
                        !command.getDestinationStaNo1().equals(one.getDestinationStaNo1())
                ){
                    try{
                        log.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    }catch (Exception e){
                        try{
                            log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                        }catch (Exception e1){
                            log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                        }
                    }
                    log.error("Rgv命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                    MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(2, command));
                    Thread.sleep(100);
                    readStatus();
                    return false;
                }else {
                    log.info("RGV命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                }
            }
            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);
        }catch (Exception e){
            log.error("RGV命令地址写入后回读出错");
        }
        if (command.getCommand() == 1) {
            //任务被确认
            rgvProtocol.setTask1SendTime(0L);//重置工位1下发时间
        if (!command.isAckFinish()) {
            if (result1.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    result1 = siemensNet.Write("DB100.18", true);
                    if(result1.IsSuccess){
                        //RGV任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
                        if (resultRead.IsSuccess) {
                            boolean commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 0);
                            if (!commandFinish){
                                log.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                log.info("RGV任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
                            log.error("RGV任务确认位回读失败!"+"循环执行次数:"+writeCount2+"次");
                        }
                    } else {
                        log.error("RGV任务确认位写入失败!"+"循环执行次数:"+writeCount2+"次");
                    }
                }while (writeCount2<5);
            }
        }
        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) {
        if (result1 != null && result1.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)));
            log.info("RGV 工位1命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位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());
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位1数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入RGV plc工位1数据失败 ===>> [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;
        }
    }
    /**
     * 初始化堆垛机状态
src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
  port: 8080
  port: 9090
  servlet:
    context-path: /@pom.build.finalName@
@@ -47,7 +47,7 @@
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 10.10.10.120
    ip: 10.10.10.100
    port: 102
    rack: 0
    slot: 0
@@ -123,7 +123,7 @@
  # 堆垛机3
  crn[2]:
    id: 5
    ip: 10.10.10.100
    ip: 10.10.10.120
    port: 102
    rack: 0
    slot: 0
@@ -219,12 +219,30 @@
    autoEmptyIn[0]:
      staNo: 1007
  # 输送线2
#  devp[1]:
#    id: 1
#    ip: 10.10.10.10
#    port: 102
#    rack: 0
#    slot: 0
  devp[1]:
    id: 2
    ip: 10.10.10.10
    port: 102
    rack: 0
    slot: 0
    rgvSta[0]:
      staNo: 4007
    rgvSta[1]:
      staNo: 4001
    rgvSta[2]:
      staNo: 4016
    rgvSta[3]:
      staNo: 4010
    rgvSta[4]:
      staNo: 2003
    rgvSta[5]:
      staNo: 2103
    rgvSta[6]:
      staNo: 2301
    rgvSta[7]:
      staNo: 2002
    rgvSta[8]:
      staNo: 2102
#    # 输送线3
#  devp[2]:
#    id: 1
@@ -240,24 +258,12 @@
#    rack: 0
#    slot: 0
  # 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
  rgv[0]:
    id: 1
    ip: 10.10.10.120
    port: 102
    rack: 0
    slot: 0
#  # RGV2
#  rgv[1]:
#    id: 2
src/main/resources/mapper/BasRgvErrMapper.xml
New file
@@ -0,0 +1,16 @@
<?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.BasRgvErrMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgvErr">
        <result column="error_code" property="errorCode" />
        <result column="err_name" property="errName" />
        <result column="modi_user" property="modiUser" />
        <result column="modi_time" property="modiTime" />
        <result column="appe_user" property="appeUser" />
        <result column="appe_time" property="appeTime" />
    </resultMap>
</mapper>
src/main/resources/mapper/WrkMastStaMapper.xml
New file
@@ -0,0 +1,24 @@
<?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.WrkMastStaMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMastSta">
        <id column="id" property="id" />
        <result column="wrk_no" property="wrkNo" />
        <result column="wrk_start" property="wrkStart" />
        <result column="wrk_end" property="wrkEnd" />
        <result column="sta_start" property="staStart" />
        <result column="sta_end" property="staEnd" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="type" property="type" />
        <result column="wrk_sts" property="wrkSts" />
        <result column="line_number" property="lineNumber" />
        <result column="wrk_type" property="wrkType" />
        <result column="bign_time" property="bignTime" />
        <result column="wrk_crn" property="wrkCrn" />
    </resultMap>
</mapper>