Программное обеспечение 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, см. «Запись функции обратного вызова».