跳到主要内容

OPC-UA 节点详解

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

接入内置 OPC-UA 服务器时

在界面菜单 OPC-UA 查看器 中直接复制 TCP Endpoint URLNodeId 使用。详见 使用 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
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:

项目
ActionREADWRITE
Endpoint上面创建的 endpoint

WRITE 时,请在 OpcUa-Item 节点前用 changemsg.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. 下一步