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

时间:2016-09-21 14:47:35

标签: java opc

上下文

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

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

在我的系统中,我使用五个不同的值(从item0到item4)执行此操作,每次更改时,我都会更新值并且会产生问题。

问题:

我需要将其更改为"每次第一个值更改时,获取所有值并保存它们",例如:

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

要做到这一点,我需要调用第一项/值的已更改函数,但我需要直接访问其他4,除了使用{{1}之外,我有什么办法可以获得这些值功能?

谢谢大家。

1 个答案:

答案 0 :(得分:0)

我发现了怎么做:

构造

//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几乎没有任何经验,我认为这不是访问数据的最佳方法(性能方面),它只是有效。

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