如何直接通过 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 的经验,我认为这不是访问数据的最佳方法(性能方面),它只是有效。
如果我发现如何优化或改进访问,我会更新。
上下文:
我找到了一种每次更改时访问数据的方法 (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 的经验,我认为这不是访问数据的最佳方法(性能方面),它只是有效。
如果我发现如何优化或改进访问,我会更新。