В этом примере показано, как работать с объектами OPC HDA Data.
Объекты OPC HDA Data создаются при считывании данных с сервера OPC Historical Data Access (HDA). Объекты OPC HDA Data позволяют вам хранить, визуализировать и манипулировать историческими данными перед преобразованием этих данных во встроенные типы данных для дальнейшей обработки в MATLAB.
Для получения дополнительной информации о генерации объектов OPC HDA Data, смотрите пример Получить данные от OPC Исторических данных Access Server.
Загрузите выборочные данные в рабочую область.
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
для возврата объединения временных рядов в объект данные. Новые значения интерполируются с помощью предоставленного метода (или линейной интерполяции, если метод не передан).
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.