lsh
2024-04-22 21038521f93c26f3e7b6810d8ee8dfdd31c159e0
#Ext
6个文件已修改
3个文件已添加
283 ■■■■■ 已修改文件
src/main/java/com/zy/core/ServerBootstrap.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/OutputQueue.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/SlaveType.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/ExtSlave.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/ExtProtocol.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/properties/SlaveProperties.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/MelsecExtThread.java 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/rgvOperate.html 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java
@@ -3,10 +3,7 @@
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.LedSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.*;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.*;
import lombok.extern.slf4j.Slf4j;
@@ -64,6 +61,11 @@
        for (Slave rgv : slaveProperties.getRgv()) {
            MessageQueue.init(SlaveType.Rgv, rgv);
        }
        // 初始化机械臂mq
        for (Slave ext : slaveProperties.getExt()) {
            MessageQueue.init(SlaveType.Ext, ext);
        }
//        // 初始化Led灯mq
//        for (Slave led : slaveProperties.getLed()) {
//            MessageQueue.init(SlaveType.Led, led);
@@ -107,6 +109,13 @@
            new Thread((Runnable) rgvThread).start();
            SlaveConnection.put(SlaveType.Rgv, rgv.getId(), rgvThread);
        }
        // 初始化机械臂线程
        log.info("初始化Ext线程...................................................");
        for (ExtSlave ext : slaveProperties.getExt()) {
            MelsecExtThread extThread = new MelsecExtThread(ext);
            new Thread(extThread).start();
            SlaveConnection.put(SlaveType.Ext, ext.getId(), extThread);
        }
//        // 初始化LED线程
//        log.info("初始化LED线程...................................................");
//        for (LedSlave led : slaveProperties.getLed()) {
src/main/java/com/zy/core/cache/OutputQueue.java
@@ -21,4 +21,6 @@
    // 堆垛机输出日志
    public static ArrayBlockingQueue<String> RGV = new ArrayBlockingQueue<>(32);
    public static ArrayBlockingQueue<String> Ext = new ArrayBlockingQueue<>(32);
}
src/main/java/com/zy/core/enums/SlaveType.java
@@ -8,7 +8,8 @@
    Led,
    Scale,
    Car,
    Rgv
    Rgv,
    Ext
    ;
    public static SlaveType findInstance(String s){
src/main/java/com/zy/core/model/ExtSlave.java
New file
@@ -0,0 +1,22 @@
package com.zy.core.model;
import com.zy.core.Slave;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.ArrayList;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class ExtSlave extends Slave {
    private Integer rack;
    private Integer slot;
    private Integer offset;
    private Boolean demo;
}
src/main/java/com/zy/core/model/protocol/ExtProtocol.java
New file
@@ -0,0 +1,16 @@
package com.zy.core.model.protocol;
import lombok.Data;
/**
 * Created by vincent on 2020/8/7
 */
@Data
public class ExtProtocol {
    private Integer extNo;
    public boolean take;//允许取信号
    public boolean put;//允许放信号
}
src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -1,10 +1,7 @@
package com.zy.core.properties;
import com.zy.core.Slave;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.LedSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.*;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@@ -44,4 +41,6 @@
    private List<Slave> car = new ArrayList<>();
    private List<RgvSlave> rgv = new ArrayList<>();
    private List<ExtSlave> ext = new ArrayList<>();
}
src/main/java/com/zy/core/thread/MelsecExtThread.java
New file
@@ -0,0 +1,180 @@
package com.zy.core.thread;
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Melsec.MelsecMcNet;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.ExtSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.ExtProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.Date;
/**
 * 机械臂线程  //Extraman==>机械臂
 * Created by vincent on 2020/8/4
 */
@Data
@Slf4j
public class MelsecExtThread implements Runnable, ThreadHandler {
    private MelsecMcNet melsecMcNet;
    private ExtSlave slave;
    private ExtProtocol extProtocol;
    private short heartBeatVal = 1;
    private boolean resetFlag = false;
    public boolean isRunning = true;
    public MelsecExtThread(ExtSlave slave) {
        this.slave = slave;
    }
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        System.out.println("线程启动");
        System.out.println("extProtocol:"+extProtocol);
        this.connect();
//        try {
//            Thread.sleep(2000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        while (isRunning) {
            try {
                int step = 1;
                Task task = MessageQueue.poll(SlaveType.Ext, slave.getId());
                if (task != null) {
                    step = task.getStep();
                }
                switch (step) {
                    // 读数据
                    case 1:
                        readStatus();
                        break;
                    default:
                        break;
                }
                // 心跳
//                heartbeat();
                Thread.sleep(500);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 初始化机械臂状态
     */
    private void initExt() {
        if (null == extProtocol) {
            extProtocol = new ExtProtocol();
        }
        extProtocol.setTake(false);
        extProtocol.setPut(false);
    }
    @Override
    public boolean connect() {
        boolean result = false;
        melsecMcNet = new MelsecMcNet(slave.getIp(), slave.getPort());
        OperateResult connect = melsecMcNet.ConnectServer();
        if(connect.IsSuccess){
            result = true;
            OutputQueue.Ext.offer(MessageFormat.format( "【{0}】机械臂plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.info("MelsecExt"+" - 1"+" - 机械臂plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        } else {
            OutputQueue.Ext.offer(MessageFormat.format("【{0}】机械臂plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}] ", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("MelsecExt"+" - 2"+" - 机械臂plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initExt();
        }
//        melsecMcNet.ConnectClose();
        return result;
    }
    /**
     * 读取状态
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = melsecMcNet.Read("D1035", (short) 56);
            if (result.IsSuccess) {
                if (null == extProtocol) {
                    extProtocol = new ExtProtocol();
                    extProtocol.setExtNo(slave.getId());
                }
                extProtocol.setTake(melsecMcNet.getByteTransform().TransBool(result.Content, 0));
                extProtocol.setPut(melsecMcNet.getByteTransform().TransBool(result.Content, 0));
//                extProtocol.setMode(melsecMcNet.getByteTransform().TransInt16(result.Content, 0));
//                extProtocol.setTaskNo(melsecMcNet.getByteTransform().TransInt16(result.Content, 2));
                OutputQueue.Ext.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
            } else {
                OutputQueue.Ext.offer(MessageFormat.format("【{0}】{1}机械臂plc状态信息失败",DateUtils.convert(new Date()), slave.getId()));
                throw new CoolException(MessageFormat.format( "机械臂plc状态信息失败 ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort()));
            }
        } catch (Exception e) {
            e.printStackTrace();
            OutputQueue.Ext.offer(MessageFormat.format("【{0}】读取机械臂plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("MelsecExt"+" - 5"+" - 读取机械臂plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initExt();
        } finally {
//            sign = System.currentTimeMillis();
        }
    }
    @Override
    public void close() {
        melsecMcNet.ConnectClose();
    }
    /**
     * 心跳
     */
    private void heartbeat(){
        if (heartBeatVal >= 30000) {
            heartBeatVal = -30000;
        } else {
            heartBeatVal =(short) (heartBeatVal+1);
        }
        OperateResult write = melsecMcNet.Write("D1011", heartBeatVal);
        if (!write.IsSuccess) {
            log.error("MelsecExt"+" - 9"+" - 机械臂plc心跳通讯失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }
    /******************************************************************************************/
    /**************************************** 测试专用 *****************************************/
    /*****************************************************************************************/
    public static void main(String[] args) throws InterruptedException {
    }
    // 提供一个方法来停止线程
    public void requestStop() {
        isRunning = false;
    }
    // 提供一个方法来重启线程
    public Thread restartThread() {
        isRunning = true;
        Thread newThread = new Thread(this);
        newThread.start();
        return newThread;
    }
}
src/main/resources/application-prod.yml
@@ -10,6 +10,14 @@
    rack: 0
    slot: 0
    demo: false
  # EXT穿梭车1
  ext[0]:
    id: 1
    ip: 10.10.10.200
    port: 502
    rack: 0
    slot: 0
    demo: false
  crn[0]: #堆垛机1
    id: 1
    ip: 172.17.91.2
src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -57,22 +57,22 @@
                            <el-button v-if="demo === 'N' " @click="demos('true')" type="info">演示</el-button>
                            <el-button v-if="demo === 'Y' " @click="demos('false')" type="info">取消演示</el-button>
                        </div>
                        <div style="margin: 10px auto 10px auto">
                            <el-button v-if="demo === 'N' " @click="rgvStatus(8)" type="primary">启动</el-button>
                            <el-button v-if="demo === 'N' " @click="rgvStatus(9)" type="primary">停止</el-button>
                            <el-button v-if="demo === 'N' " @click="rgvStatus(14)" type="primary">单机</el-button>
                            <el-button v-if="demo === 'N' " @click="rgvStatus(15)" type="primary">联机</el-button>
                            <el-button v-if="demo === 'N' " @click="rgvStatus(11)" type="primary">复位按钮</el-button>
                        <div style="margin: 10px auto 10px auto" v-if="demo === 'N' ">
                            <el-button @click="rgvStatus(8)" type="primary">启动</el-button>
                            <el-button @click="rgvStatus(9)" type="primary">停止</el-button>
                            <el-button @click="rgvStatus(14)" type="primary">单机</el-button>
                            <el-button @click="rgvStatus(15)" type="primary">联机</el-button>
                            <el-button @click="rgvStatus(11)" type="primary">复位按钮</el-button>
                        </div>
                        <div style="margin: 10px auto 10px auto">
                            <el-button v-if="demo === 'N' " @click="rgvStatus(7)" type="warning">报警消音</el-button>
                            <el-button v-if="demo === 'N' " @click="rgvStatus(12)" type="warning">手动</el-button>
                            <el-button v-if="demo === 'N' " @click="rgvStatus(13)" type="warning">手动定位</el-button>
                        <div style="margin: 10px auto 10px auto" v-if="demo === 'N' ">
                            <el-button @click="rgvStatus(7)" type="warning">报警消音</el-button>
                            <el-button @click="rgvStatus(12)" type="warning">手动</el-button>
                            <el-button @click="rgvStatus(13)" type="warning">手动定位</el-button>
                        </div>
                        <div style="margin: 10px auto 10px auto">
                            <el-button v-if="demo === 'N' " :style="" @click="rgvStatus(5)" type="danger">强制启动</el-button>
                            <el-button v-if="demo === 'N' " @click="rgvStatus(10)" type="danger">急停</el-button>
                            <el-button v-if="demo === 'N' " @click="rgvStatus(16)" type="danger">货叉定位回中</el-button>
                        <div style="margin: 10px auto 10px auto" v-if="demo === 'N' ">
                            <el-button :style="" @click="rgvStatus(5)" type="danger">强制启动</el-button>
                            <el-button @click="rgvStatus(10)" type="danger">急停</el-button>
                            <el-button @click="rgvStatus(16)" type="danger">货叉定位回中</el-button>
                        </div>
                        <div style="margin-top: 5px" v-if="demo === 'Y'">
                            <el-button  @click="staTova(2,1)" type="warning">输送-置换1</el-button>