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 上。
对于该接口,您至少需要定义以下属性:

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

连接故障排除
如果在连接 OPCUA 服务器时遇到问题,请按以下步骤操作。
- 创建您自己的测试模型。复制演示场景,并在不使用安全证书的情况下使用该配置。请将服务器设置为您的 OPC 服务器的 IP 地址(例如,如果服务器运行在同一台机器上,则为 127.0.0.1):
- 使用 OpcWatch 检查是否可以从您的机器访问服务器。在此位置下载 OpcWatch:
在运行 Unity 的计算机上启动 OpcWatch,并输入您的 OPCUA 服务器地址:\

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

- 如果无法浏览服务器,请检查您的服务器配置。服务器应在不使用安全设置的情况下运行。首次测试时不应使用安全证书和密码。
- 如果仍然无法浏览服务器,请尝试在命令行中 ping 服务器(例如 ping 192.168.0.32)。如果 ping 没有响应,请检查防火墙设置。请关闭服务器和您计算机上的防火墙。
- 如果可以浏览服务器,请返回 Unity。再次检查 Unity 中模型的服务器地址是否与 OpcWatch 测试中的相同。打开演示模型并删除所有子节点。
- 选择您在 OpcWatch 中能够浏览到的节点 ID,将其输入到 OPCUA_Interface 配置的 Top Node Id 字段中。然后点击导入节点。
- 您现在应该能看到 OPC UA 服务器的子节点。在控制台中,您应该看到消息 "OPCUA Interface - connected to OPCUA server \[127.0.0.1] on port \[48010]"
- 在目标设备(Windows、Android、iOS)上编译应用程序并进行测试。
- 如果在目标设备上仍然无法连接,请使用工具查看目标设备上的日志文件,例如 https://assetstore.unity.com/packages/tools/gui/in-game-debug-console-68068
- 检查移动设备上的调试日志。日志消息应为您提供有关移动设备问题的线索。
生成您自己的应用程序证书
重要提示 目前不支持基于证书的认证和通信。我们正在努力解决此问题,并尽快找到解决方案。
导入 OPCUA 节点
配置好接口并且服务器可访问后,您可以从 OPCUA 服务器导入节点。
点击 Import Nodes,所有节点(在 Top Node ID 下)将被导入并生成为带有 OPCUA_Node 脚本的 GameObject:

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

使用 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 服务器的。

由于在大多数情况下无法确定 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 - 版权所有。未经出版商事先书面许可,不得以任何形式或任何方式(包括打印、保存、复印、录制或其他电子或机械方法)复制、分发或传播本出版物的任何部分。