C#使用 ModeBusTCP读取汇川Easy521PLC
Modbus TCP是一种基于以太网TCP/IP的Modbus协议变种,它允许Modbus协议在以太网网络上运行,使得设备之间可以通过IP网络交换数据。Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准,广泛应用于工业自动化领域。
#region ModBusTCP 地址解释
/* 00 01->事务标识符,随意指定
00 00->协议标识符,Modbus TCP协议标识符为0x0000
00 06->报文长度,表示后面的报文长度为6个字节
01->广播地址
03->功能码 0x01 读输出线圈
0x02 读离散输入
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器
00 64 读写地址高八位 低八位
00 01 寄存器数量
*/
using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Threading.Tasks;namespace ModbusTcpExample
{class Program{static void Main(string[] args){MBTCP mBTCP = new MBTCP();mBTCP.MDConnection("192.168.1.2", 502);}}class MBTCP{private bool ConnectionStatus = false;NetworkStream stream;//ModBusTCP启动public void MDConnection(string ipAddress, int port){try{TcpClient client = new TcpClient(ipAddress, port);stream = client.GetStream();ConnectionStatus = true;}catch (Exception e){Console.WriteLine("TCP connection failed: " + e.Message);ConnectionStatus = false;}}//读单个D寄存器public int ReadRegister(int address){if (ConnectionStatus){try{#region ModBusTCP 地址解释/* 00 01->事务标识符,随意指定00 00->协议标识符,Modbus TCP协议标识符为0x000000 06->报文长度,表示后面的报文长度为6个字节01->广播地址03->功能码 0x01 读输出线圈0x02 读离散输入0x03 读保持寄存器0x04 读输入寄存器0x05 写单个线圈0x06 写单个保持寄存器0x0F 写多个线圈0x10 写多个保持寄存器00 64 读写地址高八位 低八位00 01 寄存器数量 */#endregionbyte H = (byte)((address >> 8) & 0xFF);byte L = (byte)(address & 0xFF);byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, H, L, 0x00, 0x01 };stream.WriteAsync(request, 0, request.Length); // 发送请求报文 byte[] response = new byte[12]; // 根据实际情况调整长度stream.ReadAsync(response, 0, response.Length);int decimalValue = (response[9] << 8) | response[10];return decimalValue;}catch (Exception e){Console.WriteLine("TCP connection failed: " + e.Message);ConnectionStatus = false;return 888;}}else{Console.WriteLine("TCP connection failed");return 888;}}//写单个D寄存器public bool WriteRegister(int address, int Wvalue){if (ConnectionStatus){try{byte H = (byte)((address >> 8) & 0xFF);byte L = (byte)(address & 0xFF);byte WH = (byte)((Wvalue >> 8) & 0xFF);byte WL = (byte)(Wvalue & 0xFF);byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, H, L, WH, WL };stream.WriteAsync(request, 0, request.Length); // 发送请求报文 byte[] response = new byte[12]; // 根据实际情况调整长度return false;}catch (Exception e){Console.WriteLine("TCP connection failed: " + e.Message);ConnectionStatus = false;return false;}}else{Console.WriteLine("TCP connection failed");return false;}}//读多个M寄存器public bool[] ReadMixeds(int address, int quantity){bool[] MB = new bool[quantity];if (ConnectionStatus){try{byte H = (byte)((address >> 8) & 0xFF);byte L = (byte)(address & 0xFF);byte QH = (byte)((quantity >> 8) & 0xFF);byte QL = (byte)(quantity & 0xFF);byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x02, H, L, QH, QL };stream.WriteAsync(request, 0, request.Length); // 发送请求报文 byte[] response = new byte[10 + quantity / 8]; // 根据实际情况调整长度stream.ReadAsync(response, 0, response.Length);Console.WriteLine("Received response:");foreach (var b in response){Console.Write(b.ToString("X2") + " ");}//bool[] MB = new bool[quantity];Console.WriteLine("\nMMMMReceived response:");int MT = 0;for (int n = 0; n < quantity / 8 + 1; n++){for (int i = 0; i < 8 && MT < quantity; i++){MB[MT] = ((response[9 + n] >> i) & 0x01) != 0;//int F = MT + address;//Console.WriteLine("M{0}.{1}", F, MB[MT]);MT++;}}return MB;}catch (Exception e){Console.WriteLine("TCP connection failed: " + e.Message);ConnectionStatus = false;return MB;}}else{Console.WriteLine("TCP connection failed");return MB;}}//写单个M寄存器public bool WriteMixed(int address, bool Wvalue){if (ConnectionStatus){try{byte H = (byte)((address >> 8) & 0xFF);byte L = (byte)(address & 0xFF);byte WByte = 0x00;if (Wvalue) { WByte = 0x01; }byte[] request = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, H, L, 0x00, WByte };stream.WriteAsync(request, 0, request.Length); // 发送请求报文 byte[] response = new byte[12]; // 根据实际情况调整长度return true;}catch (Exception e){Console.WriteLine("TCP connection failed: " + e.Message);ConnectionStatus = false;return false;}}else{Console.WriteLine("TCP connection failed");return false;}}}}
相关文章:

C#使用 ModeBusTCP读取汇川Easy521PLC
Modbus TCP是一种基于以太网TCP/IP的Modbus协议变种,它允许Modbus协议在以太网网络上运行,使得设备之间可以通过IP网络交换数据。Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准,广泛应用于工业自动化领域。 #regio…...

PostgreSQL的postgres主进程
PostgreSQL的postgres主进程 在PostgreSQL数据库系统中,主要的后台进程各司其职,保证数据库的高效运行。其中,主进程postgres(也称为Postmaster)是整个数据库的核心,它负责管理和协调所有其他后台进程&…...

Java实现K个排序链表的高效合并:逐一合并、分治法与优先队列详解
Java实现K个排序链表的高效合并:逐一合并、分治法与优先队列详解 在算法和数据结构的学习中,链表是一个非常基础但又极具挑战的数据结构。尤其是当面对合并多个排序链表的问题时,如何在保证效率的前提下实现代码的简洁与高效,往往…...

Xinstall揭秘:高效App推广背后的黑科技
在移动互联网时代,App的运营推广成为了开发者们最为关注的话题之一。然而,随着市场竞争的加剧,推广难度也越来越大。这时候,一款名为Xinstall的品牌走进了我们的视线,它以其独特的技术和解决方案,为App推广…...

星巴克VS瑞幸,新王、旧王之争给新CEO带来哪些启示
“变化是生命的元素,求变是生命的力量”,马克吐温曾这样解释生命。而商场上何尝不是如此,正因为世异则事异,求变也是企业的常态。 近日,星巴克官宣布莱恩尼科尔(Brian Niccol)将于9月9日接替拉什曼纳拉辛汉(Laxman Na…...

C语言 | Leetcode C语言题解之第354题俄罗斯套娃信封问题
题目: 题解: int cmp(int** a, int** b) {return (*a)[0] (*b)[0] ? (*b)[1] - (*a)[1] : (*a)[0] - (*b)[0]; }int maxEnvelopes(int** envelopes, int envelopesSize, int* envelopesColSize) {if (envelopesSize 0) {return 0;}qsort(envelopes, …...

大型俄罗斯国际展览会介绍
今天分享一些在俄罗斯比较知名的国际展览会,以下展会大多为一年一届,具体展出时间大家可去网上查询了解,充分利用合适的展会,无疑是企业拓展市场、塑造品牌、对接资源、紧跟行业趋势的重要途径。 1、俄罗斯国际食品展览会 展览地…...

CST软件仿真案例:圆极化平板天线仿真02
本期继续完成一款圆极化Patch天线的仿真实例。读者可以完整的了解到怎么用CST微波工作室,完成对一款天线建模、设置到仿真分析的完整过程。 本期中,我们要设计的圆极化天线尺寸如下图所示: 本期内容是接着上期部分开始。首先先完成仿真实例0…...

【前端】vue监视属性和计算属性对比
首先分开讲解各个属性的作用。 1.计算属性 作用:用来计算出来一个值,这个值调用的时候不需要加括号,会根据依赖进行缓存,依赖不变,computed的值不会重新计算。 const vm new Vue({el:#root,data:{lastName:张,firstNa…...

探索提示工程 Prompt Engineering的奥妙
一、探索提示工程 Prompt Engineering 1. 介绍通用人工智能和专用人工智能 人工智能(AI)可以分为通用人工智能(AGI)和专用人工智能(Narrow AI)。AGI是一种能够理解、学习和执行任何人类可以完成的任务的智…...

算法阶段总结1
阶段总结 通过今天晚上的这场div2我深刻的意识到,光是会找窍门是远远不够的,你得会基础的建图,dp,高级数据结构,你这样才可以不断的提升自己,不可以一直在一个阶段停留下去,构造题可以刷下去&a…...

前端宝典之七:React性能优化实战精华篇
本文主要讲解实战项目中React性能优化的方法,主要分为三个大的方面:减少不必要的组件更新、组件优化以及tree-shaking,共11个方法 一、减少不必要组件更新 以下是一些可以避免在 React 提交阶段进行不必要重新渲染的方法: 1、使…...

【Dash】feffery_antd_components 简单入门示例
一、简单了解 feffery_antd_components 简称 fac ,是一个基于 Ant Design 的 Dash 第三方组件,由Feffery 老师开源维护的 Python 网页开发组件库,它具有丰富的页面常用交互组件功能,使开发者可以使用纯Python的方式快速构建现代…...

JAVA学习-练习试用Java实现“路径交叉”
问题: 给定一个整数数组 distance 。从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南移动 distance[2] 米,向东移动 distance[3] 米,持续移动。也就是说&#…...

element组件封装
1.上传组件 <!--文件上传组件--> <template><div class"upload-file"><el-uploadref"fileUpload"v-if"props.type default":action"baseURL other.adaptationUrl(props.uploadFileUrl)":before-upload"h…...

Mysql (面试篇)
目录 唯一索引比普通索引快吗 MySQL由哪些部分组成,分别用来做什么 MySQL查询缓存有什么弊端,应该什么情况下使用,8.0版本对查询缓存由上面变更 MyISAM和InnoDB的区别有哪些 MySQL怎么恢复半个月前的数据 MySQL事务的隔离级别ÿ…...

【python】深入探讨python中的抽象类,创建、实现方法以及应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

微前端传值
在微前端架构中,不同子应用之间通过 postMessage 进行通信是一种常见的做法。这种方式允许不同源的窗口之间进行安全的信息交换。 下面是如何使用 postMessage 在微前端环境中发送和接收消息的示例。 步骤 1: 发送消息 假设您有一个主应用(host app&a…...

《学会 SpringBoot · 依赖管理机制》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...

全网行为管理软件有哪些?5款总有一款适合你的企业!
如今企业越来越依赖互联网进行日常运营和业务发展,网络行为管理变得日益重要。 为了确保网络安全、提高员工工作效率、避免敏感信息外泄等问题,企业往往需要借助全网行为管理软件来监控和管理内部网络的使用情况。 本文将为您介绍五款热门的全网行为管理…...

以简单的例子从头开始建spring boot web多模块项目(二)-mybatis简单集成
继续使用以简单的例子从头开始建spring boot web多模块项目(一)中的项目进行mybatis集成。 1、pom.xml文件中,增加相关的依赖包的引入,分别是mybatis-spring-boot-starter、lombok、mysql-connector-java 如下: <d…...

Golang | Leetcode Golang题解之第354题俄罗斯套娃信封问题
题目: 题解: func maxEnvelopes(envelopes [][]int) int {n : len(envelopes)if n 0 {return 0}sort.Slice(envelopes, func(i, j int) bool {a, b : envelopes[i], envelopes[j]return a[0] < b[0] || a[0] b[0] && a[1] > b[1]})f : …...

jmeter中添加ip欺骗
1、首先在本机电脑中通过配置文件创建添加ip的配置文件,先创建一个txt格式的,直接修改文件名以及后缀为ips.bat 2、编辑该ips.bat文件,在文件中输入如下内容,用于快速给本机添加ip地址,(2,1&…...

WPF篇(19)-TabControl控件+TreeView树控件
TabControl控件 TabControl表示包含多个共享相同的空间在屏幕上的项的控件。它也是继承于Selector基类,所以TabControl也只支持单选操作。另外,TabControl的元素只能是TabItem,这个TabItem继承于HeaderedContentControl类,所以Ta…...

appium下载及安装
下载地址:https://github.com/appium/appium-desktop/releases 双击安装就可以...

XSS项目实战
目录 一、项目来源 二、实战操作 EASY 1 2 3 4 5 6 7 8 一、项目来源 XSS Game - Learning XSS Made Simple! | Created by PwnFunction 二、实战操作 EASY 1 1.Easy -1 2.题目要求及源码 Difficulty is Easy.Pop an alert(1337) on sandbox.pwnfunction.com.No …...

SD-WAN降低网络运维难度的关键技术解析
为什么说SD-WAN(软件定义广域网)大大降低了网络运维的复杂性,主要是因为它的智能路径选择、应用识别和链路质量监测这三个核心技术。这几项在SD-WAN中尤为重要的技术,它们共同作用,提升了整体网络性能,为网…...

【算法基础实验】图论-最小生成树-Prim的即时实现
理论知识 Prim算法是一种用于计算加权无向图的最小生成树(MST, Minimum Spanning Tree)的贪心算法。最小生成树是一个连通的无向图的子图,它包含所有的顶点且总权重最小。Prim算法从一个起始顶点开始,不断将权重最小的边加入生成…...

LLama 3 跨各种 GPU 类型的基准测试
2024 年 4 月 18 日,AI 社区对 Llama 3 70B 的发布表示欢迎,这是一款最先进的大型语言模型 (LLM)。该型号是 Llama 系列的下一代产品,支持广泛的用例。该模型 istelf 在广泛的行业平台上表现良好,并提供了新…...

FreeRTOS 快速入门(五)之信号量
目录 一、信号量的特性1、信号量跟队列的对比2、两种信号量的对比 二、信号量1、二值信号量1.1 二值信号量用于同步1.2 二值信号量用于互斥 2、计数信号量 三、信号量函数1、创建2、删除3、give/take 一、信号量的特性 信号量(Semaphore)是一种实现任务…...