luxiaotao1123
2020-11-03 bc517b90731dfc34b8aee0d7f4877d96b09c18da
Merge branch 'jswcs' of https://gitee.com/luxiaotao1123/zy-wcs into jswcs
12个文件已修改
2个文件已添加
1 文件已复制
1 文件已重命名
399 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ConsoleController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/CrnController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/CrnThread.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnFingerPosType.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnForkPosType.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnLiftPosType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnStatusType.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnTaskModeType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/CrnCommand.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/MelsecCrnThread.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/crn.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -24,7 +24,7 @@
import com.zy.core.properties.SlaveProperties;
import com.zy.core.properties.SystemProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.CrnThread;
import com.zy.core.thread.SiemensCrnThread;
import com.zy.core.thread.DevpThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -111,7 +111,7 @@
        List<CrnLatestDataVo> vos = new ArrayList<>();
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            SiemensCrnThread crnThread = (SiemensCrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            if (crnThread == null) {
                continue;
            }
@@ -224,7 +224,7 @@
        CrnDetailVo vo = new CrnDetailVo();
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            if (crnSlave.getId().equals(crnNo)) {
                CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId());
                SiemensCrnThread crnThread = (SiemensCrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId());
                CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                vo.setCrnNo(crnNo);
                vo.setWorkNo(crnProtocol.getTaskNo());
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -28,7 +28,7 @@
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.CrnThread;
import com.zy.core.CrnThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -26,7 +26,7 @@
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.CrnThread;
import com.zy.core.CrnThread;
import com.zy.core.thread.DevpThread;
import com.zy.core.thread.LedThread;
import lombok.extern.slf4j.Slf4j;
@@ -112,9 +112,11 @@
                }
                // 获取入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()).clone();
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
@@ -218,8 +220,12 @@
            for (DevpSlave.Sta inSta : devp.getInSta()) {
                // 获取入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()).clone();
                if (staProtocol == null) { continue; }
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing() && staProtocol.isLoading()
                        && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 0
@@ -264,8 +270,12 @@
            for (DevpSlave.Sta pickSta : devp.getPickSta()) {
                // 获取拣料入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo()).clone();
                if (staProtocol == null) { continue; }
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
                    && staProtocol.getWorkNo() > 0 && staProtocol.isPakMk()){
                    WrkMast wrkMast = wrkMastMapper.selectPickStep(staProtocol.getWorkNo().intValue());
@@ -350,8 +360,12 @@
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                // 获取堆垛机出库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
                if (staProtocol == null) { continue; }
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
                    // 查询工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(staProtocol.getSiteId());
@@ -452,8 +466,12 @@
            boolean flag = false;
            // 获取堆垛机入库站信息
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
            if (staProtocol == null) { continue; }
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
            if (staDetl == null) {
@@ -540,8 +558,12 @@
            }
            // 获取堆垛机出库站信息
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
            if (staProtocol == null) { continue; }
            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
            if (staDetl == null) {
@@ -712,8 +734,12 @@
            for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) {
                // 获取空板入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo()).clone();
                if (staProtocol == null) { continue; }
                StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 站点条件判断
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 0 && staProtocol.isPakMk()) {
@@ -790,8 +816,12 @@
            List<WrkMast> wrkMasts = new ArrayList<>();
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo).clone();
                if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) { continue; }
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 获取工作档数据
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; }
@@ -877,8 +907,12 @@
            boolean reset = true;
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo).clone();
                if (staProtocol == null) {continue;}
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.getWorkNo() != 0) {
                    reset = false;
                    break;
src/main/java/com/zy/core/CrnThread.java
New file
@@ -0,0 +1,11 @@
package com.zy.core;
import com.zy.core.model.protocol.CrnProtocol;
public interface CrnThread extends ThreadHandler {
    CrnProtocol getCrnProtocol();
    void setResetFlag(boolean flag);
}
src/main/java/com/zy/core/ServerBootstrap.java
@@ -6,10 +6,7 @@
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.CarThread;
import com.zy.core.thread.CrnThread;
import com.zy.core.thread.DevpThread;
import com.zy.core.thread.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
@@ -76,8 +73,18 @@
        // 初始化堆垛机线程
        log.info("初始化堆垛机线程...................................................");
        for (CrnSlave crn : slaveProperties.getCrn()) {
            CrnThread crnThread = new CrnThread(crn);
            new Thread(crnThread).start();
            CrnThread crnThread = null;
            switch (crn.getId()) {
                case 1:
                    crnThread = new SiemensCrnThread(crn);
                    break;
                case 2:
                    crnThread = new MelsecCrnThread(crn);
                    break;
                default:
                    break;
            }
            new Thread((Runnable) crnThread).start();
            SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread);
        }
src/main/java/com/zy/core/enums/CrnFingerPosType.java
New file
@@ -0,0 +1,41 @@
package com.zy.core.enums;
public enum CrnFingerPosType {
    DOWN(2, "下定位"),  // 下定位
    UP(1, "上定位"),   // 上定位
    NONE(0, "不在定位"),   // 不在定位
    ;
    public Integer id;
    public String desc;
    CrnFingerPosType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static CrnFingerPosType get(Short id) {
        if (null == id) {
            return null;
        }
        for (CrnFingerPosType type : CrnFingerPosType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return null;
    }
    public static CrnFingerPosType get(CrnFingerPosType type) {
        if (null == type) {
            return null;
        }
        for (CrnFingerPosType crnLiftPosType : CrnFingerPosType.values()) {
            if (crnLiftPosType == type) {
                return crnLiftPosType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/enums/CrnForkPosType.java
@@ -5,6 +5,8 @@
    HOME(0, "货叉原位"),   // 货叉原位
    LEFT(1, "货叉在左侧"),  // 货叉在左侧
    RIGHT(2, "货叉在右侧"),   // 货叉在右侧
    _LEFT(3, "货叉在左侧远"),   // 货叉在右侧远
    _RIGHT(4, "货叉在右侧远"),   // 货叉在右侧远
    ;
    public Integer id;
src/main/java/com/zy/core/enums/CrnLiftPosType.java
@@ -2,6 +2,7 @@
public enum CrnLiftPosType {
    POSITION(3, "在定位"), // 在定位
    DOWN(2, "下定位"),  // 下定位
    UP(1, "上定位"),   // 上定位
    NONE(0, "不在定位"),   // 不在定位
src/main/java/com/zy/core/enums/CrnStatusType.java
@@ -10,6 +10,9 @@
    TO_ORIGIN(5, "回原点中"),
    ORIGIN(6, "反原点"),
    LOC_MOVE(7, "库位移位"),
    POSITON_MOVE(10, "坐标移行"),
    FETCH_WAITING(21, "等待取货允许"),
    PUT_WAITING(22, "等待放货允许"),
    WAITING(90, "任务完成等待WCS确认"),
    SOS(99, "报警"),
    ;
src/main/java/com/zy/core/enums/CrnTaskModeType.java
@@ -9,6 +9,7 @@
    SITE_MOVE(4),    // 站位移转
    GO_ORIGIN(5),    // 回原点
    OFFSET_MOVE(7),    // 坐标移行
    TIMING(90),     // 校时
    ;
    public Integer id;
src/main/java/com/zy/core/model/command/CrnCommand.java
@@ -4,6 +4,9 @@
import com.zy.core.enums.CrnTaskModeType;
import lombok.Data;
import java.util.Calendar;
import java.util.Date;
/**
 * 堆垛机命令报文
 * Created by vincent on 2020/8/11
@@ -30,6 +33,8 @@
     * 5 = 回原点  不用发
     * 6 = 去反原点 目标发
     * 7 = 坐标移行 目标发
     * 90 = 设置时间
     * 99 = 取消当前任务
     */
    private Short taskMode = 0;
@@ -54,6 +59,8 @@
    // 目标位置层号
    private Short destinationPosZ = 0;
    private Short taskSend = 0;
    public void setTaskMode(Short taskMode){
        this.taskMode = taskMode;
        this.taskModeType = CrnTaskModeType.get(taskModeType);
@@ -64,4 +71,26 @@
        this.taskMode = CrnTaskModeType.get(type).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/CrnProtocol.java
@@ -1,10 +1,7 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasCrnp;
import com.zy.core.enums.CrnForkPosType;
import com.zy.core.enums.CrnLiftPosType;
import com.zy.core.enums.CrnModeType;
import com.zy.core.enums.CrnStatusType;
import com.zy.core.enums.*;
import lombok.Data;
/**
@@ -92,6 +89,16 @@
     * 1 = 不在定位
     */
    public Short walkPos;
    /**
     * 拨指位置
     * 0 = 不在定位
     * 1 = 上定位
     * 2 = 下定位
     */
    public Short fingerPos;
    public CrnFingerPosType fingerPosType;
    /**
     * 堆垛机任务完成
@@ -233,6 +240,11 @@
        this.status = CrnStatusType.get(type).id.shortValue();
    }
    public void setFingerPos(Short type) {
        this.fingerPos = type;
        this.fingerPosType = CrnFingerPosType.get(type);
    }
    public void setError1(boolean[] error1){
        this.error1 = error1;
        this.crnError1 = new CrnError1();
src/main/java/com/zy/core/thread/MelsecCrnThread.java
copy from src/main/java/com/zy/core/thread/CrnThread.java copy to src/main/java/com/zy/core/thread/MelsecCrnThread.java
File was copied from src/main/java/com/zy/core/thread/CrnThread.java
@@ -2,14 +2,14 @@
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import HslCommunication.Profinet.Melsec.MelsecMcNet;
import com.alibaba.fastjson.JSON;
import com.core.common.Arith;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.service.BasCrnpService;
import com.zy.core.ThreadHandler;
import com.zy.core.CrnThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.CrnStatusType;
@@ -23,6 +23,7 @@
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.Calendar;
import java.util.Date;
/**
@@ -31,14 +32,16 @@
 */
@Data
@Slf4j
public class CrnThread implements Runnable, ThreadHandler {
public class MelsecCrnThread implements Runnable, CrnThread {
    private SiemensS7Net siemensNet;
    private MelsecMcNet melsecMcNet;
    private CrnSlave slave;
    private CrnProtocol crnProtocol;
    private boolean resetFlag = false;
    private short heartBeatVal = 1;
    private int heartTimes = 0;
    public CrnThread(CrnSlave slave) {
    public MelsecCrnThread(CrnSlave slave) {
        this.slave = slave;
    }
@@ -83,6 +86,12 @@
                    default:
                        break;
                }
                // 心跳 2s一次
                heartTimes++;
                if (Arith.remainder(heartTimes, 4) == 0) {
                    heartbeat();
                    heartTimes = 0;
                }
                Thread.sleep(500);
            } catch (Exception e) {
                e.printStackTrace();
@@ -94,19 +103,46 @@
    @Override
    public boolean connect() {
        boolean result = false;
        siemensNet = new SiemensS7Net(SiemensPLCS.S300, slave.getIp());
        siemensNet.setRack(slave.getRack().byteValue());
        siemensNet.setSlot(slave.getSlot().byteValue());
        OperateResult connect = siemensNet.ConnectServer();
        melsecMcNet = new MelsecMcNet(slave.getIp(), slave.getPort());
        OperateResult connect = melsecMcNet.ConnectServer();
        if(connect.IsSuccess){
            result = true;
            OutputQueue.CRN.offer(MessageFormat.format( "【{0}】堆垛机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("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            OutputQueue.CRN.offer(MessageFormat.format( "【{0}】堆垛机plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.info("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】堆垛机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("堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】堆垛机plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
        }
        siemensNet.ConnectClose();
        // 命令下发区 --------------------------------------------------------------------------
        /**
         *      array[1] = command.getSourcePosY(); // 列
         *         array[2] = command.getSourcePosZ(); // 层
         *         array[3] = command.getSourcePosX(); // 排
         *         array[4] = command.getDestinationPosY(); // 列
         *         array[5] = command.getDestinationPosZ();  // 层
         *         array[6] = command.getDestinationPosX(); // 排
         *         array[7] = command.getTaskNo();
         */
        Date date = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        CrnCommand crnCommand = new CrnCommand();
        crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
        crnCommand.setTaskMode(CrnTaskModeType.TIMING); // 任务模式:  设置时间
        crnCommand.setSourcePosY((short) cal.get(Calendar.YEAR));     // 年:1980~2079
        crnCommand.setSourcePosZ((short) (cal.get(Calendar.MONTH)+1));     // 月:1~12
        crnCommand.setSourcePosX((short) cal.get(Calendar.DATE));     // 日:1~31
        crnCommand.setDestinationPosY((short) cal.get(Calendar.HOUR_OF_DAY));     // 时:0~23
        crnCommand.setDestinationPosZ((short) cal.get(Calendar.MINUTE));     // 分:0~59
        crnCommand.setDestinationPosX((short) cal.get(Calendar.SECOND));     // 秒:0~59
        crnCommand.setTaskNo((short) (cal.get(Calendar.DAY_OF_WEEK) - 1));     // 星期:0(日)~6(六)
        crnCommand.setTaskSend((short) 1);
        crnCommand.setAckFinish((short) 0);
        if (write(crnCommand)) {
            log.info("堆垛机plc校对时间成功 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
        }
        melsecMcNet.ConnectClose();
        return result;
    }
@@ -114,36 +150,33 @@
     * 读取状态
     */
    private void readStatus(){
        OperateResultExOne<byte[]> result = siemensNet.Read("DB8.18", (short) 62);
        OperateResultExOne<byte[]> result = melsecMcNet.Read("D1119", (short) 58);
        if (result.IsSuccess) {
            if (null == crnProtocol) {
                crnProtocol = new CrnProtocol();
            }
            crnProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));
            crnProtocol.setTaskNo(siemensNet.getByteTransform().TransInt16(result.Content, 2));
            crnProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 4));
            crnProtocol.setBay(siemensNet.getByteTransform().TransInt16(result.Content, 6));
            crnProtocol.setLevel(siemensNet.getByteTransform().TransInt16(result.Content, 8));
            crnProtocol.setForkPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));
            crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
            crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14));
//            crnProtocol.setTaskFinish(siemensNet.getByteTransform().TransInt16(result.Content, 16));
            crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 18));
            crnProtocol.setAlarm1(siemensNet.getByteTransform().TransInt16(result.Content, 20));
            // 异常信息
            crnProtocol.setError1(siemensNet.getByteTransform().TransBool(result.Content, 22, 2));
            crnProtocol.setError2(siemensNet.getByteTransform().TransBool(result.Content, 24, 2));
            crnProtocol.setError3(siemensNet.getByteTransform().TransBool(result.Content, 26, 2));
            crnProtocol.setError4(siemensNet.getByteTransform().TransBool(result.Content, 28, 2));
            crnProtocol.setError5(siemensNet.getByteTransform().TransBool(result.Content, 30, 2));
            crnProtocol.setError6(siemensNet.getByteTransform().TransBool(result.Content, 32, 2));
            crnProtocol.setXSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 34));
            crnProtocol.setYSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 38));
            crnProtocol.setZSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 42));
            crnProtocol.setXDistance(siemensNet.getByteTransform().TransSingle(result.Content, 46));
            crnProtocol.setYDistance(siemensNet.getByteTransform().TransSingle(result.Content, 50));
            crnProtocol.setXDuration(siemensNet.getByteTransform().TransSingle(result.Content, 54));
            crnProtocol.setYDuration(siemensNet.getByteTransform().TransSingle(result.Content, 58));
            crnProtocol.setTaskNo(melsecMcNet.getByteTransform().TransInt16(result.Content, 0));
            crnProtocol.setMode(melsecMcNet.getByteTransform().TransInt16(result.Content, 2));
            crnProtocol.setStatus(melsecMcNet.getByteTransform().TransInt16(result.Content, 4));
            crnProtocol.setBay(melsecMcNet.getByteTransform().TransInt16(result.Content, 6));
            crnProtocol.setLevel(melsecMcNet.getByteTransform().TransInt16(result.Content, 8));
            crnProtocol.setForkPos(melsecMcNet.getByteTransform().TransInt16(result.Content, 10));
            crnProtocol.setLiftPos(melsecMcNet.getByteTransform().TransInt16(result.Content, 12));
            crnProtocol.setWalkPos(melsecMcNet.getByteTransform().TransInt16(result.Content, 14));
            crnProtocol.setFingerPos(melsecMcNet.getByteTransform().TransInt16(result.Content, 16));
            crnProtocol.setLoaded(melsecMcNet.getByteTransform().TransInt16(result.Content, 18));
            crnProtocol.setAlarm1(melsecMcNet.getByteTransform().TransInt16(result.Content, 20));
            crnProtocol.setTemp1(melsecMcNet.getByteTransform().TransInt16(result.Content, 22));
            crnProtocol.setTemp2(melsecMcNet.getByteTransform().TransInt16(result.Content, 24));
            crnProtocol.setTemp3(melsecMcNet.getByteTransform().TransInt16(result.Content, 26));
            crnProtocol.setTemp4(melsecMcNet.getByteTransform().TransInt16(result.Content, 28));
            crnProtocol.setXSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 30));
            crnProtocol.setYSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 34));
            crnProtocol.setZSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 38));
            crnProtocol.setXDistance(melsecMcNet.getByteTransform().TransSingle(result.Content, 42));
            crnProtocol.setYDistance(melsecMcNet.getByteTransform().TransSingle(result.Content, 46));
            crnProtocol.setXDuration(melsecMcNet.getByteTransform().TransSingle(result.Content, 50));
            crnProtocol.setYDuration(melsecMcNet.getByteTransform().TransSingle(result.Content, 54));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
@@ -164,12 +197,12 @@
            BasCrnp basCrnp = new BasCrnp();
            basCrnp.setCrnNo(slave.getId());
            if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))){
                log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            }
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机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("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }
@@ -181,32 +214,54 @@
            log.error("堆垛机写入命令为空");
            return false;
        }
        if (command.getAckFinish() == 1) {
            command.setTaskSend((short) 0);
        } else if (command.getAckFinish() == 0) {
            command.setTaskSend((short) 1);
        }
        command.setCrnNo(slave.getId());
        short[] array = new short[9];
        array[0] = command.getAckFinish();
        array[1] = command.getTaskNo();
        array[2] = command.getTaskMode();
        array[3] = command.getSourcePosX();
        array[4] = command.getSourcePosY();
        array[5] = command.getSourcePosZ();
        array[6] = command.getDestinationPosX();
        array[7] = command.getDestinationPosY();
        array[8] = command.getDestinationPosZ();
        OperateResult result = siemensNet.Write("DB8.0", array);
        short[] array = new short[10];
        array[0] = command.getTaskMode();
        array[1] = command.getSourcePosY(); // 列
        array[2] = command.getSourcePosZ(); // 层
        array[3] = command.getSourcePosX(); // 排
        array[4] = command.getDestinationPosY(); // 列
        array[5] = command.getDestinationPosZ();  // 层
        array[6] = command.getDestinationPosX(); // 排
        array[7] = command.getTaskNo();
        array[8] = command.getTaskSend();
        array[9] = command.getAckFinish();
        OperateResult result = melsecMcNet.Write("D1001", array);
        if (result.IsSuccess) {
            log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    /**
     * 心跳
     */
    private void heartbeat(){
        if (heartBeatVal == 1) {
            heartBeatVal = 0;
        } else {
            heartBeatVal = 1;
        }
        OperateResult write = melsecMcNet.Write("D1000", heartBeatVal);
        if (!write.IsSuccess) {
            log.error("输送线plc编号={} 心跳失败", slave.getId());
        }
    }
    @Override
    public void close() {
        siemensNet.ConnectClose();
        melsecMcNet.ConnectClose();
    }
    /******************************************************************************************/
@@ -216,9 +271,7 @@
        CrnSlave slave = new CrnSlave();
        slave.setId(1);
        slave.setIp("192.168.6.9");
        slave.setRack(0);
        slave.setSlot(0);
        CrnThread crnThread = new CrnThread(slave);
        MelsecCrnThread crnThread = new MelsecCrnThread(slave);
        crnThread.connect();
        crnThread.readStatus();
        System.out.println(JSON.toJSONString(crnThread.crnProtocol));
@@ -323,5 +376,4 @@
//        }
    }
}
src/main/java/com/zy/core/thread/SiemensCrnThread.java
File was renamed from src/main/java/com/zy/core/thread/CrnThread.java
@@ -9,7 +9,7 @@
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.service.BasCrnpService;
import com.zy.core.ThreadHandler;
import com.zy.core.CrnThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.CrnStatusType;
@@ -31,14 +31,14 @@
 */
@Data
@Slf4j
public class CrnThread implements Runnable, ThreadHandler {
public class SiemensCrnThread implements Runnable, CrnThread {
    private SiemensS7Net siemensNet;
    private CrnSlave slave;
    private CrnProtocol crnProtocol;
    private boolean resetFlag = false;
    public CrnThread(CrnSlave slave) {
    public SiemensCrnThread(CrnSlave slave) {
        this.slave = slave;
    }
@@ -218,7 +218,7 @@
        slave.setIp("192.168.6.9");
        slave.setRack(0);
        slave.setSlot(0);
        CrnThread crnThread = new CrnThread(slave);
        SiemensCrnThread crnThread = new SiemensCrnThread(slave);
        crnThread.connect();
        crnThread.readStatus();
        System.out.println(JSON.toJSONString(crnThread.crnProtocol));
src/main/resources/application.yml
@@ -62,6 +62,15 @@
      row: 1
      bay: 0
      lev: 1
    # 堆垛机2
    crn[1]:
      id: 1
      ip: 192.168.6.10
      port: 102
      rack: 0
      slot: 0
      # 偏移量,当堆垛机站点列号=1时,偏移量=2
      offset: 2
  # 输送线
  devp[0]:
    id: 1
src/main/webapp/views/crn.html
@@ -96,6 +96,7 @@
            <span class="select-title">堆垛机号</span>
            <div class="select-container">
                <label><input type="radio" name="crnSelect" value="1" checked>&nbsp;1号堆垛机</label>
                <label><input type="radio" name="crnSelect" value="2">&nbsp;2号堆垛机</label>
            </div>
        </div>
        <!-- 源站/源库位 选择 -->