自动化立体仓库 - WCS系统
#
lsh
2024-06-25 f30358a20ae9a74ee7f6c604a8d102c1b9b24659
#
1个文件已添加
22个文件已修改
939 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasJar.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasJarMast.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastExecute.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasJarMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastExecuteMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasJarService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastExecuteService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasJarServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 224 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastExecuteServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/SteAndJarUtil.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/JarTaskModeType.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/SteTaskModeType.java 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/JarCommand.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/SteCommand.java 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/JarThread.java 160 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SteThread.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasJarMapper.xml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastExecuteMapper.xml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasJar.java
@@ -130,22 +130,22 @@
     * 出罐小车
     */
    @ApiModelProperty(value= "出罐小车")
    @TableField("out_ste_id")
    private Integer outSteId;
    @TableField("out_ste_no")
    private Integer outSteNo;
    /**
     * 入罐RGV
     */
    @ApiModelProperty(value= "入罐RGV")
    @TableField("enter_rgv_id")
    private Integer enterRgvId;
    @TableField("enter_rgv_no")
    private Integer enterRgvNo;
    /**
     * 出罐RGV
     */
    @ApiModelProperty(value= "出罐RGV")
    @TableField("out_rgv_id")
    private Integer outRgvId;
    @TableField("out_rgv_no")
    private Integer outRgvNo;
    /**
     * 冷却
src/main/java/com/zy/asrs/entity/BasJarMast.java
@@ -185,9 +185,9 @@
        this.jarRegin = jar.getRegion();
        this.status = 0;
        this.enterSteNo = jar.getEnterSteNo();
        this.outSteId = jar.getOutSteId();
        this.enterRgvId = jar.getEnterRgvId();;
        this.outRgvId = jar.getOutRgvId();;
        this.outSteId = jar.getOutSteNo();
        this.enterRgvId = jar.getEnterRgvNo();;
        this.outRgvId = jar.getOutRgvNo();;
        this.ioTime = wrkMast.getIoTime();
        this.modiTime = now;
        this.appeTime = now;
src/main/java/com/zy/asrs/entity/WrkMastExecute.java
@@ -140,9 +140,9 @@
    private Integer wrkSts;
    /**
     * 任务类型 0: 未知  1: 开门  2: 关门  3: 入硫化罐  4: 入冷却槽  5: 穿梭车进冷却槽  6: 穿梭车离开冷却槽  7: 出冷却槽
     * 任务类型 0: 未知  1: 开进料门  2: 关进料门  3: 开出料门  4: 关出料门  5: 入硫化罐  6: 入冷却槽  7: 穿梭车进冷却槽  8: 穿梭车离开冷却槽  9: 出冷却槽 10:A=>B 11:B=>A
     */
    @ApiModelProperty(value= "任务类型 0: 未知  1: 开进料门  2: 关进料门  3: 开出料门  4: 关出料门  5: 入硫化罐  6: 入冷却槽  7: 穿梭车进冷却槽  8: 穿梭车离开冷却槽  9: 出冷却槽  ")
    @ApiModelProperty(value= "任务类型 0: 未知  1: 开进料门  2: 关进料门  3: 开出料门  4: 关出料门  5: 入硫化罐  6: 入冷却槽  7: 穿梭车进冷却槽  8: 穿梭车离开冷却槽  9: 出冷却槽 10:A=>B 11:B=>A ")
    @TableField("io_type")
    private Integer ioType;
src/main/java/com/zy/asrs/mapper/BasJarMapper.java
@@ -3,10 +3,13 @@
import com.zy.asrs.entity.BasJar;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface BasJarMapper extends BaseMapper<BasJar> {
    BasJar selectByJarNo(@Param("jarNo") Integer jarNo);
}
src/main/java/com/zy/asrs/mapper/WrkMastExecuteMapper.java
@@ -6,12 +6,21 @@
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface WrkMastExecuteMapper extends BaseMapper<WrkMastExecute> {
    WrkMastExecute getWrkMastByWrkNo(@Param("wrkNo") Long wrkNo);
    List<WrkMastExecute> getWrkMastByJarId(@Param("jarId") Integer jarId);
    List<WrkMastExecute> sselectWrkMastExecuteByType(@Param("type") Integer type);
    List<WrkMastExecute> sselectWrkMastExecuteByTypeAndIoTyper(@Param("type")Integer type,@Param("ioType")Integer ioType);
    Integer getWrkMastByJarIdCount(@Param("jarId") Integer jarId);
}
src/main/java/com/zy/asrs/service/BasJarService.java
@@ -3,6 +3,10 @@
import com.zy.asrs.entity.BasJar;
import com.baomidou.mybatisplus.service.IService;
import java.util.List;
public interface BasJarService extends IService<BasJar> {
    BasJar selectByJarNo(Integer jarNo);
}
src/main/java/com/zy/asrs/service/WrkMastExecuteService.java
@@ -3,10 +3,18 @@
import com.zy.asrs.entity.WrkMastExecute;
import com.baomidou.mybatisplus.service.IService;
import java.util.List;
public interface WrkMastExecuteService extends IService<WrkMastExecute> {
    WrkMastExecute getWrkMastByWrkNo(Long wrkNo);
    WrkMastExecute getWrkMastExecuteByWrkNo(Long wrkNo);
    Integer getWrkMastByJarIdCount(Integer jarId);
    List<WrkMastExecute> getWrkMastExecuteByJarNo(Integer jarId);
    List<WrkMastExecute> sselectWrkMastExecuteByType(Integer type);
    List<WrkMastExecute> sselectWrkMastExecuteByTypeAndIoTyper(Integer type,Integer ioType);
    Integer getWrkMastExecuteByJarIdCount(Integer jarId);
}
src/main/java/com/zy/asrs/service/impl/BasJarServiceImpl.java
@@ -9,4 +9,8 @@
@Service("basJarService")
public class BasJarServiceImpl extends ServiceImpl<BasJarMapper, BasJar> implements BasJarService {
    @Override
    public BasJar selectByJarNo(Integer jarNo){
        return this.baseMapper.selectByJarNo(jarNo);
    };
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -11,10 +11,7 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.*;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.CodeDetectionUtil;
import com.zy.asrs.utils.RouteUtils;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
import com.zy.asrs.utils.*;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.MatDto;
import com.zy.common.model.SearchLocParam;
@@ -30,9 +27,7 @@
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.*;
import com.zy.core.model.*;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.command.*;
import com.zy.core.model.cpmmandParam.CrnCommandParam;
import com.zy.core.model.protocol.*;
import com.zy.core.properties.SlaveProperties;
@@ -1167,6 +1162,7 @@
        }
        return false;
    }
    public synchronized boolean crnStnToOutStnTwo(CrnSlave.CrnStn crnStn ,Integer conStation) {
        try{
            Date now = new Date();
@@ -1288,6 +1284,7 @@
        }
        return false;
    }
    public synchronized boolean crnStnToOutStnThree(CrnSlave.CrnStn crnStn ) {
        try{
            // 获取堆垛机出库站信息
@@ -2938,6 +2935,7 @@
            }
        }
    }
    public synchronized boolean storeFinishedExecuteOne(CrnSlave crn) {
        try{
            // 获取堆垛机信息
@@ -3003,6 +3001,7 @@
        }
        return false;
    }
    public synchronized boolean storeFinishedExecuteTwo(CrnSlave crn) {
        try{
            // 获取堆垛机信息
@@ -3094,6 +3093,7 @@
        }
        return false;
    }
    public synchronized boolean storeFinishedExecuteThree(CrnSlave crn) {
        try{
            // 获取堆垛机信息
@@ -3613,6 +3613,7 @@
            }
        }
    }
    /**
     * 空栈板初始化入库,叉车入库站放货
     */
@@ -4418,7 +4419,7 @@
    public synchronized void jarMastGenerate() {
        for (JarSlave jarSlave : slaveProperties.getJar()) {
            try{
                if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
                if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                    continue;
                }
                for(JarSlave.StaStn staStn : jarSlave.getJarInSta()){
@@ -4473,7 +4474,7 @@
                            if (!Cools.isEmpty(basJarMast)){
                                continue;
                            }
                            WrkMastExecute wrkMastExecute = wrkMastExecuteService.getWrkMastByWrkNo(wrkMast.getWrkNo().longValue());
                            WrkMastExecute wrkMastExecute = wrkMastExecuteService.getWrkMastExecuteByWrkNo(wrkMast.getWrkNo().longValue());
                            if (!Cools.isEmpty(wrkMastExecute)){
                                continue;
                            }
@@ -4605,7 +4606,7 @@
        for (JarSlave jarSlave : slaveProperties.getJar()) {
            int i = jarSlave.getId()>2? 1:0;
            try{
                if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
                if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                    continue;
                }
@@ -4670,11 +4671,14 @@
    public synchronized boolean[] jarWrkMastExecuteGenerateBurial(boolean[] signExecute,Integer sign) {
        for (JarSlave jarSlave : slaveProperties.getJar()) {
            if (jarSlave.getId()<5){
                continue;
            }
            try{
                if (signExecute[jarSlave.getId()-5]){
                    continue;
                }
                if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
                if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                    signExecute[jarSlave.getId()-5] = true;
                    continue;
                }
@@ -4716,11 +4720,14 @@
    public synchronized boolean[] jarWrkMastExecuteGenerateSte(boolean[] signExecute,Integer sign) {
        for (JarSlave jarSlave : slaveProperties.getJar()) {
            if (jarSlave.getId()<5){
                continue;
            }
            try{
                if (signExecute[jarSlave.getId()-5]){
                    continue;
                }
                if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
                if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                    continue;
                }
@@ -4774,7 +4781,7 @@
     */
    public synchronized boolean jarWrkMastExecuteGenerate1(JarSlave jarSlave,Integer sign) {
        try{
            if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
            if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                return false;
            }
            List<BasJarMast> basJarMastList = basJarMastService.getJarMastByJarIdAndStatusList(jarSlave.getId(), new ArrayList<Integer>() {{
@@ -4847,13 +4854,13 @@
                                && !jarOtherProtocol.isLeftDoor() && jarOtherProtocol.leftDoorOpen==0  && jarOtherProtocol.leftDoorClose==0){
                            if (!jarProtocol.isLeftDoor() && basJarMast.getStatus()==0){
                                //生成开门任务 OpenTheDoor
                                if (!jarWrkMastExecuteGenerateExecute(basJar,basJarMast,basJar.getJarNo(),new int[]{basJar.getEnterSteNo(),basJar.getEnterRgvId(),1,1})){
                                if (!jarWrkMastExecuteGenerateExecute(basJar,basJarMast,basJar.getJarNo(),new int[]{basJar.getEnterSteNo(),basJar.getEnterRgvNo(),1,1})){
                                    log.error("JarWrkMastExecute任务创建===>执行异常===》异常数据:BasJar:"+ JSON.toJSONString(basJar)+";BasJarMast:"+JSON.toJSONString(basJarMast));
                                }
                                return true;
                            } else if (jarProtocol.statusType == JarStatusType.WAITING3 && jarProtocol.isLeftDoor()){
                                //生成入硫化罐任务
                                if (!jarWrkMastExecuteGenerateExecute(basJar,basJarMast,basJar.getJarNo(),new int[]{basJar.getEnterSteNo(),basJar.getEnterRgvId(),5,1})){
                                if (!jarWrkMastExecuteGenerateExecute(basJar,basJarMast,basJar.getJarNo(),new int[]{basJar.getEnterSteNo(),basJar.getEnterRgvNo(),5,1})){
                                    log.error("JarWrkMastExecute任务创建===>执行异常===》异常数据:BasJar:"+ JSON.toJSONString(basJar)+";BasJarMast:"+JSON.toJSONString(basJarMast));
                                }
                                return true;
@@ -4881,7 +4888,7 @@
     */
    public synchronized boolean jarWrkMastExecuteGenerate2(JarSlave jarSlave,Integer sign) {
        try{
            if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
            if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                return false;
            }
            List<BasJarMast> basJarMastList = basJarMastService.getJarMastByJarIdAndStatusList(jarSlave.getId(), new ArrayList<Integer>() {{
@@ -4928,7 +4935,7 @@
                        && !jarProtocol.isRightDoor() && jarProtocol.isLeftDoor()
                        && jarProtocol.leftDoorOpen==0  && jarProtocol.leftDoorClose==0 && jarProtocol.rightDoorOpen==0  && jarProtocol.rightDoorClose==0){
                    //关进料门
                    if (!jarWrkMastExecuteGenerateExecute(basJar,basJarMastSign,basJar.getJarNo(),new int[]{basJar.getEnterSteNo(),basJar.getEnterRgvId(),2,1})){
                    if (!jarWrkMastExecuteGenerateExecute(basJar,basJarMastSign,basJar.getJarNo(),new int[]{basJar.getEnterSteNo(),basJar.getEnterRgvNo(),2,1})){
                        log.error("JarWrkMastExecute任务创建===>执行异常===》异常数据:BasJar:"+ JSON.toJSONString(basJar)+";BasJarMast:"+JSON.toJSONString(basJarMastSign));
                    }
                    return true;
@@ -4950,7 +4957,7 @@
     */
    public synchronized boolean jarWrkMastExecuteGenerate3(JarSlave jarSlave,Integer sign) {
        try{
            if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
            if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                return false;
            }
            List<BasJarMast> basJarMastList = basJarMastService.getJarMastByJarIdAndStatusList(jarSlave.getId(), new ArrayList<Integer>() {{
@@ -4997,7 +5004,7 @@
                        && !jarProtocol.isLeftDoor() && !jarProtocol.isRightDoor()
                        && jarProtocol.leftDoorOpen==0  && jarProtocol.leftDoorClose==0 && jarProtocol.rightDoorOpen==0  && jarProtocol.rightDoorClose==0){
                    //开出料门
                    if (!jarWrkMastExecuteGenerateExecute(basJar,basJarMastSign,basJar.getJarNo(),new int[]{basJar.getOutSteId(),basJar.getOutRgvId(),3,1})){
                    if (!jarWrkMastExecuteGenerateExecute(basJar,basJarMastSign,basJar.getJarNo(),new int[]{basJar.getOutSteNo(),basJar.getOutRgvNo(),3,1})){
                        log.error("JarWrkMastExecute任务创建===>执行异常===》异常数据:BasJar:"+ JSON.toJSONString(basJar)+";BasJarMast:"+JSON.toJSONString(basJarMastSign));
                    }
                    return true;
@@ -5019,7 +5026,7 @@
     */
    public synchronized boolean jarWrkMastExecuteGenerate4(JarSlave jarSlave,Integer sign) {
        try{
            if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
            if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                return false;
            }
            List<BasJarMast> basJarMastList = basJarMastService.getJarMastByJarIdAndStatusList(jarSlave.getId(), new ArrayList<Integer>() {{
@@ -5067,7 +5074,7 @@
                        && !jarProtocol.isLeftDoor() && jarProtocol.isRightDoor()
                        && jarProtocol.leftDoorOpen==0  && jarProtocol.leftDoorClose==0 && jarProtocol.rightDoorOpen==0  && jarProtocol.rightDoorClose==0){
                    //关进料门
                    if (!jarWrkMastExecuteGenerateExecute(basJar,jarMastByJarIdMin,basJar.getJarNo(),new int[]{basJar.getOutSteId(),basJar.getOutRgvId(),3,1})){
                    if (!jarWrkMastExecuteGenerateExecute(basJar,jarMastByJarIdMin,basJar.getJarNo(),new int[]{basJar.getOutSteNo(),basJar.getOutRgvNo(),3,1})){
                        log.error("JarWrkMastExecute任务创建===>执行异常===》异常数据:BasJar:"+ JSON.toJSONString(basJar)+";BasJarMast:"+JSON.toJSONString(jarMastByJarIdMin));
                    }
                    return true;
@@ -5089,7 +5096,7 @@
     */
    public synchronized boolean jarWrkMastExecuteGenerate5(JarSlave jarSlave,Integer sign) {
        try{
            if (wrkMastExecuteService.getWrkMastByJarIdCount(jarSlave.getId())!=0){
            if (wrkMastExecuteService.getWrkMastExecuteByJarIdCount(jarSlave.getId())!=0){
                return false;
            }
            List<BasJarMast> basJarMastList = basJarMastService.getJarMastByJarIdAndStatusList(jarSlave.getId(), new ArrayList<Integer>() {{
@@ -5136,7 +5143,7 @@
                //门作业  无
                if (jarProtocol.isAutoing() && jarProtocol.jarErr==0){
                    //关进料门
                    if (!jarWrkMastExecuteGenerateExecute(basJar,jarMastByJarIdMin,basJar.getBurial(),new int[]{basJar.getOutSteId(),basJar.getOutRgvId(),3,1})){
                    if (!jarWrkMastExecuteGenerateExecute(basJar,jarMastByJarIdMin,basJar.getBurial(),new int[]{basJar.getOutSteNo(),basJar.getOutRgvNo(),3,1})){
                        log.error("JarWrkMastExecute任务创建===>执行异常===》异常数据:BasJar:"+ JSON.toJSONString(basJar)+";BasJarMast:"+JSON.toJSONString(jarMastByJarIdMin));
                    }
                    return true;
@@ -5154,6 +5161,9 @@
    /**
     *  判断STE小车状态  //完成
     *  1:A面  进料面
     *  2:B面 出料面
     *  3:冷却槽B面 上输送线
     */
    public synchronized boolean jarWrkMastExecuteGenerateSteStatus(Integer steNo,Integer type) {
        try{
@@ -5201,9 +5211,17 @@
        }
        return false;
    }
    /**
     *  判断RGV小车状态  //完成
     */
    /*
     * 判断RGV小车状态  //完成
     * RGV1;//小车无货空闲
     * RGV2;//小车输送线取货到位
     * RGV3;//小车运行中
     * RGV3;//小车运行中
     * RGV4;//小车改左侧货物目标站   取1(左)货物
     * RGV5;//小车改右侧货物目标站   取2(右)货物
     * RGV6;//上位机清除平移车资料
     * */
    public synchronized boolean jarWrkMastExecuteGenerateRgvStatus(Integer rgvNo,Integer rgvPlcId,Integer type) {
        try{
            //检测RGV状态
@@ -5217,6 +5235,7 @@
            if (staProtocolRGV == null) {
                return false;
            }
            return staProtocolRGV.rgvBoolean(type);
        } catch (Exception e){
            log.error("{}号RGV状态判断状态异常,异常原因={}",rgvNo,e.getMessage());
@@ -5242,6 +5261,46 @@
        return false;
    }
    /*
    * JarWrkMastExecute任务创建==>下发
    * Action
    * */
    public synchronized void jarWrkMastExecuteAction(Integer sign) {
        try{
            List<WrkMastExecute> wrkMastExecuteList = wrkMastExecuteService.sselectWrkMastExecuteByTypeAndIoTyper(0, 0);
            for (WrkMastExecute wrkMastExecute : wrkMastExecuteList){
                /*
                * 任务类型 0: 未知
                * 1: 开进料门  2: 关进料门  3: 开出料门  4: 关出料门
                * 5: 入硫化罐
                * 6: 入冷却槽
                * 7: 穿梭车进冷却槽  8: 穿梭车离开冷却槽
                * 9: 出冷却槽
                * 10:A=>B 11:B=>A
                * */
                switch (wrkMastExecute.getIoType()){
                    case 1:
                        jarWrkMastExecuteActionExecute1(wrkMastExecute,sign);
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                    case 9:
                    case 10:
                    case 11:
                    case 12:
                    case 13:
                }
            }
        } catch (Exception e){
        }
    }
    /**
     *  JarWrkMastExecute任务完成   //未完成
     */
@@ -5253,24 +5312,131 @@
        }
    }
    /**
     *  JarWrkMastExecute任务创建==>下发 //未完成
     *  开进料门
     *  任务下发
     */
    public synchronized boolean jarWrkMastExecuteActionExecute1(WrkMastExecute wrkMastExecute,Integer sign) {
        try{
            List<WrkMastExecute> wrkMastExecuteByJarNo = wrkMastExecuteService.getWrkMastExecuteByJarNo(wrkMastExecute.getJarId());
            if (wrkMastExecuteByJarNo.size()!=1 || !wrkMastExecuteByJarNo.get(0).getWrkNo().equals(wrkMastExecute.getWrkNo())){
                return false;
            }
            // 获取硫化罐信息
            JarThread jarThread = (JarThread) SlaveConnection.get(SlaveType.Jar, wrkMastExecute.getJarId());
            JarProtocol jarProtocol = jarThread.getJarProtocol();
            if (jarProtocol == null) {
                return false;
            }
            if (jarProtocol.modeType != JarModeType.AUTO){
                return false;
            }
            BasJar basJar = basJarMapper.selectByJarNo(jarProtocol.getJarNo());
            if (Cools.isEmpty(basJar)){
                log.error("{}号硫化罐查询设备档案无信息!!!",jarProtocol.getJarNo());
                return false;
            }
            //判断小车状态
            if (!jarWrkMastExecuteGenerateSteStatus(basJar.getEnterSteNo(),1)){
                return false;
            }
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            StaProtocol staProtocolRGV = devpThread.getStation().get(basJar.getEnterRgvNo());
            if (staProtocolRGV == null) {
                return false;
            } else {
                staProtocolRGV = staProtocolRGV.clone();
            }
            if (staProtocolRGV == null) {
                return false;
            }
            if (staProtocolRGV.rgvBoolean(1)){
                //门作业  无
                //自动、空闲、  进料们关闭需打开
                if (jarProtocol.isAutoing() && jarProtocol.jarErr==0
                        && jarProtocol.leftDoorOpen==0  && jarProtocol.leftDoorClose==0 && jarProtocol.rightDoorOpen==0  && jarProtocol.rightDoorClose==0){
                    if (SteAndJarUtil.steAndJarNowRow(staProtocolRGV.getNowRow() , jarProtocol.getJarNo())){
                        //移走  == > 2
                    } else {
                        //直接开门
                    }
                }
                return false;
            } else {
                log.error("jarWrkMastExecuteActionExecute1===>执行异常===》RGV不满足条件,等待===》异常数据:BasJar:"+ JSON.toJSONString(basJar.getEnterRgvNo())+";WrkMastExecute:"+JSON.toJSONString(wrkMastExecute));
                return false;
            }
        } catch (Exception e){
            log.error("jarWrkMastExecuteActionExecute1任务执行下发异常==》wrkMastExecute={},异常原因={}",wrkMastExecute,e.getMessage());
        }
        return false;
    }
    /*
     * Rgv  动作
     * */
    public synchronized boolean jarRgvTake(Integer rgvNo,WrkMastExecute wrkMastExecute,Integer type){
    public synchronized boolean jarRgvTake(WrkMastExecute wrkMastExecute,Integer endRow){
        try {
            StaProtocol staProtocol = new StaProtocol();
            staProtocol.setSiteId(wrkMastExecute.getRgvId());
            staProtocol.setEndRow(endRow.shortValue());
            // 下发站点信息
            if (!MessageQueue.offer(SlaveType.Devp, 2, new Task(9, staProtocol))) {
                log.error("平衡车Rgv命令下发失败,堆垛机号={},任务数据={},下发数据={}", wrkMastExecute.getRgvId(), JSON.toJSON(wrkMastExecute), JSON.toJSON(staProtocol));
                return false;
            }
            return true;
        }catch (Exception e){
            log.error("平衡车Rgv命令下发失败,Rgv号={},任务数据={},endRow={}", wrkMastExecute.getSteId(), JSON.toJSON(wrkMastExecute), JSON.toJSON(endRow));
        }
        return false;
    }
    /*
     * Ste  动作
     * */
    public synchronized boolean jarSteTake(Integer steNo,WrkMastExecute wrkMastExecute,Integer type){
    public synchronized boolean jarSteTake(WrkMastExecute wrkMastExecute,Integer startLoad,Integer endLoad,SteTaskModeType steTaskModeType,boolean complete){
        try {
            SteCommand steCommand = new SteCommand();
            steCommand.setSteNo(wrkMastExecute.getSteId());
            steCommand.setStartLoad(startLoad);
            steCommand.setEndLoad(endLoad);
            steCommand.setTaskModeType(steTaskModeType);
            steCommand.setComplete(complete);
            if (!MessageQueue.offer(SlaveType.Ste, steCommand.getSteNo(), new Task(2, steCommand))) {
                log.error("穿梭车Ste命令下发失败,堆垛机号={},任务数据={},下发数据={},complete={}", steCommand.getSteNo(), JSON.toJSON(wrkMastExecute), JSON.toJSON(steCommand),complete);
                return false;
            }
            return true;
        }catch (Exception e){
            log.error("穿梭车Ste命令下发失败,堆垛机号={},任务数据={},complete={}", wrkMastExecute.getSteId(), JSON.toJSON(wrkMastExecute), JSON.toJSON(complete));
        }
        return false;
    }
    /*
     * Jar  动作
     * */
    public synchronized boolean jarDoorTake(Integer jarNo,WrkMastExecute wrkMastExecute,Integer type){
    public synchronized boolean jarDoorTake(WrkMastExecute wrkMastExecute,JarTaskModeType jarTaskModeType){
        try{
            JarCommand jarCommand = new JarCommand();
            jarCommand.setJarNo(wrkMastExecute.getJarId());
            jarCommand.setTaskModeType(jarTaskModeType);
            if (!MessageQueue.offer(SlaveType.Jar, jarCommand.getJarNo(), new Task(2, jarCommand))) {
                log.error("硫化罐Jar命令下发失败,堆垛机号={},任务数据={},下发数据={}", jarCommand.getJarNo(), JSON.toJSON(wrkMastExecute), JSON.toJSON(jarCommand));
                return false;
            }
            return true;
        }catch (Exception e){
            log.error("硫化罐Jar命令下发失败,堆垛机号={},任务数据={},下发数据={}", wrkMastExecute.getJarId(), JSON.toJSON(wrkMastExecute), JSON.toJSON(jarTaskModeType));
        }
        return false;
    }
src/main/java/com/zy/asrs/service/impl/WrkMastExecuteServiceImpl.java
@@ -6,16 +6,33 @@
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("wrkMastExecuteService")
public class WrkMastExecuteServiceImpl extends ServiceImpl<WrkMastExecuteMapper, WrkMastExecute> implements WrkMastExecuteService {
    @Override
    public WrkMastExecute getWrkMastByWrkNo(Long wrkNo) {
    public WrkMastExecute getWrkMastExecuteByWrkNo(Long wrkNo) {
        return this.baseMapper.getWrkMastByWrkNo(wrkNo);
    }
    @Override
    public Integer getWrkMastByJarIdCount(Integer jarId) {
    public List<WrkMastExecute> getWrkMastExecuteByJarNo(Integer jarId) {
        return this.baseMapper.getWrkMastByJarId(jarId);
    }
    @Override
    public List<WrkMastExecute> sselectWrkMastExecuteByType(Integer type) {
        return this.baseMapper.sselectWrkMastExecuteByType(type);
    }
    @Override
    public List<WrkMastExecute> sselectWrkMastExecuteByTypeAndIoTyper(Integer type,Integer ioType) {
        return this.baseMapper.sselectWrkMastExecuteByTypeAndIoTyper(type,ioType);
    }
    @Override
    public Integer getWrkMastExecuteByJarIdCount(Integer jarId) {
        return this.baseMapper.getWrkMastByJarIdCount(jarId);
    }
}
src/main/java/com/zy/asrs/utils/SteAndJarUtil.java
New file
@@ -0,0 +1,18 @@
package com.zy.asrs.utils;
import java.util.regex.Pattern;
public class SteAndJarUtil {
    /**
     * RGV位置是否与硫化罐正对
     */
    public static boolean steAndJarNowRow(short steNowRow , Integer jarNo){
        return (steNowRow==(short) 1 && (jarNo == 2 || jarNo == 4)) || (steNowRow==(short)3 && (jarNo == 1 || jarNo == 3));
    }
    public static void main(String[] args) {
    }
}
src/main/java/com/zy/core/MainProcess.java
@@ -96,6 +96,8 @@
                    /************************************JAR调度************************************/
                    //JarWrkMastExecute任务创建   //硫化罐
                    mainService.jarWrkMastExecuteGenerate(k);
                    mainService.jarWrkMastExecuteAction(k);
                    //Jar任务创建  //完成
                    mainService.jarMastGenerate();
src/main/java/com/zy/core/enums/JarTaskModeType.java
@@ -4,10 +4,16 @@
* */
public enum JarTaskModeType {
    INIT(1, "左门开"),    // 初始
    OUT_RIGHT(2, "左门关"),    // 右出库
    OUT_LEFT(3, "右门开"),    // 左出库
    IN_RIGHT(4, "右门关"),    // 右入库
    IN_OPEN_DOOR(1, "进料开门"),    // 进料开门
    IN_CLOSE_DOOR(2, "进料关门"),    // 进料关门
    OUT_OPEN_DOOR(3, "出料开门"),    // 出料开门
    OUT_CLOSE_DOOR(4, "出料关门"),    // 出料关门
    OPEN_THE_DOOR(5, "开门"),    // 开门
    CLOSE_THE_DOOR(6, "关门"),    // 关门
    IN_DOOR_COMPLETE(7, "进料完成"),    // 进料完成
    OUT_DOOR_COMPLETE(8, "出料完成"),    // 出料完成
    OPEN_THE_DOOR_COMPLETE(9, "开门完成"),    // 开门完成
    CLOSE_THE_DOOR_COMPLETE(10, "关门完成"),    // 关门完成
    ;
    public Integer id;
src/main/java/com/zy/core/enums/SteTaskModeType.java
@@ -8,23 +8,28 @@
public enum SteTaskModeType {
    INIT(0, "初始"),    // 初始
    OUT_RIGHT(1, "右出库"),    // 右出库
    OUT_LEFT(2, "左出库"),    // 左出库
    IN_RIGHT(4, "右入库"),    // 右入库
    IN_LEFT(3, "左入库"),    // 左入库
    MOVE_LEFT(5, "左移库"),    // 左移库
    MOVE_RIGHT(6, "右移库"),    // 右移库
    GO_ORIGIN(8, "去右端"),    // 回反原点
    BACK_ORIGIN(7, "去左端"),      // 回原点
    WAITING_RIGHT(10, "右待机"),        // A点
    WAITING_LEFT(9, "左待机"),       // B点
//    FIT_LEFT(11, "左搬移"),   // 左搬移
//    FIT_RIGHT(12, "右搬移"),      // 右搬移
    CHARGE_LEFT(13, "左充电"),         // 左充电
    CHARGE_RIGHT(14, "右充电"),         // 左充电
//    OUT_RIGHT(1, "右出库"),    // 右出库
//    OUT_LEFT(2, "左出库"),    // 左出库
//    IN_RIGHT(4, "右入库"),    // 右入库
//    IN_LEFT(3, "左入库"),    // 左入库
//    MOVE_LEFT(5, "左移库"),    // 左移库
//    MOVE_RIGHT(6, "右移库"),    // 右移库
//    GO_ORIGIN(8, "去右端"),    // 回反原点
//    BACK_ORIGIN(7, "去左端"),      // 回原点
//    WAITING_RIGHT(10, "右待机"),        // A点
//    WAITING_LEFT(9, "左待机"),       // B点
////    FIT_LEFT(11, "左搬移"),   // 左搬移
////    FIT_RIGHT(12, "右搬移"),      // 右搬移
//    CHARGE_LEFT(13, "左充电"),         // 左充电
//    CHARGE_RIGHT(14, "右充电"),         // 左充电
//    CHECK_LEFT(14, "左盘点"),     // 左盘点
//    CHECK_RIGHT(15, "右盘点"),    // 右盘点
    CLOSE_CHARGE(17, "断开充电"),   // 断开充电
    STE_YDQH_10(10,"原地取货"),
    STE_YDFH_11(11,"原地放货"),
    STE_WFQH_12(12,"往返取货"),
    STE_WFFH_13(13,"往返放货"),
    STE_MOVE_14(14,"移动"),
//    CLOSE_CHARGE(17, "断开充电"),   // 断开充电
    ;
    public Integer id;
@@ -56,74 +61,6 @@
            }
        }
        return null;
    }
    public static SteTaskModeType findInByLoc(String locNo, Integer crnNo) {
        switch (SteUtils.getGroupRow(locNo, true, crnNo)) {
            case 2:
                return SteTaskModeType.IN_RIGHT;   // 右
            case 12:
                return SteTaskModeType.IN_LEFT;    // 左
            default:
                throw new CoolException("解析穿梭车原点定位失败");
        }
    }
    public static SteTaskModeType findOutByLoc(String locNo, Integer crnNo) {
        switch (SteUtils.getGroupRow(locNo, false, crnNo)) {
            case 2:
                return SteTaskModeType.OUT_LEFT;   // 右
            case 12:
                return SteTaskModeType.OUT_RIGHT;    // 左
            default:
                throw new CoolException("解析穿梭车原点定位失败");
        }
    }
    public static SteTaskModeType findOutByLoc2(String locNo, Integer crnNo) {
        switch (SteUtils.getGroupRow(locNo, false, crnNo)) {
            case 2:
                return SteTaskModeType.GO_ORIGIN;   // 8
            case 12:
                return SteTaskModeType.BACK_ORIGIN;    // 7
            default:
                throw new CoolException("解析穿梭车原点定位失败");
        }
    }
    // -----------------------------------------------
    // 去待搬点
    public static SteTaskModeType findOriginByLoc(SteProtocol steProtocol, Integer crnNo) {
        int row = steProtocol.getRow().intValue();
        if (SteUtils.SHUTTLE_GROUP_ROW_LIST.contains(row)) {
            return crnNo == 1 ? SteTaskModeType.BACK_ORIGIN : SteTaskModeType.GO_ORIGIN;
        } else if (row==13 || row==1){
            return SteTaskModeType.INIT;
        } else {
            throw new CoolException("解析穿梭车原点定位失败");
        }
    }
    public static SteTaskModeType findOriginByLoc(Integer row, Integer crnNo) {
        if (SteUtils.SHUTTLE_GROUP_ROW_LIST.contains(row)) {
            return crnNo == 1 ? SteTaskModeType.BACK_ORIGIN : SteTaskModeType.GO_ORIGIN;
        } else if (row==13 || row==1){
            return SteTaskModeType.INIT;
        } else {
            throw new CoolException("解析穿梭车原点定位失败");
        }
    }
    public static SteTaskModeType findWaiting(Integer row, Integer crnNo) {
        if (SteUtils.SHUTTLE_GROUP_ROW_LIST.contains(row)) {
            return crnNo == 1 ? SteTaskModeType.WAITING_LEFT : SteTaskModeType.WAITING_RIGHT;
        } else if (row==1||row==13){
            return SteTaskModeType.INIT;
        } else {
            throw new CoolException("解析穿梭车原点定位失败");
        }
    }
}
src/main/java/com/zy/core/model/command/JarCommand.java
@@ -1,7 +1,7 @@
package com.zy.core.model.command;
import com.alibaba.fastjson.annotation.JSONField;
import com.zy.core.enums.SteTaskModeType;
import com.zy.core.enums.JarTaskModeType;
import lombok.Data;
/**
@@ -20,14 +20,8 @@
    // 作业类型
    private Short taskMode = 0;
    // 正在执行任务
    public Boolean execute = Boolean.FALSE;
    // 确认任务完成
    public Boolean complete = Boolean.FALSE;
    @JSONField(serialize = false)
    private SteTaskModeType taskModeType;
    private JarTaskModeType taskModeType;
    /**
     * 输入穿梭车运行禁止 1运行,0禁止
@@ -36,12 +30,12 @@
    public void setTaskMode(Short taskMode){
        this.taskMode = taskMode;
        this.taskModeType = SteTaskModeType.get(taskModeType);
        this.taskModeType = JarTaskModeType.get(taskModeType);
    }
    public void setTaskMode(SteTaskModeType type) {
    public void setTaskMode(JarTaskModeType type) {
        this.taskModeType = type;
        this.taskMode = SteTaskModeType.get(type).id.shortValue();
        this.taskMode = JarTaskModeType.get(type).id.shortValue();
    }
}
src/main/java/com/zy/core/model/command/SteCommand.java
@@ -16,6 +16,10 @@
    // 任务号
    private Integer taskNo = 0;
    // 起始点位
    private Integer startLoad = 0;
    // 目标点位
    private Integer endLoad = 0;
    // 作业类型
    private Short taskMode = 0;
@@ -25,62 +29,53 @@
    // 确认任务完成
    public Boolean complete = Boolean.FALSE;
//
    @JSONField(serialize = false)
    private SteTaskModeType taskModeType;
//
//    // 起始设备号
//    private Short startSsbm;
//
//    // 目的设备号
//    private Short endSsbm;
//
//    // 控制模式 0=脱机 1=联机
//    private Short controlMode;
//
//    // 开启信号 1-启动
//    private Short open;
//
//    // 初始化
//    private Short init;
//
//    // 复位信号 1=复位
//    private Boolean reset;
//
//    // 删除指令 1=删除
//    private Boolean delete;
//
//    // 托盘间距 中间托盘之间距离 单位毫米
//    private Short space;
//
//    // 间距确认
//    private Short spaceYes;
//
//    // 排修改
//    private Short rowModify;
//
//    // 列修改
//    private Short bayModify;
//
//    // 层修改
//    private Short levModify;
//
//    // 修改确认
//    private Short modifyYes;
    // 排
    private Short row;
    // 列
    private Short bay;
    // 层
    private Short lev;
    // 起始设备号
    private Short startSsbm;
    // 目的设备号
    private Short endSsbm;
    // 控制模式 0=脱机 1=联机
    private Short controlMode;
    // 开启信号 1-启动
    private Short open;
    // 初始化
    private Short init;
    // 复位信号 1=复位
    private Boolean reset;
    // 删除指令 1=删除
    private Boolean delete;
    // 托盘间距 中间托盘之间距离 单位毫米
    private Short space;
    // 间距确认
    private Short spaceYes;
    // 排修改
    private Short rowModify;
    // 列修改
    private Short bayModify;
    // 层修改
    private Short levModify;
    // 修改确认
    private Short modifyYes;
    /**
     * 输入穿梭车运行禁止 1运行,0禁止
     */
    private Short run;
//    /**
//     * 输入穿梭车运行禁止 1运行,0禁止
//     */
//    private Short run;
    public void setTaskMode(Short taskMode){
        this.taskMode = taskMode;
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -79,7 +79,7 @@
    private boolean barcodeErr;
    private short endRow;//小车目标位
    private short nowRow;//小车当前位
    private short nowRow;//小车当前位   //左:1  中: 2  右:3   (面朝入料口)
    private boolean RGV1;//小车无货空闲
    private boolean RGV2;//小车输送线取货到位
    private boolean RGV3;//小车运行中
src/main/java/com/zy/core/thread/JarThread.java
@@ -20,6 +20,7 @@
import com.zy.core.enums.SlaveType;
import com.zy.core.model.JarSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.JarCommand;
import com.zy.core.model.protocol.JarProtocol;
import lombok.Data;
@@ -150,7 +151,7 @@
                jarProtocol.setJarErr((int)siemensS7Net.getByteTransform().TransInt16(result.Content, 14));//异常码
                jarProtocol.setStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 16));//状态
                jarProtocol.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 12) != 2);//自动
                jarProtocol.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 12) == 2);//自动
                // 根据实时信息更新数据库
                BasJarService service = SpringUtils.getBean(BasJarService.class);
                if (null != service) {
@@ -168,6 +169,7 @@
            }
        } catch (Exception e) {
//            e.printStackTrace();
            log.error(e.getMessage());
            OutputQueue.STE.offer(MessageFormat.format("【{0}】读取硫化罐plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//            News.error("读取穿梭车plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initSte();
@@ -183,41 +185,129 @@
            News.error("穿梭车写入命令为空");
            return false;
        }
        command.setJarNo(slave.getId());
        OperateResult result = null;
        // 开始任务
        if (!command.getComplete()) {
            //组织任务前,先清空写任务确认位,以及任务完成确认位
            OperateResult result01 = siemensS7Net.Write("V2000.0", false);
            OperateResult result02 = siemensS7Net.Write("V2000.1", false);
            // 1.任务号
            OperateResult result0 = siemensS7Net.Write("V998", command.getTaskNo().shortValue());
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 作业
            if (command.getTaskMode() != 0) {
                // 2.作业
                OperateResult result1 = siemensS7Net.Write("V1000", command.getTaskMode());
                // 3.确认开始任务
                if (result0.IsSuccess && result1.IsSuccess) {
                    result = siemensS7Net.Write("V2000.0", true);
                }
            }
            // 任务完成
        } else {
            siemensS7Net.Write("V998", (short) 0);
            siemensS7Net.Write("V1000", (short) 0);
            siemensS7Net.Write("V2000.0", false);
            result = siemensS7Net.Write("V2000.1", true);
        command.setJarNo(slave.getId());
        OperateResult result1 = null;
        String resultV1 = "";
        short resultS1 = 0;
        OperateResult result2 = null;
        String resultV2 = null;
        short resultS2 = 0;
        switch (command.getTaskMode()){
            case 1:
            case 2:
            case 3:
            case 4:
                return false;
            case 5://开门
                resultV1 = "V318";
                resultV2 = "V320";
                resultS1 = (short)1;
                resultS2 = (short)1;
                break;
            case 6://关门
                resultV1 = "V322";
                resultV2 = "V324";
                resultS1 = (short)1;
                resultS2 = (short)1;
                break;
            case 7:
            case 8:
                return false;
            case 9:
                resultV1 = "V318";
                resultV2 = "V320";
                break;
            case 10:
                resultV1 = "V322";
                resultV2 = "V324";
                break;
            default:
                return false;
        }
        result1 = siemensS7Net.Write(resultV1, resultS1);
        result2 = siemensS7Net.Write(resultV2, resultS2);
        //硫化罐任务写入后,回读一次,看是否成功
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int writeCount = 1;
        do {
            try{
                if(!result1.IsSuccess){
                    log.error("写入硫化罐plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead1 = siemensS7Net.Read(resultV1, (short) 2);
                if (resultRead1.IsSuccess) {
                    short transInt16 = siemensS7Net.getByteTransform().TransInt16(resultRead1.Content, 0);
                    if (transInt16 == resultS1 || transInt16 == (short) 2 || transInt16 == (short) 3){
                        break;
                    } else {
                        log.error("写入硫化罐plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount);
                        result1 = siemensS7Net.Write(resultV1, resultS1);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入硫化罐plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入硫化罐plc数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        writeCount = 1;
        do {
            try{
                if(!result2.IsSuccess){
                    log.error("写入硫化罐plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount);
                    result2 = siemensS7Net.Write(resultV2, resultS2);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead2 = siemensS7Net.Read(resultV2, (short) 2);
                if (resultRead2.IsSuccess) {
                    short transInt16 = siemensS7Net.getByteTransform().TransInt16(resultRead2.Content, 0);
                    if (transInt16 == resultS1  || transInt16 == (short) 3){
                        break;
                    } else {
                        log.error("写入硫化罐plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount);
                        result2 = siemensS7Net.Write(resultV2, resultS2);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入硫化罐plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount);
                    result2 = siemensS7Net.Write(resultV2, resultS2);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入硫化罐plc数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        try {
            // 日志记录
            if (!command.getComplete() && command.getTaskMode() != 0) {
            if (command.getTaskMode() != 0) {
                BasSteOptService bean = SpringUtils.getBean(BasSteOptService.class);
                if (null != bean) {
                    BasSteOpt basSteOpt = new BasSteOpt(
@@ -241,19 +331,15 @@
                    bean.insert(basSteOpt);
                }
            }
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
        if (result1 != null && result1.IsSuccess && result2 != null && result2.IsSuccess ) {
            News.info("硫化罐命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command));
            OutputQueue.STE.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 硫化罐命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command)));
            try {
                Thread.sleep(500);
            } catch (Exception e){
            }
            } catch (Exception e){ }
            return true;
        } else {
            OutputQueue.STE.offer(MessageFormat.format("【{0}】写入硫化罐plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -59,6 +59,7 @@
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        this.connect();
        sign = System.currentTimeMillis();
        while (isRunning) {
            try {
                int step = 1;
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -197,6 +197,9 @@
                        Thread.sleep(400);
                        write((StaProtocol)task.getData());
                        break;
                    case 9:
                        write9((StaProtocol)task.getData());
                        break;
                    default:
                        break;
                }
@@ -316,27 +319,6 @@
                }
            }
        }
//        Thread.sleep(200);
//        OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.100", (short) (staNoSize * 2));
//        if (result1.IsSuccess) {
//            for (int i = 0; i < staNoSize; i++) {
//                Integer siteId = staNos.get(i); // 站点编号
//                boolean[] status = siemensS7Net.getByteTransform().TransBool(result1.Content, i*2, 1);
//                StaProtocol staProtocol = station.get(siteId);
//                staProtocol.setAutoing(status[0]);  // 自动
//                staProtocol.setLoading(status[1]);  // 有物
//                staProtocol.setInEnable(status[2]); // 可入
//                staProtocol.setOutEnable(status[3]);// 可出
//                staProtocol.setEmptyMk(status[4]);  // 空板信号
//                staProtocol.setFullPlt(status[5]);  // 满托盘
//                staProtocol.setHigh(status[6]);     // 高库位
//                staProtocol.setLow(status[7]);      // 低库位
//
//                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
//                    staProtocol.setPakMk(true);
//                }
//            }
//        }
        //条码扫描器
        Thread.sleep(200);
@@ -555,6 +537,86 @@
            log.info("输送线命令下发码垛完成  给输送复位 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    /**
     * 写入 ID+目标站 =====> 单站点写入
     */
    private void write9(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        short resultS1 = staProtocol.getEndRow();
        OperateResult result1 = null;
        String resultV1 = "";
        switch (staProtocol.getSiteId()){
            case 623:
                resultV1 = "1800";
                break;
            case 624:
                resultV1 = "1806";
                break;
            case 625:
                resultV1 = "1812";
                break;
            case 626:
                resultV1 = "1818";
                break;
            default:
                return;
        }
        result1 = siemensS7Net.Write(resultV1, resultS1);
        //硫化罐任务写入后,回读一次,看是否成功
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int writeCount = 1;
        do {
            try{
                if(!result1.IsSuccess){
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead1 = siemensS7Net.Read(resultV1, (short) 2);
                if (resultRead1.IsSuccess) {
                    short transInt16 = siemensS7Net.getByteTransform().TransInt16(resultRead1.Content, 0);
                    if (transInt16 == resultS1 || transInt16 == (short) 2 || transInt16 == (short) 3){
                        break;
                    } else {
                        log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                        result1 = siemensS7Net.Write(resultV1, resultS1);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入RGV数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        if (!result1.IsSuccess) {
            staProtocol = station.get(staProtocol.getSiteId());
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            log.info("输送线命令下发码垛完成  给输送复位 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    // 更新入出库模式
    private void updateIoMode() throws InterruptedException {
        if (this.ioModeOf2F != IoModeType.NONE) {
src/main/java/com/zy/core/thread/SteThread.java
@@ -163,16 +163,16 @@
                OutputQueue.STE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                // 复位信号
                if (steProtocol.getWaiting()) {
                    if (resetFlag) {
                        SteCommand steCommand = new SteCommand();
                        steCommand.setComplete(true);
                        if (write(steCommand) && confirmPos()) {
                            resetFlag = false;
                        }
                    }
                }
//                // 复位信号
//                if (steProtocol.getWaiting()) {
//                    if (resetFlag) {
//                        SteCommand steCommand = new SteCommand();
//                        steCommand.setComplete(true);
//                        if (write(steCommand) && confirmPos()) {
//                            resetFlag = false;
//                        }
//                    }
//                }
                // 根据实时信息更新数据库
                BasSteService service = SpringUtils.getBean(BasSteService.class);
@@ -223,8 +223,10 @@
            //组织任务前,先清空写任务确认位,以及任务完成确认位
            siemensS7Net.Write("DB100.0", (short) 0);//设备号
            siemensS7Net.Write("DB100.2", (short) 0);//任务号
            siemensS7Net.Write("DB100.12.0", false);//任务开始确认位
            siemensS7Net.Write("DB100.12.1", false);//任务完成确认
            siemensS7Net.Write("DB100.12", (short) 0);//起始点位
            siemensS7Net.Write("DB100.14", (short) 0);//目的点位
            siemensS7Net.Write("DB100.16.0", false);//任务开始确认位
            siemensS7Net.Write("DB100.16.1", false);//任务完成确认
            // 1.任务号
            OperateResult result0 = siemensS7Net.Write("DB100.2", command.getTaskNo().shortValue());
            try {
@@ -236,9 +238,11 @@
            if (command.getTaskMode() != 0) {
                // 2.作业
                OperateResult result1 = siemensS7Net.Write("DB100.4", command.getTaskMode());
                OperateResult result2 = siemensS7Net.Write("DB100.12", (short) command.getStartLoad().shortValue());//起始点位
                OperateResult result3 = siemensS7Net.Write("DB100.14", (short) command.getEndLoad().shortValue());//目的点位
                // 3.确认开始任务
                if (result0.IsSuccess && result1.IsSuccess) {
                    result = siemensS7Net.Write("DB100.12.0", true);
                if (result0.IsSuccess && result1.IsSuccess && result2.IsSuccess && result3.IsSuccess) {
                    result = siemensS7Net.Write("DB100.16.0", true);
                    try {
                        Thread.sleep(300);
@@ -249,11 +253,11 @@
            }
            // 任务完成
        } else {
            siemensS7Net.Write("DB100.2", (short) 0);//任务号
            siemensS7Net.Write("DB100.4.0", (short) 0);//任务类型
            siemensS7Net.Write("DB100.12.0", false);//任务开始确认位
//            siemensS7Net.Write("DB100.2", (short) 0);//任务号
//            siemensS7Net.Write("DB100.4.0", (short) 0);//任务类型
            siemensS7Net.Write("DB100.16.0", false);//任务开始确认位
            result = siemensS7Net.Write("DB100.12.1", true);//任务完成确认
            result = siemensS7Net.Write("DB100.16.1", true);//任务完成确认
        }
        try {
@@ -286,13 +290,6 @@
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
            // 维护数据库排列层
            if (!steProtocol.getWaiting()) {
                if (!Cools.isEmpty(command.getRow(), command.getBay(), command.getLev())) {
                    this.modifyPos(command.getRow().intValue(), command.getBay().intValue(), command.getLev().intValue());
                }
            }
            News.info("穿梭车命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.STE.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
@@ -300,13 +297,6 @@
            OutputQueue.STE.offer(MessageFormat.format("【{0}】写入穿梭车plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            News.error("写入穿梭车plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    public void modifyPos(Integer row, Integer bay, Integer lev) {
        BasSteService service = SpringUtils.getBean(BasSteService.class);
        if (!service.updatePos(this.slave.getId(), row, bay, lev)) {
            News.error("更新{}号穿梭车定位失败 ===>> 排:【{}】, 列:【{}】,层:【{}】", this.slave.getId(), row, bay, lev);
        }
    }
@@ -367,21 +357,21 @@
    /******************************************************************************************/
    /**************************************** 测试专用 *****************************************/
    /*****************************************************************************************/
    public static void main(String[] args) throws InterruptedException {
        SteSlave slave = new SteSlave();
        slave.setId(1);
        slave.setIp("192.168.2.1");
        slave.setPort(502);
        SteThread thread = new SteThread(slave);
        thread.connect();
        thread.readStatus();
        System.out.println(JSON.toJSONString(thread.steProtocol));
        // 穿梭车运行禁止
        SteCommand command = new SteCommand();
        command.setRun((short)0);
        thread.write(command);
    }
//    public static void main(String[] args) throws InterruptedException {
//        SteSlave slave = new SteSlave();
//        slave.setId(1);
//        slave.setIp("192.168.2.1");
//        slave.setPort(502);
//        SteThread thread = new SteThread(slave);
//        thread.connect();
//        thread.readStatus();
//        System.out.println(JSON.toJSONString(thread.steProtocol));
//
//        // 穿梭车运行禁止
//        SteCommand command = new SteCommand();
////        command.setRun((short)0);
//        thread.write(command);
//
//    }
}
src/main/resources/mapper/BasJarMapper.xml
@@ -4,7 +4,7 @@
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasJar">
        <result column="jar_no" property="jarNo" />
        <id column="jar_no" property="jarNo" />
        <result column="region" property="region" />
        <result column="jar_code" property="jarCode" />
        <result column="sta_no" property="staNo" />
@@ -20,11 +20,18 @@
        <result column="right_in_enable" property="rightInEnable" />
        <result column="right_out_enable" property="rightOutEnable" />
        <result column="enter_ste_no" property="enterSteNo" />
        <result column="out_ste_id" property="outSteId" />
        <result column="enter_rgv_id" property="enterRgvId" />
        <result column="out_rgv_id" property="outRgvId" />
        <result column="out_ste_no" property="outSteNo" />
        <result column="enter_rgv_no" property="enterRgvNo" />
        <result column="out_rgv_no" property="outRgvNo" />
        <result column="burial" property="burial" />
    </resultMap>
    <select id="selectByJarNo" resultMap="BaseResultMap">
        select top 1 * from asr_bas_jar
        where 1=1
        and jar_no=0
        order by id
    </select>
</mapper>
src/main/resources/mapper/WrkMastExecuteMapper.xml
@@ -25,13 +25,27 @@
    </resultMap>
    <select id="getWrkMastByWrkNo" resultMap="BaseResultMap">
    <select id="getWrkMastExecuteByWrkNo" resultMap="BaseResultMap">
        select top 1 * from jar_wrk_mast_execute
        where 1=1
        and jar_id = #{jarId}
    </select>
    <select id="getWrkMastExecuteByJarId" resultMap="BaseResultMap">
        select * from jar_wrk_mast_execute
        where 1=1
        and jar_id = #{jarId}
    </select>
    <select id="getWrkMastByJarIdCount" resultType="Integer">
    <select id="sselectWrkMastExecuteByType" resultMap="BaseResultMap">
        select * from jar_wrk_mast_execute
        where 1=1
        and type = #{type}
        and io_type = #{iotype}
        and wrk_type = 0;
    </select>
    <select id="getWrkMastExecuteByJarIdCount" resultType="Integer">
        select count(1) from jar_wrk_mast_execute
        where 1=1
        and jar_id = #{jarId}