如何按订阅需求读取值?

How to read values on subscription demand?

我正在使用 OPC-UA .Net 堆栈学习 OPC-UA。订阅和发送数据的示例是在服务器端明确创建的,刷新周期为 1 秒——即每秒更新一次变量值,其余的(通知客户端)由 OPC-UA 堆栈处理。由于循环是手工制作的,这意味着即使根本没有订阅也能正常工作。

好的。但我想稍微反转一下——不要给变量设置静态值,不要依赖这个手动刷新周期,而是每当变量即将被读取(订阅需求)时,动态计算值和return 它给客户。

我在变量上添加了 OnReadValue 处理程序,当客户端订阅该值时,它会被触发,计算并 returned。几乎正是我所希望的——问题是它只完成了 一次

我想由于客户端每隔一段时间请求更新,在服务器上有一些循环在这样的时间间隔内进行。如何告诉服务器再次读取变量(以触发处理程序)?

在阅读了提供的 OPC UA-.Net 堆栈的源代码后,我现在可以看到我错过了数据传输的组织方式。报告间隔不是 "give me as many data as possible",而是恰恰相反 "give me as little data as possible"。这是因为服务器是变化事件驱动的,而不是时间驱动的(或请求驱动的)——也就是说,变量值的任何变化都会被注意到,并且可以愉快地排队等待报告,但时间间隔起着刹车——如果变化时间小于间隔,则不会向队列中添加任何内容(因此不会报告)。

尽管客户端可以请求连续报告 -- 间隔=0 并且队列有一定的大小。