ModBus协议详解:从基础概念到C#实现RTU与TCP通讯

ModBus协议是莫迪康公司为了让PLC之间进行数据通信而设计出来的协议。它是一种总线协议,是一种一对多,上下级的关系。

它的应用广泛,具有免费开源,操作简单的有点,并且可以兼容串口和网络通讯,兼容也不错。

数据类型:输入布尔(输入线圈),输入寄存器,输出布尔(输出线圈),输出寄存器

布尔就是bool值,寄存器可以是int或者float类型

常用功能码

1、读取

读取输出线圈(Read Coils) 0x01

读取输入线圈 (Read DisCrete Input)0x02,(主机只读)

读取输出寄存器(Read Holding Registers)0x03,

读取输入寄存器(Read Inpute Registers)0x04,(主机只读)

2、写入

写入单个线圈(Write Single Coil)0x05

写入单个寄存器(Write Single Register)0x06

写入多个线圈(Write Multple Coils)0x0F

写入多个寄存器(Write Multple Register)0x10

三种传输类型

1、ModbusRTU,用于串口通信,传递字节码,效率更高

流程是主机向从机发出请求,从站响应请求后,主站才能接收到数据。

主机报文:从站地址+功能码+起始地址+数据长度+校验位(从站地址,功能码占1个字节,起始地址、数据长度、检验位占2个字节)

数据长度可以看做是读取的行数

例如:从机的设备地址是01,功能码是读取输出寄存器03,起始寄存器地址是从第0开始读取,读取的数量是9,得出的报文就是:01 03 00 00 00 09 XX XX

从机报文:从站地址+功能码+数据的字节位数+数据+校验位(从站地址,功能码,数据的字节位数占1个字节,数据、检验位占2个字节)

例如:从机的设备地址是01,功能码是读取输出寄存器03,每次读取4个字节,从机传输的值都是65,得出的报文就是:01 03 04 00 41 00 41 XX XX

2、ModBusAscii,用于串口通信,传递Ascii码

3、ModBusTCP,用于网络传输

4、ModBusUDP,用于网络传输

5、ModBusRTUOverTCP/UDP,串口转网口通信

6、ModBusAsciiOverTCP/UDP,串口转网口通信

使用C#完成ModBus的RTU和TCP通讯

进行测试前需要用到Modbus Slave开启一个ModBus服务

1、RTU通讯(串口通讯)

    var modbus = new HslCommunication.ModBus.ModbusRtu();modbus.SerialPortInni(cfg => {cfg.BaudRate = 9600;cfg.PortName = "COM2";cfg.Parity = System.IO.Ports.Parity.None;cfg.DataBits = 8;cfg.StopBits = System.IO.Ports.StopBits.One;// 每次写falsecfg.RtsEnable = false;});// 设置超时时间modbus.ReceiveTimeOut = 5000;// 设置起始地址是否从0开始,有些情况是从1开始modbus.AddressStartWithZero = true;// 设置数据大小端modbus.DataFormat = HslCommunication.Core.DataFormat.CDAB;// 设置设备地址modbus.Station = 1;modbus.Crc16CheckEnable = true;modbus.IsClearCacheBeforeRead = false;var openResult = modbus.Open();if(openResult.IsSuccess == false){MessageBox.Show("打开ModBus失败");return;}// 读取数据,从第0位开始,读取5个数据var readResult = await modbus.ReadInt16Async("0", 5);if(readResult.IsSuccess == true){this.textBox1.Text = this.textBox1.Text + string.Join(",", readResult.Content) + Environment.NewLine;}// 继续读取另一个设备地址的Bool类型modbus.Station = 2;var readBool = await modbus.ReadBoolAsync("5");if (readResult.IsSuccess == true){this.textBox1.Text = this.textBox1.Text + readBool.Content + Environment.NewLine;}// 写入数据modbus.Station = 1;var writeResult = await modbus.WriteAsync("0", (short)90);if (writeResult.IsSuccess == true){this.textBox1.Text = this.textBox1.Text + "写入成功" + Environment.NewLine;}

2、TCP通讯

    var modBus = new HslCommunication.ModBus.ModbusTcpNet("127.0.0.1");modBus.Port = 502;modBus.Station = 1;modBus.ConnectTimeOut = 10000;modBus.ReceiveTimeOut = 5000;modBus.AddressStartWithZero = true;modBus.IsStringReverse = false;modBus.DataFormat = HslCommunication.Core.DataFormat.CDAB;// 读取数据var result = await modBus.ReadInt16Async("0");if (result.IsSuccess){this.textBox1.Text = this.textBox1.Text + result.Content + Environment.NewLine;}// 写入数据var resultWrite = await modBus.WriteAsync("1", 66);if (resultWrite.IsSuccess){this.textBox1.Text = this.textBox1.Text + "写入成功" + Environment.NewLine;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比

在PHP开发中,数组排序是日常操作的核心技能之一。无论是处理用户数据、产品列表,还是分析日志信息,合理的排序方法能显著提升代码的效率和可维护性。PHP提供了多种数组排序函数(如 sort()、rsort()、asort() 等)&#…

RabittMQ-高级特性2-应用问题

文章目录 前言延迟队列介绍ttl死信队列存在问题延迟队列插件安装延迟插件使用事务消息分发概念介绍限流非公平分发(负载均衡) 限流负载均衡RabbitMQ应用问题-幂等性保障顺序性保障介绍1顺序性保障介绍2消息积压总结 前言 延迟队列介绍 延迟队列(Delaye…

HOW - 在 Mac 上的 Chrome 浏览器中调试 Windows 场景下的前端页面

文章目录 为什么需要模拟 Windows 环境?一、修改 User-Agent 模拟 Windows 浏览器方法 1:通过 Chrome 开发者工具修改 UA方法 2:使用浏览器插件 二、模拟 Windows 的字体和滚动条样式1. 模拟 Windows 字体2. 强制显示滚动条(模拟 …

如何删除豆包本地大模型

由于无法选择大模型的安装位置,因此会占用C盘大量空间,然后又找到不卸载的地方,经排查豆包大模型安装位为:C:\Users\[当前电脑用户]\AppData\Local\Doubao\User Data,只能进行手动卸载。

Linux C语言线程编程入门笔记

目录 开发环境准备 线程基础概念 进程与线程的关系 线程生命周期 创建线程 等待线程结束 线程函数和参数 互斥锁与共享资源保护 总结 开发环境准备 操作系统:以 Linux 为例(Ubuntu/CentOS 等主流发行版)。请确保系统已安装 GNU C 编…

levelDB的数据查看(非常详细)

起因:.net大作业天气预报程序(WPF)答辩时,老师问怎么维持数据持久性的,启动时加载的数据存在哪里,我明白老师想考的应该是json文件的解析(正反),半天没答上来存那个文件了(老师默认这个文件是自…

数据分析怎么做?高效的数据分析方法有哪些?

目录 一、数据分析的对象和目的 (一)数据分析的常见对象 (二)数据分析的目的 二、数据分析怎么做? (一)明确问题 (二)收集数据 (三)清洗和…

手写 Vue 源码 === 完善依赖追踪与触发更新

目录 依赖收集的完整实现 trackEffects:建立双向依赖关系 触发更新的完整实现 完整的响应式流程 为什么使用 Map 而不是 Set? 总结 在上一篇文章中,我们介绍了 Vue3 响应式系统的基本原理和 activeEffect 的作用。现在,我们将深入探讨完善后的依赖追踪和触发更新机制…

从代码学习深度学习 - 区域卷积神经网络(R-CNN)系列 PyTorch版

文章目录 前言R-CNNFast R-CNN兴趣区域汇聚层 (RoI Pooling)代码示例:兴趣区域汇聚层 (RoI Pooling) 的计算方法Faster R-CNNMask R-CNN双线性插值 (Bilinear Interpolation) 与兴趣区域对齐 (RoI Align)兴趣区域对齐层的输入输出全卷积网络 (FCN) 的作用掩码输出形状总结前言…

18个国内wordpress主题推荐

工厂wordpress中文主题 红蓝色搭配的工厂wordpress中文主题,适合从事生产、加工的工厂官方网站使用。 https://www.jianzhanpress.com/?p8533 Pithy设计师wordpress网站模板 精练简洁的wordpress模板,设计师或设计工作室展示型网站模板。 https://w…

低成本自动化改造技术锚点深度解析

执行摘要 本文旨在深入剖析四项关键的低成本自动化技术,这些技术为工业转型提供了显著的运营和经济效益。文章将提供实用且深入的指导,涵盖老旧设备联网、AGV车队优化、空压机系统智能能耗管控以及此类项目投资回报率(ROI)的严谨…

Oracle — 数据管理

介绍 Oracle数据库作为全球领先的关系型数据库管理系统,其数据管理能力以高效性、安全性和智能化为核心。系统通过多维度技术实现海量数据的存储与实时处理,支持高并发事务操作与复杂分析查询,满足企业关键业务需求。在安全领域,O…

【PhysUnits】3.3 SI 基础量纲单位(units/base.rs)

一、源码 这段代码定义了一系列基础物理量纲的类型别名,并使用标记 trait Canonical 来表示它们是国际单位制(SI)中的基本单位。 use crate::Dimension; use typenum::{P1, Z0};/// 标记特质,表示基础量纲单位 pub trait Canoni…

硬件实操技巧记录

本篇自用,防止自己忘记 焊接技巧 一般都是随机电烙铁锡膏组合。 拆电阻时,电烙铁放在电阻上,加锡膏,这个时候熔点会降低,电阻更容易掉下来,用电烙铁带走;焊电阻时,一端点锡膏&…

13.thinkphp的Session和cookie

一.Session 1. 在使用Session之前,需要开启初始化,在中间件文件middleware.php; // Session 初始化 \think\middleware\SessionInit::class 2. TP6.0不支持原生$_SESSION的获取方式,也不支持session_开头的函数&…

TensorFlow中数据集的创建

目录 前言示例示例1示例2示例3示例4 前言 TensorFlow 的 tf.data.Dataset API 提供了一种灵活且高效的方式来加载和预处理数据。它可以轻松处理大规模数据集,并支持多种数据源格式。 所有数据集相关的内容都在tf.data中,from_tensor_slices:…

第十六章,网络型攻击防范技术

网络攻击介绍 网络攻击 --- 指的是入侵或破坏网络上的服务器 ( 主机 ) ,盗取服务器的敏感数据或占用网络带宽。 网络攻击分类: 流量型攻击 网络层攻击 应用层攻击 单包攻击 畸形报文攻击 --- 向目标主机发送有缺陷的IP报文,使得目标在…

服务器不备案有影响吗

在当今数字化的时代,服务器成为了众多企业和个人开展业务、展示自我的重要工具。然而,有一个问题常常被忽视,那就是服务器不备案到底有没有影响? 答案是肯定的!服务器不备案,影响可不小。据相关数据显示&a…

【LeetCode Solutions】LeetCode 176 ~ 180 题解

CONTENTS LeetCode 176. 第二高的薪水(SQL 中等)LeetCode 177. 第 N 高的薪水(SQL 中等)LeetCode 178. 分数排名(SQL 中等)LeetCode 179. 最大数(中等)LeetCode 180. 连续出现的数字…

D720201 PCIE 转USB HUB

1. 启动时出现了下面错误 [ 4.682595] pcieport 0004:00:00.0: Signaling PME through PCIe PME interrupt [ 4.684939] pci 0004:01:00.0: Signaling PME through PCIe PME interrupt [ 4.691287] pci 0004:01:00.0: enabling device (0000 -> 0002) [ 5.2962…