自动化立体仓库 - WCS系统
#
luxiaotao1123
2020-10-10 e4427640cee143dc0ff4b0d37216f023fc85356c
#
1个文件已添加
4个文件已修改
186 ■■■■ 已修改文件
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/model/command/CrnCommand.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/MelsecCrnThread.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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/model/command/CrnCommand.java
@@ -30,6 +30,8 @@
     * 5 = 回原点  不用发
     * 6 = 去反原点 目标发
     * 7 = 坐标移行 目标发
     * 90 = 设置时间
     * 99 = 取消当前任务
     */
    private Short taskMode = 0;
@@ -54,6 +56,8 @@
    // 目标位置层号
    private Short destinationPosZ = 0;
    private Short taskSend = 0;
    public void setTaskMode(Short taskMode){
        this.taskMode = taskMode;
        this.taskModeType = CrnTaskModeType.get(taskModeType);
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
@@ -2,9 +2,9 @@
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;
@@ -33,10 +33,12 @@
@Slf4j
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 MelsecCrnThread(CrnSlave slave) {
        this.slave = slave;
@@ -83,6 +85,12 @@
                    default:
                        break;
                }
                // 心跳 2s一次
                heartTimes++;
                if (Arith.remainder(heartTimes, 4) == 0) {
                    heartbeat();
                    heartTimes = 0;
                }
                Thread.sleep(500);
            } catch (Exception e) {
                e.printStackTrace();
@@ -94,10 +102,8 @@
    @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()));
@@ -106,7 +112,7 @@
            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());
        }
        siemensNet.ConnectClose();
        melsecMcNet.ConnectClose();
        return result;
    }
@@ -114,36 +120,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()));
@@ -181,18 +184,25 @@
            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)));
@@ -204,9 +214,24 @@
        }
    }
    /**
     * 心跳
     */
    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,8 +241,6 @@
        CrnSlave slave = new CrnSlave();
        slave.setId(1);
        slave.setIp("192.168.6.9");
        slave.setRack(0);
        slave.setSlot(0);
        MelsecCrnThread crnThread = new MelsecCrnThread(slave);
        crnThread.connect();
        crnThread.readStatus();