OPC-UA
OPC-UA(OLE for Process Control - Unified Architecture,IEC 62541)是工业自动化领域的标准通信规约。Kepware、Matrikon、Prosys、Ignition 等几乎所有 SCADA / 中间件产品都提供 OPC-UA 服务器功能。
由于大多数 PLC 本身不具备 OPC-UA 服务器功能,通常通过 Kepware 之类的网关软件将 PLC 数值以 OPC-UA 方式对外提供,而本网关则连接该 OPC-UA 服务器读取数值。
支持的 spec / 安全
本网关的 OPC-UA 客户端支持至 OPC UA 1.04 (IEC 62541:2020) —— 基于 Eclipse Milo 0.6.16 SDK。
- Transport:opc.tcp://(UA Binary encoding)
- Security:None / Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss 等标准策略
- User token:Anonymous / UserName+Password / X.509 Certificate
- Subscription:网关采用 polling 方式(
timecycle周期)—— 不使用 UA 的 MonitoredItem 订阅
注册表单输入项
| 输入栏 | 填写内容 | 示例 |
|---|---|---|
| IP 地址 | OPC-UA 服务器 PC 的 IP | 192.168.0.40 |
| 端口 | OPC-UA 服务器端口 | 49320(Kepware 默认)/ 4840(标准) |
| 用户 (User) | 在 OPC-UA 服务器中注册的用户 ID | kopens(因服务器而异) |
| 密码 | 该用户的密码 | *** |
| 服务器名称 (servername) | 端点末尾的服务器名称 | (Kepware 则留空) |
| 使用 Discovery | 是否自动检索服务器的端点 | 通常 false。不行时尝试 true |
| 使用 Subscription (subscription-enabled) | 以 server-push 模式替代 polling | 勾选时 true(对大量标签更高效) |
| Publishing (publishing-interval) | 服务器发布数据变更的间隔 (ms) | 1000(默认) |
| Sampling (sampling-interval) | 服务器采样数值的间隔 (ms) | 1000(默认) |
| Queue Size (queue-size) | 变更值累积队列大小(防止 notification 丢失) | 10(默认) |
用户 / 密码 两栏均留空时,将尝试以匿名(Anonymous)方式连接。服务器端需允许匿名连接。
标签的 PLC 地址表示法
OPC-UA 的标签地址通常称为 NodeId,格式如下。
| 表示法 | 说明 |
|---|---|
ns=2;s=Channel1.Device1.Tag1 | namespace 2,字符串标识符 —— Kepware 中最常见 |
ns=2;i=1234 | namespace 2,数字标识符 |
ns=3;g=09087e75-8e5e-499b-954f-f2a8624db28a | GUID 型 |
ns=是 namespace 编号。通常为2。s=之后填入 “Channel.Device.Tag” 形式的路径(与 Kepware 中创建的路径完全一致)。
如何获取 NodeId
- PLC 厂商 / Kepware 厂商手册 中通常附有映射表。
- 使用 UA Expert 等免费 OPC-UA 客户端直接连接,在树形结构中右键点击节点即可复制 NodeId。
- Kepware 自带的 OPC Quick Client 工具也可完成同样的操作。
Kepware 快速设置
以下是常用组合 Kepware 的操作步骤。
- Kepware Server → Project → 添加通道(例:
Simulator) - 添加设备(例:
Simulator)→ 型号 =16 Bit Device - 添加标签 → 名称
Sine1,typeFloat,scan rate100ms - 在 Project Properties → OPC UA → Server Endpoint 中启用端口
49320 - 启用匿名或用户账户
在本网关的注册表单中:
| 栏位 | 值 |
|---|---|
| IP | Kepware 服务器 PC 的 IP |
| 端口 | 49320 |
| 用户/密码 | 上面创建的账户(匿名则留空) |
| 标签 PLC 地址 | ns=2;s=Simulator.Simulator.Sine1 |
常见问题与解决
| 现象 / 消息 | 可能原因 | 解决 |
|---|---|---|
| “Connection refused” / 无法连接 | OPC-UA 服务器未启动或端口被阻断 | 确认 OPC-UA 服务器是否运行、IP/端口是否正确 |
| “User access denied” | 用户/密码错误,或服务器不允许匿名连接 | 在服务器注册用户或允许匿名 |
| “Security checks failed” | 服务器安全策略不匹配 | 将服务器安全策略设为 “None” 或 “Basic256Sha256” |
能连接但数值始终为 0 或 null | 标签 NodeId 拼写错误、namespace 编号不同 | 用 UA Expert 等验证同一 NodeId 是否真正可用 |
| 反复断开重连 | 网络不稳定,或服务器 PC 负载过高 | 巡检服务器 PC 资源 / 线缆 / 交换机 |
常用数据格式
| PLC 中的值 | 数据格式 | 格式辅助 | PLC 地址示例 |
|---|---|---|---|
| 开/关 | Boolean | (留空) | ns=2;s=Pump.Status |
| 整数 | Integer | (留空) | ns=2;s=Counter |
| 大整数 | Long | (留空) | ns=2;s=Total |
| 浮点数 (32-bit) | Float | (留空) | ns=2;s=Pressure |
| 浮点数 (64-bit,高精度) | Double | (留空) | ns=2;s=PrecisionTemp |
| 字符串 | String | (留空) | ns=2;s=Recipe.Name |
对于 OPC-UA,format 栏通常留空(由服务器提供数据类型)。
更详细的示例 / 自动化注册
如需通过脚本 / API 自动注册,请参考 高级 — REST API 页面中的 OPC-UA 示例。