modbus
简介
Modbus 是一种串行通信协议,广泛应用于工业自动化领域,用于在不同设备之间进行数据交换和控制
- 主从架构:Modbus 采用主从通信模式,其中一个设备作为主设备,其他设备作为从设备。主设备可以向从设备发送请求,从设备则响应请求并返回数据。
- 数据类型:Modbus 支持多种数据类型,包括位(布尔值)、整数、浮点数等。
- 功能码:Modbus 定义了一系列功能码,用于实现不同的操作,如读取输入/输出状态、读取寄存器数据、写入寄存器数据等。
- 传输介质:Modbus 可以通过串口(如 RS-232、RS-485)或以太网进行通信。
- 简单易用:Modbus 协议相对简单,易于实现和集成到各种工业设备中。
硬件层协议:解决0和1的可靠传输,常有RS232、RS485、CAN、IIC、SPI …
软件层协议:解决传输目的,常有Modbus、TCP/IP、CANopen …
Modebus通信过程
注意Modbus是一主多从的通信协议
Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备。从站处理信息和使用Modbus将其数据发送给主站。
也就是说,不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。
从机不会自己发送消息给主站,只能回复从主机发送的消息请求。
Modbus存储区
- 存储的数据类型
布尔量
布尔量比如IO口的电平高低,灯的开关状态等。16位寄存器
16位寄存器比如 传感器的温度数据,存储的密码等。
存储区名称 | 区号 | 写入权限 | 内容形式 | 地址范围 |
---|---|---|---|---|
线圈 | 01 | 读写 | 位(0 或 1) | 00001-09999 |
离散输入 | 02 | 只读 | 位(0 或 1) | 10001-19999 |
保持寄存器 | 03 | 读写 | 字(16 位整数) | 40001-49999 |
输入寄存器 | 04 | 只读 | 字(16 位整数) | 30001-39999 |
Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,主机读写从机的存储区,实际上就是对从机设备对应的实际存储空间进行读写。
- 客户端发送请求:客户端(如主站)向 Modbus 从站发送请求,请求中包含要读取或写入的数据地址和数据类型等信息。
- 从站处理请求:从站接收到请求后,根据请求中的地址和数据类型,在其内部的数据存储区中查找相应的数据。
- 从站返回响应:从站将找到的数据或执行结果返回给客户端,响应中包含数据值或错误代码等信息。
- 客户端处理响应:客户端接收到响应后,根据响应中的数据或错误代码进行相应的处理。
在 Modbus 数据模型中,数据的读写操作是基于寄存器的。客户端可以通过读取保持寄存器或输入寄存器中的数据来获取从站的状态或测量值,也可以通过写入保持寄存器中的数据来控制从站的行为。
Modbus协议类型
串行端口存在多个版本的Modbus协议,而最常见的是下面四种:
Modbus-Rtu
- Modbus-Ascii
- Modbus-Tcp
- ModbusPlus
Modbus RTU是一种紧凑的,十六进制表示数据的方式,RTU格式后续的命令/数据带有循环冗余校验的校验和
Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式,ASCII格式采用纵向冗余校验的校验和。
Modbus-RTU协议
Modbus报文帧结构
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。
Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容
Modbus-RTU协议在串行链路上的报文格式如下所示:
Modbus RTU 报文格式如下:
地址 | 功能码 | 数据 | 校验 |
---|---|---|---|
1 字节 | 1 字节 | N 字节 | 2 字节 |
- 地址:从站设备地址,1 字节,取值范围 0-247。
- 功能码:表示操作类型,1 字节,常见的功能码有 01(读线圈状态)、02(读离散输入状态)、03(读保持寄存器)、04(读输入寄存器)、05(写单个线圈)、06(写单个保持寄存器)、15(写多个线圈)、16(写多个保持寄存器)等。
- 数据:根据功能码的不同,数据的格式和长度也不同。例如,读线圈状态时,数据为 0 或 1;读保持寄存器时,数据为 2 字节的寄存器值;写单个线圈时,数据为 0 或 1;写单个保持寄存器时,数据为 2 字节的寄存器值。
- 校验:采用 CRC16 校验,2 字节,用于检测报文的正确性。
Modbus功能码
功能码 | 名称 | 操作 |
---|---|---|
01 | 读线圈状态 | 读取从站离散输出线圈的通断状态 |
02 | 读离散输入状态 | 读取从站离散输入的通断状态 |
03 | 读保持寄存器 | 读取从站保持寄存器的内容 |
04 | 读输入寄存器 | 读取从站输入寄存器的内容 |
05 | 写单个线圈 | 将从站的单个线圈设置为 ON 或 OFF |
06 | 写单个保持寄存器 | 将从站的单个保持寄存器设置为指定值 |
15 | 写多个线圈 | 将从站的多个线圈设置为 ON 或 OFF |
16 | 写多个保持寄存器 | 将从站的多个保持寄存器设置为指定值 |