在工业自动化系统中,Modbus协议作为最经典的现场通信标准之一,凭借结构清晰、兼容性强的特点,广泛应用于控制器、传感器及监控系统之间的数据交互。本文将简要说明联诚科技LicOS PLC/PAC在作为Modbus服务器时的地址结构与通信机制,帮助开发者和集成商快速理解与部署系统。
基本功能与意义
在LicOS PLC/PAC中,Modbus地址的作用主要体现在以下四个方面:
数据标识与定位
每个地址对应PLC内部的特定数据区域,如线圈、输入寄存器、保持寄存器等。通过地址,客户端可以准确访问或修改目标数据。
数据交互与通信
客户端通过读写特定地址完成与PLC的实时通信,实现数据采集与控制命令的下发。
设备互联与兼容
清晰的地址规则使LicOS设备能与其他支持Modbus协议的系统实现无缝互联。
系统配置与维护便利
明确的地址映射可降低系统调试与后期维护的复杂度,提高项目实施效率。
Modbus通讯格式有三种,这是根据物理层/传输层而做的适配。根据TCP等传输层协议的特点,Modbus摇身一变,就成为了ModbusTCP,使用RS485、RS232等串行物理层协议,Modbus就形成了ModbusRTU和ModbusASCII。
本教程基于以下开发条件:
软件:
Smart Control V5.0、Modbus Toolkit 5、SCOMM
网络拓扑:

Modbus TCP
Modbus TCP协议的数据格式由三部分组成:MBAP + 功能码 + 数据。
其中 MBAP 含四个字段:事务标识符、协议标识符、长度、单元标识符。
事务标识符(2字节):表示数据序号,每发送一次数据可自增或保持不变;
协议标识符(2字节):固定为00;
长度(2字节):表示后续数据的长度;
单元标识符:相当于串行从机地址。
示例:从机返回数据 0001 0000 0005 03 04 02 0006
其中 0001 为消息序号,0000 表示Modbus TCP协议,0005 为后续数据长度,03 为单元标识符,04 为功能码,02 表示数据长度为2字节,0006 为寄存器数据。
1. 报文头MBAP
MBAP为报文头,长度为7字节,组成如下:

报文格式

报文格式解释
从机返回响应数据:

从机返回响应数据结构图
2. 帧结构PDU
帧结构PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。
功能码
Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。

功能码解释
根据对象的不同,Modbus的功能码有:

功能码类型
3. 服务器配置
PLC/PAC作为ModbusTCP服务器,有以下几个参数,如下图所示:

ModbusTCP服务器配置
l Base Info Config-基本信息
Enable or Disable:TRUE启用PLC的 ModbusTCP从站功能:FALSE关闭PLC的ModbusTCP从站功能。
Port ID:端口号。
Max Connection:最大连接数量。
l Filter Info Config-过滤信息
Enable Filter:TRUE启用IP过滤功能,FALSE关闭IP过滤功能。
Mask:允许接入的客户端所处网段的子网掩码。
Start IP:允许接入的客户端所处网段的起始IP。
End IP:允许接入的客户端所处网段的结束IP。
l Clients Info:连接信息,连接数量及IP信息
Nummber ofclient:已经接入的客户端数量。
IP ofclient:当有多个客户端接入时,轮询显示接入客户端的IP、端口信息,显示格式如下图所示。
![]()
接入设备IP信息
4. 0x01:读多个线圈
在从站中读1~2000个连续线圈状态,ON=1,OFF=0
请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)
如:在从站0x01中,读取开始地址为0x0000的线圈数据,读0x0008位
00 02 00 00 00 06 01 01 00 00 00 08
回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF
00 02 00 00 00 04 01 01 01 01
00000001

读多个线圈
5. 0x02:读多个离散量输入
在从站中读1~2000个连续的离散量输入状态
请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))
如:从地址0x0000开始读0x0008个离散量输入
00 03 00 00 00 06 01 02 00 00 00 08
回:数据长度为0x01个字节,数据为0x01,第一个离散量输入为ON,其余为OFF
00 03 00 00 00 04 01 02 01 01
00000001

读多个离散量输入
6. 0x03:读多个保持寄存器
在从站中读保持寄存器连续块的内容
请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
如:起始地址是0x0000,寄存器数量是 0x0003
00 04 00 00 00 06 01 03 00 00 00 03
回:数据长度为0x06,第一个寄存器的数据为0x05,第二个寄存器的数据为0x06,其余为0x00
00 04 00 00 00 09 01 03 06 00 05 00 06 00 00
5,6,0

读多个保持寄存器
7. 0x04:读多个输入寄存器
在从站中读1~2000个连续输入寄存器
请求:MBAP功能码 起始地址H起始地址L寄存器数量H寄存器数量L(共12字节)
响应:MBAP功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
如:读起始地址为0x0000,数量为0x0005的寄存器数据
00 05 00 00 00 06 01 04 00 00 00 05
回:数据长度为0x0A,第一个寄存器的数据为0x0B,第一个寄存器的数据为0x16,其余为0x00
00 05 00 00 00 0D 01 04 0A 00 0B 00 16 00 00 00 00 00 00
11,22,0,0,0

读多个输入寄存器
8. 0x05:写单个线圈
在从站中的一个输出写成ON或OFF
请求:MBAP功能码 输出地址H输出地址L输出值H输出值L(共12字节)
响应:MBAP功能码 输出地址H输出地址L输出值H输出值L(共12字节)
如:将地址为0x0003的线圈设为ON
00 07 00 00 00 06 01 05 00 03 FF 00
回:写入成功
00 07 00 00 00 06 01 05 00 03 FF 00
TRUE

写单个线圈
9. 0x06:写单个保持寄存器
在从站中写一个保持寄存器
请求:MBAP功能码寄存器地址H寄存器地址L寄存器值H寄存器值L(共12字节)
响应:MBAP功能码寄存器地址H寄存器地址L寄存器值H寄存器值L(共12字节)
如:向地址是0x0000的寄存器写入数据0x000A
00 08 00 00 00 06 01 06 00 00 00 0A
回:写入成功
00 08 00 00 00 06 01 06 00 00 00 0A
10

写单个保持寄存器
10. 0x10:写多个保持寄存器
在一个远程设备中写连续寄存器(1~123个寄存器)
请求:MBAP功能码起始地址H起始地址L寄存器数量H寄存器数量L字节长度寄存器值(13+寄存器数量×2)
响应:MBAP功能码起始地址H起始地址L寄存器数量H寄存器数量L(共12字节)
如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
00 00 00 00 00 09 01 10 00 00 00 01 02 00 0F
回:写入成功
00 00 00 00 00 06 01 10 00 00 00 01
1

写多个保持寄存器
11. 0x0F:写多个线圈
将一个从站中的一个线圈序列的每个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF
请求:MBAP功能码起始地址H起始地址L输出数量H输出数量L字节长度输出值H输出值L
响应:MBAP功能码起始地址H起始地址L输出数量H输出数量L
如:将地址为0x0000、0x0002的线圈设为ON,0x0001的线圈为OFF
00 01 00 00 00 08 01 0F 00 00 00 03 01 05
回:写入成功
00 01 00 00 00 06 01 0F 00 00 00 03
3

写多个线圈
Modbus RTU
Modbus RTU 数据包通常由 从站地址、功能码、数据和差错校验 组成。
例如,主机发送的数据包为:06 03 00 50 00 04 45 AF。
其中:
06 为从站地址;
03 为功能码,表示读取保持寄存器;
0050 为起始寄存器地址;
0004 表示读取 4 个字的数据;
45AF 为 CRC 校验码,用于检测数据传输是否出错。
1. 帧结构
帧结构 = 地址 + 功能码 + 数据 + 校验
地址:占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)。
功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能。
数据:根据功能码不同,有不同结构,在后续的实例中有说明。
校验:为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,再回复;如果不一样,说明这个数据在传输的时候出了问题,数据不对的,所以就抛弃了。
主机查询数据:

主机查询数据结构图
2. 功能码
根据对象的不同,Modbus的功能码有:

功能码类型
根据对象的不同,Modbus的功能码有:

功能码类型
3. 服务器配置
PLC/PAC作为ModbusRTU服务器,有以下几个参数,如下图所示:

ModbusRTU服务器参数
基本配置
是否启用:值为TRUE表示ModbusRTU通道开启;值为FALSE表示ModbusRTU通道关闭,默认值为FALSE。
从站地址:PLC/PAC作为ModbusRTU从站时的地址编号,取值范围为1-247。
串口配置
COM端口:PLC/PAC作为ModbusRTU从站时的通信端口,默认值为1,取值范围为1-4,分别对应CPU单元的串口号为1-4的串口,各串口的管脚定义请参阅《PLC/PAC可编程逻辑控制器硬件手册》。
波特率:ModbusRTU通信时的传输速率,取值范围为1200-115200bps,建议使用9600bps,默认值也为9600bps。
奇偶校验:ModbusRTU通信时的数据校验方式,支持奇校验(ODD)、偶校验(EVEN)、无校验(NONE)三种数据校验方法,默认为偶校验EVEN。
数据位:ModbusRTU通信时的数据位长度,支持5、6、7、8位数据长度,默认为8位数据位。
停止位:ModbusRTU通信时的停止位长度,支持1、2位停止位长度,默认为1位停止位长度。
4. 0x01:读多个线圈
作用:读从机线圈寄存器,位操作,可读单个或多个;
发送指令:从机地址:0x01,寄存器开始地址:0x0000,共读取8个线圈。发送命令如下:

TX:01 01 00 00 00 08 3D CC
响应:返回数据每一位的对应的线圈状态,1表示ON,0表示OFF;

RX:01 01 01 07 10 4A
5. 0x02:读多个离散输入
读从机离散输入寄存器,位操作,可读单个或多个;
发送指令:从机地址:0x01,寄存器开始地址:0x0000,共读取8个输入。发送命令如下:

TX:01 02 00 00 00 08 79 CC
响应:返回数据每一位的对应输入的状态,1表示ON,0表示OFF;

RX:01 02 01 10 A0 44
6. 0x03:读多个保持寄存器
作用:读从机保持寄存器,字节操作,可读单个或多个;
发送指令:从机地址:0x01,寄存器开始地址:0x0000,共读取1个寄存器。发送命令如下:

TX:01 03 00 00 00 01 84 0A
响应:返回数据。

RX:01 03 02 00 0F F8 40
7. 0x04:读多个输入寄存器
作用:读从机输入寄存器,字节操作,可读单个或多个;
发送指令:从机地址:0x01,寄存器开始地址:0x0000,共读取1个寄存器。发送命令如下:

TX:01 04 00 00 00 01 31 CA
响应:返回数据。

RX:01 04 02 00 0F F9 34
8. 0x05:写单个线圈
作用:写单个线圈,位操作,只能写一个,写0xFF00表示线圈为ON,写0x0000表示线圈为OFF;
发送指令:从机地址:0x01,设置线圈0x0000为ON。发送命令如下:

TX:01 05 00 00 FF 00 8C 3A
响应:同发送数据。
9. 0x06:写单个保持寄存器
作用:写单个保持寄存器,字节操作,只能写一个;
发送指令:从机地址:0x01,设置线圈0x0000为0x2193。发送命令如下:

TX:01 06 00 00 21 93 D1 F7
响应:同发送数据。
10. 0x10:写多个保持寄存器
作用:写多个保持寄存器,字节操作,可写多个;
发送指令:从机地址:0x01,寄存器地址0x0000,写2个寄存器4个字节数据。发送命令如下:

TX:01 10 00 00 00 02 04 00 08 00 09 B2 6B
响应:返回数据。

RX:01 10 00 00 00 02 41 C8
LicOS PLC/PAC作为Modbus服务器,具备完整的Modbus TCP与RTU通信能力。其地址映射清晰,功能码覆盖全面,支持工业现场常见的数据读写需求。
在实际部署时,建议结合具体网络环境与设备性能,合理配置连接数、串口参数及IP过滤策略,以保障通信的实时性与安全性。