exponenta event banner

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

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

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

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

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

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

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

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

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

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

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

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

Шаг 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.

Примечание

Поле 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]

Поле данных структуры события содержит

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 предоставляют информацию о событии, таком как источник события, время, событие было получено тулбоксом и ID транзакции того события.

Отформатированные данные структуры для задачи журналирования

Данные логов программного обеспечения 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 смотрите Запись Функция обратного вызова.