在这篇文章中,通过将 S7-1500 设置为具有专用服务器接口和用户身份验证的 OPC UA 服务器来学习如何使用 OPC UA 在两个 PLC 之间进行通信。
OPC UA 是用于工业通信的开放式数据交换标准。它描述了一种用于从机器到机器或从机器到 PC 交换数据的协议。OPC UA 是 Open Platform Communications Unified Architecture 的缩写,顾名思义,是一种独立于制造商、系统供应商和编程语言的通信协议。
在这个演示中,我们将学习如何实现 OPC UA 用于 PLC 到 PLC 的通信,也称为水平通信。但这并不是 OPC UA 的唯一应用——它还用于 PLC 与更高级别系统(如 SCADA 和 MES)之间的通信,也称为垂直通信。
在更新的固件版本中,S7-1500 PLC 还具有内置的 OPC UA 客户端。此 OPC UA 客户端可用于与条码扫描仪和打印机等从属设备进行垂直集成。使用 OPC UA 与这些设备通信的 PLC 可以从条形码扫描仪检索条形码或将数据发送到打印机进行打印。
OPC UA 的优势
OPC UA 服务器接口
OPC UA 的主要优势在于它独立于制造商。OPC UA 提供了一种在任何制造商制造的设备之间交换数据的开放方式,而无需使用网关设备将通信从一种专有格式转换为另一种。许多制造商支持Modbus/TCP和TCP/IP等其他通信协议 ,但 OPC UA 正迅速成为工业通信的首选通信协议。
由于 OPC UA 基于 TCP/IP,因此可通过以太网进行路由。这意味着不在同一子网中的设备可以通过使用路由器相互通信。其他工业协议(如I-Device 通信)受到限制,因为它们无法通过以太网路由,因此只能用于同一子网中的设备之间的通信。
OPC UA 具有内置诊断功能,因此可以在用户程序中检测和处理通信错误。诊断对于在监控系统时解决通信问题也很有用。
与旧协议不同,OPC UA 支持使用优化的数据块进行数据交换。这意味着您可以遵循 Siemens 的建议,在两个 PLC 之间进行通信时专门在用户程序中使用优化的数据块。
虽然 OPC UA 不是像PUT/GET那样的单面通信协议,但服务器 PLC 不需要编程。服务器 PLC 只是将数据提供给第三方。这使得使用 OPC UA 在两个 PLC 之间设计数据交换变得非常容易。
关于从服务器 PLC 公开数据的主题,OPC UA 支持使用配套规范要求。OPC 配套规范是一种订购数据的方式,以便以结构化格式将其提供给客户端。当客户端浏览服务器公开的数据时,数据以结构化方式呈现,标准数据采用标准格式。配套规范通过确保仅公开特定数据来帮助在 OPC UA 连接中提供一些安全性。
当然,由于 OPC UA 是一种现代协议,因此 OPC UA 通信可以通过现代互联网标准安全性得到保护。可用于 OPC 通信的安全机制包括数据的加密和数字签名,以确保传输的数据不会被恶意第三方拦截、读取或修改。
OPC UA 的缺点
由于 OPC UA 是一种现代的跨平台通信协议,因此使用 OPC UA 进行 PLC 到 PLC 通信几乎没有缺点。我能想到的唯一缺点不是与 OPC UA 本身有关,而是与在 TIA Portal 中启用 OPC UA 服务器的方式有关。
在 TIA Portal 中启用 PLC 中的 OPC UA 服务器时,默认情况下,PLC 中的所有数据都会在没有安全性的情况下公开。这意味着在您启用 OPC UA 后,任何 OPC UA 客户端都可以立即连接到 PLC 并浏览和修改该 PLC 中的任何数据,包括数据块、实例数据块、输入、输出和内存位。
这实际上比 PUT/GET 等传统通信协议更糟糕,因为 OPC UA 象征性地公开来自 PLC 的数据。由于数据是象征性地公开的,因此恶意行为者可以象征性地浏览标签,以更清楚地了解他们正在访问的确切数据。
好消息是,正确设置后,OPC UA 是一种非常安全的通信协议。在接下来的部分中,我将向您展示如何设置 OPC UA 通信以在两个 PLC 之间交换数据,以及如何保护该通信以确保恶意行为者不会干扰通信中涉及的系统。
演示
在此演示中,两个 PLC 将通过 OPC UA 交换数据。PLC_2 充当 OPC UA 服务器,将数据公开给 PLC_1,即 OPC UA 客户端。随着演示的进行,我们将逐步提高通信的安全性。
在 TIA Portal 中,我创建了一个新项目,添加了两个 PLC,并运行了安全向导。
配置服务器
在 PLC_2 中,我将启用 OPC UA 服务器。由于 OPC UA 是许可产品,我需要在 Properties > General > Runtime Licenses 中选择我为 PLC 购买的运行时许可类型。在下拉列表中选择购买的许可证类型。目前,您无需提供实际购买许可证的证明,尽管这在未来可能会发生变化。
所需的许可证类型取决于您使用的 CPU。您可以在此SIOS 条目中查看 PLC 需要哪种类型的许可证。
在 TIA Portal 中选择 OPC UA 运行时许可证
接下来,我通过激活“属性”>“常规”>“OPC UA”>“服务器的可访问性”下的复选框“激活 OPC UA 服务器”来启用 PLC_2 中的 OPC UA 服务器。将弹出一条警告,强调必须正确保护 OPC UA 服务器。仔细阅读后单击“确定”关闭此警告。
激活 OPC UA 服务器
如果您向下滚动到此窗口的服务器地址部分,您将看到我们有两个 OPC UA 服务器地址。这是因为此 PLC 有两个端口,并且为这两个端口启用了 OPC UA 服务器。
OPC UA 服务器地址
安全检查 #1
现在,OPC UA 服务器已启用。任何 OPC UA 客户端都可以浏览到该 PLC 并访问通过 OPC UA 服务器公开的数据。这包括输入、输出、内存地址和 DB。
为了演示这一点,我在 PLC 中创建了一些输入和输出,并在硬件配置中启用了时钟字节。下载这些更改后,我启动了免费的 OPC UA 客户端UAExpert来浏览 PLC。
在UAExpert 中,我单击服务器> 添加并切换到高级选项卡。在这里,我可以输入我从 PLC_2 的硬件配置中复制的 OPC UA 服务器的端点 URL。单击“确定”添加服务器。
在 UA Expert 中配置 OPC UA 服务器
OPC UA 服务器被添加到左侧窗格中的项目树中。右键单击服务器并选择连接以连接到 OPC UA 服务器。
连接到 OPC UA 服务器
弹出一个错误窗口,通知我们 PLC_2 OPC UA 服务器提供的安全证书存在问题。单击信任服务器证书以忽略这些警告。
信任 OPC UA 服务器证书
最后,单击继续连接到 OPC UA 服务器。
单击继续连接到 OPC UA 服务器
通过连接到 OPC UA 服务器,我们可以浏览左侧地址空间窗格中公开的数据。您可以在这里看到,我们可以象征性地浏览公开的数据,并查看在 PLC 中配置的所有输入、输出和内存区域。
我已经选择了输入、输出和内存位并将它们拖到 UA Expert 的中心窗格中。
浏览 OPC UA 服务器中的标签
现在我可以监控这些标签的值了。我还可以通过双击它们来修改标签的值。在这里,您可以看到我已将输出 Q_01_01_M11_MTR 修改为 True。
从 OPC UA 服务器写入标签
这是一个非常危险的情况——任何 OPC UA 客户端都可以连接到这个 PLC 来查看和修改任何数据。事实上,这种情况不如使用PUT/GET安全,因为 OPC UA 象征性地公开数据,因此恶意行为者很容易通过 OPC UA 客户端找到将对系统造成最大破坏的数据。
配置服务器接口
我们可以通过仔细选择向 OPC UA 客户端公开哪些数据来提高 OPC UA 服务器的安全性。
为此,我们需要在 PLC_2 的硬件配置中禁用标准服务器接口。标准服务器接口是将来自 PLC 的所有数据公开给 OPC UA 客户端的服务器接口。您可以在属性 > 常规 > OPC UA> 标准服务器接口(SIMATIC 命名空间)中禁用此服务器接口:
禁用标准 SIMATIC 服务器接口
关闭此服务器接口后,我们可以创建一个新的服务器接口,将 PLC 中的特定数据公开给 OPC UA 客户端。
要添加新的服务器接口,请双击项目树中 PLC_2 > OPC UA 通信 > 服务器接口下的添加新服务器接口按钮。为您的服务器接口命名,然后单击确定以创建接口并打开服务器接口编辑器。
添加新的 OPC UA 服务器接口
在 Server Editor 窗口中,您有两个窗格。在左窗格中,您有 OPC UA 服务器接口命名空间。此命名空间定义了 OPC UA 客户端可访问的所有数据。OPC UA 客户端只能浏览此命名空间中的数据。在右侧,您可以将项目的 OPC UA 元素添加到 OPC UA 服务器接口命名空间中。
要将项目中的元素添加到 OPC UA 服务器接口命名空间,您只需将它们从左侧拖放到右侧窗格即可。在此示例中,我已将光电管输入和时钟位标记添加到服务器接口名称空间。
向 OPC UA 服务器接口添加标签
我将下载这些更改并切换回UAExpert OPC UA 客户端以查看这些更改。
安全检查 #2
回到UAExpert,我已经断开并重新连接到OPC UA 服务器。现在我看到数据不再直接通过 PLC 公开,而是我们选择公开的标签通过名为 Server_Interface_1 的新文件夹公开。这是我们在 TIA Portal 中创建的服务器接口命名空间。
当您展开此文件夹时,您会看到它包含我们选择公开的所有数据。再一次,我们可以监控和修改通过这个服务器接口命名空间暴露的数据的值。
OPC UA 客户端中的服务器接口命名空间
现在,我们通过限制向 OPC UA 客户端公开的数据的数量和类型,使连接更加安全。在下一节中,我们将通过实施身份验证来进一步提高连接的安全性,以便只有具有正确用户名和密码的设备才能连接到服务器。
配置身份验证
访客身份验证允许任何客户端访问 OPC UA 服务器,而无需在密码中提供用户名。为了实现身份验证,我们希望在 OPC UA 服务器中禁用访客身份验证。您可以在 TIA Portal 中通过取消激活“常规”>“OPC UA”>“访客身份验证”下 PLC 属性中的“启用访客身份验证”复选框来执行此操作
禁用 OPC UA 服务器的访客身份验证
在本节下方,我们可以通过激活“启用用户名和密码身份验证”复选框来启用用户名和密码身份验证。使用用户名和密码启用身份验证后,您可以定义 OPC 客户端将用于连接到 OPC 服务器的用户名和密码。
为 OPC UA 服务器启用身份验证
安全检查#3
将更改下载到 PLC 后,我可以返回到UAExpert 并断开并重新连接到 OPC UA 服务器。这次当我尝试连接时,我看到抛出“BadIdentityTokenInvalid”错误。这是因为 OPC UA 服务器不再允许访客身份验证
BadIdentityTokenInvalid 错误
我们可以在服务器连接属性中配置用于连接到 OPC UA 服务器的用户名和密码。要访问服务器连接属性,请右键单击 OPC UA Demo 并选择 Properties。
服务器连接属性
在身份验证设置部分,您可以提供用户名和密码以连接到 OPC UA 服务器。您可以选择存储这些凭据,这样您就不必在每次连接到 OPC UA 服务器时都提供它们。
UA Expert 中的身份验证设置
为 OPC UA Server 提供正确的用户名和密码后,您可以再次连接、浏览服务器接口命名空间中的标签、监控和写入标签值。
现在我们已经采取措施保护 OPC UA 服务器,让我们配置 OPC UA 客户端,看看我们如何使用 OPC UA 进行 PLC 到 PLC 的通信。
配置 OPC UA 客户端
在 PLC_1 中,我在常规 > OPC UA > 客户端下的 PLC 属性中激活 OPC UA 客户端。
激活 OPC UA 客户端
同样,我们必须在 PLC 属性中的 General > Runtime Licenses > OPC UA 下指定购买的许可证类型。
就像 OPC UA 服务器有一个服务器接口一样,OPC UA 客户端也有一个客户端接口。通过双击项目树中 PLC_1 > OPC UA 通信 > 客户端接口下的“添加新客户端接口”,为 PLC_1 添加客户端接口。名为 Client_Interface_1 的客户端接口会自动创建并打开。
添加客户端接口
在编辑器的底部窗格中,提供 OPC UA 服务器的 IP 地址和端口(如果已修改)。您将看到带有新信息的服务器地址更新。
配置服务器 IP 地址
在“安全”选项卡中,向下滚动到“用户身份验证”部分。在用户身份验证下拉菜单中,选择“用户名和密码”。在以下两个框中,提供您之前在 OPC UA 服务器中配置的用户名和密码。
为 OPC UA 客户端设置安全性
完成这些更改后,将它们下载到 PLC。
配置数据交换
接下来,我们可以指定 OPC UA Server 和 Client 之间的数据交换。在“OPC UA 客户端接口”树中,您可以看到有各种数据访问选项,包括读取列表、写入列表和方法列表。读取列表包含从 OPC UA 服务器读取的数据,写入列表包含写入 OPC UA 服务器的数据。在此演示中,我们将从 OPC UA 服务器读取数据。
双击“添加新阅读列表”以创建并打开一个名为“阅读列表_1”的新阅读列表。
创建一个新的阅读列表
现在,我们要将来自服务器接口命名空间的数据添加到读取列表中。
我们可以通过以 XML 格式从 PLC_2 导出服务器接口名称空间并将其导入回 PLC_1 中的客户端接口来实现此目的。如果与服务器的在线连接可用,一个更简单的选择是浏览 OPC UA 服务器接口命名空间的数据。为此,请从 OPC UA 服务器接口源下拉列表中选择在线 [],然后单击“在线访问”以浏览 OPC UA 服务器接口。
浏览 OPC UA 服务器接口
在打开的对话框中,粘贴 OPC UA 服务器的地址,然后单击“查找所选服务器”。找到服务器后,选择安全级别“无安全性”并指定正确的用户身份验证类型以及用户您之前创建的名称和密码。最后,单击“连接”以连接到 OPC UA 服务器。
连接到 OPC UA 服务器
在弹出框中,单击“是”选择信任 OPC UA 服务器的证书。
如果一切顺利,您应该能够在 OPC UA 服务器界面窗格中看到 OPC UA 服务器公开的数据。从这里,您可以将要使用的数据拖到 OPC UA 客户端的读取列表中。在此示例中,我将 Clock_1Hz 布尔标记带到客户端的读取列表中。
将数据添加到 OPC UA 客户端读取列表
最后,我们需要轮询数据。为此,我将使用指令 > 通信 > OPC UA > OPC UA 客户端下的 OPC_UA_ReadList_C 块。这是一个紧凑的通信块,这意味着它与 OPC UA 服务器建立连接并处理数据交换。
在 Main OB 中创建对指令的调用并启动配置向导。
OPC_UA_ReadList_C 的配置向导
按照配置向导中的步骤参数化模块并设置 REQ 引脚以循环轮询来自服务器的数据。如果配置正确,您应该会看到块更改值的 STATUS 引脚以表明正在接收数据。
完成参数化 OPC_UA_ReadList_C
现在,如果我跟踪从服务器接收到的数据(在“Client interface_1_Data”.“Read list_1”.Variable.Clock_1Hz 中可用),我可以看到正在从 OPC UA 服务器接收和更新数据
OPC UA 数据跟踪
总结
在这篇文章中,介绍了 OPC UA,并解释了使用 OPC UA 作为 PLC 系统中水平和垂直通信的通信协议的一些优点和缺点。
展示了如何使用 OPC UA 在两个 PLC 之间进行通信。在此过程中,学习了如何将 S7-1500 PLC 设置为 OPC UA 服务器,以及如何使用服务器接口和用户身份验证正确保护服务器连接。
还学习了如何将 S7-1500 PLC 配置为 OPC UA 客户端以及如何使用来自服务器的数据。