2016-10-10 1279 views
0

我使用Milo项目创建了一个OPC UA项目来创建一个OPC UA客户端。我对OPC UA仍然很陌生。现在我被困在一个特定节点的数据更改后,寻找最佳实践来读取来自多个节点的值。OPC UA - 客户端 - Milo - 最佳实践 - 订阅数据变更

信息模型是这样的: RfidSensorType

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

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

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

我的研究: 1)触发服务 我已经看到存在一个TriggerigService,只有当一个特定节点改变它的值时,监视器项才会发送报告。 问题:这会叫几个callsbacks和NOZ只是one..i需要的所有信息,同时进一步处理他们..

2)事件监视 在事件监控一个可以选择“事件域”,这将返回每个事件通知。我不确定是否可以选择CurrentAtTag,Station,IOLPort和CurrentValue ...

+0

比如'CurrentAtTag'和'IOLPort'之间的更新时间有很大不同吗?就像第一个变速器变慢了,第二个变化很快?如果没有,我只需要订阅所有这些内容,然后查看性能是否正常。 – astrowalker

+0

Hi @astrowalker, 不,他们几乎在同一时间。我已经考虑过采用所有节点。 问题是我需要在我的应用程序中调用另一个需要所有值的方法。我不知道我如何能做到这一点,如果我得到不同的回调值... 你知道我的意思吗? 也许这个问题很容易解决,但我暂时没有想法。 – Niko

+0

看起来好像你可能没有正确地考虑你的架构。如果许多数据字段一起改变,那么它们确实属于单个组合单元,而不是不同的字段。 –

回答

0

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

由于Kevin纠正了,因为'RfidSensor_Station1'不是节点类'变量',所以它没有值属性,并且您无法监视节点是否发生数据更改。如果您使用的是PLC,我可能将传感器的所有属性组合成一个字符串或字节数组。然后我监视新变量,并解析客户端中的字符串。

或者您可以按照您的描述进行ReadRequest。这将工作得很好。

+0

在这种情况下订阅站本身不起作用,因为站被建模为ObjectType/ObjectNode。如果它被建模为一个变量,而它可能有一个复杂的数据类型,它代表了所有工作站数据的组合,他将能够订阅它。将它作为读取请求进行操作可能是最好的/唯一的方法。 –