В этом примере показано, как работать с объектами OPC HDA Data.
Объекты данных OPC HDA создаются при считывании данных с сервера доступа к историческим данным OPC (HDA). Объекты OPC HDA Data позволяют сохранять, визуализировать и обрабатывать исторические данные перед преобразованием этих данных во встроенные типы данных для дальнейшей обработки в MATLAB.
Дополнительные сведения о создании объектов данных OPC HDA см. в примере Получение данных с сервера доступа к данным за прошлые периоды OPC.
Загрузите образцы данных в рабочую область.
load opcdemoHDAData
Проверьте рабочую область, чтобы увидеть загруженные переменные.
whos
Name Size Bytes Class Attributes hdaDataSmall 1x2 356 opc.hda.Data hdaDataVis 1x2 9088 opc.hda.Data
Отображение сводки данных, содержащихся в hdaDataVis.
hdaDataVis
hdaDataVis =
1-by-2 OPC HDA Data object:
ItemID Value Start TimeStamp End TimeStamp Quality
-------------- ----------------- ----------------------- ----------------------- ----------------------
Example.Item.1 361 double values 2010-05-12 08:15:00.000 2010-05-12 09:15:00.000 1 unique quality [Raw]
Example.Item.2 11 double values 2010-05-12 08:30:00.000 2010-05-12 09:30:00.000 2 unique qualities
Объект данных содержит два элемента. Первый элемент Example.Item.1 содержит 361 значение и одно уникальное качество, в то время как второе имеет 11 значений и два уникальных качества.
Более подробно изучите второй элемент с помощью showValues способ.
showValues(hdaDataVis(2))
OPC HDA Data object for item Example.Item.2:
TIMESTAMP VALUE QUALITY
======================= ============= =================
2010-05-12 08:30:00.000 -0.500000 Raw (Good)
2010-05-12 08:36:00.000 -0.250000 Raw (Good)
2010-05-12 08:42:00.000 0.000000 Raw (Good)
2010-05-12 08:48:00.000 0.250000 Raw (Good)
2010-05-12 08:54:00.000 0.500000 Calculated (Good)
2010-05-12 09:00:00.000 0.500000 Calculated (Good)
2010-05-12 09:06:00.000 0.400000 Calculated (Good)
2010-05-12 09:12:00.000 0.300000 Raw (Good)
2010-05-12 09:18:00.000 0.200000 Raw (Good)
2010-05-12 09:24:00.000 0.100000 Raw (Good)
2010-05-12 09:30:00.000 0.000000 Raw (Good)
Получение текущего формата отображения даты с помощью opc.getDateDisplayFormat.
origFormat = opc.getDateDisplayFormat;
Измените формат отображения на стандартный формат даты в США и снова отобразите значение.
opc.setDateDisplayFormat('mm/dd/yyyy HH:MM AM');
showValues(hdaDataVis(2))
OPC HDA Data object for item Example.Item.2:
TIMESTAMP VALUE QUALITY
=================== ============= =================
05/12/2010 8:30 AM -0.500000 Raw (Good)
05/12/2010 8:36 AM -0.250000 Raw (Good)
05/12/2010 8:42 AM 0.000000 Raw (Good)
05/12/2010 8:48 AM 0.250000 Raw (Good)
05/12/2010 8:54 AM 0.500000 Calculated (Good)
05/12/2010 9:00 AM 0.500000 Calculated (Good)
05/12/2010 9:06 AM 0.400000 Calculated (Good)
05/12/2010 9:12 AM 0.300000 Raw (Good)
05/12/2010 9:18 AM 0.200000 Raw (Good)
05/12/2010 9:24 AM 0.100000 Raw (Good)
05/12/2010 9:30 AM 0.000000 Raw (Good)
Восстановите формат отображения по умолчанию.
opc.setDateDisplayFormat('default')
ans = yyyy-mm-dd HH:MM:SS.FFF
Сбросьте формат отображения до исходного значения.
opc.setDateDisplayFormat(origFormat);
Визуализация данных OPC HDA с помощью plot или stairs методы для объекта данных.
axH1 = subplot(2,1,1); plot(hdaDataVis); title('Plot of hdaDataVis data'); axH2 = subplot(2,1,2); stairs(hdaDataVis); title('Stairstep plot of hdaDataVis data'); legend show

Проверьте небольшой набор данных. Этот набор данных намеренно мал, чтобы показать концепцию повторной выборки.
hdaDataSmall
hdaDataSmall =
1-by-2 OPC HDA Data object:
ItemID Value Start TimeStamp End TimeStamp Quality
--------------- --------------- ----------------------- ----------------------- ----------------------
Example.ItemR.1 5 double values 2010-06-01 09:30:00.000 2010-06-01 09:31:00.000 1 unique quality [Raw]
Example.ItemR.2 3 double values 2010-06-01 09:30:00.000 2010-06-01 09:31:00.000 1 unique quality [Raw]
Просмотрите данные по каждой позиции по отдельности. Невозможно отобразить элементы в одной таблице, так как их метки времени не совпадают.
showValues(hdaDataSmall(1)) showValues(hdaDataSmall(2))
OPC HDA Data object for item Example.ItemR.1:
TIMESTAMP VALUE QUALITY
======================= ============= ==========
2010-06-01 09:30:00.000 0.000000 Raw (Good)
2010-06-01 09:30:15.000 1.000000 Raw (Good)
2010-06-01 09:30:30.000 2.000000 Raw (Good)
2010-06-01 09:30:45.000 1.000000 Raw (Good)
2010-06-01 09:31:00.000 0.000000 Raw (Good)
OPC HDA Data object for item Example.ItemR.2:
TIMESTAMP VALUE QUALITY
======================= ============= ==========
2010-06-01 09:30:00.000 1.000000 Raw (Good)
2010-06-01 09:30:30.000 2.000000 Raw (Good)
2010-06-01 09:31:00.000 3.000000 Raw (Good)
Попытка преобразовать данные в двойной массив. Преобразование завершится ошибкой.
try vals = double(hdaDataSmall); catch exc disp(exc.message) end
Conversion to double failed. All elements of the OPC HDA Data object must have the same time stamp. Consider using 'TSUNION' or 'RESAMPLE' on the Data object.
Пересечение временных отметок элементов приводит к меньшему набору данных с регулярной выборкой.
hdaDataIntersect = hdaDataSmall.tsintersect
hdaDataIntersect =
1-by-2 OPC HDA Data object:
ItemID Value Start TimeStamp End TimeStamp Quality
--------------- --------------- ----------------------- ----------------------- ----------------------
Example.ItemR.1 3 double values 2010-06-01 09:30:00.000 2010-06-01 09:31:00.000 1 unique quality [Raw]
Example.ItemR.2 3 double values 2010-06-01 09:30:00.000 2010-06-01 09:31:00.000 1 unique quality [Raw]
Use the showValues method to display all values.
Показать эти значения вместе. Это можно сделать, потому что метки времени теперь регулярно отбираются.
showValues(hdaDataIntersect)
OPC HDA Data object array:
TIMESTAMP Example.ItemR.1 Example.ItemR.2
======================= =============== ===============
2010-06-01 09:30:00.000 0.000000 1.000000
2010-06-01 09:30:30.000 2.000000 2.000000
2010-06-01 09:31:00.000 0.000000 3.000000
Преобразование объекта данных в двойной массив.
vals = double(hdaDataIntersect)
vals =
0 1
2 2
0 3
Использовать tsunion возвращает объединение временных рядов в объекте Data. Новые значения интерполируются с использованием предоставленного метода (или линейной интерполяции, если метод не предоставлен).
hdaDataUnion = hdaDataSmall.tsunion showValues(hdaDataUnion)
hdaDataUnion =
1-by-2 OPC HDA Data object:
ItemID Value Start TimeStamp End TimeStamp Quality
--------------- --------------- ----------------------- ----------------------- ----------------------
Example.ItemR.1 5 double values 2010-06-01 09:30:00.000 2010-06-01 09:31:00.000 1 unique quality [Raw]
Example.ItemR.2 5 double values 2010-06-01 09:30:00.000 2010-06-01 09:31:00.000 2 unique qualities
Use the showValues method to display all values.
OPC HDA Data object array:
TIMESTAMP Example.ItemR.1 Example.ItemR.2
======================= =============== ===============
2010-06-01 09:30:00.000 0.000000 1.000000
2010-06-01 09:30:15.000 1.000000 1.500000
2010-06-01 09:30:30.000 2.000000 2.000000
2010-06-01 09:30:45.000 1.000000 2.500000
2010-06-01 09:31:00.000 0.000000 3.000000
Обратите внимание, что для этих новых значений в параметре качества установлено значение «Interpolated». Example.ItemR.2.
showValues(hdaDataUnion(2))
OPC HDA Data object for item Example.ItemR.2:
TIMESTAMP VALUE QUALITY
======================= ============= ===================
2010-06-01 09:30:00.000 1.000000 Raw (Good)
2010-06-01 09:30:15.000 1.500000 Interpolated (Good)
2010-06-01 09:30:30.000 2.000000 Raw (Good)
2010-06-01 09:30:45.000 2.500000 Interpolated (Good)
2010-06-01 09:31:00.000 3.000000 Raw (Good)
Постройте график данных с маркерами, чтобы показать, как работают методы.
subplot(2,1,1); plot(hdaDataSmall,'Marker','.'); hold all plot(hdaDataIntersect,'Marker','o','LineStyle','none'); title('Intersection of time series in Data object'); subplot(2,1,2); plot(hdaDataSmall,'Marker','.'); hold all plot(hdaDataUnion,'Marker','o','LineStyle','none'); title('Union of time series in Data object');

Выполните повторную выборку небольшого набора данных на указанных шагах времени.
newTS = datenum(2010,6,1,9,30,[0:60]);
hdaDataResampled = resample(hdaDataSmall,newTS)
figure;
plot(hdaDataSmall);
hold all
stairs(hdaDataResampled);
hdaDataResampled =
1-by-2 OPC HDA Data object:
ItemID Value Start TimeStamp End TimeStamp Quality
--------------- ---------------- ----------------------- ----------------------- ------------------
Example.ItemR.1 61 double values 2010-06-01 09:30:00.000 2010-06-01 09:31:00.000 2 unique qualities
Example.ItemR.2 61 double values 2010-06-01 09:30:00.000 2010-06-01 09:31:00.000 2 unique qualities
Use the showValues method to display all values.
