当前位置: 首页 > news >正文

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.xdnf.cn/news/286147.html

相关文章:

  • Spring Boot 集成 Solr 的详细步骤及示例
  • C# WPF 布局
  • 算法笔记.约数个数
  • 基于muduo库实现高并发服务器
  • Nginx核心功能2
  • Linux:权限的理解
  • 健康养生:从生活点滴启航
  • 解决pycharm检测不到已经装好的conda的pytorch环境
  • 项目成本管理_挣得进度ES
  • 网络:cookie和session
  • 【硬核攻坚】告别CUDA OOM!DeepSeek部署显存瓶颈终极解决方案:三大策略高效落地
  • [特殊字符]Git 操作实战:如何将本地项目提交到远程 Gitee 仓库
  • RocketMQ与Kafka的区别
  • Nuxt3还能用吗?
  • 直方图反向投影
  • Three.js + React 实战系列 - 项目展示区开发详解 Projects 组件(3D 模型 + 动效 + 状态切换)✨
  • android-ndk开发(2): macOS 安装 ndk
  • PyTorch_自动微分模块
  • 时间同步服务核心知识笔记:原理、配置与故障排除
  • 因为gromacs必须安装cuda(系统自带的NVIDIA驱动不行),这里介绍下如何安装cuda
  • 学习路线(机器人软件架构)
  • Java常用注解大全(基于JDK17+SpringBoot3)
  • 对ubuntu的简单介绍
  • Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
  • 题目 3321: 蓝桥杯2025年第十六届省赛真题-画展布置
  • SpringMVC 框架核心知识点详解与实战
  • 精益数据分析(41/126):深入解读移动应用商业模式的关键指标与策略
  • linux 高并发 文件句柄数 fs 及 tcp端口数调优
  • 泉州2025年首次网签备案登记的商品住宅并在本年度进行装修、改造及家装物品和材料购置的,在上述补贴额度的基础上上浮2万元,单个产权人补贴最高不超过5万元。
  • VScode中关于Copilot的骚操作