From 21038521f93c26f3e7b6810d8ee8dfdd31c159e0 Mon Sep 17 00:00:00 2001 From: lsh <lsh@163.com> Date: 星期一, 22 四月 2024 15:35:01 +0800 Subject: [PATCH] #Ext --- src/main/java/com/zy/core/properties/SlaveProperties.java | 7 src/main/java/com/zy/core/thread/MelsecExtThread.java | 180 ++++++++++++++++++++++++++++++++++++ src/main/java/com/zy/core/model/ExtSlave.java | 22 ++++ src/main/java/com/zy/core/enums/SlaveType.java | 3 src/main/java/com/zy/core/cache/OutputQueue.java | 2 src/main/java/com/zy/core/model/protocol/ExtProtocol.java | 16 +++ src/main/resources/application-prod.yml | 8 + src/main/webapp/views/deviceOperate/rgvOperate.html | 28 ++-- src/main/java/com/zy/core/ServerBootstrap.java | 17 ++ 9 files changed, 260 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java index d67d829..c8fe405 100644 --- a/src/main/java/com/zy/core/ServerBootstrap.java +++ b/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); + } // // 鍒濆鍖朙ed鐏痬q // 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("鍒濆鍖朎xt绾跨▼..................................................."); + for (ExtSlave ext : slaveProperties.getExt()) { + MelsecExtThread extThread = new MelsecExtThread(ext); + new Thread(extThread).start(); + SlaveConnection.put(SlaveType.Ext, ext.getId(), extThread); + } // // 鍒濆鍖朙ED绾跨▼ // log.info("鍒濆鍖朙ED绾跨▼..................................................."); // for (LedSlave led : slaveProperties.getLed()) { diff --git a/src/main/java/com/zy/core/cache/OutputQueue.java b/src/main/java/com/zy/core/cache/OutputQueue.java index a5c050d..48bd3be 100644 --- a/src/main/java/com/zy/core/cache/OutputQueue.java +++ b/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); + } diff --git a/src/main/java/com/zy/core/enums/SlaveType.java b/src/main/java/com/zy/core/enums/SlaveType.java index 7f64d13..14b192a 100644 --- a/src/main/java/com/zy/core/enums/SlaveType.java +++ b/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){ diff --git a/src/main/java/com/zy/core/model/ExtSlave.java b/src/main/java/com/zy/core/model/ExtSlave.java new file mode 100644 index 0000000..8b541b2 --- /dev/null +++ b/src/main/java/com/zy/core/model/ExtSlave.java @@ -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; + +} \ No newline at end of file diff --git a/src/main/java/com/zy/core/model/protocol/ExtProtocol.java b/src/main/java/com/zy/core/model/protocol/ExtProtocol.java new file mode 100644 index 0000000..5de464b --- /dev/null +++ b/src/main/java/com/zy/core/model/protocol/ExtProtocol.java @@ -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;//鍏佽鏀句俊鍙� + +} diff --git a/src/main/java/com/zy/core/properties/SlaveProperties.java b/src/main/java/com/zy/core/properties/SlaveProperties.java index 866ea67..0510d2e 100644 --- a/src/main/java/com/zy/core/properties/SlaveProperties.java +++ b/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<>(); } diff --git a/src/main/java/com/zy/core/thread/MelsecExtThread.java b/src/main/java/com/zy/core/thread/MelsecExtThread.java new file mode 100644 index 0000000..3cab9ee --- /dev/null +++ b/src/main/java/com/zy/core/thread/MelsecExtThread.java @@ -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"+" - 鏈烘鑷俻lc杩炴帴鎴愬姛 ===>> [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"+" - 鏈烘鑷俻lc杩炴帴澶辫触锛侊紒锛� ===>> [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}鏈烘鑷俻lc鐘舵�佷俊鎭け璐�",DateUtils.convert(new Date()), slave.getId())); + throw new CoolException(MessageFormat.format( "鏈烘鑷俻lc鐘舵�佷俊鎭け璐� ===>> [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"+" - 璇诲彇鏈烘鑷俻lc鐘舵�佷俊鎭け璐� ===>> [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"+" - 鏈烘鑷俻lc蹇冭烦閫氳澶辫触 ===>> [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; + } + +} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 833f539..46cbdcf 100644 --- a/src/main/resources/application-prod.yml +++ b/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 diff --git a/src/main/webapp/views/deviceOperate/rgvOperate.html b/src/main/webapp/views/deviceOperate/rgvOperate.html index ab59e9f..dc6b8b2 100644 --- a/src/main/webapp/views/deviceOperate/rgvOperate.html +++ b/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> -- Gitblit v1.9.1