一、Modbus简介
1.概述
Modbus是一种通信协议,用于在工业自动化系统中实现设备之间的数据交换与通信,它定义了设备之间的通信规则、消息格式以及支持的功能码和数据类型。
2.硬件载体
Modbus通讯协议主要有三种形式:Modbus RTU、Modbus ASCII和Modbus TCP/IP。
- Modbus RTU: 基于二进制数据的串行通信方式,使用RS-232或RS-485等物理层接口。
- Modbus ASCII: 基于ASCII字符的串行通信方式,使用RS-232或RS-485等物理层接口。
- Modbus TCP/IP::基于TCP/IP协议的以太网通信方式,使用Ethernet或WiFi等物理层接口。
3.功能简介
Modbus提供了一些基础功能和数据类型。这些数据类型包括线圈(Coil)、输入离散量(Discrete Input)、保持寄存器(Holding Register)和输入寄存器(Input Register)。设备可以读取或写入这些数据类型,以实现对信号状态、参数设置和数据交换等操作。
二、协议内容
1.数据类型
Modbus提供了多种数据类型,常用的有以下几种:
- 线圈
数据类型为位/布尔类型。圈通常表示开关状态,可以是ON或OFF(TRUE或FALSE)。 - 离散量输入
数据类型为位/布尔类型数据。离散量输入表示一组离散的输入信号,其状态可以是ON或OFF(TRUE或FALSE)。 - 保持寄存器
数据类型为16位无符号整数。保持寄存器用于保存设备的控制参数、配置信息等。 - 输入寄存器
数据类型为16位无符号整数。输入寄存器用于保存设备的测量值、状态信息等。
2.功能码
Modbus提供了读写线圈状态、读取输入输入状态及输入寄存器、读写保持寄存器等多种功能码。
功能码 | 功能 | 介绍 |
---|---|---|
0x01 | 读取线圈状态 | 读取指定线圈的状态,返回一个或多个线圈的布尔值 |
0x02 | 读取输入离散量 | 读取指定输入离散量的状态,返回一个或多个输入信号的布尔值 |
0x03 | 读取保持寄存器 | 读取指定保持寄存器中的数据,返回一个或多个16位寄存器的值 |
0x04 | 读取输入寄存器 | 读取指定输入寄存器中的数据,返回一个或多个16位寄存器的值 |
0x05 | 写入单个线圈 | 设置指定线圈的状态,将一个线圈置为ON或OFF |
0x06 | 写入单个保持寄存器 | 写入指定保持寄存器中的数据,将一个16位寄存器设置为指定的值 |
0x15 | 写入多个线圈 | 设置连续线圈的状态,批量将多个线圈置为ON或OFF |
0x16 | 写入多个保持寄存器 | 写入连续保持寄存器中的数据,批量设置多个16位寄存器的值 |
3.数据帧结构
Modbus协议的数据帧结构根据不同的传输方式(RTU、ASCII、TCP/IP)略有差异。
Modbus RTU数据帧:
序号 | 名称 | 长度/字节 | 介绍 |
---|---|---|---|
1 | 起始符 | 1 | 一个字节的低电平信号,用于标识数据帧的开始 |
2 | 地 址 | 1 | 目标设备的地址 |
3 | 功能码 | 1 | 指定所需的操作类型 |
4 | 数 据 | * | 根据功能码需要传输的具体数据,长度可变 |
5 | CRC校验 | 2 | 循环冗余校验,用于验证数据的完整性 |
Modbus ASCII数据帧:
序号 | 名称 | 长度/ASCII字符 | 介绍 |
---|---|---|---|
1 | 起始符 | 1 | 冒号":",用于标识数据帧的开始 |
2 | 地 址 | 2 | 目标设备的地址 |
3 | 功能码 | 2 | 指定所需的操作类型 |
4 | 数 据 | * | 根据功能码需要传输的具体数据,长度可变,每个字节使用两个ASCII字符表示 |
5 | LRC校验 | 2 | 长奇偶校验,用于验证数据的完整性 |
Modbus TCP/IP数据帧:
序号 | 名称 | 长度/字节 | 介绍 |
---|---|---|---|
1 | 事务标识符 | 2 | 用于标识请求和响应之间的关联 |
2 | 协议标识符 | 2 | 表示协议类型,0x00 0x00 表示Modbus TCP/IP协议 |
3 | 长度字段 | 2 | 指示后续数据的长度(不包括事务标识符、协议标识符和长度字段本身) |
4 | 设备标识符 | 1 | 目标设备的地址 |
5 | 功能码 | 1 | 指定所需的操作类型 |
6 | 数 据 | * | 根据功能码需要传输的具体数据,长度可变 |