OPCUA (Professional)

简介

OPCUA 是由 OPC 基金会维护的工业通信标准。大多数自动化设备提供商(如 PLC 和机器人制造商)都提供 OPCUA 服务器。有时 OPCUA 服务器直接集成在自动化设备中,有时需要在 PC 上安装专用软件。OPCUA 是工业 4.0 (Industry4.0) 的重要新兴标准。

更多信息请查看:

⚠️

OPCUA4Unity 既可作为独立资源使用,也是 realvirtual.io Professional 的一部分。与行为模型 (PLCInputs 和 PLCOutputs) 的连接以及信号在层级视图中的显示属于 realvirtual.io 框架的功能,OPCUA4Unity 独立资源中不包含这些功能。

安装

realvirtual.io Professional 和 OPCUA4Unity 两个资源均通过 Unity Asset Store 安装。

如果您使用 realvirtual.io 框架,安装后可在路径 game4automation/private/interfaces/OPCUA4Unity 下找到 OPCUA 接口。如果使用独立版本,可在 Asset 文件夹下的 OPCUA4Unity 路径中找到。

如果您使用 realvirtual.io Professional 版本,也可以独立于 realvirtual.io 使用 OPCUA4Unity。只需将整个 OPCUA4Unity 文件夹移动到新项目中即可。

演示模型

在子文件夹 DemoModel 中,我们提供了一个小演示,展示如何独立于 realvirtual.io 框架使用 OPCUA 接口。该演示模型使用 Unified Automation (https://www.unified-automation.com/downloads/opc-ua-servers.html) 提供的演示 OPCUA 服务器 (OPC UA C++ Demo Server V1.6.3 (Windows))。如果您先在 Unified Automation 注册,可以免费下载该 OPCUA 服务器。

接口配置

如果您使用 realvirtual.io,可以通过工具栏将 OPCUA 接口添加到场景中:

否则,您需要创建一个空的 GameObject 并将 OPCUA_Interface 脚本添加到该 GameObject 上。

对于该接口,您至少需要定义以下属性:

OPCUA 接口 Inspector
属性描述
Server IP服务器的 IP 地址,可以是本机上的演示服务器或外部设备
Server PortOPCUA 服务器的端口
Security Policy选择安全策略的下拉菜单 - 默认为 NONE
Path定义服务器的子路径(如 127.0.0.1/opcuaserver/)。如不需要则留空
Session Timeout Ms如果 OPCUA 服务器未发送响应时的会话超时时间(毫秒)
Top Node Id所有要导入的节点所在的顶级节点 ID。请注意,如果您想在自己的脚本代码中使用节点,则不需要导入节点。您可以在脚本中访问 OPCUA 服务器导入的任何节点。
Debug Mode设置为 true 时,控制台日志将显示额外的调试信息
Application NameOPCUA 应用程序名称
Appication URNOPCUA 应用程序 URN
Product URIOPCUA 产品 URI
Client Private CertificateStreaming Assets 文件夹中客户端私钥证书的路径(如果证书直接位于 StreamingAssets 中,请仅使用子路径或文件名)。如果不使用证书进行安全认证,请将此值留空。
Client Public CertificateStreaming Assets 文件夹中客户端公钥证书的路径。如果不使用证书则留空。
Username如果使用用户名和密码进行安全认证,则为 OPCUA 用户名。否则留空。
Password用户密码
Password Signature Algorithm密码签名算法(如果使用密码)。
Reconn... [截断]

Unity 事件

您可以为 OnConnected、OnDisconnected、OnReconnecting 和 OnReconnected 事件分配方法,以便在您的组件中获知 OPCUA 接口的状态。

连接故障排除

如果在连接 OPCUA 服务器时遇到问题,请按以下步骤操作。

  1. 创建您自己的测试模型。复制演示场景,并在不使用安全证书的情况下使用该配置。请将服务器设置为您的 OPC 服务器的 IP 地址(例如,如果服务器运行在同一台机器上,则为 127.0.0.1):
  2. 使用 OpcWatch 检查是否可以从您的机器访问服务器。在此位置下载 OpcWatch:

在运行 Unity 的计算机上启动 OpcWatch,并输入您的 OPCUA 服务器地址:\

  1. 使用 OpcWatch 检查是否能连接到您的 OPC 服务器。服务器状态应显示为已连接,并且您应该能够浏览子节点:

  1. 如果无法浏览服务器,请检查您的服务器配置。服务器应在不使用安全设置的情况下运行。首次测试时不应使用安全证书和密码。
  2. 如果仍然无法浏览服务器,请尝试在命令行中 ping 服务器(例如 ping 192.168.0.32)。如果 ping 没有响应,请检查防火墙设置。请关闭服务器和您计算机上的防火墙。
  3. 如果可以浏览服务器,请返回 Unity。再次检查 Unity 中模型的服务器地址是否与 OpcWatch 测试中的相同。打开演示模型并删除所有子节点。
  4. 选择您在 OpcWatch 中能够浏览到的节点 ID,将其输入到 OPCUA_Interface 配置的 Top Node Id 字段中。然后点击导入节点。
  5. 您现在应该能看到 OPC UA 服务器的子节点。在控制台中,您应该看到消息 "OPCUA Interface - connected to OPCUA server \[127.0.0.1] on port \[48010]"
  6. 在目标设备(Windows、Android、iOS)上编译应用程序并进行测试。
  7. 如果在目标设备上仍然无法连接,请使用工具查看目标设备上的日志文件,例如 https://assetstore.unity.com/packages/tools/gui/in-game-debug-console-68068
  8. 检查移动设备上的调试日志。日志消息应为您提供有关移动设备问题的线索。

生成您自己的应用程序证书

重要提示 目前不支持基于证书的认证和通信。我们正在努力解决此问题,并尽快找到解决方案。

导入 OPCUA 节点

配置好接口并且服务器可访问后,您可以从 OPCUA 服务器导入节点。

点击 Import Nodes,所有节点(在 Top Node ID 下)将被导入并生成为带有 OPCUA_Node 脚本的 GameObject:

OPCUA_Node 脚本显示从 OPCUA 服务器导入的节点信息:

OIPCUA 节点

使用 Read Node 按钮可以从服务器更新数据。

如果安装了 realvirtual.io 框架,还会创建所有对应的 PLCSignal。这些信号可以拖放到 realvirtual.io 框架的传感器或驱动上。

当您启动仿真时,OPCUA 信号将在 Unity 和 OPCUA 服务器之间交换。

使用 realvirtual.io PLCInputs 和 PLCOutputs 的 OPCUA 节点

ℹ️

本节仅适用于同时使用 realvirtual.io 和 OPCUA4Unity 的客户。OPCUA4Unity 包含在 realvirtual.io Professional 中。

OPCUA 接口在源代码中使用多个基于 Define realvirtual.io 的编译开关来定义 realvirtual.io 的特殊行为。在信号导入期间,所有导入的 OPCUA 节点都会添加对应的 PLCInputs 和 PLCOutput 信号。PLCOutputs 会自动订阅 OPCUA 服务器。PLCInputs 不应订阅,因为它们是由 Unity 发送到 OPCUA 服务器的。

带 realvirtual.io 信号的 OPCUA 节点

由于在大多数情况下无法确定 OPCUA 节点应该是 PLC 输入还是 PLC 输出,因此使用布尔值 Write Value(表示值写入 OPCUA 服务器)和 Read Value(表示值从 OPCUA 服务器读取)。基于此和数据类型,相应的 PLCInput 或 PLCOutput 脚本会被添加到 OPCUA 节点上。

ℹ️

无法同时将 OPCUA 节点定义为 PLCInput 和 PLCOutput。如果尝试这样做,日志中将显示警告消息,且不会添加 PLCInput 或 PLCOutput 脚本。如果要将一个节点同时用作输入和输出,您需要自行编写交互代码(见下文)。

可以在 OPCUA 接口配置中定义正则表达式 (RegEx),以在信号导入期间自动确定哪些 OPCUA 符号应被视为输入或输出。可以定义一个或多个正则表达式来匹配应被视为写入信号(即 PLCInputs 或从 Unity 输出)的符号名称或符号名称的一部分。

如果您更改了上述与 realvirtual.io 相关的任何设置,可以通过点击 Update nodes 按钮来更新所有已导入的节点。

轮询 OPCU 节点

订阅值通常是推荐的方法。但在某些情况下,轮询值可能更实用。轮询时,您可以为每个节点选择要在哪个周期获取数据。

要启用轮询,您应该禁用订阅。将轮询值设置为 true,并使用 PollCycleMs 以毫秒为单位指定轮询更新速率。如果输入 0,则每次 FixedUpdate 都会执行轮询,这可能会降低应用程序性能。

通过脚本使用 OPCUA 节点

您可以在 在线 API 类文档 中找到完整的 API 文档。

本节仅基于演示模型概述如何使用 OPCUA 节点。

读取值

您可以使用两种方法读取值。

直接读取

第一种方法(不推荐)是直接从 OPCUA 服务器读取,命令如下:


var myvar = Interface.ReadNodeValue ("ns=2;s=Demo.Dynamic.Scalar.UInt64")

您可以在 OPCUA_Node 脚本和接口本身上找到此方法。如果您的方法中有对接口的直接引用,可以这样做:


using UnityEditor;
using UnityEngine;
using realvirtual.io;

public class DemoReadNodeNotRecommended : MonoBehaviour
{
 
    public OPCUA_Interface Interface;
    public string NodeId;

    // Update is called once per frame
    void Update()
    {
        
        float myvar = (float)Interface.ReadNodeValue(NodeId);
    }
}
ℹ️

不推荐此方法,因为读取不是多线程执行的,可能会阻塞或减慢您的应用程序。

订阅节点值变更

这是推荐的方法。您应该注册到 EventOnConnected 事件,当接口连接后,您可以订阅节点变更。

示例如下:


public class DemoMoveCubeWithDelegate : MonoBehaviour
  {
      public OPCUA_Interface Interface;
      public string NodeId;
      public float PositionY;

      private OPCUA_Node node;
      private OPCUANodeSubscription subscription;

      // Start is called before the first frame update
      void Start()
      {
  
          if (Interface != null)
              Interface.EventOnConnected.AddListener(OnConnected);

      }

      public void OnConnected()
      {
          subscription = Interface.Subscribe(NodeId, NodeChanged);
      }
      
      public void
          NodeChanged(OPCUANodeSubscription sub, object obj) // 当节点 nodeid 的节点值变更时调用
      {
          PositionY = (float) obj; // 根据新值设置新位置 
      }

      // Update is called once per frame
      void Update()
      {
          transform.rotation = Quaternion.Euler(new Vector3(0, PositionY, 0));
      }
  }

写入值

您可以这样写入值:


bool success = Interface.WriteNodeValue ("ns=2;s=Demo.Dynamic.Scalar.Float",100)

© 2025 realvirtual GmbH https://realvirtual.io - 版权所有。未经出版商事先书面许可,不得以任何形式或任何方式(包括打印、保存、复印、录制或其他电子或机械方法)复制、分发或传播本出版物的任何部分。