2016-09-21 3 views
0

Контекст:Как получить данные OPC-сервера через Utgard напрямую (без изменений (элемент Item, состояние ItemState)))?

Я нашел способ, чтобы получить доступ к данным каждый раз, когда она меняется (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, есть ли способ получить эти значения отдельно от использования функции changed(Item item, ItemState state)?

Спасибо всем.

ответ

0

я узнал, как это сделать:

Constructor:

//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, я полагаю, что это не лучший способ (производительность) для доступа к данным, он просто работает.

Я обновлю, если узнаю, как оптимизировать или улучшить доступ.