1. Modbus 协议简介

Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。

标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

      1.  在Modbus网络上转输

1异步串行通信。一般的介质有:RS-232,RS485,RS-422上,这也是工业上使用的最多的; 

2主从方式通信。一问一答.典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。

3、广播和单独通信。主设备与从设备单1)独通信:从设备返回一消息作为回应。2)广播,从设备不作任何回应

      1. 在其它类型网络上转输

 1、对等技术通信。在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。

   2主从方式通信。尽管网络通信方法是“对等”,Modbus协议仍提供了主从原则,设备发消息就是主设备,并期望从从设备得到回应。

    1. 两种传输方式(ASCII或RTU)
      1. ASCII或RTU内容

控制器能设置为两种传输模式(ASCII或RTU),设备必须支持RTU模式,ASCII只是可选。所以ASCII只做了解。

异步串行通信上,般的介质有:RS-232,RS485,RS-422,才会分 ASCII或RTU, 在其它网络上(象MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。

ASCII模式:字符数据,用字符表示十六进制数,如0xff 就是“FF”, 错误检测域LRC

RTU  模式:二进制数数据(十六进制0xff), 错误检测域 CRC

 

ASCII

地址

功能代码

数据数量

数据1

...

数据n

LRC高字节

LRC低字节

回车

换行

RTU

地址

功能代码

数据数量

数据1

...

数据n

CRC低字节

CRC高字节

 

 

 

      1. ASCII或RTU消息帧断帧方式

1、ASCII帧

 使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。

2、RTU帧

 使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。

整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。

 

    1. Modbus网络的协议帧
      1. 帧结构

1.信息帧结构

地址码

功能码

数据区

错误校验码

8位

8位

N × 8位

16位

  

最常用的功能码:

代码

含义

操作

03

读取数据

读取当前寄存器内一个或多个二进制值

06

重置单一寄存器

把设置的二进制值写入单一寄存器

0x10

重置多寄存器

把设置的二进制值写入多个寄存器

 

 

 

      1. 协议帧实例
        1. 查询(功能码0x03)

功能描述:

现在我是主机,我要查询从机地址为1的数据.

 

   

主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 12 34 B5 33

 

 

   


*发送数据解析*/
主机发送01 03 00 00 00 01 84 0A

01-地址
03-功能码,代表查询功能,其他功能后面再说
00 00-代表查询的起始寄存器地址.说明从0x0000开始查询.
(
这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据;)
00 01-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的1个寄存器值;
84 0A-CRC

/*回复解析*/
从机回复01 03 02 12 34 B5 33


01-地址
03-功能码
02-代表后面数据的字节数,因为上面说到,一个寄存器有2个字节,所以后面的字节数肯定是2*查询的寄存器个数;
12 34-寄存器的值是12 34,结合发送的数据看出,01这个寄存器的值为12 34
B5 33-CRC

 

 

简便记忆:

基本流程就是:
发送:地址 + 我要查      +(寄存器起始地址+个数)+校验
回复:地址 +(回)我要查 +(数据的字节数+数据)  +校验

 

        1. 修改
  1. 修改单个寄存器(功能码0x06)

 

   

主机发送01 06 00 00 00 01 48 0A
从机回复01 06 00 00 00 01 48 0A  (成功修改)

 

 

   

*发送数据解析*/
主机发送01 06 00 00 00 01 48 0A
01-从机地址
06-功能码:修改单个寄存器功能,修改有些不同,有修改一个寄存器和修改多个寄存器;
00 00-修改的起始寄存器地址.说明从0x0000开始.
00 01-修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-CRC

/*回复解析*/
从机回复01 06 00 00 00 01 48 0A
01-从机地址
06-功能码:修改单个寄存器功能;
00 00-修改的起始寄存器地址.说明是0x0000.
00 01-修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-CRC

 

  1. 修改多个寄存器(功能码0x10

 

   

主机发送01 10 00 00 00 02 04 11 22 33 44 42 5A
从机回复01 10 00 00 00 02 41 C8

 

   

/*发送数据解析*/
主机发送01 10 00 00 00 02 04 11 22 33 44 42 5A
01-从机地址
10-功能码,代表修改多个寄存器功能;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
00 02代表修改的寄存器数量
04   -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;
11 22 33 44-表示修改的值,结合上面,就是从第0000寄存器开始修改2寄存器值为11 22 33 44,就是把0000寄存器改为11 22000133 44
 42 5A -循环冗余校验,modbus的校验公式,从首个字节开始到22前面为止;

/*回复解析*/
从机回复01 10 00 00 00 02 41 C8
01-从机地址
10-功能码
00 00-代表修改的起始寄存器地址.说明是0x0000.
00 02-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机修改了哪几个寄存器就足够了;
41 C8-循环冗余校验;

 

 

用修改0x10功能码修改1个寄存器:

   

主机发送01 10 00 00 00 01 02 11 22 2A 19
从机回复01 10 00 00 00 01 01 C9

 

   

/*发送数据解析*/
主机发送01 10 00 00 00 01 02 11 22 2A 19
01-从机地址
10-功能码,代表修改多个寄存器功能;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
00 01-代表修改的寄存器数量
02   -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;
11 22-表示修改的值,结合上面,就是从第0000寄存器开始修改一个寄存器值为11 22,就是把0000寄存器改为11 22
2A 19-循环冗余校验,modbus的校验公式,从首个字节开始到22前面为止;

/*回复解析*/
从机回复01 10 00 00 00 01 01 C9
01-从机地址
10-功能码
00 00-代表修改的起始寄存器地址.说明是0x0000.
00 01-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机修改了哪几个寄存器就足够了;
01 C9-循环冗余校验;

 

    1. 通信方式

Modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。

  • 主站请求:功能码+数据
  • 从站正常响应:请求功能码+响应数据
  • 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
  • 注意:需要超时管理机制,避免无期限的等待可能不出现的应答

IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。

通信过程

  1. connect 建立TCP连接
  2. 准备Modbus报文
  3. 使用send命令发送报文
  4. 在同一连接下等待应答
  5. 使用recv命令读取报文,完成一次数据交换
  6. 通信任务结束时,关闭TCP连接

 

    1. Modbus-TCP

以太网作为介质进行传输,

协议与modbus网络的区别:

modbus网络:

【Modbus 】Modbus 协议

以太网:

***+协议标志+后续数据长度+ 附加地址+功能码+数据

Modbus-PLUS

高速令牌传递网络

    1. Modbus所在传输层

 

【Modbus 】Modbus 协议

    1. 附录

表1 ModBus功能码

功能码

名称

作用

01

读取线圈状态

取得一组逻辑线圈的当前状态(ON/OFF)

02

读取输入状态

取得一组开关输入的当前状态(ON/OFF)

03

读取保持寄存器

在一个或多个保持寄存器中取得当前的二进制值

04

读取输入寄存器

在一个或多个输入寄存器中取得当前的二进制值

05

强置单线圈

强置一个逻辑线圈的通断状态

06

预置单寄存器

把具体二进值装入一个保持寄存器

07

读取异常状态

取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态

08

回送诊断校验

把诊断校验报文送从机,以对通信处理进行评鉴

09

编程(只用于484)

使主机模拟编程器作用,修改PC从机逻辑

10

控询(只用于484)

可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送

11

读取事件计数

可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时

12

读取通信事件记录

可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误

13

编程(184/384 484 584)

可使主机模拟编程器功能修改PC从机逻辑

14

探询(184/384 484 584)

可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送

15

强置多线圈

强置一串连续逻辑线圈的通断

16

预置多寄存器

把具体的二进制值装入一串连续的保持寄存器

17

报告从机标识

可使主机判断编址从机的类型及该从机运行指示灯的状态

18

(884和MICRO 84)

可使主机模拟编程功能,修改PC状态逻辑

19

重置通信链路

发生非可修改错误后,是从机复位于已知状态,可重置顺序字节

20

读取通用参数(584L)

显示扩展存储器文件中的数据信息

21

写入通用参数(584L)

把通用参数写入扩展存储文件,或修改之

22~64

保留作扩展功能备用

 

65~72

保留以备用户功能所用

留作用户功能的扩展编码

73~119

非法功能

 

120~127

保留

留作内部作用

128~255

保留

用于异常应答

 

参考:https://blog.csdn.net/panda5_csdn/article/details/94332166 Modbus协议解析--小白一看就懂的协议

          http://blog.sina.com.cn/s/blog_65ba9a5e0101df1g.html modbus 入门篇,不冗长,很好理解!

          https://blog.csdn.net/rxiang12/article/details/79125813 Modbus通讯协议详细解释

相关文章: