Программное обеспечение OPC Toolbox™ использует структуры, чтобы возвратить данные из Сервера OPC для следующих операций:
Синхронные операции чтения, выполняемое использование read
функция.
Асинхронные операции чтения, выполняемое использование readasync
функция.
Данные изменяют события, сгенерированные Сервером OPC для всех активных, подписанных групп или через a 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);
Данные возвращены в формате структуры. Чтобы интерпретировать данные, необходимо извлечь релевантную информацию из структур. В этом примере вы сравниваете Значение, Качество и 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
Значение
, 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
Значение
, Quality
, и TimeStamp
.
Для чтения читайте асинхронный и события изменения данных, необходимо использовать отформатированные данные структуры. Однако для задачи логгирования, у вас есть опция получения данных в формате структуры, или формата массива ячеек или числового массива.
Для задачи логгирования необходимо использовать отформатированные данные структуры, когда вы интересуетесь
“Необработанная” информация о событии возвращена Сервером OPC. Необработанная информация может помочь в диагностировании настройки Сервера OPC или клиентской настройки. Например, если вы видите значение данных, которое часто не изменяется, все же вы знаете, что устройство должно изменяться часто, можно исследовать отформатированные данные структуры, чтобы определить, когда Сервер OPC уведомляет клиенты изменения в Значении, Качестве и/или TimeStamp.
Время выполнения, а не данные временных рядов. Если необходимо отследить, когда оператор изменил состояние переключателя, отформатированные данные структуры предоставляют вам основанные на событии данные, а не данные временных рядов.
Для других задач, которые включают данные временных рядов, такие как визуализация данных, анализ, моделирование и операции оптимизации, необходимо рассмотреть использование выходного формата массива ячеек или числового массива для getdata
и opcread
. Для получения дополнительной информации о форматах массивов смотрите Отформатированные данные Массивов.
Если вы получаете данные из памяти или диска в формате структуры, можно преобразовать получившуюся структуру в формат массивов с помощью opcstruct2array
функция. Вы передаете массив структур функции, и это возвратит ItemID
Значение
, Quality
, TimeStamp
, и EventTime
информация содержится в том массиве структур.
opcstruct2array
функция особенно полезна, когда это необходимо, чтобы визуализировать или анализировать данные временных рядов, не удаляя его из памяти. Поскольку peekdata
только возвращает массивы структур (из-за факторов скорости), можно использовать opcstruct2array
преобразовывать содержимое данных о структуре в отдельные массивы в целях визуализации и анализа.
Примечание
Необходимо всегда получать данные в формате числового массива или массива ячеек каждый раз, когда вы только хотите управлять данными временных рядов. Несмотря на то, что opcstruct2array
функция была спроектирована, чтобы использовать как можно меньше памяти, преобразование в MATLAB все еще требует пространства памяти и для массива структур и для полученных массивов.
Для примера использования opcstruct2array
, смотрите Запись Функция обратного вызова.