分享

Modbus介绍与协议解析

 工控自动化交流 2020-06-07

一、Modbus介绍

Modbus是一种通讯协议,主要应用于电子控制器上的一种通用语言。Modbus支持多种电气接口,如RS232、RS485、TCP/IP等。多数Modbus设备通信是通过串口或TCP/IP进行连接。

通常情况下 Modbus是主从架构,即通信节点是Master,其它使用Modbus协议参与通信的是slave节点(最多247个,地址范围为1-247,0节点是广播地址)。每个slave设备都具有一个唯一的地址。总线上只能有一个Master节点。

Modbus介绍与协议解析

请求流程

​​​Modbus传输模式可分为 ASCII和RTU两种模式,同一网络中所有设备必须保持统一,要么是ASCII,要么统一为RTU模式,两者不可共存。相对来说RTU模式传输效率较高,

ASCII模式下,消息以冒号字符开始,以回车换行字符结束。

RTU模式下,消息发送和接收至少间隔3.5字符时间的停顿间隔作为标志。

Modbus寄存器介绍

所有数据都存在寄存器中,寄存器可指物理寄存器,也可是一块内存区域。Modbus根据数据类型及各自读写特性,将寄存器分为了4个部分,分别如下。

Modbus介绍与协议解析

寄存器介绍

Modbus地址、功能码、数据域介绍

Modbus消息帧的地址,在ASCII模式下包含2个字符,在RTU模式下包含1个字符。单个设备地址实际范围是在1-247值之间。0为广播地址、248-255为保留地址。

功能码由1个字节构成,因此取值范围1-255。常用功能码如下:

01:读线圈状态

02:读输入状态

03:读保持寄存器

04:读输入寄存器

05:强制单线圈

06:预制单寄存器

15:强制多线圈

17:报告从设备ID

22:屏蔽写寄存器

23:读/写寄存器

数据内容与功能码紧密相关,存放功能码需要操作的具体数据,数据域以字节为单位,长度可变,对于有些功能码此域可为空。

二、Modbus协议解析

ModbusTCP通常使用端口502作为接收报文端口。

ModbusTCP包含一个应用报文头,该头占用7个字节。Modbus TCP/IP协议最大数据帧长度为260字节。

Modbus介绍与协议解析

ModbusTCP报文

传输标识:Transaction Identifier。占用2个字节。标记某个Modbus 查询/应答的传输过程,可设置为0,每次通讯+1;由客户端生成(主站设备),应答时复制该值。

协议标识:Protocol Identifier。占用2个字节。 Modbus协议为 0x00。由客户端生成,应答时复制该值。

字节长度:Length。占用2个字节。高4位为设置为0X00,因此后续字节必须在256个字节内;第四位记录后续的字节个数;由客户端生成(主站设备),应答时重新生成。

单位标识符:Unit Identifier。占用1个字节。用以识别从机设备。由客户端生成,应答时复制该值。

0x01 读取线圈输出状态

下图为query请求报文,Modbus传输内容为 “05 91 00 00 00 06 ff 01 00 00 00 0a”。

Modbus介绍与协议解析

01-请求报文

05 91(十六进制) 为传输标识,即1425(十进制);

00 00为协议标识;

00 06为字节长度;

ff为单位标识符,即255(十进制);

01为功能码,占1个字节;

00 为Modbus起始地址高位;

00 为Modbus起始地址低位;

00 为寄存器高位;

0a为寄存器低位。

下图为query后的响应报文,Modbus传输内容为 “05 91 00 00 00 05 ff 01 02 01 00”。

Modbus介绍与协议解析

01-响应报文

​05 91(十六进制) 为传输标识,即1425(十进制);

00 00为协议标识;

00 05为字节长度;

ff为单位标识符,即255(十进制);

01为功能码,占1个字节;

02为数据域字节数;

01 00 为数据字段。响应报文的数据字段中,每个线圈占用1位(bit),01=0000 0001,00=0000 0000。1=ON,0=OFF。如果最后的数据字节不能填满8个线圈的状态(1个字节),则由0填充。

0x02 读取离散量输入值

下图为query请求报文,Modbus传输内容为 “05 92 00 00 00 06 ff 02 00 00 00 0b”。

Modbus介绍与协议解析

02-请求报文

​05 92(十六进制) 为传输标识,即1426(十进制);

00 00为协议标识;

00 06为字节长度;

ff为单位标识符,即255(十进制);

02为功能码;

00 为Modbus起始地址高位;

00 为Modbus起始地址低位;

00 为寄存器高位;

0b为寄存器低位。

下图为query后的响应报文,Modbus传输内容为 “05 92 00 00 00 05 ff 02 02 02 00”。

Modbus介绍与协议解析

02-响应报文

05 92(十六进制) 为传输标识,即1426(十进制);

00 00为协议标识;

00 06为字节长度;

ff为单位标识符,即255(十进制);

02为功能码;

02为数据域字节数

02 00 为数据字段。响应报文的数据字段中,每个线圈占用1位(bit),02=0000 00010,00=0000 0000。1=ON,0=OFF。如果最后的数据字节不能填满8个线圈的状态(1个字节),则由0填充。

0x04 读取输入寄存器值

下图为query请求报文,Modbus传输内容为 “07 45 00 00 00 06 ff 04 01 8f 00 02”。下图请求报文大体含义为:需读取输入寄存器地址30144-30145,共计2个寄存器内容。即读取Modbus协议地址143至144的内容。

Modbus介绍与协议解析

04-请求报文

07 45(十六进制) 为传输标识,即1861(十进制);

00 00为协议标识;

00 06为字节长度;

ff为单位标识符,即255(十进制);

04为功能码;

01 为Modbus起始地址高位;

8f 为Modbus起始地址低位,起始地址为143。

00 为寄存器高位;

02为寄存器低位,读取数量为2。

下图为query后的响应报文,Modbus传输内容为 “07 45 00 00 00 07 ff 04 04 b6 00 47 7f”。

Modbus介绍与协议解析

04-响应报文

07 45(十六进制) 为传输标识,即1861(十进制);

00 00为协议标识;

00 07为字节长度;

ff为单位标识符,即255(十进制);

04为功能码;

04为数据域字节数。

b6 00 47 7f为数据字段。响应报文的数据字段中,每个线圈占用1位(bit),b6=1011 0110,00=0000 0000,47=1000 0111,7f=1111111。1=ON,0=OFF。如果最后的数据字节不能填满8个线圈的状态(1个字节),则由0填充。

三、关于Modbus数据审计/防护

Modbus数据审计/防护其核心是对协议报文进行深度解码分析,记录其操作时间、地点、操作人、和操作行为等关键要素,依托操作行为数据的有效存储和行为管控,从而实现对Modbus系统的安全日志的审计分析及异常阻断,加强组织事中管控能力,事后回溯追查、分析研判的能力。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多