Этот пример показывает вам, как работать с Объектами данных UA OPC.
Вы создаете Объекты данных UA OPC, когда вы считываете исторические данные из сервера UA OPC. Объекты данных UA OPC позволяют вам хранить, визуализировать и управлять историческими данными прежде, чем преобразовать те данные во встроенные типы данных для последующей обработки в MATLAB.
Для получения дополнительной информации о генерации Объектов данных UA OPC смотрите Чтение в качестве примера Исторические Серверные данные UA OPC.
Загрузите выборочные данные в рабочую область.
load demoUA_SampleData
Исследуйте рабочую область, чтобы видеть, какие переменные загрузились.
whos
Name Size Bytes Class Attributes dataSample 1x3 5926 opc.ua.Data
Отобразите сводные данные выборочных данных.
summary(dataSample)
1-by-3 OPC UA Data object: Name Value Start Timestamp End Timestamp Quality ------ ---------------- ----------------------- ----------------------- ------------------ Double 9 double values 2015-04-22 09:00:10.000 2015-04-22 09:01:30.000 3 unique qualities Float 12 single values 2015-04-22 09:00:02.000 2015-04-22 09:01:30.000 3 unique qualities Int32 12 int32 values 2015-04-22 09:00:02.000 2015-04-22 09:01:30.000 3 unique qualities
Объект данных содержит три набора данных. Первый элемент Double
содержит 9 значений, второе и третье имеют 12 значений каждый.
Смотрите ли Float
и Int32
наборы данных имеют ту же метку времени.
arrayHasSameTimestamp(dataSample(2:3))
ans = 1
Отобразите Float
и Int32
наборы данных вместе. Поскольку все элементы имеют ту же метку времени, таблица значений может быть отображена
dataSample(2:3)
ans = 1-by-2 OPC UA Data object array: Timestamp Float Int32 ----------------------- ------------------------------- -------------------------------- 2015-04-22 09:00:02.000 10.000000 [Good (Raw)] 10 [Good (Raw)] 2015-04-22 09:00:25.000 20.000000 [Good (Raw)] 20 [Good (Raw)] 2015-04-22 09:00:28.000 25.000000 [Good (Raw)] 25 [Good (Raw)] 2015-04-22 09:00:40.000 30.000000 [Good (Raw)] 30 [Good (Raw)] 2015-04-22 09:00:42.000 0.000000 [Bad (Raw)] 0 [Bad (Raw)] 2015-04-22 09:00:48.000 4.000000 [Good (Raw)] 40 [Good (Raw)] 2015-04-22 09:00:52.000 50.000000 [Good (Raw)] 50 [Good (Raw)] 2015-04-22 09:01:12.000 60.000000 [Good (Raw)] 60 [Good (Raw)] 2015-04-22 09:01:17.000 70.000000 [Uncertain (Raw)] 70 [Uncertain (Raw)] 2015-04-22 09:01:23.000 70.000000 [Good (Raw)] 70 [Good (Raw)] 2015-04-22 09:01:26.000 80.000000 [Good (Raw)] 80 [Good (Raw)] 2015-04-22 09:01:30.000 90.000000 [Good (Raw)] 90 [Good (Raw)]
Получите формат отображения текущей даты с помощью opc.getDateDisplayFormat
.
origFormat = opc.getDateDisplayFormat;
Измените формат отображения в стандартный формат даты США и отобразите значение снова.
opc.setDateDisplayFormat('mm/dd/yyyy HH:MM AM');
dataSample(2:3)
ans = 1-by-2 OPC UA Data object array: Timestamp Float Int32 ------------------- ------------------------------- -------------------------------- 04/22/2015 9:00 AM 10.000000 [Good (Raw)] 10 [Good (Raw)] 04/22/2015 9:00 AM 20.000000 [Good (Raw)] 20 [Good (Raw)] 04/22/2015 9:00 AM 25.000000 [Good (Raw)] 25 [Good (Raw)] 04/22/2015 9:00 AM 30.000000 [Good (Raw)] 30 [Good (Raw)] 04/22/2015 9:00 AM 0.000000 [Bad (Raw)] 0 [Bad (Raw)] 04/22/2015 9:00 AM 4.000000 [Good (Raw)] 40 [Good (Raw)] 04/22/2015 9:00 AM 50.000000 [Good (Raw)] 50 [Good (Raw)] 04/22/2015 9:01 AM 60.000000 [Good (Raw)] 60 [Good (Raw)] 04/22/2015 9:01 AM 70.000000 [Uncertain (Raw)] 70 [Uncertain (Raw)] 04/22/2015 9:01 AM 70.000000 [Good (Raw)] 70 [Good (Raw)] 04/22/2015 9:01 AM 80.000000 [Good (Raw)] 80 [Good (Raw)] 04/22/2015 9:01 AM 90.000000 [Good (Raw)] 90 [Good (Raw)]
Сбросьте формат отображения к значению по умолчанию.
opc.setDateDisplayFormat('default')
ans = yyyy-mm-dd HH:MM:SS.FFF
Сбросьте формат отображения к исходному значению.
opc.setDateDisplayFormat(origFormat);
Визуализируйте Данные о UA OPC с помощью plot
или stairs
методы на объекте данных.
axH1 = subplot(2,1,1); plot(dataSample); title('Plot of sample data'); axH2 = subplot(2,1,2); stairs(dataSample); title('Stairstep plot of sample data'); legend('Location', 'NorthWest')
Данные в dataSample
установите имеет различные метки времени.
arrayHasSameTimestamp(dataSample)
ans = 0
Попытайтесь преобразовать данные в двойной массив. Преобразование перестанет работать.
try vals = double(dataSample); catch exc disp(exc.message) end
Conversion to double failed. All elements of the OPC Data object must have the same time stamp. Consider using 'TSUNION', 'TSINTERSECT' or 'RESAMPLE' on the Data object.
Пересечение данных добавляет метку времени к результатам в меньшем наборе данных, содержащем общие метки времени от всех элементов.
dataIntersect = tsintersect(dataSample)
dataIntersect = 1-by-3 OPC UA Data object array: Timestamp Double Float Int32 ----------------------- -------------------------- -------------------------- --------------------------- 2015-04-22 09:00:40.000 40.000000 [Bad (Raw)] 30.000000 [Good (Raw)] 30 [Good (Raw)] 2015-04-22 09:01:30.000 90.000000 [Good (Raw)] 90.000000 [Good (Raw)] 90 [Good (Raw)]
Преобразуйте объект данных в двойной массив.
vals = double(dataIntersect)
vals = 40 30 30 90 90 90
Используйте tsunion
возвратить объединение временных рядов в Объекте данных. Новые значения интерполированы с помощью предоставленного метода (или линейная интерполяция, если никакой метод не предоставляется). Качество установлено в "Интерполированный" для тех новых значений.
dataUnion = tsunion(dataSample)
dataUnion = 1-by-3 OPC UA Data object array: Timestamp Double Float Int32 ----------------------- -------------------------------------------------- ----------------------------------- ------------------------------------ 2015-04-22 03:00:02.000 2.000000 [Uncertain:Subnormal (Interpolated)] 10.000000 [Good (Raw)] 10 [Good (Raw)] 2015-04-22 03:00:10.000 10.000000 [Good (Raw)] 13.478261 [Good (Interpolated)] 13 [Good (Interpolated)] 2015-04-22 03:00:20.000 20.000000 [Good (Raw)] 17.826086 [Good (Interpolated)] 18 [Good (Interpolated)] 2015-04-22 03:00:25.000 25.000000 [Good (Interpolated)] 20.000000 [Good (Raw)] 20 [Good (Raw)] 2015-04-22 03:00:28.000 28.000000 [Good (Interpolated)] 25.000000 [Good (Raw)] 25 [Good (Raw)] 2015-04-22 03:00:30.000 30.000000 [Good (Raw)] 25.833334 [Good (Interpolated)] 26 [Good (Interpolated)] 2015-04-22 03:00:40.000 40.000000 [Bad (Raw)] 30.000000 [Good (Raw)] 30 [Good (Raw)] 2015-04-22 03:00:42.000 42.000000 [Good (Interpolated)] 0.000000 [Bad (Raw)] 0 [Bad (Raw)] 2015-04-22 03:00:48.000 48.000000 [Good (Interpolated)] 4.000000 [Good (Raw)] 40 [Good (Raw)] 2015-04-22 03:00:50.000 50.000000 [Good (Raw)] 27.000000 [Good (Interpolated)] 45 [Good (Interpolated)] 2015-04-22 03:00:52.000 52.000000 [Good (Interpolated)] 50.000000 [Good (Raw)] 50 [Good (Raw)] 2015-04-22 03:01:00.000 60.000000 [Good (Raw)] 54.000000 [Good (Interpolated)] 54 [Good (Interpolated)] 2015-04-22 03:01:10.000 70.000000 [Uncertain (Raw)] 59.000000 [Good (Interpolated)] 59 [Good (Interpolated)] 2015-04-22 03:01:12.000 72.000000 [Good (Interpolated)] 60.000000 [Good (Raw)] 60 [Good (Raw)] 2015-04-22 03:01:17.000 77.000000 [Good (Interpolated)] 70.000000 [Uncertain (Raw)] 70 [Uncertain (Raw)] 2015-04-22 03:01:20.000 80.000000 [Good (Raw)] 70.000000 [Good (Interpolated)] 70 [Good (Interpolated)] 2015-04-22 03:01:23.000 83.000000 [Good (Interpolated)] 70.000000 [Good (Raw)] 70 [Good (Raw)] 2015-04-22 03:01:26.000 86.000000 [Good (Interpolated)] 80.000000 [Good (Raw)] 80 [Good (Raw)] 2015-04-22 03:01:30.000 90.000000 [Good (Raw)] 90.000000 [Good (Raw)] 90 [Good (Raw)]
Отобразите данные на графике с маркерами, чтобы показать, как методы работают.
subplot(2,1,1); plot(dataSample, 'Marker','.'); hold all plot(dataIntersect, 'Marker','o', 'LineStyle','none'); title('Intersection of time series in Data object'); subplot(2,1,2); plot(dataSample, 'Marker','.'); hold all plot(dataUnion, 'Marker','o', 'LineStyle','--'); title('Union of time series in Data object');
Передискретизируйте небольшой набор данных на шагах требуемого времени.
newTS = dataSample(1).Timestamp(1):seconds(5):dataSample(1).Timestamp(end); dataResampled = resample(dataSample,newTS) figure; plot(dataSample); hold all plot(dataResampled, 'Marker','x', 'Linestyle','none');
dataResampled = 1-by-3 OPC UA Data object array: Timestamp Double Float Int32 ----------------------- ----------------------------------- ----------------------------------- ------------------------------------ 2015-04-22 03:00:10.000 10.000000 [Good (Raw)] 13.478261 [Good (Interpolated)] 13 [Good (Interpolated)] 2015-04-22 03:00:15.000 15.000000 [Good (Interpolated)] 15.652174 [Good (Interpolated)] 16 [Good (Interpolated)] 2015-04-22 03:00:20.000 20.000000 [Good (Raw)] 17.826086 [Good (Interpolated)] 18 [Good (Interpolated)] 2015-04-22 03:00:25.000 25.000000 [Good (Interpolated)] 20.000000 [Good (Raw)] 20 [Good (Raw)] 2015-04-22 03:00:30.000 30.000000 [Good (Raw)] 25.833334 [Good (Interpolated)] 26 [Good (Interpolated)] 2015-04-22 03:00:35.000 35.000000 [Good (Interpolated)] 27.916666 [Good (Interpolated)] 28 [Good (Interpolated)] 2015-04-22 03:00:40.000 40.000000 [Bad (Raw)] 30.000000 [Good (Raw)] 30 [Good (Raw)] 2015-04-22 03:00:45.000 45.000000 [Good (Interpolated)] 2.000000 [Good (Interpolated)] 20 [Good (Interpolated)] 2015-04-22 03:00:50.000 50.000000 [Good (Raw)] 27.000000 [Good (Interpolated)] 45 [Good (Interpolated)] 2015-04-22 03:00:55.000 55.000000 [Good (Interpolated)] 51.500000 [Good (Interpolated)] 52 [Good (Interpolated)] 2015-04-22 03:01:00.000 60.000000 [Good (Raw)] 54.000000 [Good (Interpolated)] 54 [Good (Interpolated)] 2015-04-22 03:01:05.000 65.000000 [Good (Interpolated)] 56.500000 [Good (Interpolated)] 57 [Good (Interpolated)] 2015-04-22 03:01:10.000 70.000000 [Uncertain (Raw)] 59.000000 [Good (Interpolated)] 59 [Good (Interpolated)] 2015-04-22 03:01:15.000 75.000000 [Good (Interpolated)] 66.000000 [Good (Interpolated)] 66 [Good (Interpolated)] 2015-04-22 03:01:20.000 80.000000 [Good (Raw)] 70.000000 [Good (Interpolated)] 70 [Good (Interpolated)] 2015-04-22 03:01:25.000 85.000000 [Good (Interpolated)] 76.666664 [Good (Interpolated)] 77 [Good (Interpolated)] 2015-04-22 03:01:30.000 90.000000 [Good (Raw)] 90.000000 [Good (Raw)] 90 [Good (Raw)]
Найдите только Хорошие данные из второго элемента передискретизируемого набора данных
resampledGood = filterByQuality(dataResampled(2), 'good')
resampledGood = 1-by-1 OPC UA Data object array: Timestamp Float ----------------------- ----------------------------------- 2015-04-22 03:00:10.000 13.478261 [Good (Interpolated)] 2015-04-22 03:00:15.000 15.652174 [Good (Interpolated)] 2015-04-22 03:00:20.000 17.826086 [Good (Interpolated)] 2015-04-22 03:00:25.000 20.000000 [Good (Raw)] 2015-04-22 03:00:30.000 25.833334 [Good (Interpolated)] 2015-04-22 03:00:35.000 27.916666 [Good (Interpolated)] 2015-04-22 03:00:40.000 30.000000 [Good (Raw)] 2015-04-22 03:00:45.000 2.000000 [Good (Interpolated)] 2015-04-22 03:00:50.000 27.000000 [Good (Interpolated)] 2015-04-22 03:00:55.000 51.500000 [Good (Interpolated)] 2015-04-22 03:01:00.000 54.000000 [Good (Interpolated)] 2015-04-22 03:01:05.000 56.500000 [Good (Interpolated)] 2015-04-22 03:01:10.000 59.000000 [Good (Interpolated)] 2015-04-22 03:01:15.000 66.000000 [Good (Interpolated)] 2015-04-22 03:01:20.000 70.000000 [Good (Interpolated)] 2015-04-22 03:01:25.000 76.666664 [Good (Interpolated)] 2015-04-22 03:01:30.000 90.000000 [Good (Raw)]
Отфильтруйте второй элемент передискретизируемых данных, чтобы возвратить только Интерполированные данные. Визуализируйте отфильтрованные данные с оригиналом.
resampledInterpolated = filterByQuality(dataResampled(2), 'Origin','interpolated') figure; plot(dataResampled(2)) hold on plot(resampledGood, 'Marker', '+', 'Linestyle','none', 'DisplayName', 'Good'); plot(resampledInterpolated, 'Marker','x', 'Linestyle','none', 'DisplayName', 'Interpolated'); legend('Location', 'NorthWest')
resampledInterpolated = 1-by-1 OPC UA Data object array: Timestamp Float ----------------------- ----------------------------------- 2015-04-22 03:00:10.000 13.478261 [Good (Interpolated)] 2015-04-22 03:00:15.000 15.652174 [Good (Interpolated)] 2015-04-22 03:00:20.000 17.826086 [Good (Interpolated)] 2015-04-22 03:00:30.000 25.833334 [Good (Interpolated)] 2015-04-22 03:00:35.000 27.916666 [Good (Interpolated)] 2015-04-22 03:00:45.000 2.000000 [Good (Interpolated)] 2015-04-22 03:00:50.000 27.000000 [Good (Interpolated)] 2015-04-22 03:00:55.000 51.500000 [Good (Interpolated)] 2015-04-22 03:01:00.000 54.000000 [Good (Interpolated)] 2015-04-22 03:01:05.000 56.500000 [Good (Interpolated)] 2015-04-22 03:01:10.000 59.000000 [Good (Interpolated)] 2015-04-22 03:01:15.000 66.000000 [Good (Interpolated)] 2015-04-22 03:01:20.000 70.000000 [Good (Interpolated)] 2015-04-22 03:01:25.000 76.666664 [Good (Interpolated)]