【问题标题】:OPC UA - Client - Milo - Best Practice - Subscription to Data ChangeOPC UA - 客户端 - Milo - 最佳实践 - 订阅数据更改
【发布时间】:2017-02-18 19:06:21
【问题描述】:

我使用 Milo 项目创建了一个 OPC UA 客户端来创建 OPC UA 客户端。我对 OPC UA 还是很陌生。现在,我一直在寻找在一个特定节点发生数据更改后从多个节点读取值的最佳实践。

信息模型如下所示: RfidSensorType

在我的服务器上,我将拥有这个 RfidSensorType 的几个对象。客户端在 CurrentAtTag 节点上创建订阅以侦听数据更改。

我的问题: 当 CurrentAtTag 的值更改时,将在我的客户端中调用一个回调函数,其中包含 UaMonitoredItem 和 CurrentAtTag 的 DataValue。 在我的应用程序中,我还需要处理(同时)Station、IOLPort 和 CurrentValue 的值,这些值也在那个时候发生了变化。 如何在 CurrentAtTag 的回调中访问这些值?

我唯一的解决方案是:在该回调中使用同步读取请求 -> 这是一种合法的方法吗?

我的研究: 1) 触发服务 我已经看到存在一个 TriggerigService,它监控项目只有在一个特定节点更改它的值时才会发送报告。 问题:这将调用几个回调,而只调用一个......我需要同时处理所有信息来进一步处理它们......

2) 事件监控 在事件监控中,可以选择将针对每个事件通知返回的“事件字段”。我不确定是否可以选择 CurrentAtTag、Station、IOLPort 和 CurrentValue...

【问题讨论】:

  • 例如CurrentAtTagIOLPort 之间的更新时间是否有很大不同?比如第一个是慢换,第二个是快换?如果不是,我会简单地订阅所有这些,看看性能是否还可以。
  • 嗨@astrowalker,不,他们几乎同时。我已经考虑订阅所有节点。问题是我需要在我的应用程序中调用另一个需要所有值的方法。如果我在不同的回调中获得值,我不确定我该怎么做......你知道我的意思吗?也许这个问题很容易解决,但我暂时没有想法。
  • 您似乎没有正确考虑您的架构。如果多个数据字段一起更改,则它们确实属于单个组合单元,而不是不同的字段。

标签: opc opc-ua milo


【解决方案1】:

就像你可以订阅服务器的ServerStatus(nodeid "i=2256")一样,你应该可以订阅'RfidSensor_Station1'对应的nodeid。服务器将发送带有“RfidSensorType”类型数据的 PublishResponse,编码为 ExtensionObject。诀窍是解码 ExtensionObject。

正如 Kevin 更正的那样,因为“RfidSensor_Station1”不是节点类“变量”,所以它没有值属性,您无法监视节点的数据更改。如果您使用的是 PLC,我可能会将传感器的所有属性组合成一个字符串或字节数组。然后我监控新变量,并在客户端解析字符串。

或者您可以按照您的描述进行 ReadRequest。这样就可以了。

【讨论】:

  • 在这种情况下订阅站本身将不起作用,因为该站被建模为 ObjectType/ObjectNode。如果它被建模为一个变量,它可能有一个复杂的数据类型,代表所有站数据的组合,他将能够订阅它。将其作为读取请求进行可能是最好/唯一的方式。
猜你喜欢
  • 1970-01-01
  • 2022-12-19
  • 2020-07-24
  • 2016-09-20
  • 2020-08-28
  • 2015-06-13
  • 2018-09-15
  • 2022-07-08
  • 2020-11-18
相关资源
最近更新 更多