IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> modbus协议教程 -> 正文阅读

[嵌入式]modbus协议教程

1、modbus协议简介

modbus是工业现场总线通信协议中应用较为成熟稳定的协议。理解起来也比较简单。modbus数据传输采用大端模式

1.1功能码简要说明

modbus定义了不同的功能码来操作不同类型的数据。具体如下:

序号功能码名称读写寄存器数据类型说明
10x01读线圈寄存器Rbit读输出开关量,每个bit代表一个信号。类比mcu的通用输出口
20x02读离散输入寄存器Rbit读输入开关量,每个bit代表一个信号。类比mcu的通用输入口
30x03读保持寄存器Ruint16读数据,每个数据是16位
40x04读输入寄存器Ruint16读输入数据,每个数据是16位,类比模拟量输入信号
50x05写单个线圈寄存器Wbit写输出开关量,每个bit代表一个信号。类比mcu的通用输出口
60x06写单个保持寄存器Wuint16写数据,每个数据是16位
70x0f写多个线圈寄存器Wbit写输出开关量,每个bit代表一个信号。类比mcu的通用输出口
80x10写多个保持寄存器Wuint16写数据,每个数据是16位

1.2线圈寄存器读写操作(读输出口状态,设置输出口状态)

1.2.1 读单个线圈寄存器(功能码0x01)

字节12345678
说明通信地址功能码数据高地址数据低地址数据长度高字节数据长度低字节CRC低字节CRC高字节
示例0x010x010x000x000x000x010xFD0xCA

数据地址:开始读取的首地址
数据长度:读取的长度,注意由于线圈寄存器的最小单位是bit,所以改长度对应的读取的bit数量,上面的例子中读取的是地址第一个线圈寄存器的值

如果线圈寄存器的值为1,则返回如下数据:

字节123455
说明通信地址功能码字节数数据0CRC低字节CRC高字节
示例0x010x010x010x010x900x48

1.2.2写单个线圈寄存器(功能码0x05)

将单个线圈寄存器写1,注意写1要发送0xff 0x00

字节12345678
说明通信地址功能码数据高地址数据低地址数据长度高字节数据长度低字节CRC低字节CRC高字节
寄存器置10x010x050x000x000xFF0x000x8C0x3A

返回数据为发送的数据:
01 05 00 00 FF 00 8C 3A

将单个线圈寄存器写0,注意写0要发送0x00 0x00

字节12345678
说明通信地址功能码数据高地址数据低地址数据长度高字节数据长度低字节CRC低字节CRC高字节
寄存器置00x010x050x000x000x000x000xCD0xCA

返回的数据为发送的数据:
01 05 00 00 00 00 CD CA

1.2.3读多个线圈寄存器(功能码0x01)

读取两个线圈寄存器,假如线圈寄存器1值为1,线圈寄存器2值为1则,

01 01 00 00 00 02 BD CB
数据返回
01 01 01 03 11 89

返回的值为3,3的2进制表述为11b

1.2.4写多个线圈寄存器(功能码0x0F)

字节12345678910
说明通信地址功能码数据高地址数据低地址线圈数量高字节线圈数量低字节字节数量数据CRC低字节CRC高字节
示例0x010x0F0x000x000x000x020x010x030x9E0x96

上面的例子是将第一和第二个线圈写入1。0x03的二进制为11b。
返回的数据格式如下:

字节123456910
说明通信地址功能码数据高地址数据低地址线圈数量高字节线圈数量低字节CRC低字节CRC高字节
示例0x010x0F0x000x000x000x020xD40x0A

注意,当写入的线圈数量不大于8则字节数量为1,数据为1个字节。如果长度超过8,则字节数量为2,字节8对应1-8线圈的值,字节9对应线圈9-16的值,字节10和11为crc

1.3读输入离散输入寄存器(功能码0x02)

字节12345678
说明通信地址功能码数据高地址数据低地址读取数量高字节读取数量低字节CRC低字节CRC高字节
示例0x010x020x000x000x000x040xFD0xCA

上面读取了4个离散输入寄存器的值,假如4个寄存器的值为0101b,则返回数据如下:

字节123478
说明通信地址功能码字节数量数据CRC低字节CRC高字节
示例0x010x020x010x050x610x8b

其中的每个bit代表io口的输入值。

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

输入寄存器读取的是类似模拟量的数据,每个数据占16bit。而离散输入寄存器每个bit占1个bit,这是这两者的区别。

字节12345678
说明通信地址功能码数据高地址数据低地址读取数量高字节读取数量低字节CRC低字节CRC高字节
示例0x010x040x000x000x000x010x900x0a

上面读取了1个输入寄存器值,假如寄存器的值为0x1000,从机的返回如下:

字节123478
说明通信地址功能码字节数量寄存器数据高字节寄存器数据低字节CRC低字节CRC高字节
示例0x010x040x020x100x000xb40xf0

读取4个输入寄存器如下:
01 04 00 00 00 04 F1 C9
返回数据
01 04 08 10 00 10 01 10 02 10 03 F2 90
返回的数据长度:8字节
第一个寄存器值:0x1000
第二个寄存器值:0x1001
第三个寄存器值:0x1002
第四个寄存器值:0x1003

1.5 保持寄存器读写操作

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

字节12345678
说明通信地址功能码寄存器高地址寄存器低地址读取数量高字节读取数量低字节CRC低字节CRC高字节
示例0x010x030x000x000x000x020xc40x0b

上面读取了两个寄存器的值,假如第一个寄存器值0x147b,第二个寄存器值0x3f8e,则从机的返回数据如下:

字节12347891011
说明通信地址功能码字节数量第一个寄存器数据高字节第一个寄存器数据低字节第二个寄存器数据高字节第二个寄存器数据低字节CRC低字节CRC高字节
示例0x010x030x040x140x7b0x3F0x8E0x1E0x4E

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

字节12345678
说明通信地址功能码寄存器高地址寄存器低地址写入值高字节写入值低字节CRC低字节CRC高字节
示例0x010x060x000x000x000x020x080x0b

如果写入成功:则返回发送下去的值
01 06 00 00 00 02 08 0B
这样就成功将第一个寄存器的值写为0x0002

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

字节12345678910111213
说明通信地址功能码寄存器高地址寄存器低地址寄存器数量高字节寄存器数量低字节写入字节数第一个寄存器值高字节第一个寄存器值低字节第二个寄存器值高字节第二个寄存器值低字节CRC低字节CRC高字节
示例0x010x100x000x000x000x020x040x000x010x000x020x230xae

如果写入正常则从机的返回值如下:

字节123456910
说明通信地址功能码数据高地址数据低地址线圈数量高字节线圈数量低字节CRC低字节CRC高字节
示例0x010x100x000x000x000x020x410xc8

这样就正常将第一个寄存器写入0x0001,第二个寄存器写入0x0002

1.6 错误反馈

如果发送的命令有问题,则会返回错误帧,如果是crc错误,从机是不会返回任何数据。从机返回错误的格式如下:

字节123910
说明地址码功能码错误码CRC低字节CRC高字节
示例0x010x80+功能码0x00

常见错误码

错误码名称说明
0x01非法功能码不支持该功能码操作寄存器
0x02非法的寄存器地址设备没有该地址
0x03非法的数据数据格式不对
0x04从机故障从机工作不正常

发送:01 06 00 00 01 02 04 00 01 00 02
返回:01 86 03 02 61
错误码为3,说明数据格式错误。上面的数据应该是写多个寄存器0x10,但功能码是写单个寄存器0x06,所有导致错误。

发送:01 16 00 00 01 02 04 00 01 00 02 D3 71
返回:01 96 01 8E 60
错误码为1,说明功能码不对,没有0x16功能码

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:33:13  更:2022-09-13 11:33:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:29:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码