Modbus协议详解

Modbus是一种串行通信协议,它采用了主从架构的网络结构。在70年代,Modicon公司为了连接自己生产的可编程逻辑控制器(PLC),开发出了这一通信协议,即Modbus协议。随后该协议得到广泛应用,现已成为工业标准通信协议之一。

Modbus协议定义了串行通信中物理层和数据链路层的标准。在物理层,Modbus支持多种硬件接口,如RS-232、RS-485、RS-422、Ethernet等。这使得Modbus可以在不同的通信介质上进行数据传输。在数据链路层,Modbus定义了报文的格式以及通信过程。支持两种数据格式,一种是RTU格式,另一种是ASCII格式。

Modbus网络采用单主机多从站的结构。通信总线上只能有一个主站设备,可以有多达247个从站设备。主站可以向从站提出请求,从站负责处理请求并返回响应数据。这样就实现了主站与从站之间的通信。主站也可以广播消息给所有从站。

Modbus广泛应用于工业环境,特别是在工业自动化系统中,大量的智能装置使用Modbus进行连接和通信。这些设备包括PLC、传感器、人机界面等。相比其他通信协议,Modbus更加简单高效,也更加稳定可靠,已经成为工业控制系统不可或缺的通信标准。

Modbus协议

Modbus RTU

Modbus RTU格式用于串行通信,是Modbus中最常见的实现格式。Modbus RTU使用紧凑的二进制表示来传输协议数据。RTU格式在命令/数据之后使用循环冗余校验(CRC)来进行错误检查,以确保数据的可靠性。Modbus RTU报文必须连续传输,在字符间不能有暂停。Modbus报文由空闲(无信号)期间进行划分和分隔。

启始位地址码功能码数据区CRC校验结束位
暂停>=28bit8bit8bitN*8bit16bit暂停>=28bit

Modbus ASCII

Modbus ASCII格式用于串行通信,它使用ASCII字符进行协议通信。ASCII格式使用纵向冗余校验(LRC)来进行错误检查。Modbus ASCII报文以开始符冒号(”:“)开头,以换行符(CR/LF)结尾进行划分。Modbus ASCII格式一般用于系统调试。

启始位地址码功能码数据区LRC校验结束位
:2字节2字节N字节2字节CR,LF

Modbus TCP/IP

Modbus TCP/IP是Modbus协议栈中面向TCP/IP网络通信的实现。Modbus TCP/IP把Modbus的ADU报文封装在TCP报文段内进行传输。而TCP/IP提供可靠的端到端连接,以及路由功能。因此Modbus TCP/IP能够实现跨网络的Modbus通信。Modbus TCP/IP连接由客户端通过指定服务器的IP地址和端口号建立。常用的端口号是502。连接建立后,客户端可以根据Modbus功能码发送请求,服务器返回响应数据。

事务ID协议ID长度单位ID功能码数据区
2字节2字节2字节1字节1字节n字节

工作模式

  • 主站查询 - 在Modbus网络中,只有主站设备有查询其他设备的权限。主站可以向从站发送查询请求,请求读取或写入数据。查询请求包含目标从站地址、功能码、数据地址等信息。这就是主站查询操作。

  • 从站响应 - 当从站收到主站的查询请求后,需要执行相应操作,并向主站返回响应。响应包含相同的地址、功能码字段,以及请求的数据或执行状态。这就是从站响应操作。

  • 广播 - 主站可以通过设置地址为0来实现广播通信,即向所有从站发送报文。从站不需要对广播报文进行响应。广播用于主站批量指令控制。

功能代码

Modbus协议定义了丰富的功能代码,用来表示不同的通信服务类型。各功能代码的定义如下:

功能代码16进制功能码类型
FC010x01读取从站线圈状态单比特访问
FC020x02读取从站输入端状态单比特访问
FC050x05写入从站线圈状态单比特访问
FC150x15批量写入从站线圈状态单比特访问
FC030x03读取从站保持寄存器内容双字节访问
FC040x04读取从站输入寄存器内容双字节访问
FC060x06写入从站寄存器数据双字节访问
FC160x10批量写入从站寄存器数据双字节访问
FC220x16读写多个寄存器:组合读取和写入多个从站寄存器数据双字节访问
FC230x17组合读取和写入从站线圈状态双字节访问
FC240x18读FIFO队列:读取从站FIFO队列中的数据双字节访问
FC200x14读存储器和输入寄存器的内容到文件文件访问
FC210x15写存储器或输出寄存器的内容从文件文件访问
FC080x08用于检查从站通信情况诊断
FC110x0B获取Modbus另外统计信息诊断
FC120x0C获取从站伺服参数:读取从站的伺服电机参数配置诊断
FC170x11获取从站的设备标识信息诊断

以上这些功能代码覆盖了Modbus通信的各种服务类型,实现了工业设备的远程监控和控制。

解释各种寄存器

线圈状态(Coil Status)

线圈状态寄存器表示设备或过程的开关状态,通常对应于继电器的输出。一个线圈状态寄存器可以表示一个开关量。读线圈状态可以获得开关状态,写线圈状态可以改变开关状态。

输入端状态(Input Status)

输入端状态寄存器对应设备或过程的开关量输入信号状态。可以理解为开关量输入。读输入状态用来获取二进制输入的状态。

保持寄存器(Holding Registers)

保持寄存器用于保存设备的参数、配置等数值信息。和线圈状态不同,保持寄存器存储的是16位的数值。读取保持寄存器可以获得参数数值,写入可以修改参数。

输入寄存器(Input Registers)

输入寄存器对应设备或过程的模拟量输入,也是16位数据。读取输入寄存器可以获得过程变量、模拟量输入接口的实时值。

比较保持寄存器(Holding Registers)和输入寄存器(Input Registers)

保持寄存器和输入寄存器的区别:

1、数据属性不同

保持寄存器中的数据通常是可配置可修改的,例如设备参数、控制设定值等。它可以被主站写入修改。

而输入寄存器中的数据通常是只读的,用于传输实时测量或监控数据,主站无法修改。

2、数据流向不同

保持寄存器主要用于主站向从站传输控制设定值。数据流向是从主站到从站。

输入寄存器主要用于从站上传监测数据至主站。数据流向是从从站到主站。

3、数据特点不同

保持寄存器中的数据可配置可变,偶尔改变。输入寄存器的数据通常是连续变化的实时数据。

4、应用场景不同

保持寄存器多用于参数配置,输入寄存器多用于过程监控。

数据结构

Modbus中的数据结构分为两部分:

PDU(Protocol Data Unit) 数据单元

PDU是Modbus报文中包含实际功能码及数据的部分。PDU包含功能码字段和数据字段:

  • 功能码字段:用于表示执行的动作,1字节。

  • 数据字段:extendable Max. 252 bytes。变量长度,包含数据地址,数量等参数。

ADU(Application Data Unit) 应用数据单元

ADU是完整的Modbus报文框架,在PDU的基础上,增加了地址域、错误检查等内容:

  • 地址域:包含从站地址,1字节。

  • PDU:功能码及数据。

  • CRC校验:RTU格式为2字节CRC,ASCII格式为LRC。

  • 帧头尾:ASCII格式有开始符和结束符。

通过PDU和ADU的组合,可以灵活表示不同的请求/响应报文。这种数据结构非常适合串行通信和主从模式,也是Modbus协议的一大特点。

常见应用

随着工业控制网络的发展,Modbus协议得到了越来越广泛的应用,主要体现在以下几个方面:

  1. $1

  2. $1

  3. $1

  4. $1

  5. $1

  6. $1

综上所述,Modbus作为一种成熟稳定的工业通信协议,其应用领域非常广泛。随着工业互联网的快速发展,Modbus协议也将进一步推动工业系统的智能化。