把订阅做对
订阅是 OPC UA 项目成功或悄然失败的分水岭。本课程区分 publishing interval 与 sampling interval,在源端应用死区和触发条件,合理设定队列大小以避免静默丢样,并加入告知连接仍然存活的心跳。
| 课时 | 11 |
|---|---|
| 时间 | 约 84 分钟 |
| 先修要求 | A3 |
| 成本 | 免费:文字课程开放,视频和实验需要免费账号 |
学完你将能够做到
- 你能够解释发布间隔和采样间隔,而不会把两者混淆。
- 你能应用死区,让噪声永远不离开服务器。
- 你能够合理设定队列大小,并发现那种以 Good 上报自身的溢出。
- 你能够为一个工厂而不是一个演示设计订阅集。
- 你能够区分“没有变化”和“连接已断”。
课程大纲
-
1
用订阅取代轮询6 分钟
为什么定时轮询服务器是错误的默认做法,以及当服务器主动推送时会有什么不同。
资料 一个轮询客户端和一个订阅客户端读取相同节点,附两份网络抓包
-
2
把发布间隔和采样间隔区分开9 分钟
OPC UA 中最容易被误解的一对概念。服务器以一个速率采样、以另一个速率投递,把两者搞混会产生看起来正确、实际却不正确的数据。
交付物 同一个 MonitoredItem 在四种采样与发布组合下的配置,以及各自实际交付的采样
-
3
能继承发布间隔时就继承6 分钟
采样间隔取 -1 时服务器的处理方式。逐项设置速率在什么情况下值得其代价。
Asset 同一个订阅分别使用显式和继承的采样间隔,并附带服务器修正后的值
-
4
读取服务器回传的修订值7 分钟
你提出请求,服务器给出修订值。忽视修订后的间隔,正是客户端误以为自己的采样比实际快十倍的原因。
资料 一次 CreateSubscription 请求与响应,展示请求参数与修订后参数的对比
-
5
在源头用死区消除噪声9 分钟
绝对死区和百分比死区,以及一个陷阱:节点上没有 EURange 时,百分比死区会悄无声息地不起作用。
交付物 一个有噪声的模拟量,分别在无死区、绝对死区和百分比死区下记录三份数据
-
6
选择一个 DataChangeTrigger7 分钟
Status、StatusValue 还是 StatusValueTimestamp。为什么计数器需要与模拟量不同的触发条件。
交付物 一个在默认触发条件下停止上报的计数器,以及修复它的触发条件变更
-
7
规划队列大小并捕获溢出10 分钟
由发布间隔与采样间隔之比决定的 QueueSize、discard-oldest,以及那个报告为 Good 的溢出位:这正是“数据看起来没问题,但采样丢了”的原因。
资料 一次刻意制造的队列溢出,DataValue 中可见的溢出位以及丢失的采样
-
8
加入心跳8 分钟
没有心跳,静默的数据流就是有歧义的。如何让“无变化”和“已失效”可区分,以及应当预料到的 SourceTimestamp 陈旧副作用。
Asset 一个带心跳的订阅,展示被重新发送的值及其未变的 SourceTimestamp
-
9
尽量减少不同间隔的数量8 分钟
每一个不同的发布间隔都会多出一个订阅。有五十种速率的客户端就有五十个订阅,服务器最终会提出抗议。
交付物 一台达到订阅上限的服务器,以及用三个订阅交付的同一批数据
-
10
断线后恢复订阅9 分钟
在重建一切之前先用 TransferSubscriptions、GoodSubscriptionTransferred,以及一个能发现订阅在服务器端已静默的看门狗。
交付物 一个在服务器重启后仍存活、订阅被成功转移的客户端,附日志
-
11
面向工厂调优,而不是面向演示5 分钟
把整套方法应用到两百台机器上:间隔与消费端需要相匹配、模拟量设死区、队列有界、连接错峰,以及不读就关掉诊断。
资料 一份调优工作表,含 200 台设备、12,000 个标签部署的真实数字
实验
需要免费账户
在 opc.tcp://opcua.umati.app:4840 上以 1000 ms 的发布间隔订阅两个变化的数值,然后故意重现一次队列溢出,并从 DataValue 证明你丢失了采样,而每个状态都显示 Good。
解锁实验 →最后核对日期 2026 年 9 月 7 日,对照 OPC UA 1.05.07。OPC UA Connect 是教育资源,与 OPC Foundation 无隶属关系。