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)的定义。您将被要求接受使用条款,但这些规范无需支付任何费用。

Modbus 中的功能码和异常码

可视化 Modbus 设备中的数据

Modbus 从设备可以想象为具有一个内部电子表格,其中填满了数字。Modbus 主设备将向从设备询问其在给定行和列中找到的数据值或数字,从设备将通过将该数据发送回主设备来响应。当然,这个过程可以逆转,Modbus 主设备告诉从设备在给定行和列处将什么数字放入其数据表中。

Modbus 设备“电子表格”中的“列”更正式地称为寄存器类型。寄存器类型可能是线圈、离散输入(又称状态输入)、输入寄存器或保持寄存器。

Modbus 设备“电子表格”中的“行”只是寄存器编号。通常,这些行从 1 开始并按顺序递增。某些设备可能没有寄存器 1,例如,它们的第一个寄存器可能是 100。如果从设备中不存在寄存器编号,它将发回一个异常消息。该异常提供了一个错误代码,提示“没有这样的寄存器”(异常代码 2,非法数据地址)。

什么是 Modbus TCP?

Modbus TCP 将 Modbus RTU 请求和响应数据包封装在通过标准以太网网络传输的 TCP 数据包中。单元号仍包含在内,其解释因应用程序而异 – 单元或从站地址不是 TCP 中的主要寻址方式。这里最重要的地址是 IP 地址,例如 192.168.1.100。Modbus TCP 的标准端口是 502,但如果需要,通常可以重新分配端口号。

TCP 数据包中省略了通常位于 RTU 数据包末尾的校验和字段。对于 Modbus TCP,校验和和错误处理由以太网处理。

Modbus 的 TCP 版本遵循 OSI 网络参考模型。Modbus TCP 定义了 OSI 模型中的表示层和应用层。

Modbus TCP 使主设备和从设备的定义不那么明显,因为以太网允许对等通信。客户端和服务器的定义在基于以太网的网络中更为人所知。在这种情况下,从设备成为服务器,主设备成为客户端。可以有多个客户端从服务器获取数据。在 Modbus 术语中,这意味着可以有多个主设备和多个从设备。现在,系统设计人员的责任是创建主设备和从设备功能之间的逻辑关联,而不是逐个物理设备地定义主设备和从设备。

什么是 Modbus ASCII?

Modbus ASCII 是一种较旧的实现,它包含 RTU 数据包的所有元素,但完全以可打印的 ASCII 字符表示。Modbus ASCII 被认为已弃用,很少再使用,并且未包含在正式的 Modbus 协议规范中。

Modbus 寄存器类型回顾

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

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

特定设备是否包含所有这些寄存器类型取决于制造商。所有 I/O 都仅映射到保持寄存器的情况非常常见。线圈是 1 位寄存器,用于控制离散输出,可以读取或写入。离散输入是用作输入的 1 位寄存器,只能读取。输入寄存器是用于输入的 16 位寄存器,只能读取。保持寄存器是最通用的 16 位寄存器,可以读取或写入,可用于各种用途,包括输入、输出、配置数据或任何“保持”数据的要求。

当网关为主控或以直接模式(Babel Buster SP-GW)运行时,网关将支持所有寄存器类型。将非 Modbus 设备连接到 Modbus 网络的控制解决方案网关在某些情况下将仅使用保持寄存器来表示非 Modbus 设备数据。

大多数控制解决方案 I/O 设备都使用保持寄存器来表示所有类型的输入和输出。在大多数情况下,相同的 I/O 也可以像其他寄存器类型一样访问,并且 I/O 状态或值在多个寄存器中镜像。

Modbus 功能码

Modbus 协议定义了几个用于访问 Modbus 寄存器的功能代码。Modbus 定义了四个不同的数据块,每个数据块中的地址或寄存器编号重叠。因此,要完整定义在何处查找数据,需要地址(或寄存器编号)和功能代码(或寄存器类型)。

下表列出了 Modbus 设备最常识别的功能代码。这只是可用代码的一个子集 – 其中一些代码具有通常不适用的特殊应用。

功能码 寄存器类型
1 读取线圈
2 读取离散输入
3 读取保持寄存器
4 读取输入寄存器
5 写入单个线圈
6 写入单个保持寄存器
15 写入多个线圈
16 写入多个保持寄存器

Modbus 异常(错误)代码

当 Modbus 从站识别出数据包,但确定请求中存在错误时,它将返回异常代码回复,而不是数据回复。异常回复由从站地址或单元号、设置了高位的功能代码副本和异常代码组成。例如,如果功能代码为 3,则异常回复中的功能代码将为 0x83。异常代码将是以下之一:

异常码 说明 详细说明
1 非法的功能码 查询中收到的功能代码不被从站识别或不被从站允许。
2 非法的数据地址 查询中收到的数据地址(寄存器编号)不是从站允许的地址,即寄存器不存在。如果请求多个寄存器,则至少有一个寄存器不被允许。
3 非法的数据值 查询数据字段中包含的值对于从站来说是不可接受的。
4 从设备故障 从站尝试执行请求的操作时发生不可恢复的错误
6 从设备忙 从属设备正在处理一个长持续时间的命令。主设备应稍后重试。
10 网关路径不可用 与网关结合使用的专门用途,通常意味着网关配置错误或超载
11 网关目标设备无法响应 专门与网关结合使用,表示未从目标设备收到响应。

Modbus消息帧格式

Modbus ASCII 或 RTU 模式仅适用于标准的 Modbus 协议串行网络,它定义了在这些网络上连续传输的消息段的每一个字节,以及决定怎样将信息打包成消息域和如何解码等功能。

RTU消息帧格式

RTU模式通过二进制格式传输数据,具有高效、可靠的特点

ASCII消息帧格式

当控制器设为在Modbus 网络上以ASCII模式通信时,在消息中每个8位(bit)的字节都将作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。

在ASCII模式下,消息以冒号(:)字符(ASCII码0x3A)开始,以回车换行符结束(ASCI码0x0D,0x0A)。消息帧的其他字段(域)可以使用的传输字符是十六进制的0··9,A··F。处于网络上的Modbus设备不断侦测“:”字符,当有一个冒号接收到时,每个设备进入解码阶段,并解码下一个字段(地址域)来判断是否是发给自己的。消息帧中的字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为发生传输错误。

地址域

所谓地址域,指的是Modbus 通信帧中的地址字段,其内容为从设备地址。Modbus消息帧的地址域包含2个字符(ASCII模式)或者1个字节(RTU模式)。

消息帧中可能的从设备地址是0~247(十进制),单个设备的实际地址范围是1~247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备做出回应。

地址0用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高级别的网络时,广播方式可能不被允许或以其他方式代替。

功能码域

功能码在Modbus协议中用于表示消息帧的功能。

功能码域由1个字节构成,因此其取值范围为1~255(十进制)。例如,常用的功能码有03、04、06、16等,其中03功能码的作用是读保持寄存器内容,04功能码的作用是读输入寄存器内容(输入寄存器和保持寄存器的区别可参考上一节的内容),06功能码的内容是预置单个保持寄存器,16功能码的内容则是预置多个保持寄存器。

从设备根据功能码执行对应的功能,执行完成后,正常情况下则在返回的响应消息帧中设置同样的功能码;如果出现异常,则在返回的消息帧中将功能码最高位(MSB)设置为1。据此,主设备可获知对应从设备的执行情况。

另外,对于主设备发送的功能码,则从设备根据具体配置来决定是否支持此功能码。如果不支持,则返回异常响应。

数据域

数据域与功能码紧密相关,存放功能码需要操作的具体数据。数据域以字节为单位,长度是可变的,对于有些功能码,数据域可以为空。

具体的功能码和数据域的构成及意义,可参考后续章节的内容,下面给出一个简单的例子。

RTU消息帧示例

以下是一个Modbus RTU请求消息帧的示例,假设主机请求从设备地址为1的设备读取保持寄存器(功能码03),起始地址为0,读取数量为2:

  • 设备地址:0x01
  • 功能码:0x03
  • 起始地址:0x0000(高字节0x00,低字节0x00)
  • 数量:0x0002(高字节0x00,低字节0x02)
  • CRC:假设计算得出的CRC为0xC40B

组成的RTU请求消息帧如下:

01 03 00 00 00 02 C4 0B

Modbus寄存器说明

Modbus协议中一个重要的概念是寄存器,所有的数据均存放于寄存器中。Modbus寄存器是指一块内存区域。Modbus寄存器根据存放的数据类型以及各自读写特性,将寄存器分为4个部分,这4个部分可以连续也可以不连续,由开发者决定。寄存器的意义如下表所示。

Modbus协议定义了设备间的数据传输方式,包括数据格式和通信规则。Modbus寄存器是协议中用于存储数据和状态信息的基本单元。

寄存器种类 说明 与PLC类比 举例说明
线圈状态(Coil Status) 输出端☐。可设定端☐的输出状态,也可以读取该位的输出状态。 DO(数字量输出) 电磁阀输出、MOSFET输 出、LED显示等
离散输入状态(Input Status) 输入端☐。 通过外部设定改变输入状态, 可读但不可写。 DI(数字量输入) 拨码开关、接近开关等
保持寄存器(Holding Register) 输出参数或保持参数,控制器运行时被设定的某些参数,可读可写 AO(模拟量输出) 模拟量输出设定值, PID 运行参数,变量阀输出大小,传感器报警上限、下限
输入寄存器(Input Register) 输入参数。 控制器运行时从外部设备获得的参数,可读但不可写 AI(模拟量输入) 模拟量输入

Modbus寄存器广泛应用于工业控制系统中,用于监控和控制各种设备和传感器。例如:

  • 读取传感器数据:温度、压力、湿度等传感器的数据可以存储在输入寄存器中,通过读取这些寄存器获取传感器数据。
  • 控制输出设备:通过写入线圈或保持寄存器,可以控制电机、阀门和其他执行设备的状态。

Modbus协议使用功能码来指定要执行的操作。常用的功能码包括(这些功能码将在后续章节详细介绍):

  • 01 (0x01):读线圈状态。
  • 02 (0x02):读离散输入状态。
  • 03 (0x03):读保持寄存器。
  • 04 (0x04):读输入寄存器。
  • 05 (0x05):写单个线圈。
  • 06 (0x06):写单个保持寄存器。
  • 15 (0x0F):写多个线圈。
  • 16 (0x10):写多个保持寄存器。

寄存器地址分配

Modbus寄存器的地址分配如下表所示:

寄存器种类 modbus地址 简称 读写状态
线圈状态 0x0000-0xFFFF 0x 可读可写
离散输入状态 0x0000-0xFFFF 1x 只读
保持寄存器 0x0000-0xFFFF 4x 可读可写
输入寄存器 0x0000-0xFFFF 3x 只读

Modbus开发环境搭建

为了搭建开发环境,我们需要准备三款软件:

如下图所示,为了便于理解和调试Modbus,首推两个工具软件 Modbus从站模拟器 和 Modbus主站模拟器 ,分别代表 Modbus 主站设备 和从站设备;为了在一台PC上通信和调试,另外需要安装虚拟串口软件 Visual Serial Port Driver(即VSPD),用于连接主站设备和从站。借助此3种软件的帮助,可以先在PC上做一些基础实验,直观地观察通信数据,这是个很好的入门方法。

1754964670-2191-2-1

以上软件仅用于学习和评估,安装测试完毕后请删除或者购买正版软件。

Virtual Serial Port Driver 是一款虚拟串口软件,允许用户去模拟多串口,支持所有的设置和信号线,仿佛操作真正的COM端口。通过操作虚拟串口对,写入到一个虚拟COM端口的数据可以从另外一个COM端口读取,可以通过此种方式实现在两个串口程序之间交换数据,如下图所示;而且可以随时创建多个虚拟端口对,所以不会有串行端口短缺的困扰,不需要额外的硬件挤占用户的办公桌。

1754964670-9543-2-2

虚拟串口软件使用

打开软件后,点击右侧的“Add pair”即可添加一对串口,只有主站和从站即可使用这一对串口进行通信。创建完成后,可以在左侧的Virtual ports看到这一对刚刚创建的窗口。之后就可以把软件关闭了。

1754964670-5843-2-3

Modbus从站模拟器使用

主要功能介绍

Modbus Slave Emulator 支持多种 Modbus 协议(RTU、ASCII、TCP/IP、UDP/IP、RUT Over TCP、RUT Over UDP);您可以同时创建多个连接,并将多个从站设备加入网络,快速搭建您的测试平台。

主要功能包括:

  • 支持多种Modbus协议,包括:
    • Modbus RTU
    • Modbus ASCII
    • Modbus TCP/IP
    • Modbus UDP/IP
    • Modbus RTU Over TCP/IP
    • Modbus RTU Over UDP/IP
  • 监视串行线路或以太网上的通信数据
  • 支持按照业务类型对寄存器进行分组管理
  • 您可以在“测试中心”编写并发送您自己的测试字符串,并以十六进制数字检查从站返回的结果。
  • 支持多达 28 种数据格式,包括:Signed、Unsigned、Hex、Binary、Long、Float、Double、String等
  • 支持 Modbus 协议地址和 PLC 地址相互切换
  • 对任意数量寄存器中的数据绘制实时图表,监控数据的变化趋势
  • 支持同时创建多个连接网络和大量主站设备
  • 通过多个标签页进行管理,快速在主站设备之间进行切换
  • 通过表格的形式管理寄存器,支持添加变量名和注释,支持切换背景与前景颜色
  • 导出/导入从站设备寄存器数据到Excel
  • 内置字节转换工具,方便将Long、Float、Double类型数据转换为寄存器中的数据
  • 内置数据校验工具,支持 CRC、LRC 校验
  • 对从站进行压力测试,以了解系统如何处理负载
  • 支持丰富的 Modbus 功能码:
    • 01 (0x01) 读取线圈
    • 02 (0x02) 读取离散输入
    • 03 (0x03) 读取保持寄存器
    • 04 (0x04) 读取输入寄存器
    • 05 (0x05) 写单个线圈
    • 06 (0x06) 写单个寄存器
    • 08 (0x08) 诊断(仅限串口)
    • 11 (0x0B) 获取通讯事件计数器(仅限串口)
    • 15 (0x0F) 写入多个线圈
    • 16 (0x10) 写入多个寄存器
    • 17 (0x11) 报告服务器 ID(仅限串口)
    • 22 (0x16) 掩码写入寄存器
    • 23 (0x17) 读/写多个寄存器
    • 43 / 14 (0x2B / 0x0E) 读取设备标识

使用方法

打开软件后,点击上方的“新建连接”,在新建连接窗口中,连接模式选择“Serial Port”,并选择刚刚创建的虚拟串口COM1,然后点击确定。 1754964670-1229-2-4

每次新建连接,它会为我们自动创建一个从站,并配置一些寄存器。默认创建10个保持寄存器,并分到名为“RegisterGroup1”的寄存器组里。双击该寄存器组,我们就能看到这10个寄存器了。在这里我们可以为每个寄存器命名,每个寄存器相当于一个变量,我们可以为它自定义变量名。比如第一个寄存器代表电压值,第二个寄存器代表电流值。最后,我们选中连接并点击上方的“打开连接”按钮,现在从站处于启动状态,可以接收主站的命令了。

1754964670-1996-2-5

我们编辑前两个寄存器,给它们赋值12和3。一会主站即可读取到这两个值。

Modbus主站模拟器使用

主要功能介绍

和从站类似;Modbus Master Emulator 支持多种 Modbus 协议(RTU、ASCII、TCP/IP、UDP/IP、RUT Over TCP、RUT Over UDP);您可以同时创建多个连接,监控多个Modbus从站寄存器,快速调试您的从站设备。

使用方法

与从站类似,这次还是点击“新建连接”按钮,端口号那里选择“COM2”。然后点击确定,即可创建一个新的连接。

1754964670-3039-2-6

每次新建连接,它会为我们自动创建一个从站,并配置一些寄存器。默认创建10个保持寄存器,并分到名为“RegisterGroup1”的寄存器组里。双击该寄存器组,我们就能看到这10个寄存器了。点击上方的“打开连接”按钮,即可开始与从站进行通信,软件默认定期读取从站的所有寄存器。这里我们可以看到刚刚在从站那里配置的10个寄存器的值。

1754964673-1039-2-7

软件其他功能这这一章里就不一一介绍了,将放到后续章节讲解mdobus功能码时结合报文进行介绍。

1234118
 
Copyright © 2008-2021 lanxinbase.com Rights Reserved. | 粤ICP备14086738号-3 |