NI 提供了三种主要机制与 Modbus 设备进行接口:(1) 高级 OPC 服务器,(2) Modbus I/O 服务器,以及 (3) 在 NI LabVIEW 软件中通过 LabVIEW 实时或 LabVIEW 数据记录与监控控制(DSC)模块引入的低级 Modbus API。
LabVIEW Modbus API
当您的应用程序需要高度控制 Modbus 请求的顺序和时序时,低级 Modbus API 是首选选项。在灵活性至关重要的情况下,低级 API 通常也是首选。然而,LabVIEW Modbus API 提供的灵活性和功能也意味着您的应用程序代码必须更加复杂,以正确管理 API。为了帮助您理解这种复杂性,LabVIEW 提供了两个示例。
Modbus 入门示例
第一个示例,Modbus Library.lvproj,提供了 API 功能的基本概述。它还展示了 PC 和实时目标上的实现差异。图 1 显示了实时 Modbus 主机示例中的代码。
图 1:实时目标上的主机.vi
此示例展示了使用 LabVIEW API 的 Modbus 应用程序的核心要求。首先,创建一个 Modbus 实例。在本例中是一个 TCP 主机。然而,您可以通过更改多态实例选择器将此示例切换为串行主机。
图 2:更改 Modbus 主机的类型
创建实例后,您可以开始轮询从设备的数据。该示例显示了使用功能代码读取输入寄存器。API 支持的所有 Modbus 功能代码都显示在相应的调色板上。由于协议的实现,从 API 具有主机无法实现的附加功能。例如,从设备可以写入输入寄存器范围,而主设备只能从该范围读取。图 3 显示了功能代码。
图 3:显示功能代码的 Modbus 主机和从机调色板
最后,关闭 Modbus 实例,释放与实例关联的内存。这也会关闭任何引用,包括实例使用的 TCP 连接或 NI-VISA 串行引用。
目前只讨论了主机示例;然而,每个示例都遵循大多数 LabVIEW 用户熟悉的相同基本模式:打开、读/写和关闭。
最后,虽然 API 看起来相同,但理解关键区别很重要。如果您的设备是主机,它必须通过网络发送请求到相应的从设备以获取数据。另一方面,从设备有自己的本地数据存储,可以快速访问它。
冗余主机示例
基本示例可能适用于某些应用;然而,对于目标是与传感器或网关通信的复杂应用可能不够。为了弥合这一差距,提供了一个示例应用,展示了如何使用两个主机与给定的从设备通信。如果其中一个主机失败并与从设备或人机界面(HMI)失去连接,另一个主机将接管。
图 4:冗余主机示例的设计
如果此设计满足您的应用需求,或者您对更复杂的 Modbus 通信示例感兴趣,请在示例查找器中查看 Redundant Modbus Masters.lvproj。
Modbus I/O 服务器
Modbus I/O 服务器位于 LabVIEW DSC 和 LabVIEW 实时模块中,提供了一个高层引擎用于通过 Modbus 通信。与指定要发送的功能代码不同,您注册要访问的数据集,I/O 服务器会自动按照指定的速率调度请求。
要使用 I/O 服务器,您需要向项目中的目标添加一个新的 I/O 服务器。与低级 API 一样,您可以选择 Modbus 主机或从机,并且这会引导到额外的参数。例如,主机有一个定义的轮询速率——每个请求发送到从设备的速率,而从设备必须等待这些请求,没有预定义的时序。
创建 I/O 服务器后,您可以指定要读取的设备上的项目。与低级 API 不同,您必须自己生成和处理请求,Modbus I/O 服务器让您可以从多种格式和数据类型中选择。例如,您可以通过将变量映射到项目 400001 来读取地址 0 处的保持寄存器,通过选择 400001.1 来读取该寄存器的第一个位,并通过选择 F400001 来读取存储在寄存器 0 和 1 中的单精度浮点数。
选择要访问的变量后,您可以在框图上使用共享变量节点读取或写入这些变量。您甚至可以为变量名设置别名。
图 5:一个简单的 I/O 服务器应用程序
I/O 服务器应用程序所需的编程工作量最小且易于理解。请记住,这种易用性也带来了一些限制。数据仅在预定义的速率下更新,并且无法在运行时添加或删除请求的数据。如果这些限制对于您的应用程序是可以接受的,那么 I/O 服务器是推荐的跨平台选项。
有关更多信息和分步指南,请参阅 Connect LabVIEW to Any PLC With Modbus。
NI OPC 服务器与 OPC I/O 服务器或 OPC UA
对于涉及多个通过不同协议通信的从设备的复杂应用,标准的 Modbus I/O 可能不足。一个常见的解决方案是使用 OPC 服务器,作为所有系统的数据聚合器,然后使用 LabVIEW DSC 模块中包含的 OPC I/O 服务器与该 OPC 服务器通信。
图 6 显示了这种架构的一个示例,其中 NI OPC 服务器使用 Modbus 直接与传感器通信,并使用 OPC UA 与 CompactRIO 控制器通信。在 NI OPC 服务器中聚合数据后,OPC I/O 服务器可以检索数据并与 LabVIEW 应用程序共享。
图 6:使用 Modbus、NI OPC 服务器和 OPC I/O 服务器的 SCADA 应用程序
您还可以开发类似的架构,使用 OPC UA Toolkit(在 2017 版之前包含在 LabVIEW DSC 模块中)代替 OPC I/O 服务器。然而,OPC UA 驱动程序是一个低级驱动程序,并没有 OPC I/O 服务器提供的易用性。
要开发这样的应用程序,您必须首先生成一个有效的配置,以便 NI OPC 服务器与您的从设备通信。这是通过生成定义驱动程序配置的通道和定义该驱动程序的单个端点的设备来完成的。在配置设备后,您可以生成标签。
图 7:上述架构中 NI OPC 服务器的示例配置
在配置了 NI OPC 服务器之后,您可以配置 OPC I/O 服务器与这些标签通信。虽然 Modbus I/O 服务器被配置为访问寄存器,但 OPC I/O 服务器被配置为访问 OPC 服务器中的标签。
图 8:配置 OPC I/O 服务器
这个绑定过程会生成您可以在应用程序中使用的变量。
图 9:使用 OPC I/O 服务器的一个简单应用程序
完整的过程演示请参阅 Connect LabVIEW to Any PLC Using OPC。
满足您的应用需求
Modbus 是一种简单的协议,您可以通过各种方式使用它来实现强大的应用程序。
对于 Modbus 通信,NI 提供了三种主要选项,可以提供广泛的功能以满足您的应用需求。首先,低级 API 提供了对协议的精细控制,具有高性能,但易用性较差。使用低级 API 时,一切都必须手动完成。对于简单的监控应用,Modbus I/O 服务器提供了一个更简单易用的 API 来访问或提供 Modbus 数据。为易用性付出的代价是 I/O 服务器放弃了对某些应用所需的协议的严格控制。最后,对于大型和复杂的系统,考虑使用全功能的 OPC 服务器作为数据聚合器可能是有益的。然后,只需使用 LabVIEW OPC UA Toolkit 或 OPC I/O 服务器来为您的应用程序提供对这些数据的访问。