Modbus 是一种广泛使用的工业通信协议,它允许电子设备之间的数据交换。Modbus 协议中有许多功能码,下面我们将重点介绍常用的功能码(01、02、03、04、05、06、10)的用法及常见数据类型,并提供一些代码示例。

一、功能码简介

  1. 功能码 01:读线圈状态
  2. 用于读取一个或多个线圈的开关状态。
  3. 响应数据为每个线圈一个位(0 或 1)。

  4. 功能码 02:读离散输入状态

  5. 用于读取一个或多个离散输入的状态,类似于功能码 01。
  6. 返回的也是每个输入一个位。

  7. 功能码 03:读保持寄存器

  8. 用于读取一个或多个保持寄存器的值,寄存器的值为 16 位(两个字节)。
  9. 返回的数据格式通常为两个字节一组。

  10. 功能码 04:读输入寄存器

  11. 用于读取设备的输入寄存器,通常是从传感器读取的值。
  12. 返回的数据格式与功能码 03 类似。

  13. 功能码 05:写单个线圈

  14. 用于向单个线圈写入开关状态(打开或关闭)。

  15. 功能码 06:写单个寄存器

  16. 用于向单个保持寄存器写入值。

  17. 功能码 10:写多个寄存器

  18. 用于一次性写入多个保持寄存器。

二、常见数据类型

在 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 协议的基本用法。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部