如何直接通过 Utgard 访问 OPC Server 数据(不更改(Item item,ItemState state)))?

How to acces OPC Server data via Utgard directly (without changed(Item item, ItemState state)))?

上下文:

我找到了一种每次更改时访问数据的方法 (Here):

AccessBase access = new SyncAccess(server, 500) ;   
access.addItem(itemX, new DataCallback() {
    @Override
    public void changed(Item item, ItemState state) {
        updateValueX();
    }
});

在我的系统中,我使用五个不同的值来执行此操作,从 item0 到 item4,每次更改时,我都会更新该值,但它会出现问题。

问题:

我需要将其更改为 "Every time the first value changes, get all the values and save them",示例:

AccessBase access = new SyncAccess(server, 500) ;   
access.addItem(item0, new DataCallback() {
    @Override
    public void changed(Item item, ItemState state) {
        updateValue0();
        updateValue1();
        updateValue2();
        updateValue3();
        updateValue4();
    }
});

为此,我需要调用第一个 item/value 的已更改函数,但我需要直接访问其他 4 个函数,除了使用changed(Item item, ItemState state)函数?

谢谢大家

我知道怎么做了:

构造函数:

//ON THE CONSTRUCTOR, INITIALIZE GROUP AND ITEMS
org.openscada.opc.lib.da.Group group = server.addGroup("GroupName");
Item items[] = new Item[numberOfItems]= group.addItem("itemID"); 
//YOU WILL NEED TO HAVE ACCESS TO items[] LATER, MAKE IT PUBLIC.

for (int index = 0; index < numberOfItems; index++) {
    items[index] = group.addItem("item"+index);
}

更改了您访问的主要项目(item0)的()功能:

access.addItem(item0, new DataCallback() {
    @Override
    public void changed(Item item0, ItemState state) {

        //where items[] is the item created using group.addItem("item"+index) in the constructor
        JIArray jiArray = items[1].read(true).getValue().getObjectAsArray(); 
        Object[] arrayObj = (Object[]) jiArray.getArrayInstance();

        // arrayObj contains the value (or values) of the item 

        for (Object v : arrayObj) {

        }
    }
});

这是我自己想出来的方法。考虑到我几乎没有使用 OPC 和 Utgard 的经验,我认为这不是访问数据的最佳方法(性能方面),它只是有效。

如果我发现如何优化或改进访问,我会更新。