Modbus RTU

此专栏一共6篇文章

Modbus Poll 软件安装-CSDN博客

Modbus Slave 软件安装-CSDN博客

Modbus Poll 、Modbus Slave 软件使用-CSDN博客

Modbus RTU-CSDN博客

Modbus RTU主机代码实现——STM32-CSDN博客

Modbus RTU 从机代码实现——STM32-CSDN博客

什么是Modbus协议

是一种主从,串行通信协议

对应7OSI模型的数据链路层与应用层

其中字符帧格式,报文帧格式——数据链路层

功能码——应用层

Modbus协议分类

Modbus RTU

(Remote Terminal Unit)

使用二进制码进行数据传输,效率高

Modbus ASCII

使用ASCII码进行数据传输,可读性好,但效率低

Modbus TCP/IP

它将Modbus协议封装在TCP/IP协议栈中,通过以太网传输数据

Modbus UDP/IP

Modbus RTU的个人理解

Modbus定义了一块内存,及四种数据类型

这个内存分为四片空间用于存放四种数据类型

每个数据所在的空间称为寄存器,每类寄存器有65536个(至于寄存器内存放数据的含义则由用户自定义)

对各类寄存器统一编址——16位地址(0x0000 -- 0xFFFF)(有四类)

 

每个从机都有这样一块统一编址的内存空间

 

Modbus通信就是主机对从机寄存器的读写操作

但并非只有主机可以对从机寄存器进行读写操作,从机也可以对自己寄存器进行读写操作

主从

串行通信总线上只有一个主机,其余全是从机(最多247个)

每次通信都是主机发起,从机不能主动发起,(主机询问,从机应答)

从机寻址方式

主机没有地址,每个从机有唯一ID(0--247)

每次主设备发起通信所发送的报文中都包含从机ID

从机根据报文内ID与自己ID来决定是否响应

从机地址

modbus支持0--255从机寻址,但是只允许挂247个从机

0

1--247

248--255

广播

从机地址

保留

Modbus RTU 两种通信模式

广播

从机ID为0

只写

对所有从机进行写操作

主机请求,从机不响应

单播

从机ID为1--247

读/写

对指定从机进行读/写操作

主机请求,从机响应

Modbus RTU 数据类型

modbus传输的数据都是寄存器内的数据,寄存器是统一编址的

具体每个寄存器保存什么数据由用户自己定义

地址前缀

地址范围

0--65535

0x0000--0xFFFF

寄存器名称

寄存器数据类型

访问类型

0

0x00000--0x0FFFF

线圈

Coils

bool

读/写

1

0x10000--0x1FFFF

离散输入

Discrete Input

bool

只读

2

0x20000--0x2FFFF

输入寄存器

Input Register

uint16

只读

3

0x30000--0x3FFFF

保持寄存器

Holding Register

uint16

读/写

Modbus RTU 功能码与异常码

功能码

Modbus功能码8bit,一共可以有256(0x00--0xFF)个功能码

其中分为公共功能码与自定义功能码

(其实可以全自定义,公共功能码只是被广泛认同使用的功能码)

Modbus常用公共功能码及使用方法

线圈

01

0x01

读多个线圈

Tx:09 01 00 00 00 09 FD 44

Rx:09 01 02 0F 01 9C 0D

05

0x05

写单个线圈

Tx:09 05 00 00 FF 00 8D 72

Rx:09 05 00 00 FF 00 8D 72

15

0x0F

写多个线圈

Tx:09 0F 00 00 00 09 02 0F 01 46 8C

Rx:09 0F 00 00 00 09 94 85

离散输入

02

0x02

读多个离散输入

Tx:09 02 00 00 00 09 B9 44

Rx:09 02 02 0F 01 9C 49

输入寄存器

04

0x04

读多个输入寄存器

Tx:09 04 00 02 00 04 51 41

Rx:09 04 08 00 02 00 03 00 04 00 05 E8 6F

保持寄存器

03

0x03

读多个保持寄存器

Tx:09 03 00 02 00 04 E4 81

Rx:09 03 08 00 02 00 03 00 04 00 05 59 B5

06

0x06

写单个保持寄存器

Tx:09 06 00 02 00 00 29 42

Rx:09 06 00 02 00 00 29 42

16

0x10

写多个保持寄存器

Tx:09 10 00 02 00 04 08 00 02 00 03 00 04 00 05 A1 B9

Rx:09 10 00 02 00 04 61 42

错误码与异常码

错误码

错误码 = 功能码 | 0x80

异常码

01

0x01

非法功能码

02

0x02

非法寄存器地址

03

0x03

非法数据值

04

0x04

从机故障

05

0x05

从设备忙,无法立即响应请求

10

0x0A

通讯超时

Modbus RTU 报文帧格式

主机请求

从机ID

功能码

数据

CRC校验

8bit

8bit

N * 8bit

16bit

从机响应

从机ID

功能码

数据

CRC校验

8bit

8bit

N * 8bit

16bit

从机异常

从机ID

错误码

异常码

CRC校验

8bit

8bit

 8bit

16bit

一条报文最长256字节

对于16bit数据,要先发高字节,再发低字节

但是CRC校验码一般先发低字节,再发高字节(自己定义,只要主从一致即可)

T1.5与T3.5

Modbus RTU规定

T1.5

一个报文帧内,相邻字符时间间隔不得大于1.5个字符时间

用的不多,基本都能满足

T3.5

两个不同报文帧之间时间间隔要大于3.5个字符时间

用于判断一个报文帧的结束

 

//波特率115200   T3.5 = 1000000/115200*(1+8+0+1)*3.5 = 303us

//波特率115200   T3.5 = 1000000/115200*(1+8+1+1)*3.5 = 334us

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值