OPC UA 服务器
网关本身内置了 OPC-UA 服务器,可将采集到的标签值原样暴露给外部 OPC-UA 客户端(SCADA, HMI)。本页面涵盖了该内置服务器的 连接信息 · 安全设置、节点树(标签列表 + 实时值 + 时序)、连接状态 · 客户端证书 · 客户端连接证书 · 账户,所有内容均在同一个画面(共六个标签页)中管理。

| 编号 | 位置 | 内容 |
|---|---|---|
| ① | 标签页栏 | 六个标签页 |
| ② | 状态卡片 | 服务器状态 · 会话 · 订阅 · 暴露节点数 |
| ③ | 端点 | TCP / TLS 连接 URL 及提供的安全策略 |
| ④ | 安全 | 匿名访问 · 无安全端点 · 客户端证书 · 账户 |
| ⑤ | 服务器证书 | 主体 · 指纹 · 有效期, [下载 (.der)] |

| 编号 | 位置 | 内容 |
|---|---|---|
| ① | 节点树 | 엣지 → OPC → 태그, 连接状态点和最新值 |
| ② | 面板头部 | CSV 图标 — 下载地址空间 |
| ③ | 节点详情 | 所选节点的详细信息和时序 |
- 实现: Eclipse Milo 1.1.8
- 传输: 仅
opc.tcp(UA Binary)。端点路径为/opcua—opc.tcp://<호스트>:12000/opcua(TCP 端口) ·opc.tcp://<호스트>:12443/opcua(«TLS» 端口)。12443 同样不是 HTTPS,而是 带有安全策略的 opc.tcp - 安全策略: Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss — 分别对应 Sign · SignAndEncrypt,两个端口均支持
- None (无安全): 当
opc.ua.server.security.none=yes(默认) 时,仅在 TCP 端口 打开会话端点。根据规范,Discovery(/opcua/discovery) 始终为 None,但无法开启会话 - 用户令牌: Anonymous (
opc.ua.server.anonymous=yes, 默认) / UserName+Password / X.509 (仅限服务器信任列表中的证书) - 服务器证书: 首次启动时通过自签名(RSA 2048) 创建并存放在
$PE_DATA_DIR/pp-data/opcua/— 升级后仍保留同一证书及信任列表 - PubSub: 不支持 — 如需发布功能,请使用 Sparkplug B
点击左侧菜单 OPC UA 服务器 图标或直接通过 http://<gateway>/ui/opcua 进入。
1. 画面构成
画面头部由六个标签页组成。如果在 URL 末尾加上 #server · #nodes · #sessions · #certs · #client-certs · #accounts,可直接打开对应标签页;否则将打开该浏览器最后访问的标签页。
| 标签页 | 内容 |
|---|---|
| 服务器信息 | 服务器状态 · 运行时间,当前会话 · 订阅 · 暴露节点数。外部客户端连接所需的 TCP / TLS 端点 URL(复制按钮) 及各端点实际提供的安全策略标识。匿名访问 · 无安全端点的开关, 客户端证书 · 账户数量, 服务器证书(主体 · SHA-1 指纹 · 有效期 · 密钥) |
| 节点 | 左侧 节点树(엣지 → OPC → 태그, 每个 OPC 的 连接状态点(悬停显示状态名称) 和标签数量, 每个标签的 最新值) 与右侧 节点详情(元数据 + 实时值 + 若为数值/布尔标签则显示 时序图表)。通过面板头部的 CSV 图标下载地址空间 |
| 连接状态 | 当前会话 · 订阅 · 监控项数量, 被拒绝的连接数, 会话列表 |
| 客户端证书 | 尝试建立安全通道的客户端证书的 已拒绝 · 已信任 列表, [信任] [移至拒绝列表] [删除], 服务器证书 [下载 (.der)] |
| 客户端连接证书 | Edge 作为客户端 连接到外部 OPC UA 服务器时使用的证书。参考 OPC UA 协议 |
| 账户 | 默认管理员 + 附加账户(只读 / 读写) 管理 |
端点 URL 的主机为 opc.ua.server.domain。若该值为回环地址(127.0.0.1 · localhost · 0.0.0.0, 安装默认值),则系统会根据浏览器访问的主机自动生成 URL — 以防止远程复制的 URL 指向用户本地 PC。
2. NodeId 约定
每个标签通过以下 OPC-UA NodeId 形式暴露。地址空间的根为 Edge ID (Objects 之下),其下为 OPC(连接) 文件夹,再下为标签。
ns=2;s=<EDGE_ID>.<OPC_ID>.<TAG_ID>
例: ns=2;s=EDGE_00303.OPC_00303.TAG_TEST_00042
- 若标签包含 标签组,则挂在 OPC 文件夹下的
GROUP.<그룹>文件夹中,但标签的 NodeId 保持上述格式不变。 - 每个 OPC 文件夹下都有
_Status文件夹,并每 2 秒提供一次Connected·State·LastError·LastCollectedAt·CycleMs(只读)。 - 若
edge.id为空或不符合EDGE_+ 大写字母 · 数字 ·_格式,则不会生成名称且无法启动 OPC-UA 服务器(记录 ERROR 日志)。
旧版本的 NodeId 为 EDGE.<SITE_ID>.<OPC_ID>.<TAG_ID>。现在根节点为 Edge ID 且取消了站点层级。由于没有兼容别名,升级后需重新配置 SCADA 侧的 NodeId。
外部客户端(UaExpert, KEPServerEX, Ignition 等) 可直接使用此 NodeId 进行订阅。详情面板的 NodeId 右侧设有 复制 按钮,方便将 ID 复制到剪贴板。
3. 节点树 — 搜索 / 刷新
- 在树顶部的搜索栏输入文本,可对树 · OPC · 标签名称进行 实时部分匹配 过滤。若匹配项在子节点中,则父节点(OPC, Edge) 也会自动展开显示。
- 画面头部的刷新(↻) 按钮 — 重新获取树及各标签页的信息。由于平时会自动更新,极少需要手动点击。
- 每行的 ◂/▾ 切换按钮可折叠/展开子树。搜索激活时为展示匹配项会自动展开,清空搜索后将恢复至之前的折叠状态。
- 长值自动省略 (ellipsis) — 当树节点的 当前值 超过列宽时,将以
text-overflow: ellipsis形式进行…处理。鼠标悬停时通过 tooltip 显示完整文本 — 这是为了防止 JSON / 较长的 STRING 值破坏树布局的保护机制。
树中显示的值在 节点标签页可见期间每 2 秒 自动更新一次 (/ui/opcua/tree)。树结构、展开状态、右侧详情及图表将保持不变。
4. 节点详情 + 时序图表
点击标签行将在右侧显示以下内容:
- NodeId (可复制)
- Tag ID / DataType / PLC Address / Alias / Description
- Value (当前值 + 最后更新时间, 精确到 ms)
- Status (
OK/ERROR (메시지))
图表类型根据值类型自动切换。
4.1 数值 / 布尔 (ECharts 折线图)
若值为 数值型(Integer/Long/Float/Double 等) 或 布尔型,则绘制 ECharts 时序折线图。
| 图表功能 | 说明 |
|---|---|
| 范围选择 | 通过图表右上角组合框选择 1분/5분/10분/30분/1시간(default)/3시간/12시간/24시간 — 立即获取 Cassandra(tm_tag_point) 的历史数据并重新绘制 |
| dataZoom 滑块 | 图表底部灰色调(浅灰色) 拖动条 — 水平缩放(zoom) / 平移(pan) |
| 自动添加 | 每 2 秒一次的轮询将新值添加到图表中 |
| Tooltip | 鼠标悬停时显示 ms 单位的时间 + 数值 |
| 布尔型 | 以 step end 形式(阶梯状) 可视化 0/1 切换 |
| 采样 | 最多保留 5,000 个点,超出后从最旧的点开始删除 (lttb 下采样) |
4.2 STRING (vis-timeline 范围图)
若值为 STRING,则绘制 vis-timeline 的 range box 图表 代替 ECharts 折线图 — 该形式将相同值连续的区间合并为一个方块,在视觉上强调 状态变化时点。
| 项目 | 说明 |
|---|---|
| 方块 = 相同值连续区间 | 例: "RUNNING" 在 12:00~12:35 期间保持不变,则该区间为一个方块 |
| 方块颜色 | 基于值哈希自动生成 — 相同文本始终为相同颜色 |
| 方块标签 | 值原文 (较长时悬停显示全部) |
| 时间轴 zoom/pan | vis 基础交互 (鼠标滚轮 / 拖拽) |
| 更新 | 轮询时将 history 按 ASC 排序并重构整个数据集 (波动较小时无闪烁) |
| 切换节点时 | 通过 disposeStringTimeline() 销毁实例 + 重新创建新节点的图表 |
STRING 图表适用于直观查看如 状态机 日志(
READY → RUNNING → ERROR → IDLE) 等非数值时序数据。相同色调方案同样适用于 查看标签值趋势 (tag-view)。
5. Edge 系统标签
树中会自动显示一个名为 OPC_SYSTEM_<EDGE_ID> 的系统连接。这里汇总了 38 个将网关自身状态暴露为 OPC-UA 节点的系统标签,标签 ID 为 TAG_<EDGE_ID>_90000 ~ TAG_<EDGE_ID>_90037。
代表性标签:
| 标签名称 | 含义 |
|---|---|
THREAD_COUNT | JVM 线程数 |
TAG_COUNT | 注册标签总数 |
SERVER_STARTED_TIMESTAMP | Edge 启动时间(epoch ms) |
PLC_CON_CONNECTED_COUNT | 当前连接的连接(OPC)数 |
MEMORY_USED_PERCENT | 内存使用率(%) |
系统连接的 连接状态 始终显示为 CONNECTED (因是自身,无连接概念),且不存在 _Status 文件夹。
6. 配合外部客户端使用 — 流程
- 在 服务器信息 标签页复制端点 URL (例:
opc.tcp://<gateway>:12000/opcua)。若去掉路径/opcua则无法连接 — 服务器将以BadTcpEndpointUrlInvalid拒绝 HELLO 请求。 - 在 UaExpert / KEPServerEX 等 OPC-UA 客户端中添加新服务器 → 输入上述 URL → 选择安全策略。
- 若开启了 无安全端点,可以通过 TCP 端口以
None方式连接。 - 使用安全策略(如 Basic256Sha256) 连接时,服务器最初会拒绝客户端证书。在 客户端证书 标签页的 已拒绝 列表中将指纹与 SCADA 侧证书核对后点击 [信任] — 无需重启,下次连接起生效。若客户端也需信任服务器证书,可通过 [下载 (.der)] 获取并导入。
- 若开启了 无安全端点,可以通过 TCP 端口以
- 认证模式:
- Anonymous — 若服务器信息标签页中开启了 匿名访问,则直接连接。匿名会话 仅限读取。
- Username / Password — 默认管理员(
opc.ua.server.user/opc.ua.server.password) 或 账户 标签页中的附加账户。 - X.509 — 仅接受存在于服务器信任列表中的证书。
- 连接后,直接订阅 NodeId 为
ns=2;s=...格式的标签。
7. 账户 · 写入
- 默认管理员(
opc.ua.server.user/password) 具有 读写 权限,且无法在画面中删除。密码可在设置画面中更改。 - 在 账户 标签页创建附加账户 — 用户名须以英文或数字开头,仅限英文、数字及
._-,最长 64 字符(不可使用默认管理员用户名);密码 8~128 字符。权限分为 只读 / 读写。权限变更立即应用于已开启会话;删除 · 禁用 · 更改密码则会断开该账户的会话。 - 非匿名会话(默认管理员 · 读写账户 · 受信任 X.509 证书) 向标签节点 写入 时,该值将被传递至相应 PLC(流程与驱动写入一致,记录于
tm_tag_write的账户 · 安全策略 · 连接 IP)。仅在 PLC 写入成功时,节点值才会更新。 - 写入被拒绝的情况:
| 结果 | 原因 |
|---|---|
Bad_NotWritable | 只读标签(client_access=R) — 对所有人 |
Bad_UserAccessDenied | 匿名会话, 只读账户, 或在 HA 对中此 Edge 缺乏 PLC 写入权限 |
Bad_InternalError | PLC 写入失败, 或处于启动阶段写入路径尚未就绪 |
opc.ua.server.anonymous 和 opc.ua.server.security.none 的默认值均为 yes。在此状态下,网络中的任何客户端均可在无需证书或密码的情况下 读取所有标签 (匿名会话的写入仍被禁止)。在生产网络中,请在设置画面的 OPC UA 服务器 标签页中关闭 允许匿名访问 及 无安全端点。
8. 故障排查
| 现象 | 排查点 |
|---|---|
| 树中看不到 OPC | 자주 하는 작업 → 새 PLC 연결 추가 是否已完成, 网关中该 OPC 的 采集自动启动 选项是否开启 |
标签旁的值显示为 - | 该标签从未更新过。检查采集启动 / OPC 连接 / Quality |
客户端连接失败,提示 BadTcpEndpointUrlInvalid | 端点 URL 末尾缺少 /opcua |
| 树中可见但外部客户端找不到 NodeId | 输入错误, 或使用了 2026.11 之前的 EDGE.<SITE_ID>... 格式 NodeId (§2) |
| 服务器信息标签页显示 «停止» | edge.id 为空或格式错误, 或无法获得 PE_DATA_DIR — 这两种情况均不会启动服务器并记录 ERROR 日志 |
| 使用安全策略连接被拒绝 | 客户端证书尚未信任 — 在 客户端证书 标签页点击 [信任] |
无法通过 None 连接 | 无安全端点 已关闭, 或尝试通过 12443 端口连接(None 会话仅限 TCP 端口) |
写入返回 Bad_NotWritable / Bad_UserAccessDenied | 参考 §7 表 |
| 图表为空 | 该标签在 Cassandra 中尚无历史数据(刚注册的标签) — 等待片刻后将添加数据点 |
| 图表显示波动剧烈 | 将范围扩大至 24小时,自动下采样将使曲线平滑 |
| 客户端不信任服务器证书 | 网关自签名证书 — 在客户端执行 "Trust" 操作或导入通过 [下载 (.der)] 获取的证书 |
9. 更多信息
- Node-RED (
/ui/flow) — 通过流对同一标签值进行加工/外部发送。参考자주 하는 작업 → Node-RED 로 자동화 / IIoT 플로우。 - REST API — 可直接通过 HTTP 获取相同数据。参考
고급 / 통합 파트너용 → REST API。 - 驱动技术指南 → OPC-UA — 描述网关的 OPC-UA 客户端 侧 (连接外部 OPC-UA 服务器获取数据的路径)。