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校验 | 结束位 |
---|---|---|---|---|---|
暂停>=28bit | 8bit | 8bit | N*8bit | 16bit | 暂停>=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进制 | 功能码 | 类型 |
---|---|---|---|
FC01 | 0x01 | 读取从站线圈状态 | 单比特访问 |
FC02 | 0x02 | 读取从站输入端状态 | 单比特访问 |
FC05 | 0x05 | 写入从站线圈状态 | 单比特访问 |
FC15 | 0x15 | 批量写入从站线圈状态 | 单比特访问 |
FC03 | 0x03 | 读取从站保持寄存器内容 | 双字节访问 |
FC04 | 0x04 | 读取从站输入寄存器内容 | 双字节访问 |
FC06 | 0x06 | 写入从站寄存器数据 | 双字节访问 |
FC16 | 0x10 | 批量写入从站寄存器数据 | 双字节访问 |
FC22 | 0x16 | 读写多个寄存器:组合读取和写入多个从站寄存器数据 | 双字节访问 |
FC23 | 0x17 | 组合读取和写入从站线圈状态 | 双字节访问 |
FC24 | 0x18 | 读FIFO队列:读取从站FIFO队列中的数据 | 双字节访问 |
FC20 | 0x14 | 读存储器和输入寄存器的内容到文件 | 文件访问 |
FC21 | 0x15 | 写存储器或输出寄存器的内容从文件 | 文件访问 |
FC08 | 0x08 | 用于检查从站通信情况 | 诊断 |
FC11 | 0x0B | 获取Modbus另外统计信息 | 诊断 |
FC12 | 0x0C | 获取从站伺服参数:读取从站的伺服电机参数配置 | 诊断 |
FC17 | 0x11 | 获取从站的设备标识信息 | 诊断 |
以上这些功能代码覆盖了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协议得到了越来越广泛的应用,主要体现在以下几个方面:
-
工业现场总线通信
工业现场中的传感器、执行器、PLC、HMI等通过Modbus通信总线连接,构成现场级联通信。 -
工业自动化监控
通过Modbus可实现对工业过程的远程监视与控制,构建自动化系统。 -
智能仪表仪表通信
将智能电表、气表等通过Modbus与主站连接,实现数据采集。 -
物联网应用
在物联网系统中,将各种传感器用Modbus连接,上传数据到云平台。 -
智能建筑系统
建筑管理系统通过Modbus采集设备运行状态,实现智能控制。 -
新能源及微电网
光伏、风电等新能源接入和微电网的监控管理。
综上所述,Modbus作为一种成熟稳定的工业通信协议,其应用领域非常广泛。随着工业互联网的快速发展,Modbus协议也将进一步推动工业系统的智能化。