跳到主要内容

OPC-UA 节点

您可以通过像 node-red-contrib-opcua 这样的社区节点直接与 外部 OPC-UA 服务器(Kepware, Ignition, 其他网关)进行通信。连接到网关自身的 OPC-UA 服务器时也使用相同的节点 (opc.tcp://127.0.0.1:12000/opcua, NodeId ns=2;s=...)。

连接内置 OPC-UA 服务器时

直接复制屏幕菜单 OPC UA 服务器 › 服务器信息选项卡中的 TCP 终点 URL 和 NodeId 使用。详情请参考 使用 OPC UA 服务器。


1. 节点类型 (node-red-contrib-opcua)​

节点用途
OpcUa-Endpoint服务器连接信息 (host/port/security/auth) — 创建一次后由其他节点共享
OpcUa-Item单个节点定义 — 将 nodeId 转换为输入
OpcUa-ClientRead / Write / Browse / Method call 的主操作节点
OpcUa-Subscribe订阅变更事件 (MonitoredItem) — 通过 push 接收而非轮询
OpcUa-Event订阅 OPC-UA Alarm & Event

2. 创建 Endpoint​

双击 OpcUa-Client 节点 → Endpoint 栏旁的铅笔图标 → 新建 endpoint:

项目值 (以网关内置服务器为准)
Endpointopc.tcp://127.0.0.1:12000/opcua
Security PolicyNone (内部) 或 Basic256Sha256 (外部运行)
Security ModeNone / Sign / Sign & Encrypt
LoginOPC UA 服务器页面的 Username/Password 或 Anonymous (若允许)

3. Read / Write 模式​

inject ─▶ OpcUa-Item (nodeId, msg.payload type) ─▶ OpcUa-Client (READ/WRITE) ─▶ debug

OpcUa-Item:

项目值
Itemns=2;s=SITE_00001.OPC_00303.TAG_TEST_00042
DataTypeInt32 (必须与实际标签数据类型一致 — 不匹配时报 BadTypeMismatch)

OpcUa-Client:

项目值
ActionREAD 或 WRITE
Endpoint上面创建的 endpoint

在执行 WRITE 时,请在 OpcUa-Item 节点之前使用 change 填充像 msg.payload = 9999 这样的值。


4. Subscribe — 仅接收变更而非轮询​

相比轮询 (周期性 read),Subscribe 的效率更高。如果没有变更则没有流量,且延迟在微秒级。

inject (once after deploy) ─▶ OpcUa-Item ×N ─▶ join (배열) ─▶ OpcUa-Subscribe ─▶ debug / function

OpcUa-Subscribe:

项目值
ActionSUBSCRIBE
Interval建议 100 ms (服务器通知客户端的最小周期)
Queue size10 (服务器过载时的缓冲区)

接收到的消息包含 msg.payload(值) + msg.topic(NodeId) + msg.timestamp。


5. Browse — 节点树自动探索​

适用于像 KEPServerEX 这样有数百/数千个节点的场景,用于确认“存在哪些 NodeId”。

inject ─▶ OpcUa-Client (action=BROWSE, msg.payload="ns=2;i=85") ─▶ debug

响应结果为子节点的 [ {nodeId, browseName, displayName, ...} ] 数组。可以通过 function 对其进行加工,构建自动注册流。


6. 常见陷阱​

现象原因 / 解决方法
BadIdentityTokenInvalid用户/密码错误或证书未信任。在服务器控制台中将客户端证书处理为 Trust
BadTypeMismatchOpcUa-Item 的 DataType 与实际节点类型不符
频繁出现 连接断开 消息Endpoint URL 的主机域名与证书 CN 不符 — 重新颁发证书或将 URL 的主机 与证书 CN 统一
Subscribe 仅触发一次OpcUa-Subscribe 仅需“注册”一次。inject 的 once after deploy 选项仅使用 1 次

7. 下一步​