Modbus是由Modicon公司(现为施耐德电气)在1979年开发的工业通信协议,是世界上最早用于工业电子设备之间通信的协议之一。它是一个**主从式(Master-Slave)**通信协议,广泛应用于工业自动化领域。
开放性:协议规范公开,任何厂商都可以使用
简单性:协议结构简单,易于实现和理解
可靠性:内置错误检测机制
灵活性:支持多种物理层和数据链路层
地址范围:00001-09999(实际协议地址0x0000起)
读写权限:可读可写
数据类型:1位二进制值(ON/OFF)
用途:控制设备开关量输出(如继电器启停、电机控制)
功能码:
读:0x01
写单点:0x05
写多点:0x0F
地址范围:10001-19999
读写权限:只读
数据类型:1位二进制值
用途:采集开关量输入信号(如按钮状态、传感器触点)
功能码:
读:0x02
地址范围:30001-39999
读写权限:只读
数据类型:16位整数或浮点数
用途:存储模拟量输入数据(如温度、压力传感器值)
功能码:
读:0x04
地址范围:40001-49999
读写权限:可读可写
数据类型:16位整数、浮点数或自定义数据
用途:存储设备参数或控制数据(如设定值、运行参数)
功能码:
读:0x03
写单点:0x06
写多点:0x10
数据类型 | 地址范围 | 访问权限 | 数据大小 | 功能码 |
---|---|---|---|---|
线圈(Coils) | 00001-09999 | 读/写 | 1位 | 01,05,15 |
离散输入(Discrete Inputs) | 10001-19999 | 只读 | 1位 | 02 |
输入寄存器(Input Registers) | 30001-39999 | 只读 | 16位(2个字节) | 04 |
保持寄存器(Holding Registers) | 40001-49999 | 读/写 | 16位(2个字节) | 03,06,16 |
0x01 (1) - 读取线圈状态:从服务器获取一组线圈(离散输出)的当前状态。
0x02 (2) - 读取输入状态:从服务器获取一组离散输入的当前状态。
0x03 (3) - 读取保持寄存器:从服务器获取一组保持寄存器的内容。
0x04 (4) - 读取输入寄存器:从服务器获取一组输入寄存器的内容。
0x05 (5) - 写入单个线圈:设定服务器上某个线圈的状态。
0x06 (6) - 写入单个保存寄存器:设定服务器上某个保持寄存器的内容。
0x0F (15) - 写入多个线圈:设定服务器上一组线圈的状态。
0x10 (16) - 写入多个保存寄存器:设定服务器上一组保持寄存器的内容。
特点:
使用二进制数据传输
数据紧凑,传输效率高
使用CRC校验
常用于RS-485/RS-232串口通信
[从站地址][功能码][数据][CRC校验] 1字节 1字节 N字节 2字节
特点:
使用ASCII字符传输
数据可读性好,易于调试
使用LRC校验
传输效率相对较低
[起始符][地址][功能码][数据][LRC校验][结束符] : 2字节 2字节 N字节 2字节 CR LF
特点:
基于以太网传输
使用TCP协议,无需额外校验
支持并发连接
传输距离远,速度快
[MBAP头部][功能码][数据] 7字节 1字节 N字节
MBAP头部结构:
事务处理标识符(2字节)
协议标识符(2字节,固定为0000)
长度字段(2字节)
单元标识符(1字节)
Modbus的应用场景
Modbus协议广泛应用于工业控制系统中,尤其是在以下场景中:
设备间数据采集和监控(如PLC与传感器、HMI的连接)。
过程自动化中的数据传输。
远程监控和控制系统(如SCADA系统)。
Modbus的开放性和简单性,使其成为工业物联网(IIoT)中广泛使用的协议之一。
Java小强
未曾清贫难成人,不经打击老天真。
自古英雄出炼狱,从来富贵入凡尘。
发表评论: