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

Modbus RTU 协议介绍

Modbus RTU 协议介绍

异步串行传输方式,采用二进制格式,适用于串行通讯(如RS-485),效率高,是工业现场的主流选择。

主站是Master,从站是Slave。

Modbus RTU 协议格式

帧结构

  • 地址码(1字节):从设备的地址,取值1-247。
  • 功能码(1字节):指定操作类型,如读取或写入。
  • 数据区(长度可变):包含具体的操作数据。
  • CRC校验(2字节):循环冗余校验码,确保数据无误。

功能码

功能码功能用途
01读线圈状态获取开关量输出状态
03读保持寄存器获取16位可读写数据
04读输入寄存器获取16位只读数据
05写单个线圈控制单个开关量输出
06写单个寄存器修改单个16位数据
16(0x10 十六进制)写多个寄存器修改多个16位数据

CRC 校验

CRC(循环冗余校验)是Modbus RTU的关键,用于检测传输错误。发送方计算CRC并附加在帧尾,接收方重新计算并比对。

CRC16校验算法示例:

const unsigned short wCRCTalbeAbs[] =
{0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400,
};unsigned short mt_api_crc16(unsigned char *ptr, unsigned int len) 
{unsigned short wCRC = 0xFFFF;unsigned short i;unsigned char chChar;unsigned char temp[2];for (i = 0; i < len; i++){chChar = *ptr++;wCRC = wCRCTalbeAbs[(chChar ^ wCRC) & 15] ^ (wCRC >> 4);wCRC = wCRCTalbeAbs[((chChar >> 4) ^ wCRC) & 15] ^ (wCRC >> 4);}temp[0] = wCRC&0xFF; temp[1] = (wCRC>>8)&0xFF;wCRC = (temp[0]<<8)|temp[1];return wCRC;
}

0x01 功能码(读线圈状态)

请求数据

01 01 00 00 00 08 9C 03
  • 01:从设备地址(1-247)
  • 01:功能码(读线圈状态)
  • 00 00:起始线圈地址(2 字节)
  • 00 08:线圈个数(读取 8 个线圈)
  • 9C 03:CRC校验

更详细的格式如下:

从设备地址 + 功能码 + 起始线圈地址(高位) + 起始线圈地址(低位) + 线圈数量(高位) + 线圈数量(低位) + CRC(高位) + CRC(低位),一共 8 个字节。

响应数据

01 01 01 55 78 3A
  • 01:从设备地址(1-247)
  • 01:功能码(读线圈状态)
  • 01:线圈状态数据的总字节数(<font style="color:rgb(0, 0, 0);">ceil(线圈数量/8)</font>,8 个线圈 = 1 字节)
  • 55:线圈状态数据(1 个字节)
  • 78 3A:CRC 校验

更详细的格式如下:

从设备地址 + 功能码 + 数据长度 + [线圈状态数据(N 字节)] + CRC(高位) + CRC(低位)

0x03 功能码(读保持寄存器)

请求数据

01 03 00 00 00 01 C4 0B
  • 01:从设备地址(1-247)
  • 03:功能码(读保持寄存器)
  • 00 00:起始寄存器地址(2 字节)
  • 00 01:寄存器个数(读取 1 个寄存器)
  • C4 0B:CRC校验

更详细的格式如下:

从设备地址 + 功能码 + 起始寄存器地址(高位) + 起始寄存器地址(低位) + 寄存器数量(高位) + 寄存器数量(低位) + CRC(高位) + CRC(低位),一共 8 个字节。

响应数据

01 03 02 19 98 B2 7E
  • 01:从设备地址(1-247)
  • 03:功能码(读保持寄存器)
  • 02:后面数据的字节数,一个寄存器有 2 个字节,所以后面的字节数等于 2*查询的寄存器数量
  • 19 98:寄存器的值是 19 98
  • B2 7E:CRC 校验

更详细的格式如下:

从设备地址 + 功能码 + 数据长度 + 寄存器数据 + CRC 校验码

字节数:1+1+1+2*N+2

0x04 功能码(读输入寄存器)

请求数据

01 04 00 01 00 03 60 0A 
  • 01:从设备地址(1-247)
  • 04:功能码(写输入寄存器)
  • 00 01:起始寄存器地址(2 字节)
  • 00 03:输入寄存器数量
  • 60 0A:CRC 校验

更详细的格式如下:

从设备地址 + 功能码 + 起始寄存器地址(高位) + 起始寄存器地址(低位) +寄存器数量(高位) + 寄存器数量(低位) + CRC 校验(高位) + CRC 校验(高位),一共 8 个字节。

响应数据

01 04 06 00 0A 01 F4 03 E8 75 3B
  • 01:从设备地址(1-247)
  • 04:功能码(写输入寄存器)
  • 06:输入寄存器数据的总字节数(寄存器数量 ×2,3×2=6 字节)
  • 00 0A:第一个输入寄存器值
  • 01 F4:第二个输入寄存器值
  • 03 E8:第三个输入寄存器值
  • 75 3B:CRC 校验

更详细的格式如下:

从设备地址 + 功能码 + 数据长度 + [N 组寄存器数据(每组 2 字节)] + CRC 校验(高位) + CRC 校验(高位)

0x05 功能码(写单个线圈)

请求数据

01 05 00 03 FF 00 8C 3A
  • 01:从设备地址(1-247)
  • 05:功能码(写单个线圈)
  • 00 03:目标线圈地址
  • FF 00:线圈状态值
  • 8C 3A:CRC 校验

更详细的格式如下:

从设备地址 + 功能码 + 目标线圈地址(高位) + 目标线圈地址(低位) + 线圈状态值(高位) + 线圈状态值(低位) + CRC 校验(高位) + CRC 校验(高位),一共 8 个字节。

响应数据

01 05 00 03 FF 00 8C 3A
  • 01:从设备地址(1-247)
  • 05:功能码(写单个线圈)
  • 00 03:目标线圈地址
  • FF 00:线圈状态值
  • 8C 3A:CRC 校验

更详细的格式如下:

从设备地址 + 功能码 + 目标线圈地址(高位) + 目标线圈地址(低位) + 线圈状态值(高位) + 线圈状态值(低位) + CRC 校验(高位) + CRC 校验(高位),一共 8 个字节。

0x06 功能码( 写单个保持寄存器)

请求数据

01 06 00 00 00 01 48 0A
  • 01:从设备地址(1-247)
  • 06:功能码(写保持寄存器)
  • 00 00:起始寄存器地址(2 字节)
  • 00 01:写入的值
  • 48 0A:CRC校验

更详细的格式如下:

从设备地址 + 功能码 + 起始寄存器地址(高位) + 起始寄存器地址(低位) + 写入值(高位) + 写入值(低位) + CRC(高位) + CRC(低位),一共 8 个字节。

响应数据

01 06 00 00 00 01 48 0A
  • 01:从设备地址(1-247)
  • 06:功能码(写保持寄存器)
  • 00 00:起始寄存器地址(2 字节)
  • 00 01:写入的值
  • 48 0A:CRC校验

更详细的格式如下:

从设备地址 + 功能码 + 起始寄存器地址(高位) + 起始寄存器地址(低位) + 写入值(高位) + 写入值(低位) + CRC(高位) + CRC(低位),一共 8 个字节。

0x010 功能码( 写多个保持寄存器)

请求数据

01 10 00 02 00 03 06 00 0A 01 02 03 04 75 F5
  • 01:从设备地址(1-247)
  • 10:功能码(写保持寄存器)
  • 00 02:起始寄存器地址(2 字节)
  • 00 03:寄存器数量
  • 06:后续数据的总字节数(寄存器数量 x 2)
  • 00 0A:写入数据 1(2 字节)
  • 01 02:写入数据 3(2 字节)
  • 03 04:写入数据 3(2 字节)
  • 75 F5:CRC 校验

更详细的格式如下:

从设备地址 + 功能码 + 起始寄存器地址(高位)+ 起始寄存器地址(低位) + 寄存器数量(高位) + 寄存器数量(低位) + 数据总字节数 + [N 组写入值(每组 2 字节)] + CRC 高位 + CRC 低位

响应数据

01 10 00 02 00 03 A7 3C
  • 01:从设备地址(1-247)
  • 10:功能码(写保持寄存器)
  • 00 02:起始寄存器地址(2 字节)
  • 00 03:寄存器数量
  • A7 3C:CRC 校验

更详细的格式如下:

从设备地址 + 功能码 + 起始寄存器地址(高位)+ 起始寄存器地址(低位) + 寄存器数量(高位) + 寄存器数量(低位) + CRC 高位 + CRC 低位。


文章转载自:

http://uuTVq5YD.dzwrt.cn
http://YchxNEjt.dzwrt.cn
http://unR0RWMT.dzwrt.cn
http://uPqPHhlp.dzwrt.cn
http://C4QDcmoC.dzwrt.cn
http://QxwtCn5N.dzwrt.cn
http://PSTZBPwI.dzwrt.cn
http://JN0GEVIZ.dzwrt.cn
http://zcnS5AYB.dzwrt.cn
http://hthePSp4.dzwrt.cn
http://TyD3FwBJ.dzwrt.cn
http://KtTMZz5g.dzwrt.cn
http://cdEz99Nu.dzwrt.cn
http://Ieyem9Oe.dzwrt.cn
http://A98uo56K.dzwrt.cn
http://Cq2FmTcc.dzwrt.cn
http://yRZNP5wN.dzwrt.cn
http://OhT8Hewq.dzwrt.cn
http://cvN2GETH.dzwrt.cn
http://PkNVhHlU.dzwrt.cn
http://VTls9cQJ.dzwrt.cn
http://hfyWQ6GU.dzwrt.cn
http://ZcnBwPBx.dzwrt.cn
http://XhM333wZ.dzwrt.cn
http://d2CeJTWS.dzwrt.cn
http://fpA0XySg.dzwrt.cn
http://Sb1LG2hD.dzwrt.cn
http://AhkY24So.dzwrt.cn
http://Sk4X3F4n.dzwrt.cn
http://oYeJTUjY.dzwrt.cn
http://www.dtcms.com/a/369706.html

相关文章:

  • 掌握RabbitMQ核心战法:从消息确认到高可用集群
  • C++数据结构命名:从规范到艺术的深度解析
  • 前后端国密加密传输用户密码流程
  • [2025.9.5]Win11.26H2.27934.1 IoT 金丝雀轻度精简优化版 PIIS出品
  • 无名信号量
  • IPD变革,是中国企业实现产品与技术领先之路
  • 在Windows中已经启动的容器(比如xinference),如何设置让其在每次Docker启动时能自动启动
  • 支付DDD建模
  • Nginx 配置详解与虚拟主机实战指南
  • 驱动员工的核心:少谈“大道理”,多解“人心”
  • 【LLM】使用 Transformer 强化学习的 GRPO
  • 【代码随想录算法训练营——Day3】链表——203.移除链表元素、707.设计链表、206.反转链表
  • 目标检测双雄:一阶段与二阶段检测器全解析
  • 2025高教社数学建模国赛C题 - NIPT的时点选择与胎儿的异常判定(完整参考论文)
  • keil 5 STM32工程介绍
  • C/C++包管理工具:Conan
  • 标注格式转换csv转xml
  • 错误是ModuleNotFoundError: No module named ‘pip‘解决“找不到 pip”
  • 文章采集发布帝国ECMS网站技巧
  • 创新、绿色、共赢:芬兰企业在华发展战略与案例解析(2025中芬建交75周年)
  • PAIN | 痛在你身,激活在我脑:原来后侧默认模式网络是‘感同身受’的神经开关
  • 【C++】Vector完全指南:动态数组高效使用
  • 状压 dp --- TSP 问题
  • 【数字孪生核心技术】什么是倾斜摄影?
  • 公共卫浴感应开关选红外还是雷达
  • 解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题
  • 计算机二级C语言操作题(填空、修改、设计题)——真题库(17)附解析答案
  • 上位机通信基础知识
  • Acrobat-2025.001.20643_Win中文_PDF编辑器_便携版安装教程
  • Java基础 9.5