#
zjj
2024-03-21 9d5f39fb3be0d9aed1fd975dad19d2c7fdecdde7
#
6个文件已修改
20个文件已添加
1759 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/BasRgvController.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasRgvErrController.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgv.java 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvErr.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasRgvErrMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasRgvMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasRgvErrService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasRgvService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasRgvErrServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasRgvServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/RgvThread.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/MessageQueue.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/OutputQueue.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvModeType.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvStatusType.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvTaskModeType.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/SlaveType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/RgvSlave.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/RgvCommand.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/properties/SlaveProperties.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensRgvThread.java 489 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasRgvErrMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasRgvMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/BasRgvController.java
New file
@@ -0,0 +1,123 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.service.BasRgvService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class BasRgvController extends BaseController {
    @Autowired
    private BasRgvService basRgvService;
    @RequestMapping(value = "/basRgv/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(basRgvService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/basRgv/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<BasRgv> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(basRgvService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/basRgv/add/auth")
    @ManagerAuth
    public R add(BasRgv basRgv) {
        basRgvService.insert(basRgv);
        return R.ok();
    }
    @RequestMapping(value = "/basRgv/update/auth")
    @ManagerAuth
    public R update(BasRgv basRgv){
        if (Cools.isEmpty(basRgv) || null==basRgv.getRgvNo()){
            return R.error();
        }
        basRgvService.updateById(basRgv);
        return R.ok();
    }
    @RequestMapping(value = "/basRgv/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            basRgvService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/basRgv/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<BasRgv> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("basRgv"));
        convert(map, wrapper);
        List<BasRgv> list = basRgvService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/basRgvQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<BasRgv> wrapper = new EntityWrapper<>();
        wrapper.like("rgv_no", condition);
        Page<BasRgv> page = basRgvService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (BasRgv basRgv : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", basRgv.getRgvNo());
            map.put("value", basRgv.getRgvNo());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/basRgv/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<BasRgv> wrapper = new EntityWrapper<BasRgv>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != basRgvService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(BasRgv.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/BasRgvErrController.java
New file
@@ -0,0 +1,123 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.BasRgvErr;
import com.zy.asrs.service.BasRgvErrService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class BasRgvErrController extends BaseController {
    @Autowired
    private BasRgvErrService basRgvErrService;
    @RequestMapping(value = "/basRgvErr/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(basRgvErrService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/basRgvErr/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<BasRgvErr> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(basRgvErrService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/basRgvErr/add/auth")
    @ManagerAuth
    public R add(BasRgvErr basRgvErr) {
        basRgvErrService.insert(basRgvErr);
        return R.ok();
    }
    @RequestMapping(value = "/basRgvErr/update/auth")
    @ManagerAuth
    public R update(BasRgvErr basRgvErr){
        if (Cools.isEmpty(basRgvErr) || null==basRgvErr.getErrorCode()){
            return R.error();
        }
        basRgvErrService.updateById(basRgvErr);
        return R.ok();
    }
    @RequestMapping(value = "/basRgvErr/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            basRgvErrService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/basRgvErr/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<BasRgvErr> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("basRgvErr"));
        convert(map, wrapper);
        List<BasRgvErr> list = basRgvErrService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/basRgvErrQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<BasRgvErr> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<BasRgvErr> page = basRgvErrService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (BasRgvErr basRgvErr : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", basRgvErr.getErrorCode());
            map.put("value", basRgvErr.getErrorCode());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/basRgvErr/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<BasRgvErr> wrapper = new EntityWrapper<BasRgvErr>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != basRgvErrService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(BasRgvErr.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/BasRgv.java
New file
@@ -0,0 +1,209 @@
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")
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= "可入")
    @TableField("in_enable")
    private Integer inEnable;
    /**
     * 可出
     */
    @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;
    /**
     * 添加人员
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    public BasRgv() {}
    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.inEnable = inEnable;
        this.outEnable = outEnable;
        this.rgvSts = rgvSts;
        this.wrkNo1 = wrkNo1;
        this.wrkNo2 = wrkNo2;
        this.rgvErr = rgvErr;
        this.pakMk = pakMk;
        this.status = status;
        this.createBy = createBy;
        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,    // 添加时间
//            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.getId());
        }
        return null;
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        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.getId());
        }
        return null;
    }
    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/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.getNickname());
        }
        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.getNickname());
        }
        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/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/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/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/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/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/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/common/CodeBuilder.java
@@ -20,7 +20,7 @@
        generator.url="127.0.0.1:1433;databasename=ghtzasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="sys_saas_log";
        generator.table="asr_bas_rgv_err";
        generator.packagePath="com.zy.asrs";
        generator.js = false;
        generator.html = false;
src/main/java/com/zy/core/RgvThread.java
New file
@@ -0,0 +1,4 @@
package com.zy.core;
public interface RgvThread extends ThreadHandler{
}
src/main/java/com/zy/core/ServerBootstrap.java
@@ -59,6 +59,10 @@
        for (Slave barcode : slaveProperties.getBarcode()) {
            MessageQueue.init(SlaveType.Barcode, barcode);
        }
        // 初始化Rgv小车mq
        for (Slave rgv : slaveProperties.getRgv()) {
            MessageQueue.init(SlaveType.Rgv, rgv);
        }
//        // 初始化Led灯mq
//        for (Slave led : slaveProperties.getLed()) {
//            MessageQueue.init(SlaveType.Led, led);
src/main/java/com/zy/core/cache/MessageQueue.java
@@ -29,6 +29,7 @@
    // 台车mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>();
    private static final Map<Integer, LinkedBlockingQueue<Task>> RGV_EXCHANGE = new ConcurrentHashMap<>();
    /**
     * mq 交换机初始化
     */
@@ -36,6 +37,9 @@
        switch (type) {
            case Crn:
                CRN_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1));
                break;
            case Rgv:
                RGV_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1));
                break;
            case Devp:
                DEVP_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
@@ -65,6 +69,8 @@
        switch (type) {
            case Crn:
                return CRN_EXCHANGE.get(id).offer(task);
            case Rgv:
                return RGV_EXCHANGE.get(id).offer(task);
            case Devp:
                return DEVP_EXCHANGE.get(id).offer(task);
            case Barcode:
@@ -88,6 +94,8 @@
        switch (type) {
            case Crn:
                return CRN_EXCHANGE.get(id).poll();
            case Rgv:
                return RGV_EXCHANGE.get(id).poll();
            case Devp:
                return DEVP_EXCHANGE.get(id).poll();
            case Barcode:
@@ -110,6 +118,8 @@
        switch (type) {
            case Crn:
                return CRN_EXCHANGE.get(id).peek();
            case Rgv:
                return RGV_EXCHANGE.get(id).peek();
            case Devp:
                return DEVP_EXCHANGE.get(id).peek();
            case Barcode:
@@ -128,9 +138,11 @@
    public static void clear(SlaveType type, Integer id){
        switch (type) {
            case Crn:
                CRN_EXCHANGE.get(id).clear();
                break;
            case Rgv:
                RGV_EXCHANGE.get(id).clear();
                break;
            case Devp:
                DEVP_EXCHANGE.get(id).clear();
                break;
src/main/java/com/zy/core/cache/OutputQueue.java
@@ -17,4 +17,8 @@
    public static ArrayBlockingQueue<JSONObject> BARCODE = new ArrayBlockingQueue<>(32);
    // 磅秤输出日志
    public static ArrayBlockingQueue<JSONObject> SCALE = new ArrayBlockingQueue<>(32);
    // 堆垛机输出日志
    public static ArrayBlockingQueue<String> RGV = new ArrayBlockingQueue<>(32);
}
src/main/java/com/zy/core/enums/RgvModeType.java
New file
@@ -0,0 +1,43 @@
package com.zy.core.enums;
public enum RgvModeType {
    NONE(-1, "离线"),
    STOP(0, "关机"),
    HAND(1, "手动"),
    HALF_AUTO(2, "半自动"),
    AUTO(3, "自动"),
    AUTO2(100, "其它"),
    ;
    public Integer id;
    public String desc;
    RgvModeType(Integer 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.intValue())) {
                return type;
            }
        }
        return null;
    }
    public static RgvModeType get(RgvModeType type) {
        if (null == type) {
            return null;
        }
        for (RgvModeType rgvModeType : RgvModeType.values()) {
            if (rgvModeType == type) {
                return rgvModeType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/RgvStatusType.java
New file
@@ -0,0 +1,46 @@
package com.zy.core.enums;
public enum RgvStatusType {
    NONE(-1, "离线"),
    IDLE(0, "空闲"),
    WORKING(1, "作业中"),
    SOS(2, "报警"),
    WORKING1(3, "作业中"),
    FETCHING(11, "取货中"),
    PUTTING(12, "放货中"),
    WAITING(90, "任务完成等待WCS确认"),
    FETCHWAITING(91, "取货任务完成等待WCS确认"),
    ;
    public Integer id;
    public String desc;
    RgvStatusType(Integer 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.intValue())) {
                return type;
            }
        }
        return NONE;
    }
    public static RgvStatusType get(RgvStatusType type) {
        if (null == type) {
            return null;
        }
        for (RgvStatusType rgvStatusType : RgvStatusType.values()) {
            if (rgvStatusType == type) {
                return rgvStatusType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/RgvTaskModeType.java
New file
@@ -0,0 +1,47 @@
package com.zy.core.enums;
public enum RgvTaskModeType {
    NONE(0),    // 无
    FETCH(1),    // 取货
    PUT(2),    // 放货
    FETCH_PUT(3),    // 取放货
    X_MOVE(4),    // 站位移转
//    Y_MOVE(5),    // 站位移转
//    XY_MOVE(6),    // 站位移转
    GO_ORIGIN(7),    // 回原点
//    BACK_ORIGIN(8),      // 回反原点
//    CLEAR(9),       // 清错
    ;
    public Integer id;
    RgvTaskModeType(Integer id) {
        this.id = id;
    }
    public static RgvTaskModeType get(Short id) {
        if (null == id) {
            return null;
        }
        for (RgvTaskModeType type : RgvTaskModeType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return null;
    }
    public static RgvTaskModeType get(RgvTaskModeType type) {
        if (null == type) {
            return null;
        }
        for (RgvTaskModeType rgvTaskModeType : RgvTaskModeType.values()) {
            if (rgvTaskModeType == type) {
                return rgvTaskModeType;
            }
        }
        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,57 @@
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 Integer offset;
    private Boolean demo;
    // RGV入库源站点
    private List<RgvStn> rgvInSStn = new ArrayList<>();
    // RGV出库源站点
    private List<RgvStn> rgvOutSStn = new ArrayList<>();
    // RGV叠盘
    private List<RgvStn> rgvEmptyInSStn = new ArrayList<>();
    // RGV空板入库
    private List<RgvStn> rgvEmptyOutSStn = new ArrayList<>();
    // RGV出库目标站点
    private List<RgvStn> rgvDestStn = new ArrayList<>();
    @Data
    public static class RgvStn {
        // 输送线plc编号
        private Integer devpPlcId;
        // RGV站点编号
        private Integer staNo;
//        // 排
//        private Integer row;
//
//        // 列
//        private Integer bay;
//
//        // 层
//        private Integer lev;
    }
}
src/main/java/com/zy/core/model/command/RgvCommand.java
New file
@@ -0,0 +1,129 @@
package com.zy.core.model.command;
import com.alibaba.fastjson.annotation.JSONField;
import com.zy.core.enums.RgvTaskModeType;
import lombok.Data;
import java.util.Calendar;
import java.util.Date;
/**
 * 堆垛机命令报文
 * Created by vincent on 2020/8/11
 */
@Data
public class RgvCommand {
    // Rgv编号
    private Integer rgvNo = 0;
    // 工位1任务完成确认位
    private Short ackFinish1 = 0;
    // 工位1任务号
    private Short taskNo1 = 0;
    /**
     * 任务模式:
     * 0 = 无
     * 1 = 取货
     * 2 = 放货
     * 3 = 取放货
     */
    private Short taskMode1 = 0;
    @JSONField(serialize = false)
    private RgvTaskModeType taskModeType1;
    /*
    工位1源站
     */
    private Short sourceStaNo1 = 0;
    /*
    工位1目标站
     */
    private Short destinationStaNo1 = 0;
    //////////////////////     工位2定义   //////////////////////////////////////////////////
    // 工位1任务完成确认位
    private Short ackFinish2 = 0;
    // 工位2任务号
    private Short taskNo2 = 0;
    /**
     * 任务模式:
     * 0 = 无
     * 1 = 取货
     * 2 = 放货
     * 3 = 取放货
     */
    private Short taskMode2 = 0;
    @JSONField(serialize = false)
    private RgvTaskModeType taskModeType2;
    /*
    工位1源站
     */
    private Short sourceStaNo2 = 0;
    /*
    工位1目标站
     */
    private Short destinationStaNo2 = 0;
    ///////////////////////////////////////////////////////////////////////////////////////
    /**
     * 任务模式:
     * 0 = 未确认
     * 1 = 工位1任务确认
     * 2 = 工位2任务确认
     * 3 = 工位1、2任务同时确认
     */
    private Short command = 0;
    public void setTaskMode1(Short taskMode1){
        this.taskMode1 = taskMode1;
        this.taskModeType1 = RgvTaskModeType.get(taskModeType1);
    }
    public void setTaskMode1(RgvTaskModeType type1) {
        this.taskModeType1 = type1;
        this.taskMode1 = RgvTaskModeType.get(type1).id.shortValue();
    }
    public void setTaskMode2(Short taskMode2){
        this.taskMode2 = taskMode2;
        this.taskModeType2 = RgvTaskModeType.get(taskModeType2);
    }
    public void setTaskMode2(RgvTaskModeType type2) {
        this.taskModeType2 = type2;
        this.taskMode2 = RgvTaskModeType.get(type2).id.shortValue();
    }
    public static void main(String[] args) {
        Date date = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        System.out.println(cal.get(Calendar.YEAR));
        //默认从0-11
        System.out.println(cal.get(Calendar.MONTH)+1);
        System.out.println(cal.get(Calendar.DATE));
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        System.out.println("时");
        System.out.println(hour);
        int minute = cal.get(Calendar.MINUTE);
        System.out.println("分");
        System.out.println(minute);
        int second = cal.get(Calendar.SECOND);
        System.out.println("秒");
        System.out.println(second);
        int mm = cal.get(Calendar.DAY_OF_WEEK) - 1; // 星期:0(日)~6(六)
        System.out.println("礼拜");
        System.out.println(mm);
    }
}
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
New file
@@ -0,0 +1,231 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasRgv;
import com.zy.core.enums.RgvModeType;
import com.zy.core.enums.RgvStatusType;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by vincent on 2020/8/7
 */
@Data
public class RgvProtocol implements Cloneable{
    private Integer RgvNo;
    /**
     * 1 = 手动模式
     * 2 = 自动模式
     * 3 = 电脑模式
     */
    public Short mode;
    public RgvModeType modeType;
    /**
     * RGV当前状态
     * 0:空闲,无任务
     * 1:作业中
     * 2:报警
     */
    public Short status;
    /**
     * 状态枚举
     */
    public RgvStatusType statusType;
    /**
     * 工位1任务号
     */
    public Short taskNo1 = 0;
    /**
     * RGV工位1当前状态
     * 0:空闲,无任务
     * 11:取货中
     * 12:放货中
     * 10:任务完成等待WCS确认
     */
    public Short status1;
    /**
     * 状态枚举
     */
    public RgvStatusType statusType1;
    /**
     * 工位1有物
     */
    public Short loaded1;
    /**
     * RGV当前位置
     */
    public Short RgvPos;
    /**
     * 走行在定位
     * 0 = 在定位
     * 1 = 不在定位
     */
    public Short walkPos;
    //////////////////////     工位2定义   //////////////////////////////////////////////////
//    /**
//     * 工位2任务号
//     */
//    public Short taskNo2 = 0;
//
//    /**
//     * RGV工位2当前状态
//     * 0:空闲,无任务
//     * 11:取货中
//     * 12:放货中
//     * 10:任务完成等待WCS确认
//     */
//    public Short status2;
//
//    /**
//     * 状态枚举
//     */
//    public RgvStatusType statusType2;
//
//    /**
//     * 工位2有物
//     */
//    public Short loaded2;
    ///////////////////////////////////////////////////////////////////////////////////////
    /**
     * 异常码
     */
    public Short alarm;
    /**
     * 心跳指令 1-2每秒切换一次
     */
    public Short heart;
    private Short temp1;
    private Short temp2;
    private Short temp3;
    private Short temp4;
    private Short temp5;
    /**
     * X行走行速度m/min
     */
    private Float xSpeed;
    /**
     * 堆垛机累计走行距离km
     */
    public Float xDistance;
    /**
     * 堆垛机累计走行时长h
     */
    public Float xDuration;
    public void setMode(Short mode) {
        this.mode = mode;
        this.modeType = RgvModeType.get(mode);
    }
    public void setMode(RgvModeType type) {
        this.modeType = type;
        this.mode = RgvModeType.get(type).id.shortValue();
    }
    public void setStatus(Short status){
        this.status = status;
        this.statusType = RgvStatusType.get(status);
    }
    public void setStatus(RgvStatusType type){
        this.statusType = type;
        this.status = RgvStatusType.get(type).id.shortValue();
    }
    public void setStatus1(Short status1){
        this.status1 = status1;
        this.statusType1 = RgvStatusType.get(status1);
    }
    public void setStatus1(RgvStatusType type1){
        this.statusType1 = type1;
        this.status1 = RgvStatusType.get(type1).id.shortValue();
    }
//    public void setStatus2(Short status2){
//        this.status2 = status2;
//        this.statusType2 = RgvStatusType.get(status2);
//    }
//
//    public void setStatus2(RgvStatusType type2){
//        this.statusType2 = type2;
//        this.status2 = RgvStatusType.get(type2).id.shortValue();
//    }
    /**
     * 最近一次入出库类型
     *       I:入库
     *       O:出库
     */
    private String lastIo = "I";
    public BasRgv toSqlModel(BasRgv basRgv){
        if (alarm!=null) {
            basRgv.setRgvErr(alarm.longValue());
        }
        basRgv.setWrkNo1(taskNo1.intValue());
//        basRgv.setWrkNo2(taskNo2.intValue());
        return basRgv;
    }
    public void setxSpeed(Short xSpeed) {
        this.xSpeed = Float.valueOf(xSpeed);
    }
    public void setxDistance(Short xDistance) {
        this.xDistance = Float.valueOf(xDistance);
    }
    public void setxDuration(Short xDuration) {
        this.xDuration = Float.valueOf(xDuration);
    }
    public Integer getRgvPosI(){
        //需要根据现场改造  根据读到的值获取对应站点位置
        Map<Short,Integer> map = new HashMap<>();
        map.put((short) 1,100);map.put((short) 2,101);
        map.put((short) 3,106);map.put((short) 4,107);
        map.put((short) 5,112);map.put((short) 6,113);
        map.put((short) 7,119);map.put((short) 8,124);
        map.put((short) 9,149);map.put((short) 10,153);
        map.put((short) 11,157);map.put((short) 12,161);
        if (RgvPos==null) return 0;
        return map.get(RgvPos);
    }
    @Override
    public RgvProtocol clone() {
        try {
            return (RgvProtocol) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}
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,5 @@
    private List<Slave> car = new ArrayList<>();
    private List<RgvSlave> rgv = new ArrayList<>();
}
src/main/java/com/zy/core/thread/SiemensRgvThread.java
New file
@@ -0,0 +1,489 @@
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.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;
@Data
@Slf4j
public class SiemensRgvThread implements Runnable, RgvThread {
    private SiemensS7Net siemensNet;
    private RgvSlave slave;
    private RgvProtocol rgvProtocol;
    /**
     * 工位1复位信号
     */
    private boolean resetFlag1 = false;
    /**
     * 工位2复位信号
     */
    private boolean resetFlag2 = false;
    //锁定标记
    private boolean PakMk = true;
    public SiemensRgvThread(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;
//                    // 工位1、2写入数据
//                    case 2:
//                        write((RgvCommand) task.getData());
//                        break;
                    //工位1写入数据
                    case 4:
                        write1((RgvCommand) task.getData());
                        break;
//                    //工位2写入数据
//                    case 5:
//                        write2((RgvCommand) task.getData());
//                        break;
                    // 复位
                    case 3:
                        RgvCommand command = (RgvCommand) task.getData();
                        if (null == command) {
                            command = new RgvCommand();
                        }
                        command.setRgvNo(slave.getId()); // RGV编号
                        command.setTaskNo1((short) 0); // 工作号
                        command.setAckFinish1((short) 1);  // 任务完成确认位
                        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo1((short)0);     // 源站
                        command.setDestinationStaNo1((short)0);     // 目标站
                        command.setCommand((short)0);
                        write1(command);
                        break;
                    // 回原点  避让
                    case 9:
                        RgvCommand commandAvoidanceXY = (RgvCommand) task.getData();
                        if (null == commandAvoidanceXY) {
                            commandAvoidanceXY = new RgvCommand();
                        }
                        commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号
                        commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号
                        commandAvoidanceXY.setAckFinish1((short) 1);  // 任务完成确认位
                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式
                        commandAvoidanceXY.setSourceStaNo1((short)0);     // 源站
                        commandAvoidanceXY.setDestinationStaNo1((short)0);     // 目标站
//                        commandAvoidanceXY.setTaskNo2((short) 0); // 工作号
//                        commandAvoidanceXY.setAckFinish2((short) 1);  // 任务完成确认位
//                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式
//                        commandAvoidanceXY.setSourceStaNo2((short)0);     // 源站
//                        commandAvoidanceXY.setDestinationStaNo2((short)0);     // 目标站
                        commandAvoidanceXY.setCommand((short)0);
                        write(commandAvoidanceXY);
                        break;
                    default:
                        break;
                }
                Thread.sleep(500);
            } catch (Exception e) {
//                e.printStackTrace();
            }
        }
    }
    /**
     * 初始化RGV状态
     */
    private void initRgv() {
        if (null == rgvProtocol) {
            rgvProtocol = new RgvProtocol();
        }
        rgvProtocol.setMode((short) -1);
        rgvProtocol.setStatus((short)-1);
        rgvProtocol.setTaskNo1((short)0);
        rgvProtocol.setStatus1((short)-1);
        rgvProtocol.setLoaded1((short)0);
        rgvProtocol.setWalkPos((short)0);
        rgvProtocol.setRgvPos((short)0);
//        rgvProtocol.setTaskNo2((short)0);
//        rgvProtocol.setStatus2((short)-1);
//        rgvProtocol.setLoaded2((short)0);
        rgvProtocol.setAlarm((short)0);
        rgvProtocol.setxSpeed((short) 0);
        rgvProtocol.setxDistance((short) 0);
        rgvProtocol.setxDuration((short) 0);
    }
    @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.RGV.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.RGV.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();
        }
//        siemensNet.ConnectClose();
        return result;
    }
    /**
     * 读取状态
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30);
            if (result.IsSuccess) {
                if (null == rgvProtocol || rgvProtocol.getRgvNo() == null) {
                    rgvProtocol = new RgvProtocol();
                    rgvProtocol.setRgvNo(slave.getId());
                }
                rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));
                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2));
                rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4));
                rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6));
                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8));
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));
                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14));
//                rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16));
                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18));
//                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20));
                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22));
//                rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26));
//                rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28));
//                rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30));
//                rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32));
//                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28));
//                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
//                rgvProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48));
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId()));
                // 工位1复位信号
                if (rgvProtocol.getStatusType1().equals(RgvStatusType.WAITING)
                        || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) {
                    if (resetFlag1) {
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setAckFinish1((short)1);
                        if (write(rgvCommand)) {
                            resetFlag1 = false;
                        }
                    }
                }
                // 工位2复位信号
//                if (rgvProtocol.getStatusType2().equals(RgvStatusType.WAITING)
//                        || rgvProtocol.getStatusType2().equals(RgvStatusType.FETCHWAITING)) {
//                    if (resetFlag2) {
//                        RgvCommand rgvCommand = new RgvCommand();
//                        rgvCommand.setAckFinish2((short)1);
//                        if (write(rgvCommand)) {
//                            resetFlag2 = false;
//                        }
//                    }
//                }
                try {
                    // 根据实时信息更新数据库
                    BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
                    BasRgv basRgv = new BasRgv();
                    basRgv.setRgvNo(slave.getId());
                    basRgv.setRgvSts((int)rgvProtocol.getMode());
                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){
                        log.error("RGV plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                    }
                } catch (Exception ignore){
                    System.out.println(ignore);
                }
            } else {
                initRgv();
                OutputQueue.RGV.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.RGV.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();
        }
    }
    /**
     * 工位1、2同时写入数据
     */
    private boolean write(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
//        convertRow(command);
        command.setRgvNo(slave.getId());
        short[] array = new short[11];
        array[0] = command.getAckFinish1();
        array[1] = command.getTaskNo1();
        array[2] = command.getTaskMode1();
        array[3] = command.getSourceStaNo1();
        array[4] = command.getDestinationStaNo1();
//        array[0] = command.getAckFinish1();
//        array[1] = command.getTaskNo1();
//        array[2] = command.getTaskMode1();
//        array[3] = command.getSourceStaNo1();
//        array[4] = command.getDestinationStaNo1();
//        array[5] = command.getAckFinish2();
//        array[6] = command.getTaskNo2();
//        array[7] = command.getTaskMode2();
//        array[8] = command.getSourceStaNo2();
//        array[9] = command.getDestinationStaNo2();
//        array[10] = command.getCommand();
        OperateResult result = siemensNet.Write("DB100.0", array);
//        if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) {
//            short commandFinish = 3;  //工位1、2任务同时写入
//            Thread.sleep(100L);
//            result = siemensNet.Write("DB100.20", commandFinish);
//        }
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.RGV.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());
            return false;
        }
    }
    /**
     * 工位1写入数据
     */
    private boolean write1(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
//        siemensNet.Write("DB100.20", command.getCommand());
        command.setRgvNo(slave.getId());
        short[] array = new short[5];
        array[0] = command.getAckFinish1();
        array[1] = command.getTaskNo1();
        array[2] = command.getTaskMode1();
        array[3] = command.getSourceStaNo1();
        array[4] = command.getDestinationStaNo1();
        siemensNet.Write("DB100.10", command.getCommand());
        OperateResult result = siemensNet.Write("DB100.0", array);
        if (!result.IsSuccess){
            log.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(4,command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 12);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
//                one.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
                one.setTaskNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                one.setTaskMode1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                if (
                        !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(4, command));
                    Thread.sleep(100);
                    readStatus();
                    return false;
                }else {
                    log.info("RGV命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                }
            }
        }catch (Exception e){
            log.error("RGV命令地址写入后回读出错");
        }
        if (command.getAckFinish1() == 0) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    short commandFinish = (short) 1;
                    result = siemensNet.Write("DB100.10", commandFinish);
                    if(result.IsSuccess){
                        //RGV任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.10", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                            if (commandFinish != 1){
                                log.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                log.info("RGV任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
                            log.error("RGV任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次");
                        }
                    } else {
                        log.error("RGV任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次");
                    }
                }while (writeCount2<5);
            }
        }
//        if (command.getAckFinish1() == 0) {
//            short commandFinish = 1;  //工位1任务写入
//            Thread.sleep(200);
//            result = siemensNet.Write("DB100.10", commandFinish);
//        }
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            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.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;
        }
    }
    /**
     * 工位2写入数据
     */
    private boolean write2(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
        command.setRgvNo(slave.getId());
        short[] array = new short[6];
        array[0] = command.getAckFinish2();
        array[1] = command.getTaskNo2();
        array[2] = command.getTaskMode2();
        array[3] = command.getSourceStaNo2();
        array[4] = command.getDestinationStaNo2();
        array[5] = command.getCommand();
        OperateResult result = siemensNet.Write("DB100.10", array);
        if (command.getAckFinish2() == 0) {
            short commandFinish = 2;  //工位2任务写入
            Thread.sleep(100L);
            result = siemensNet.Write("DB100.20", commandFinish);
        }
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("RGV 工位2命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位2命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位2数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入RGV plc工位2数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    @Override
    public void close() {
        siemensNet.ConnectClose();
    }
    /******************************************************************************************/
    /**************************************** 测试专用 *****************************************/
    /*****************************************************************************************/
    public static void main(String[] args) throws InterruptedException {
        RgvSlave slave = new RgvSlave();
        slave.setId(1);
        slave.setIp("192.168.6.9");
        slave.setRack(0);
        slave.setSlot(0);
        SiemensRgvThread rgvThread = new SiemensRgvThread(slave);
        rgvThread.connect();
        rgvThread.readStatus();
        System.out.println(JSON.toJSONString(rgvThread.rgvProtocol));
        Thread.sleep(3000L);
    }
}
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/BasRgvMapper.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.BasRgvMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasRgv">
        <result column="rgv_no" property="rgvNo" />
        <result column="in_enable" property="inEnable" />
        <result column="out_enable" property="outEnable" />
        <result column="rgv_sts" property="rgvSts" />
        <result column="wrk_no1" property="wrkNo1" />
        <result column="wrk_no2" property="wrkNo2" />
        <result column="rgv_err" property="rgvErr" />
        <result column="pak_mk" property="pakMk" />
        <result column="status" property="status" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="memo" property="memo" />
    </resultMap>
</mapper>