Работа со структурированными данными

Когда используются структуры

Программное обеспечение OPC Toolbox™ использует структуры для возврата данных с сервера OPC для следующих операций:

  • Синхронные операции чтения, выполняемые с помощью read функция.

  • Операции асинхронного чтения, выполняемые с помощью readasync функция.

  • События изменения данных, сгенерированные Сервером OPC для всех активных, подписанных групп или через refresh вызов функции.

  • Получение записанных данных в формате структуры из памяти с помощью getdata или peekdata функций.

Во всех случаях структура возвращенных данных одинаковая. В этом разделе описывается эта структура и способ использования данных структуры для понимания операций OPC.

Выполните операцию чтения нескольких элементов

Чтобы проиллюстрировать использование данных в формате структуры, в следующем примере считываются значения из трех элементов на Matrikon™ OPC Simulation Server.

Шаг 1: Создайте групповые объекты OPC Toolbox

Этот пример создает иерархию объектов 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');

Шаг 2: Чтение данных

В этом примере значения считываются сначала с устройства, а затем с кэша сервера. Данные возвращаются в формате структуры.

r1 = read(grp, 'device');
r2 = read(grp);

Шаг 3: Интерпретируйте данные

Данные возвращаются в формате структуры. Для интерпретации данных необходимо извлечь соответствующую информацию из структур. В этом примере вы сравниваете Значение, Качество и TimeStamp, чтобы подтвердить, что они одинаковы для обеих операций чтения.

disp({r1.ItemID;r1.Value;r2.Value})
disp({r1.ItemID;r1.Quality;r2.Quality})
disp({r1.ItemID;r1.TimeStamp;r2.TimeStamp})

Шаг 4: Подробнее Данные

Считывая сначала из кэша, а затем с устройства, можно сравнить возвращенные данные, чтобы увидеть, произошло ли какое-либо изменение. В этом случае данные не будут одинаковыми.

r3 = read(grp);
r4 = read(grp, `device');
disp({r3.ItemID;r3.Value;r4.Value})

Шаг 5: Очистка

Всегда удаляйте объекты тулбокса из памяти, и переменные, которые ссылаются на них, когда они вам больше не нужны.

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