Программное обеспечение OPC Toolbox™ использует структуры для возврата данных с сервера OPC для следующих операций:
Синхронные операции чтения, выполняемые с помощью read функция.
Асинхронные операции чтения, выполняемые с помощью readasync функция.
События изменения данных, генерируемые сервером OPC для всех активных, подписанных групп или через refresh вызов функции.
Получение зарегистрированных данных в структурном формате из памяти с помощью getdata или peekdata функции.
Во всех случаях структура возвращаемых данных одинакова. В этом разделе описывается эта структура и способы использования данных структуры для понимания операций OPC.
Чтобы проиллюстрировать, как использовать отформатированные структурой данные, следующий пример читает ценности от трех пунктов на Сервере Моделирования Matrikon™ OPC.
В этом примере создается иерархия объектов OPC Toolbox для сервера моделирования Matrikon. Для запуска этого примера в системе необходимо установить сервер моделирования Matrikon. Можно также заменить значения, используемые при создании объектов, значениями для сервера, к которому можно получить доступ.
da = opcda('localhost','Matrikon.OPC.Simulation.1');
connect(da);
grp = addgroup(da,'StructExample');
itm1 = additem(grp,'Random.Real8');
itm2 = additem(grp,'Saw-toothed Waves.UInt2');
itm3 = additem(grp,'Random.Boolean');В этом примере сначала считываются значения с устройства, а затем из кэша сервера. Данные возвращаются в структурном формате.
r1 = read(grp, 'device'); r2 = read(grp);
Данные возвращаются в структурном формате. Для интерпретации данных необходимо извлечь соответствующую информацию из структур. В этом примере сравниваются значения Value, Quality и TimeStamp, чтобы подтвердить, что они одинаковы для обеих операций чтения.
disp({r1.ItemID;r1.Value;r2.Value})
disp({r1.ItemID;r1.Quality;r2.Quality})
disp({r1.ItemID;r1.TimeStamp;r2.TimeStamp})Считывая сначала из кэша, а затем из устройства, можно сравнить возвращенные данные, чтобы увидеть, произошли ли какие-либо изменения. В этом случае данные не будут одинаковыми.
r3 = read(grp);
r4 = read(grp, `device');
disp({r3.ItemID;r3.Value;r4.Value})Всегда удаляйте объекты панели инструментов из памяти и переменные, которые ссылаются на них, когда они больше не нужны.
disconnect(da) delete(da) clear da grp itm1 itm2 itm3
Все данные, возвращенные read, opcread, и getdata функции, включенные в структуры изменений данных и асинхронных событий чтения, переданные функциям обратного вызова, имеют один и тот же базовый формат. Формат лучше всего объяснить, начиная с выходных данных read функция, которая обеспечивает базовый компоновочный блок данных в структурном формате.
При выполнении read функция с одной daitem возвращается следующая структура.
rSingle = read(itm1)
rSingle =
ItemID: 'Random.Real8'
Value: 1.0440e+004
Quality: 'Good: Non-specific'
TimeStamp: [2004 3 10 14 46 9.5310]
Error: ''Все данные в структурном формате для элемента будут содержать ItemID, Value, Quality, и TimeStamp поля.
Примечание
Error поле в этом примере относится к read и используется для указания любого сообщения об ошибке, сгенерированного сервером для этого элемента.
При выполнении команды read функция с объектом группы, содержащим более одного элемента, возвращается массив структуры.
rGroup = read(grp)
rGroup =
3x1 struct array with fields:
ItemID
Value
Quality
TimeStamp
ErrorВ этом случае массив структуры содержит один элемент для каждого считанного элемента. ItemID поле в каждом элементе идентифицирует элемент, связанный с этим элементом массива структуры.
Примечание
При выполнении асинхронных операций чтения и для событий изменения данных порядок элементов в массиве структуры определяется сервером OPC. Порядок может не совпадать с порядком элементов, переданных функции чтения.
Структуры событий содержат информацию о событии, а также данные, связанные с этим событием.
В следующем примере показано содержимое асинхронного события чтения.
cleareventlog(da);
tid = readasync(itm);
% Wait for the read async event to occur
pause(1);
event = get(da, 'EventLog')
event =
Type: 'ReadAsync'
Data: [1x1 struct]Поле Data структуры события содержит
event.Data
ans =
LocalEventTime: [2004 3 11 10 59 57.6710]
TransID: 4
GroupName: 'StructExample'
Items: [1x1 struct]Поле Items структуры данных содержит
event.Data.Items
ans =
ItemID: 'Random.Real8'
Value: 9.7471e+003
Quality: 'Good: Non-specific'
TimeStamp: [2004 3 11 10 59 57.6710]Из примера видно, что структура событий встраивает данные в формате структуры в Items области Data структура, связанная с событием. Дополнительные поля Data структура предоставляет информацию о событии, такую как источник события, время получения события панелью инструментов и идентификатор транзакции этого события.
Программа OPC Toolbox регистрирует данные в памяти и/или на диске с помощью события изменения данных. При возврате данных в структурном формате для задачи ведения журнала с помощью opcread или getdata функция, возвращаемый структурный массив содержит информацию о событии изменения данных, размещенную в структурном массиве. Каждый элемент массива структуры содержит запись или событие изменения данных. Структурный массив имеет LocalEventTime и Items поля из события изменения данных. Items поле, в свою очередь, является массивом структуры, содержащим поля ItemID, Value, Quality, и TimeStamp.
Для событий чтения, асинхронного чтения и изменения данных необходимо использовать данные в структурном формате. Однако для задачи ведения журнала имеется возможность извлечения данных в структурном формате, числовом формате или формате массива ячеек.
Для задачи ведения журнала следует использовать данные в структурном формате, когда вас интересует
"Необработанная" информация о событии, возвращенная сервером OPC ". Необработанная информация может помочь в диагностике конфигурации сервера OPC или конфигурации клиента. Например, если вы видите значение данных, которое не меняется часто, но вы знаете, что устройство должно изменяться часто, вы можете проверить данные в формате структуры, чтобы определить, когда сервер OPC уведомляет клиентов об изменении значения, качества и/или TimeStamp.
Информация о времени, а не данные временных рядов. Если требуется отслеживать, когда оператор изменил состояние коммутатора, данные в структурном формате предоставляют данные на основе событий, а не временные ряды.
Для других задач, связанных с данными временных рядов, таких как визуализация данных, анализ, моделирование и оптимизация, следует использовать формат вывода ячеек или числовых массивов для getdata и opcread. Дополнительные сведения о форматах массивов см. в разделе Форматированные массивом данные.
При извлечении данных из памяти или диска в формате структуры можно преобразовать полученную структуру в формат массива с помощью opcstruct2array функция. Вы передаете структурный массив функции, и она возвращает ItemID, Value, Quality, TimeStamp, и EventTime информация, содержащаяся в этом массиве структуры.
opcstruct2array функция особенно полезна, когда требуется визуализировать или анализировать данные временных рядов, не удаляя их из памяти. Поскольку peekdata возвращает только массивы структуры (из соображений скорости), можно использовать opcstruct2array преобразование содержимого данных структуры в отдельные массивы для целей визуализации и анализа.
Примечание
Всегда следует извлекать данные в числовом формате или в формате массива ячеек, когда требуется только манипулировать данными временных рядов. Хотя opcstruct2array функция была разработана для использования как можно меньшего объема памяти, преобразование в ПО MATLAB ® по-прежнему требует пространства для хранения как для структурного массива, так и для результирующих массивов.
Пример использования opcstruct2array, см. раздел Запись функции обратного вызова.