【问题标题】:How to read values on subscription demand?如何读取订阅需求的值?
【发布时间】:2023-03-29 15:12:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您不能通过节点 ID 读取值来手动更新值吗?通用客户端示例实现应该包含相应的代码。
  • @ManfredRadlwimmer,这是关于服务器(而不是客户端)的内部结构。这里我想怎么做——客户端以 5 秒的间隔订阅一些变量。所以服务器每 5 秒尝试读取一次(我猜)。在这种情况下,我想在服务器尝试刷新变量时准确地从实际硬件中读取值(在服务器上)。

标签: c# subscription opc-ua


【解决方案1】:

在阅读了提供的 OPC UA-.Net 堆栈的源代码后,我现在可以看到我错过了数据传输的组织方式。报告间隔不是为了“给我尽可能多的数据”,而是相反的“给我尽可能少的数据”。这是因为服务器是更改事件驱动的,而不是时间驱动(或请求驱动)的——也就是说,变量值的任何变化都会被注意到,并且可以很高兴地排队等待报告,但间隔的作用是刹车 - 如果更改时间小于间隔,则不会将任何内容添加到队列中(因此不会报告)。

客户端可以请求连续报告 -- 间隔 = 0 和一些相当大的队列大小。

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2012-03-14
    • 1970-01-01
    • 2015-08-24
    • 2021-08-15
    • 2019-12-05
    相关资源
    最近更新 更多