第六章:Modbus 答疑

REDISANT 提供互联网与物联网开发测试套件 #


第六章:Modbus 答疑 #

我从哪里开始与我的 Modbus 设备通信? #

以下是需要了解的几件事:

(1) 物理连接是什么?

Modbus RTU 使用 RS-485 或 RS-232。Modbus TCP 使用以太网。如果您正在寻找网关,则需要选择与要连接的设备的电气接口相匹配的型号。

(2) 寄存器如何映射?

当使用网关将 Modbus 设备连接到非 Modbus 网络时,您需要从设备制造商处获取描述可用寄存器及其寻址方法的文档。Modbus 协议不提供寄存器自动识别自身的方法。

(3) 通信参数是什么?

Modbus RTU 要求您了解或定义波特率、字符格式(8 位无奇偶校验等)和从站 ID(又称从属地址、单元编号、单元 ID)。任何一项不匹配都将导致无法通信。

Modbus TCP 要求您了解或定义网络上的 IP 地址。在某些情况下,您还需要单元 ID。 Modbus TCP 设备可能会使用单元 ID,也可能会忽略它,具体取决于设备和应用程序。

Modbus:当 40001 真正意味着 1,或 0 真正意味着 1 时 #

Modbus 的文档没有很好的标准化。实际上有一个标准,但在文档方面没有得到很好的遵循。您必须执行以下一项或多项操作才能解读制造商真正指的是哪个寄存器:

a) 查找寄存器描述,例如保持寄存器、线圈等。如果文档中说的是 #1,并告诉您它们是保持寄存器,那么您拥有的就是保持寄存器 #1。您还拥有用户友好的文档。

b) 查看数字本身。如果您看到列表中的第一个寄存器的编号为 40001,这实际上告诉您它是寄存器 #1,并且它是一个保持寄存器。这种表示形式通常被称为旧的 Modicon 约定。

c) 查找要使用的功能代码的定义。如果您看到寄存器 #1,以及告诉您使用功能代码 3 和 16 的表示法,这也告诉您它是保持寄存器 #1。

重要提示:寄存器 1 的地址为 0。请继续阅读……

d) 文档中的数字是指寄存器编号还是地址?寄存器 #1 的地址为零。如果您的文档中提到的是寄存器还是地址不清楚,并且您没有得到预期的结果,请尝试将寄存器编号加一或减一。有些产品均在配置软件或网页中引用寄存器编号。但是,一些制造商在记录其设备时显示的是地址,而不是寄存器编号。

40001:Modicon 寄存器的 Modicon 约定符号 #

Modbus 最初由 Gould-Modicon(现为施耐德电气)开发。Modicon 最初使用的符号至今仍经常使用,尽管目前的 Modbus-IDA 标准认为它已过时。使用 Modicon 符号的优点是,一个数字中包含两条信息:(a) 寄存器类型;(b) 寄存器编号。寄存器编号偏移量定义类型。

Modbus 设备中引用的寄存器类型支持的寄存器类型包括:

  • 线圈(离散输出)
  • 离散输入(或状态输入)
  • 输入寄存器
  • 保持寄存器

对于上述每种寄存器类型,Modbus 最初定义的有效地址范围为 0 到 9999。当前规范中允许的有效范围为 0 到 65,535。

地址范围适用于每种类型的寄存器,需要查看 Modbus 消息包中的功能代码来确定引用的寄存器类型。Modicon 约定使用寄存器引用的第一位数字来识别寄存器类型。

使用 Modicon 符号识别的寄存器类型和引用范围如下:

  • 0x = 线圈 = 00001-09999
  • 1x = 离散输入 = 10001-19999
  • 3x = 输入寄存器 = 30001-39999
  • 4x = 保持寄存器 = 40001-49999

有时,需要访问超过 10,000 个寄存器类型。基于最初的约定,还有另一个看起来非常相似的事实上的标准。使用 Modicon 表示法识别的其他寄存器类型和参考范围如下:

  • 0x = 线圈 = 000001-065535
  • 1x = 离散输入 = 100001-165535
  • 3x = 输入寄存器 = 300001-365535
  • 4x = 保持寄存器 = 400001-465535

当使用扩展寄存器引用时,所有寄存器引用必须恰好是六位数字。

寄存器是 16 位 - 如何读取浮点或 32 位数据? #

Modbus 协议将保持寄存器定义为 16 位宽;但是,对于读取和写入宽度超过 16 位的数据,存在一个广泛使用的事实标准。最常见的是 IEEE 754 浮点和 32 位整数。该约定也可以扩展到双精度浮点和 64 位整数数据。

宽数据仅由两个连续的“寄存器”组成,被视为单个宽寄存器。32 位 IEEE 754 标准中的浮点和 32 位整数数据被广泛使用。尽管寄存器对的约定得到广泛认可,但关于高阶或低阶寄存器应该先出现的约定尚未标准化。因此,许多设备都支持“交换”选项。这意味着,在某些情况下,“交换”选项更明确地标识为“高阶数据在第一个寄存器中”或类似内容。

大多数产品默认将高位寄存器放在第一位,或放在低位寄存器中。这称为“大端”,与 Modbus 协议一致,该协议本身就是大端。所有 16 位值的字节顺序都是最高有效字节在前。

40001:7 等符号是什么意思? #

这是引用寄存器中各个位的常用符号。此特定示例引用(Modicon 表示法)寄存器 40001,位 7。位通常从位 0 开始编号,这是 Modbus 寄存器中 16 位字段中的最低有效位或最右边的位。如果使用此样式表示法,您可能会看到 40001:0 到 40001:15。

如何读取寄存器中的各个位? #

每个 Modbus 设备的文档往往略有不同。但是,如果您的设备将多个位打包到一个保持寄存器中,文档将记录在同一寄存器编号或地址中找到的最多 16 个不同项目。这些位可以用“Bn”或“Dn”或只是“位 n”来标识。大多数情况下,最低有效位将称为位 0,最高有效位将是位 15。您可能会找到对位 1 到位 16 的引用,在这种情况下,只需从数字中减一即可参考下表。

您无法从保持寄存器中只读取一位。没有办法做到这一点 - Modbus 协议根本不提供该功能。您必须读取所有 16 位,然后测试您感兴趣的单个位是真还是假(1 或 0)。

Modbus 网络上可以有多少个设备? #

从逻辑上讲,您可以寻址超过 250 个设备;然而,RS-485 收发器无法物理驱动那么多设备。 Modbus 协议规定限制为 32 个设备,大多数 RS-485 收发器都同意这一点。只有当网络上的所有设备都具有低负载收发器时,您才能拥有超过 32 个设备。

在哪里可以获取 Modbus 协议规范的副本? #

您可以访问 www.modbus.org 获取 Modbus 协议规范的副本。主要关注三个文件: (1) 应用层协议,定义功能代码和寻址; (2)串行线路(RTU)使用的定义; (3)以太网使用(TCP)的定义。您将被要求接受使用条款,但这些规范无需支付任何费用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.redisant.cn