MODBUS常用功能码学习及实例

Modbus,看这个就行了 Modbus基础知识概念 Modbus通信协议由Modicon公司(现在的施耐德电气Schneider Electric)于1979年为可编程逻辑控制(即PLC)通信而发表。目前,Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus作为目前工业领域应用最广泛的协议,与其他通信协议相比,有以下特点: Modbus协议标准开放、公开发表且无版权要求。 Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以... 阅读详情
AI摘要

本文详细介绍了Modbus协议中常见的功能码及其应用场景,并通过实例演示了如何使用这些功能码进行数据读写操作。

Modbus常用功能码学习及实例

一.MODBUS寄存器种类说明

虽然MODBUS支持诸多功能码,但其中只涉及到四种寄存器:线圈寄存器、离散输入寄存器、保持寄存器、输入寄存器。
只要搞清楚寄存器的本质和功能码的联系,其实理解功能码就很简单。

寄存器种类读写状态位操作字操作适用功能码
线圈寄存器读/写位01H(读); 05H(写单个位); 0FH(写多个位)
离散输入寄存器只读位02H
保持寄存器读/写字03H(读); 06H(写单个字节); 0FH(写多个字节)
输入寄存器只读字04H

线圈寄存器:可以类比为开关量,每个bit都对应一个信号的开关状态。所以一个字节可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,比如控制或者读取电磁阀的开关志状态。对应的功能码有:0x01 0x05 0x0f

离散输入寄存器:离散输入寄存器相当于线圈寄存器的只读模式,每个bit表示一个开关量,而他的开关量只能读取,不能够写入。只能通过外部设定改变输入状态,比如我可以读取外部按键的按下还是松开,但是控制不了按键。对应的功能码有:0x02

保持寄存器:寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。比如我不到那可以读取传感器报警上限下限,也可以设置它的大小。对应的功能码有:0x03 0x06 0x10

输入寄存器:输入寄存器相当于保持寄存器的只读模式,也是只支持读而不能写。一个寄存器也是占据两个字节的空间。比如通过读取输入寄存器获取现在的模拟量采样值。对应的功能码有 0x04

二.MODBUS部分功能码

MODBUS支持很多功能码,但是在实际应用的时候常用的也就那么几个。

上面介绍了Modbus的四个寄存器种类:线圈寄存器、离散输入寄存器、保持寄存器、输入寄存器,从寄存器角度理解了对应功能码。下面列出常用功能码,具体如下:

功能码名称数据类型作用
0x01读线圈寄存器位取得一组逻辑线圈的当前状态(ON/OFF )
0x02读离散输入寄存器位取得一组开关输入的当前状态(ON/OFF )
0x03读保持寄存器整型、浮点型、字符型在一个或多个保持寄存器中取得当前的二进制值
0x04读输入寄存器整型、浮点型在一个或多个输入寄存器中取得当前的二进制值
0x05写单个线圈寄存器位强置一个逻辑线圈的通断状态
0x06写单个保持寄存器整型、浮点型、字符型把具体二进值装入一个保持寄存器
0x0f写多个线圈寄存器位强置一串连续逻辑线圈的通断
0x10写多个保持寄存器整型、浮点型、字符型把具体的二进制值装入一串连续的保持寄存器

三.MODBUS功能码实例

1.功能码:01H 读线圈寄存器

1)功能:读从站线圈寄存器,位操作,可读单个或者多个
2)主机发送指令:
主机发送数据包括:从站地址+功能码+寄存器起始地址+寄存器数量+校验码
假设从站地址为0x01,线圈寄存器开始地址0x0021,结束地址0x002c,即寄存器地址范围为:0x0021~0x002c,总共读取12个连续线圈的状态值,则主机发送指令如下图所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数低8位CRC校验低8位CRC校验高8位
0x010x010x000x210x000x0c0xXX0xXX

3)从站响应返回:
从站响应返回数据包括:从站地址+功能码+返回字节数+数据值+校验码
其中,返回数据值的每一位对应线圈状态,线圈状态为ON时,其值为1;状态为OFF时,其值为0;
【数据以小端的形式进行存储,即最低有效位存放于内存最低位地址(位于二进制的右侧)。每8个位组成一个字节,当线圈的数量不是8的倍数时,剩余的位数添0补位。】

从站地址功能码返回字节数data1data2CRC校验低8位CRC校验高8位
0x010x010x020xCB0x0B0xXX0xXX

本例中读取12个线圈,12/8商1余4,因此需要2个字节存放应答数据,返回字节数为2。
字节1存放线圈编号21~28的数值(小端字节序,线圈28的值存放在bit7,线圈21的值存放在bit0);
字节2存放线圈编号29~32的数值,剩余位数添0补位;

上表中data1表示0x0021-0x0028的线圈状态,data1的最低位代表最低地址的线圈状态;
data1:0xCB=1100 1011,则data1线圈状态如下表所示:

线圈地址0x280x270x260x250x240x230x220x21
数值11001011

data2表示地址0x0030-0x0038的线圈状态,不够8位,字节高位填充为0。
data2:0x0B=0000 1011,则data2线圈状态如下表所示:

线圈地址0x300x2f0x2e0x2d0x2c0x2b0x2a0x29
数值00001011

2.功能码:02H 读离散输入寄存器

1)功能:读离散输入寄存器,位操作,可读单个或多个,类似功能码0X01,此处省略;

3.功能码:03H 读保持寄存器

1)功能:读从站保持寄存器,字节操作,可读单个或者多个;每个保持寄存器占2个字节(16位);
2)主机发送指令:
主机发送数据包括:从站地址+功能码+寄存器起始地址+寄存器数量+校验码
假设从站地址为0x03,保持寄存器开始地址为0x003B,结束地址0x003D,即寄存器地址范围为:0x003B~0x003D,总共读取3个保持寄存器的数据,则主机发送指令如下图所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数量低8位CRC校验低8位CRC校验高8位
0x030x030x000x3B0x000x030xXX0xXX

3)从站响应返回:
从站响应返回数据包括:从站地址+功能码+返回字节数+数据值+校验码

从站地址功能码返回字节数data1Hdata1Ldata2Hdata2Ldata3Hdata3LCRC校验低8位CRC校验高8位
0x030x030x060x1B0x0B0x0A0x010xC20xDB0xXX0xXX

本例中读取3个保持寄存器,每个保持寄存器占2个字节,因此需要6个字节存放应答数据,返回字节数为6。
0x003B~0x003D保持寄存器的数值如下图所示:

寄存器地址0x003D0x003C0x003A
数值0xC2 DB0x0A 010x1B 0B

4.功能码:04H 读输入寄存器

1)功能:读输入寄存器,字节操作,可读单个或多个,类似功能码0X03,此处省略;

5.功能码:05H 写单个线圈寄存器

1)功能:对单个线圈进行写操作,位操作,只能写一个。写入0xFF00表示将线圈置为ON,写入0x0000表示将线圈置为OFF,其它值无效;
2)主机发送指令:
主机发送数据包括:从站地址+功能码+寄存器起始地址+数据值+校验码
假设从站地址为0x03,线圈寄存器起始地址为0x0032,要将其设置为ON,则主机发送指令如下表所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位
0x030x050x000x320xff0x000xXX0xXX

3)从站响应返回:
从站应答数据包括:从站地址+功能码+寄存器地址+写入值+校验码
如果数据成功写入,则应答数据与请求数据一样,如下表所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位
0x030x050x000x320xff0x000xXX0xXX

6.功能码:06H 写单个保持寄存器|

1)功能:对单个保持寄存器进行写操作,字节操作,只能写一个。
2)主机发送指令:
主机发送数据包括:从站地址+功能码+寄存器起始地址+数据值+校验码
假设从站地址为0x01,线圈寄存器起始地址为0x0048,写入数值为0x1234,则主机发送指令如下表所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位
0x010x060x000x480x120x340xXX0xXX

3)从站响应返回:
从站应答数据包括:从站地址+功能码+寄存器地址+写入值+校验码
如果数据成功写入,则应答数据与请求数据一样。

MODBUS常用功能码 寄存器分为四种,如表1.1所示:表1.1 寄存器分类。 阅读详情

相关推荐

Modbus常用功能码说明

*离散输入寄存器:**离散输入寄存器相当于线圈寄存器的只读模式,每个bit表示一个开关量,而他的开关量只能读取,不能够写入。**保持寄存器:**寄存器的单位是两个byte,也就是可以存放具体的数据量的,并且是可读写的。字节1存放线圈编号0x21~0x28的数值(小端字节序,线圈28的值存放在bit7,线圈21的值存放在bit0);data2表示地址0x0029~0x002c的线圈状态,不够8位,字节高位填充为0。1)功能:读离散输入寄存器,位操作,可读单个或多个,类似功能码0X01。

欧文的博客 4518

Modbus通讯协议常用功能码解释

Modbus通讯协议功能码解释

li707414287的博客 3万+

Modbus功能码

Modbus主要功能码

lakerszhy的专栏 3万+

ModbusRTU的几种常用功能码介绍及使用

ModbusRTU几种常用功能码解析,ModbusCRC16校验算法

u013763970的博客 6万+

modbus rtu功能码理解

声明:此内容转自http://www.elecfans.com/d/631762.html。 1 功能码“02”:读1路或多路开关量状态输入 例如:主机要读取地址为01,开关量DI1—DI4的输入状态。 从机(PDM)数据寄存器的地址和数据为: 主机发送的报文格式: 从机(PDM)响应返回的报文格式: 2 功能码“01”:读1路或多路开关量输出状态 例如:主机要读取地址为01,开关量DO1,DO2的输出状态。 从机(PDM)数据寄存器的地址和数据为: 主机发送的报文格.

红萝卜 1万+

modbus功能码04实例_Modbus通讯编程实例

Modbus通讯编程实例(一)最近单独在写Modbus和现场总线的介绍,都是一些思路性质的介绍,不涉及具体的实例,可能很多童鞋还是觉得不够具体,因为我现在不做具体的编程调试了,所以直接些实例很费劲。参考了一些网上的和施耐德电气内部的资料,写成以下的案例,用了一些其他人的劳动成果,如果原作者在意版权问题,请联系我,我尊重您的所有权。我的帖子里提过Modbus的功能码,常用的没几个,这里列出更多的(也...

weixin_39649660的博客 1795

Modbus功能码详解

Modbus功能码详解

ttcet的博客 2万+

贰:Modbus常用功能码协议详解

01H-读线圈状态1)描述:读从机线圈寄存器,位操作,可读单个或者多个; 2)发送指令: 假设从机地址位0x01,寄存器开始地址0x0023,寄存器结束抵制0x0038,总共读取21个线圈。协议图如下:3)响应: 返回数据的每一位对应线圈状态,1-ON,0-OFF,如下图; 上表中data1表示0x0023-0x002a的线圈状态,data1的最低位代表最低地址的线圈状态,可以理解为小端模式

2万+

MODBUS常用功能码学习及实例 modbus报文格式

离散输入寄存器相当于线圈寄存器的只读模式,每个bit表示一个开关量,而他的开关量只能读取,不能够写入。:寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。上面介绍了Modbus的四个寄存器种类:线圈寄存器、离散输入寄存器、保持寄存器、输入寄存器,从寄存器角度理解了对应功能码。本例中读取3个保持寄存器,每个保持寄存器占2个字节,因此需要6个字节存放应答数据,返回字节数为6。1)功能:读离散输入寄存器,位操作,可读单个或多个,类似功能码0X01,此处省略;

chentiebo的博客 5013

Modbus功能码详细讲解

用户自定义功能码是指设备制造商或系统集成商为满足特定需求而定义的功能码。Modbus 协议本身允许用户扩展功能码,使用特定范围的功能码来实现自定义操作。这些功能码的范围通常在 0x80 到 0xFF 之间,因此它们被分配给特定的厂商或应用。功能:用户可以根据实际应用场景定义新的功能码,进行特殊的数据操作或控制功能。比如,某些设备可能需要一个特殊的读取或写入命令来进行设备配置或状态查询。格式:自定义功能码通常遵循与标准功能码相似的格式,但其具体的操作内容和响应格式由用户或厂商决定。公共功能码。

m0_49476241的博客 4151

modbus寄存器、功能码、报文结构解析

Modbus是一种主/从通讯模式。主站在Modbus网络上没有地址,从站的地址范围为0-247,其中0为广播地址,从站的实际地址范围为1-247。

码灵的博客 2万+

RS-485软件层协议之Modbus-RTU

Modbus-RTU是一种比较简单、可靠的协议,本文梳理了一下标准中一些常用的功能码,并举例介绍了具体使用方法。

掌芯元器 4347

Avalonia v11实战:手把手教你从零创建第一个跨平台桌面App(含设计器不显示的解决方案)

本文详细介绍了如何使用Avalonia v11从零开始创建跨平台桌面应用,包括环境准备、项目创建、界面设计及常见问题解决方案。特别针对设计器不显示等常见问题提供了实用解决方法,帮助.NET开发者快速掌握这一强大的UI框架,实现Windows、macOS和Linux多平台应用开发。

weixin_30417487的博客 163

MODBUS RTU协议原理及功能码解析

modbus是OSI模型第七层上的应用层报文传输协议。 modbus是一个请求/应答协议。并规定了相关的功能码。 modbus功能码是modbus请求应答PDU的元素

专注嵌入式软硬件开发。 3万+

手把手教你用C#和LibUsbDotNet实现USB设备通信(含完整代码示例)

本文详细介绍了如何使用C#和LibUsbDotNet库实现USB设备通信,包括设备识别、连接建立、同步/异步数据读写等核心操作。通过完整的代码示例,开发者可以快速掌握USB通信的关键技术,适用于工业自动化、医疗设备等多种场景。重点讲解了数据读写优化和错误处理技巧,帮助提升通信效率和可靠性。

a3b4c5的博客 703

整理 钢琴 铃木钢琴教程(铃木)

铃木钢琴 超清PDF

TS的博客 1210

Modbus 协议学习笔记及常用功能码详解

下面的MODBUS 协议的相关知识 是自己在网上搬运的 以便以后自己查看 01.寄存器分类 Modbus寄存器分为四种,如下表所示: 线圈寄存器:实际上可以表示一个开关量,线圈操作位(bit)一个bit对应一个开关信号,即(0/false,1/true),每个byte字节就能代表8个的位的开关信号,线圈寄存器支持读和写,Modbus的功能码又能对线圈的单个或多个进行一个读取写入操作,其实就是在操作字节的位。实对应上面的功能码也就是:0x01 0x05 0x0f 离散输入寄存器:离散输入寄存器..

位文杰的博客 3万+

路径跟踪 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

纯追踪算法(Pure Pursuit)参考了人类驾驶行为,其基本思想是在待跟踪路径上设置预瞄点(goal-ahead),通过简单的几何方法驱动机器人跟踪预瞄点直至抵达目标位置.本文详细推导纯追踪算法的理论原理及其变种——自适应纯追踪算法(APP)和规范化纯追踪算法(RPP),并提供ROS C++/Python/Matlab三种仿真实现加深理解

FRIGIDWINTER的博客 8405

MODBUS RTU/TCP协议及常用功能码详解

一、简介 ModBus是Modicon公司为其PLC通讯而开发的一种通讯协议。如今Modicon公司已经被施耐德收购成为了施耐德旗下品牌。从1979年问世至今,已经成为工业通讯领域的业界标准。 ModBus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。通信双方必须同时支持上述模式中的一种。 MODBUS寄存器分类 寄存器种类 读写状态 数据类型 功能码 PLC地址 线圈寄存器 读/写 位(bit)

qq_43254236的博客 4万+

基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案

最小 MVP:本地知识库 + Doubao Embedding + 简单检索。工具化:把检索/写入/系统功能通过 MCP 封装。Agent 编排:RAG 流程 + 自检 + 引用输出。这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。

lpfasd123的博客 1095

C++(Qt)软件调试---内存分析工具Heob(26)

绝对最全面最详细的Heob使用说明。(图文并茂) 绝大部分的文章都说Heob是一个内存泄漏分析工具,其实Heob只是内存泄漏分析功能比较突出,实际上Heob可以分析很多内存问题。 Heob是一个Windows下检测缓冲区溢出(野指针、空指针、内存越界、重复释放、异常捕获等)和内存泄漏的工具,集成到Qt Creator中,功能强大,简单容易上手。

mahuifa的博客 4311
上一篇: DTU网关连接MQTT服务器、MQTT.fx工具测试
下一篇: 串口通信基础(一)——串行与并行通信,同步与异步通信
Steven邵
博客等级 码龄6年 381粉丝 24原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值