Modbus 是一种广泛使用的工业通信协议,它允许电子设备之间的数据交换。Modbus 协议中有许多功能码,下面我们将重点介绍常用的功能码(01、02、03、04、05、06、10)的用法及常见数据类型,并提供一些代码示例。
一、功能码简介
- 功能码 01:读线圈状态
- 用于读取一个或多个线圈的开关状态。
-
响应数据为每个线圈一个位(0 或 1)。
-
功能码 02:读离散输入状态
- 用于读取一个或多个离散输入的状态,类似于功能码 01。
-
返回的也是每个输入一个位。
-
功能码 03:读保持寄存器
- 用于读取一个或多个保持寄存器的值,寄存器的值为 16 位(两个字节)。
-
返回的数据格式通常为两个字节一组。
-
功能码 04:读输入寄存器
- 用于读取设备的输入寄存器,通常是从传感器读取的值。
-
返回的数据格式与功能码 03 类似。
-
功能码 05:写单个线圈
-
用于向单个线圈写入开关状态(打开或关闭)。
-
功能码 06:写单个寄存器
-
用于向单个保持寄存器写入值。
-
功能码 10:写多个寄存器
- 用于一次性写入多个保持寄存器。
二、常见数据类型
在 Modbus 通信中,常见的数据类型有: - 线圈:每个线圈用一个位表示,开则为 1,关则为 0。 - 离散输入:每个离散输入同样用一个位表示。 - 保持寄存器:每个寄存器为 16 位,可以存储整数、浮点数等。 - 输入寄存器:同样是 16 位,通常用于存储传感器的数据。
三、代码示例
以下是 Python 中使用 pymodbus
库进行 Modbus 通信的简单示例。
from pymodbus.client.sync import ModbusTcpClient
# 创建 Modbus TCP 客户端
client = ModbusTcpClient('192.168.1.10', port=502)
client.connect()
# 功能码 01:读取线圈状态
result = client.read_coils(0, 8) # 从地址 0 开始读取 8 个线圈
print("线圈状态:", result.bits)
# 功能码 02:读取离散输入状态
result = client.read_discrete_inputs(0, 8) # 从地址 0 开始读取 8 个离散输入
print("离散输入状态:", result.bits)
# 功能码 03:读取保持寄存器
result = client.read_holding_registers(0, 5) # 从地址 0 开始读取 5 个寄存器
print("保持寄存器值:", result.registers)
# 功能码 04:读取输入寄存器
result = client.read_input_registers(0, 5) # 从地址 0 开始读取 5 个输入寄存器
print("输入寄存器值:", result.registers)
# 功能码 05:写单个线圈
client.write_coil(0, True) # 将地址 0 的线圈设置为 True(开)
# 功能码 06:写单个寄存器
client.write_register(0, 12345) # 将地址 0 的寄存器设置为 12345
# 功能码 10:写多个寄存器
client.write_registers(1, [10, 20, 30]) # 将地址 1 处的寄存器设置为 10, 20, 30
# 关闭客户端
client.close()
四、总结
Modbus 协议为工业设备之间的通信提供了一种简单的方式。掌握常用的功能码及其使用方法,可以有效地进行设备监控和数据交换。通过代码示例可以看出,使用现有的库进行 Modbus 通信是相对简单的。希望这篇文章能帮助理解 Modbus 协议的基本用法。