簡體   English   中英

如何過濾掉 OPC UA Milo 中的 UaMonitoredItem 事件?

[英]How to filter out events coming to UaMonitoredItem in OPC UA Milo?

我正在嘗試基於UaMonitoredItem及其setValueConsumer(ValueConsumer valueConsumer)方法編寫內部應用程序事件日志。 是否可以在setValueConsumer(ValueConsumer valueConsumer)方法的“初始化”/“首次使用”之后過濾掉到達UaMonitoredItems的事件,而不是在此期間? 在這種情況下,使用ManagedDataItemManagedEventItem會是一個好習慣嗎?

代碼例如:

public void subscribeOnComponentsEvent(List list) {
    
    //....
    
    //Created in MonitoringMode.Sampling to avoid race condition
    for (UaMonitoredItem item : monitoredItems) {
        allMonitoredItems.add(item);
        item.setValueConsumer((e, vs) -> {
            logger.info("Received from {}", e.getReadValueId().getNodeId());
        });
    }
}
    
public void setMonitoringMode(MonitoringMode mode) {

    try {
        subscription.setMonitoringMode(mode, allMonitoredItems).get();
    } catch (InterruptedException | ExecutionException e) {
        logger.error(e.getMessage());
    }
}

public static void main(String[] args) {

    //...
    
    client.subscribeOnComponentsEvent(list);
    client.setMonitoringMode(MonitoringMode.Reporting);
}

Output 的代碼示例:

[milo-shared-thread-pool-3] INFO client.Client - Received from NodeId{ns=1, id=state_open}
[milo-shared-thread-pool-3] INFO client.Client - Received from NodeId{ns=1, id=state_closed}
[milo-shared-thread-pool-3] INFO client.Client - Received from NodeId{ns=1, id=state_alarm}

當應用程序啟動時,此代碼會立即啟動,因此,可能已經在日志中的監視器中的數據將被重新寫入日志。

有沒有辦法避免將數據重新寫入日志?

此代碼不會立即啟動或運行,它只會在創建 MonitoredItem 並且服務器發送通知后運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM