Программное обеспечение OPC Toolbox™ использует структуры для возврата данных с сервера OPC для следующих операций:
Синхронные операции чтения, выполняемые с помощью read
функция.
Операции асинхронного чтения, выполняемые с помощью readasync
функция.
События изменения данных, сгенерированные Сервером OPC для всех активных, подписанных групп или через refresh
вызов функции.
Получение записанных данных в формате структуры из памяти с помощью getdata
или peekdata
функций.
Во всех случаях структура возвращенных данных одинаковая. В этом разделе описывается эта структура и способ использования данных структуры для понимания операций OPC.
Чтобы проиллюстрировать использование данных в формате структуры, в следующем примере считываются значения из трех элементов на Matrikon™ OPC Simulation Server.
Этот пример создает иерархию объектов OPC Toolbox для сервера симуляции матриц. Чтобы запустить этот пример в вашей системе, необходимо установить сервер симуляции 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);
Данные возвращаются в формате структуры. Для интерпретации данных необходимо извлечь соответствующую информацию из структур. В этом примере вы сравниваете Значение, Качество и 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
поля.
Примечание
The Error
поле в этом примере характерно для read
функция, и используется для указания любого сообщения об ошибке, сгенерированного сервером для этого элемента.
Если вы выполняете read
функция с групповым объектом, содержащим более одного элемента, возвращается массив структур.
rGroup = read(grp) rGroup = 3x1 struct array with fields: ItemID Value Quality TimeStamp Error
В этом случае массив структур содержит по одному элементу для каждого считанного элемента. The ItemID
поле в каждом элементе определяет элемент, связанный с этим элементом массива структур.
Примечание
При выполнении операций асинхронного чтения и для событий изменения данных порядок элементов массива структур определяется сервером OPC. Порядок может отличаться от порядка элементов, переданных в функцию read.
Структуры события содержат информацию конкретно о событии, а также данные, связанные с этим событием.
В следующем примере отображается содержимое асинхронного события чтения.
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]
Поле Данные структуры события содержит
event.Data ans = LocalEventTime: [2004 3 11 10 59 57.6710] TransID: 4 GroupName: 'StructExample' Items: [1x1 struct]
Поле Элементам структуры данных содержит:
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
поля из события изменения данных. The Items
поле, в свою очередь, представляет собой массив структур, содержащий поля ItemID
, Value
, Quality
, и TimeStamp
.
Для чтения, чтения событий async и изменения данных необходимо использовать структурированные данные. Однако для задачи регистрации у вас есть опция извлечения данных в формате структуры или в формате числа или массива ячеек.
Для задачи логгирования следует использовать структурированные данные, когда вы заинтересованы в
«Необработанная» информация о событии, возвращенная Серверу OPC. Необработанная информация может помочь в диагностике строения сервера OPC или строения клиента. Например, если вы видите значение данных, которое не часто изменяется, но знаете, что устройство должно часто изменяться, можно изучить форматированные в структуре данные, чтобы определить, когда сервер OPC уведомляет клиентов об изменении значения, качества и/или TimeStamp.
Время выполнения, а не данные временных рядов. Если вам нужно отследить, когда оператор изменил состояние коммутатора, структурированные данные предоставят вам основанные на событиях данные, а не данные временных рядов.
Для других задач, которые включают данные временных рядов, таких как визуализация данных, анализ, моделирование и операции оптимизации, следует рассмотреть использование массива ячеек или числового формата выхода массива для getdata
и opcread
. Для получения дополнительной информации о форматах массивов см. Раздел «Данные в формате массивов».
Если вы извлекаете данные из памяти или диска в формате структуры, можно преобразовать полученную структуру в формат массива с помощью opcstruct2array
функция. Вы передаете массив структуры в функцию, и это вернет ItemID
, Value
, Quality
, TimeStamp
, и EventTime
информацию, содержащуюся в этом массиве структур.
The opcstruct2array
функция особенно полезна, когда вы хотите визуализировать или проанализировать данные временных рядов, не удаляя их из памяти. Поскольку peekdata
возвращает только массивы структур (из-за факторов скорости), можно использовать opcstruct2array
преобразование содержимого данных структуры в отдельные массивы в целях визуализации и анализа.
Примечание
Вы всегда должны получать данные в числовом формате или в формате массива ячеек, когда вы хотите только манипулировать данными временных рядов. Хотя и opcstruct2array
функция была разработана, чтобы использовать как можно меньше памяти, преобразование в MATLAB® ПО все еще требует пространства памяти как для массива структур, так и для получившихся массивов.
Для примера использования opcstruct2array
, см. «Запись функции обратного вызова».