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~0x0032,总共读取12个连续线圈的状态值,则主机发送指令如下图所示:

从站地址 功能码 寄存器起始地址高8位 寄存器起始地址低8位 寄存器数量高8位 寄存器数低8位 CRC校验低8位 CRC校验高8位
0x01 0x01 0x00 0x21 0x00 0x0c 0xXX 0xXX

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

从站地址 功能码 返回字节数 data1 data2 CRC校验低8位 CRC校验高8位
0x01 0x01 0x02 0xCB 0x0B 0xXX 0xXX

本例中读取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线圈状态如下表所示:

线圈地址 功能码 0x28 0x27 0x26 0x25 0x24 0x23 0x22 0x21
数值 0x01 1 1 0 0 1 0 1 1

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

线圈地址 功能码 0x30 0x2f 0x2e 0x2d 0x2c 0x2b 0x2a 0x29
数值 0x01 0 0 0 0 1 0 1 1

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

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

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

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

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

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

从站地址 功能码 返回字节数 data1H data1L data2H data2L data3H data3L CRC校验低8位 CRC校验高8位
0x03 0x03 0x06 0x1B 0x0B 0x0A 0x01 0xC2 0xDB 0xXX 0xXX

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

寄存器地址 0x003D 0x003C 0x003A
数值 0xC2 DB 0x0A 01 0x1B 0B

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

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

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

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

从站地址 功能码 寄存器起始地址高8位 寄存器起始地址低8位 dataH dataL CRC校验低8位 CRC校验高8位
0x03 0x05 0x00 0x32 0xff 0x00 0xXX 0xXX

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

从站地址 功能码 寄存器起始地址高8位 寄存器起始地址低8位 dataH dataL CRC校验低8位 CRC校验高8位
0x03 0x05 0x00 0x32 0xff 0x00 0xXX 0xXX

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

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

从站地址 功能码 寄存器起始地址高8位 寄存器起始地址低8位 dataH dataL CRC校验低8位 CRC校验高8位
0x01 0x06 0x00 0x48 0x12 0x34 0xXX 0xXX

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

MODBUS常用功能码学习及实例相关推荐

  1. MODBUS常用功能码

    1 简述 Modbus寄存器分为四种,如表1.1所示: 表1.1 寄存器分类 寄存器种类 数据类型 访问类型 功能码 PLC地址 寄存器地址 线圈寄存器 位 读写 01H 05H 0FH 00001- ...

  2. ModBus常用功能码和PLC地址位对应关系,踩坑

    功能码 描述 PLC地址位 寄存器地址位 位/字操作 操作数量 01H 读线圈寄存器 00001-09999 0000H-FFFFH 位操作 单个或多个 02H 读离散输入寄存器 10001-1999 ...

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

    下面的MODBUS 协议的相关知识 是自己在网上搬运的 以便以后自己查看 01. 寄存器分类 Modbus寄存器分为四种,如下表所示: 线圈寄存器:实际上可以表示一个开关量,线圈操作位(bit)一个b ...

  4. Modbus通信协议指令学习记录

    Modbus通信协议指令学习记录 Modbus协议版本 读取指令格式 Modbus RTU Modbus ASCII Modbus TCP 写入指令格式 Modbus RTU Modbus ASCII ...

  5. Modbus通信工具学习记录

    Modbus通信工具学习记录 Modbus通信方式 Serial Port Serial Port调试助手 虚拟Serial Port驱动 TCP TCP调试助手 Modbus模拟工具 Modbus ...

  6. 常用深度学习框——Caffe/TensorFlow / Keras/ PyTorch/MXNet

    常用深度学习框--Caffe/TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tensor ...

  7. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  8. mondb 常用命令学习记录

    mondb 常用命令学习记录 一.MongoDB 下载安装 MongoDB官网 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制 ...

  9. 【嵌入式】Modbus TCP功能码

    00. 目录 文章目录 00. 目录 01. 寄存器分类 02. 常用功能码 03. 读线圈寄存器(01H) 04. 读离散输入寄存器(02H) 05. 读保持寄存器(03H) 06. 读输入寄存器( ...

最新文章

  1. java 二分搜索获得大于目标数的第一位_遇到「最值问题」还在无脑动态规划?二分法考虑一下呗
  2. [Usaco2007 Jan]Telephone Lines架设电话线
  3. Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)
  4. 年轻人应该买房还是租房,我给你理性分析
  5. [转载] 学Python的笔记(在网上自学的总结)
  6. 【转】轻松记住大端小端的含义(附对大端和小端的解释)
  7. 1、pandas使用sort_values排序
  8. 20191115英文每日一句
  9. linux文件系统ext2\ext3\ext4\xfs详解
  10. grasshopper python_【转】精华教学 | GH_Cpython——将原生的 Python 与机器学习框架引入Grasshopper...
  11. Linux各个发行版镜像下载
  12. 财报前被香港证监会点名,富途内控再受拷问
  13. 不小心删了(或覆盖了)window系统变量的PATH的怎么办?
  14. IP根域名服务器以及域名服务器对国家安全的真正意义。
  15. 仿蜜蜂视频TV实现gridview选中放大,并且放大时弹出底部说明
  16. js moment.js 给定时间 获取自然月、周的时间轴
  17. Java对象结构与锁实现原理及MarkWord详解
  18. 新增A股热门概念行情—股票数据远程下载服务升级
  19. iPhone 4与iPad开发基础教程
  20. SSM集成支付宝(沙箱环境)

热门文章

  1. 三分钟理解三种基本进程状态
  2. 正经公司怎么谈区块链?
  3. 【Python脚本入门】01、基础知识
  4. 查看vue版本,cli版本,npm以及node版本
  5. linux系统桌面黑屏,Ubuntu10.04启动黑屏解决办法
  6. Qt中的套件提示no complier set in kit和no debugger,出现黄色感叹号问题解决(MSVC2017)
  7. 程序员编程艺术(算法卷):第一章、左旋转字符串
  8. Nginx源码分析1--------编写Nginx扩展模块
  9. 哈希算法SHA-256实现示例
  10. 怎样建网站赚钱企业建网站,网站建设的好处!