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款总有一款适合你的企业!
如今企业越来越依赖互联网进行日常运营和业务发展,网络行为管理变得日益重要。 为了确保网络安全、提高员工工作效率、避免敏感信息外泄等问题,企业往往需要借助全网行为管理软件来监控和管理内部网络的使用情况。 本文将为您介绍五款热门的全网行为管理…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
