ModbusRTU的几种常用功能码介绍及使用
文章目录
- Modbus协议
- Modbus特点
- 本文重点:ModbusRTU的功能码使用(以下数据均使用16进制)
- 1、功能码01:读1路或多路开关量线圈输出状态
- 2、功能码02:读1路或多路开关量状态输入
- 3、功能码03:读多路寄存器
- 4、功能码05:写1路开关量输出
- 5、功能码06:写单路寄存器
- 6、功能码10:写多路寄存器
- 附:ModbusCRC16校验算法
Modbus协议
Modbus是OSI模型第七层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。
Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。
Modbus特点
Modbus具有以下几个特点:
(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。目前,支持Modbus的厂家超过400家,支持Modbus的产品超过600种。
(2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
(3)Modbus的帧格式简单、紧凑,通俗易懂,用户使用容易,厂商开发简单。
本文重点:ModbusRTU的功能码使用(以下数据均使用16进制)
1、功能码01:读1路或多路开关量线圈输出状态
例如:主机要读取地址为01,开关量DO1,DO2的输出状态。
从机(PDM)数据寄存器的地址和数据为:
起始地址 | DO寄存器数据 | 备注 |
---|---|---|
0000 | 02 | DO1输出状态为“0”,DO2输出状态为“1” |
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至设备地址为01的从机 |
功能码 | 1 | 01 | 读开关量输出状态 |
起始BIT位 | 2 | 0000 | 起始BIT位地址为 0000 |
读数据长度 | 2 | 0002 | 读取2路继电器线圈输出状态位 |
CRC校验码 | 2 | BDCB | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
从机(PDM)响应返回的报文格式:
从机响应 | 字节数 | 返回的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 来自从机 01 |
功能码 | 1 | 01 | 读开关量输出状态 |
数据长度 | 1 | 01 | 1个字节(8个BIT位) |
DO状态数据 | 1 | 02 | DO寄存器内容 |
CRC校验码 | 2 | D049 | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
2、功能码02:读1路或多路开关量状态输入
例如:主机要读取地址为01,开关量DI1—DI4的输入状态。
从机(PDM)数据寄存器的地址和数据为:
起始地址 | DI寄存器数据 | 备注 |
---|---|---|
0000 | 0B | DI1/DI2/DI3输入状态为“1”,DI3输入状态为“0” |
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至设备地址为01的从机 |
功能码 | 1 | 02 | 读开关量输入状态 |
起始BIT位 | 2 | 0000 | 起始BIT位地址为 0000 |
读数据长度 | 2 | 0004 | 读取4路开关量输入状态位 |
CRC校验码 | 2 | 79C9 | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
从机(PDM)响应返回的报文格式:
从机响应 | 字节数 | 返回的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 来自从机 01 |
功能码 | 1 | 02 | 读开关量输入状态 |
数据长度 | 1 | 01 | 1个字节(8个BIT位) |
DI状态数据 | 1 | 0B | DI寄存器内容 |
CRC校验码 | 2 | E04F | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
3、功能码03:读多路寄存器
例如:主机要读取地址为01,起始地址为0002的3个从机寄存器数据。
从机(PDM)数据寄存器的地址和数据为:
寄存器地址 | 寄存器数据 | 备注 |
---|---|---|
0002 | 1234 | 此寄存器里的数据为十进制4660 |
0003 | 1111 | 此寄存器里的数据为十进制4369 |
0004 | 2222 | 此寄存器里的数据为十进制8738 |
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至地址为01的从机 |
功能码 | 1 | 03 | 读取寄存器 |
起始地址 | 2 | 0002 | 起始地址为 0002 |
数据长度 | 3 | 0003 | 读取3个寄存器(3个字) |
CRC校验码 | 2 | A40B | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
从机(PDM)响应返回的报文格式:
从机响应 | 字节数 | 返回的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 来自从机 01 |
功能码 | 1 | 03 | 读取寄存器 |
读取字节 | 1 | 06 | 3个寄存器共6个字节 |
寄存器数据1 | 2 | 1234 | 地址为0002的寄存器的内容 |
寄存器数据2 | 2 | 1111 | 地址为0003的寄存器的内容 |
寄存器数据3 | 2 | 2222 | 地址为0004的寄存器的内容 |
CRC校验码 | 2 | 5E43 | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
4、功能码05:写1路开关量输出
例1:开关量输出点DO1,其当前状态为“分”,主机要控制该路继电器“合”。
控制命令为:
“FF00”为控制继电器“合”;
“0000”为控制继电器“分”;
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至地址为01的从机 |
功能码 | 1 | 05 | 写开关量输出状态 |
输出BIT位 | 2 | 0000 | 对应输出继电器BIT位(DO1) |
控制命令 | 2 | FF00 | 控制该路继电器输出为“合”状态位 |
CRC校验码 | 2 | 8C3A | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
从机(PDM)响应返回的报文格式:
与主机发送的报文格式及数据内容完全相同。
例2:开关量输出点DO2,其当前状态为“合”,主机要控制该路继电器“分”。
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至地址为01的从机 |
功能码 | 1 | 05 | 写开关量输出状态 |
输出BIT位 | 2 | 0001 | 对应输出继电器BIT位(DO2) |
控制命令 | 2 | 0000 | 控制该路继电器输出为“分”状态位 |
CRC校验码 | 2 | 9C0A | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
从机(PDM)响应返回的报文格式:
与主机发送的报文格式及数据内容完全相同。
5、功能码06:写单路寄存器
例如:主机要把数据1E34保存到地址为000B的从机寄存器中(从机设备地址为01),此数据将覆盖寄存器地址里原来的存储信息。
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至地址为01的从机 |
功能码 | 1 | 06 | 写单路寄存器 |
寄存器地址 | 2 | 000B | 要写入的寄存器地址 |
写入数据 | 2 | 1E34 | 写入的新数据 |
CRC校验码 | 2 | F07F | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
从机(PDM)响应返回的报文格式:
与主机发送的报文格式及数据内容完全相同。
6、功能码10:写多路寄存器
主机利用这个功能码把多个数据保存到PDM表的数据存储器中去。Modbus通讯规约中的寄存器指的是16位(2个字节或1个字),并且高位在前,低位在后。这样PDM的存储器都是2个字节。由于Modbus通讯规约允许每次最多保存60个寄存器,因此PDM一次也最多允许保存60个数据寄存器。
例如:主机要把数据2D7A、42B1、15E8保存到地址为002A、002B、002C的从机寄存器中去(从机设备地址为01)。
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 发送至地址为01的从机 |
功能码 | 1 | 10 | 写多路寄存器 |
寄存器地址 | 2 | 002A | 要写入的寄存器的起始地址 |
写入数据字长度 | 2 | 0003 | 写入数据的字长度(共3个字) |
字节计数 | 1 | 06 | 写入数据的字节长度(共6个字节) |
写入数据1 | 2 | 2D7A | 数据地址002A |
写入数据2 | 2 | 42B1 | 数据地址002B |
写入数据3 | 2 | 15E8 | 数据地址002C |
CRC校验码 | 2 | 52FC | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
从机(PDM)响应返回的报文格式:
从机响应 | 字节数 | 返回的信息 | 备注 |
---|---|---|---|
从机地址 | 1 | 01 | 来自从机01 |
功能码 | 1 | 10 | 写多路寄存器 |
起始地址 | 2 | 002A | 起始地址 |
数据字长度 | 2 | 0003 | 写入3个字长度 |
CRC校验码 | 2 | A1C0 | 由主机计算得到ModbusCRC16校验码,此校验码为2个字节,低字节在前,高字节在后 |
附:ModbusCRC16校验算法
/*
*********************************************************************************************************
* 函 数 名: ModbusCRC16
* 功能说明: 标准ModBusCRC16校验计算
* 形 参:buf:需要校验的数据 len:需要校验的数据长度
* 返 回 值: 校验码
*********************************************************************************************************
*/
unsigned short ModbusCRC16( unsigned char * aData, unsigned int aSize )
{unsigned short CRC_OUT=0XFFFF;unsigned int i,j;unsigned char crc_low,crc_high;for(i=0;i<aSize;i++){CRC_OUT^=aData[i];for(j=0;j<8;j++){if( (CRC_OUT&0x01)==0x01){CRC_OUT>>=1;CRC_OUT^=0XA001;}else{CRC_OUT>>=1;}}}//exchange high and low 8 bitcrc_low=(unsigned char)CRC_OUT;crc_high=(unsigned char)(CRC_OUT>>8);CRC_OUT=(unsigned int)((crc_low<<8)+crc_high);return CRC_OUT;
}
当然,我们也可以使用查表法来计算CRC校验码。
ModbusRTU的几种常用功能码介绍及使用相关推荐
- 工业计算机的那些接口,工业平板电脑几种常用接口介绍
随着 VGA 接口: VGA(Video Graphics Array)还有一个名称叫D-Sub.VGA接口共有15针,分成3排,每排5个孔,是显卡上应用最为广泛的接口类型,绝大多数显卡都带有此种接口 ...
- 详细介绍!Linux 上几种常用的文件传输方式
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 责编:乐乐 来源:https://dwz.cn/VWIHhsOw 昨天发布一篇Linux文章( ...
- 结合Scikit-learn介绍几种常用的特征选择方法
特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...
- python 卡方检验 特征选择_结合Scikit-learn介绍几种常用的特征选择方法
特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...
- 常用的几种卷积神经网络介绍
常用的几种卷积神经网络介绍 标签(空格分隔): 深度学习 这是一篇基础理论的博客,基本手法是抄.删.改.查,毕竟介绍这几个基础网络的博文也挺多的,就算是自己的一个笔记吧,以后忘了多看看.主要是想介绍下 ...
- php 登录安全认证,介绍几种常用的web安全认证方式
本文为大家介绍了五种常用的web安全认证方式,具有一定的参考价值,希望能对大家有所帮助. 1.Http Basic Auth 这是一种最古老的安全认证方式,这种方式就是简单的访问API的时候,带上访问 ...
- 干货:结合Scikit-learn介绍几种常用的特征选择方法
原文:http://dataunion.org/14072.html 作者:Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮 ...
- 用螺纹铣刀铣螺纹转速进给怎么设_机加工中最常用的几种钨钢铣刀刀具介绍
点击上方"机械设计一点通"关注我们,每天学习一个机械设计相关知识点 在机加工中最常用的几种铣刀你都知道吗? 首先呢,铣刀为多齿回转刀具,其每一个刀齿都相当于一把车刀固定在铣刀的回转 ...
- php redis type,redis中的几种常用基础对象介绍
一:前言 redis中有几种常用的基础对象,如string.hash.list.set.zset等,下面我们就来介绍下他们的底层实现数据结构与常见应用场景和特点. 二:redisobject 源码位置 ...
最新文章
- Git 2.25.0发布,支持部分clone、稀疏checkout
- 解决git本地仓库与远程仓库关联出现 failed to push some refs to git的问题
- linux下装php,Linux下安装php
- 文本文件如何在其他地方打开
- sql item_map
- 我看360与酷派的“爱情”之争
- 筛法求素数 素数打表
- vs2012搭建gtest环境
- Entity Framework 4 in Action读书笔记——第一章:数据访问重载:Entity Framework(2)...
- 携程编程大赛 (预赛第二场)第一题【剪刀石头布】
- 国科大高级人工智能6-GAN
- 职称计算机Word2003是考什么,2017年职称计算机考试word2003考点
- 大数据之-入门_大数据特点(4V)---大数据之hadoop工作笔记0003
- PaddleClas模型训练/评估:数据准备
- Linux系统下使用iftop结合iptables服务解决带宽被恶意请求的问题
- 使用JUnit-4.11报java.lang.NoClassDefFoundError:
- PROC文件及文件夹创建
- 【元胞自动机】基于matlab元胞自动机模拟小区车流量【含Matlab源码 358期】
- 2021年全球探针卡市场规模大约为158亿元(人民币),预计2028年将达到247亿元
- 马克飞象怎么转成html,马克飞象教程