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