可视化和预处理OPC UA数据

这个例子向您展示了如何使用OPC UA数据对象。

从OPC UA服务器读取历史数据时创建OPC UA数据对象。OPC UA数据对象允许您在将历史数据转换为在MATLAB中进行进一步处理的数据类型之前存储、可视化和操作历史数据。

有关生成OPC UA数据对象的更多信息,请参见示例读历史OPC UA服务器数据

加载样本OPC UA数据集

将示例数据加载到工作区中。

负载demoUA_SampleData

显示OPC UA数据对象

检查工作区以查看加载了哪些变量。

名称大小字节类属性dataSample 1x3 5926 opc.ua.Data

显示示例数据的摘要。

总结(dataSample)
1×3 OPC UA数据对象:名称值开始时间结束时间戳质量- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -双9双值2015-04-22 09:00:10.000 2015-04-22 09:01:30.000 3独特品质浮动12单值2015-04-22 09:00:02.000 2015-04-22 09:01:30.000 3独特的品质Int32 12 Int32值2015-04-22 09:00:02.000 2015-04-22 09:01:30.000 3独特的品质

数据对象包含三个数据集。第一个元素包含9个值,第二个和第三个各有12个值。

浮动Int32数据集具有相同的时间戳。

arrayHasSameTimestamp (dataSample (2:3))
ans = 1

显示浮动Int32数据集在一起。因为所有的元素都有相同的时间戳,所以可以显示一个值表

dataSample (2:3)
an = 1 * 2的OPC UA数据对象数组:时间戳浮动Int32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2015-04-22 09:00:02.000 10.000000[好(生)]10[好(生)]2015-04-22 09:00:25.000 20.000000[好(生)]20[好(生)]2015-04-22 09:00:28.000 25.000000[好(生)]25[好(生)]2015-04-22 09:00:40.000 30.000000[好(生)]30[好(生)]2015-04-22 09:00:42.000 0.000000[坏(生)]0[坏(生)]2015-04-22 09:00:48.000 4.000000[好(生)]40[好(生)]2015-04-22[2015-04-22 09:01] [Good (Raw)] 50 [Good (Raw)] [Good (Raw)] 60 [Good (Raw)][2015-04-22 09:22 70.000000[不确定(Raw)] 70 [Good (Raw)] [Good (Raw)] 70 [Good (Raw)] [Good (Raw)] 80 [Good (Raw)] [Good (Raw)] [2015-04-22 09:01 [Good (Raw)] 90 [Good (Raw)]

更改日期显示格式

使用以下命令获取当前日期显示格式opc.getDateDisplayFormat

origFormat = opc.getDateDisplayFormat;

将显示格式更改为标准的US日期格式并再次显示该值。

opc.setDateDisplayFormat(“mm / dd / yyyy HH: mm我”);dataSample (2:3)
ANS = 1×2 OPC UA数据对象数组:时间戳浮法的Int32 ------------------- ------------------------------- -------------------------------- 04 /二千〇一十五分之二十二9:00 AM 10.000000 [良好(RAW)] 10 [良好(RAW)] 2015年4月22日9:00 AM 20.000000 [良好(RAW)] 20 [良好(RAW)] 2015年4月22日9:上午12点25.000000 [良好(RAW)] 25 [良好(RAW)] 2015年4月22日上午09点00 30.000000 [良好(RAW)] 30 [良好(RAW)] 2015年4月22日上午09点00 0.000000[差(RAW)] 0 [差(原始)] 2015年4月22日9:00 AM 4.000000 [良好(RAW)] 40 [良好(RAW)] 2015年4月22日9:00 AM 50.000000 [良好(原始)] 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('默认')
HH:MM:SS.FFF

将显示格式重置为原始值。

opc.setDateDisplayFormat (origFormat);

可视化OPC UA数据

方法可视化OPC UA数据情节要么楼梯数据对象上的方法。

axH1 =次要情节(2,1,1);情节(dataSample);标题(“样本数据图”);axH2 =次要情节(2,1,2);楼梯(dataSample);标题(“样本数据阶梯图”);传奇('位置',“西北”)

重新采样OPC UA数据

中的数据dataSampleset有不同的时间戳。

arrayHasSameTimestamp (dataSample)
ans = 0

尝试把该数据转换为双阵列。转换将失败。

试一试瓦尔斯=双(dataSample);exc disp (exc.message)结束
转换为双失败。OPC数据对象的所有元素必须具有相同的时间戳。考虑在数据对象上使用“TSUNION”、“TSINTERSECT”或“RESAMPLE”。

数据时间戳的交集将产生一个更小的数据集,其中包含来自所有元素的公共时间戳。

dataIntersect = tsintersect (dataSample)
dataIntersect = 1×3 OPC UA数据对象数组:时间戳双浮子Int32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2015-04-22 09:00:40.000 40.000000[坏(生)]30.000000[好(生)]30[好(生)]2015-04-22 09:01:30.000 90.000000[好(生)]90.000000[好(生)90(好(生))

将数据对象转换为双数组。

瓦尔斯=双(dataIntersect)
瓦尔斯= 40 30 30 90 90 90

使用tsunion返回数据对象中时间序列的并集。使用提供的方法插值新值(如果没有提供方法,则使用线性插值)。对于那些新值,质量被设置为“内插”。

dataUnion = tsunion (dataSample)
dataUnion = 1×3 OPC UA数据对象数组:时间戳双浮子Int32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2015-04-22 03:00:02.000 2.000000(不确定:弱智者(插值)]10.000000[好(生)]10[好(生)]2015-04-22 03:00:10.000 10.000000[好(生)]13.478261[好(插值)]13[好(插值)]2015-04-22 03:00:20.000 20.000000[好(生)]17.826086[好(插值)]18(好(插值))2015-04-22 03:00:25.000 25.000000[好(插值)]20.000000[好(生)]20[好(生)]2015-04-22 03:00:28.000 28.000000[好(插值)]25.000000[好(生)]25[好(生)]2015-04-22 03:00:30.000 30.000000[好(生)]25.833334[好(插值)]26[好(插值)]2015-04-22 03:00:40.000 40.000000[坏(生)]30.000000[好(生)]30[好(生)]2015-04-22 03:00:42.000 42.000000[好(插值)]0.000000[坏(生)]0坏(生)2015-04-22 03:00:48.00048.000000(好(插值))4.000000[好(生)]40[好(生)]2015-04-22 03:00:50.000 50.000000[好(生)]27.000000[好(插值)]45[好(插值)]2015-04-22 03:00:52.000 52.000000(好(插值))50.000000(好(生))50[好(生)]2015-04-22 03:01:00.000 60.000000[好(生)]54.000000[好(插值)]54[好(插值)]2015-04-22 03:01:10.000 70.000000(不确定(生))59.000000[好(插值)]59[好(插值)]2015-04-2203:01:12.000 72.000000(好(插值))60.000000(好(生))60[好(生)]2015-04-22 03:01:17.000 77.000000(好(插值))70.000000(不确定(生))70(不确定(生))2015-04-22 03:01:20.000 80.000000[好(生)]70.000000[好(插值)]70[好(插值)]2015-04-22 03:01:23.000 83.000000[好(插值)]70.000000[好(生)]70[好(生)]2015-04-22 03:01:26.000 86.000000[好(插值)]80.000000[好(生)]80[好(生)]2015-04-2290.000000[好(生)]90.000000[好(生)]90[好(生)]

用标记绘制数据以显示方法是如何工作的。

次要情节(2,1,1);情节(dataSample“标记”,“。”);持有所有情节(dataIntersect“标记”,'O',“线型”,“没有”);标题(“数据对象中时间序列的交集”);次要情节(2,1,2);情节(dataSample“标记”,“。”);持有所有图(dataUnion,“标记”,'O',“线型”,“——”);标题(数据对象中时间序列的并集);

按指定的时间步重新取样小数据集。

蝾螈= dataSample (1) .Timestamp(1):秒(5):dataSample (1) .Timestamp(结束);datare= resample(dataSample,newTS)图;情节(dataSample);持有所有情节(dataResampled“标记”,“x”,“线型”,“没有”);
dataResampled = 1×3 OPC UA数据对象数组:时间戳双浮点的Int32 ----------------------- ----------------------------------- ----------------------------------- ------------------------------------ 2015-04-22 03:00:10.000 10.000000 [良好(RAW)] 13.478261 [好(内插)] 13 [好(内插)] 2015年4月22日03:00:15.000 15.000000 [好(内插)] 15.652174 [好(内插)] 16 [好(内插)] 2015年4月22日03:00:20.000 20.000000 [良好(RAW)] 17.826086 [好(内插)] 18 [好(内插)] 2015年4月22日03:00:25.000 25.000000[良好(插值)] 20.000000 [良好(RAW)] 20 [良好(RAW)] 2015年4月22日03:00:30.000 30.000000 [良好(RAW)] 25.833334 [好(内插)] 26 [好(内插)] 2015年4月22日03:00:35.000 35.000000 [好(内插)] 27.916666 [好(内插)] 28 [好(内插)] 2015年4月22日03:00:40.000 40.000000 [坏(原始)] 30.000000[良好(RAW)] 30 [良好(RAW)] 2015年4月22日03:00:45.000 45.000000 [好(内插)] 2.000000 [好(内插)] 20 [好(内插)] 2015年4月22日03:00:50.000 50.000000 [良好(RAW)] 27.000000 [好(内插)] 45 [好(内插)] 2015年4月22日03:00:55.000 55.000000 [好(内插)] 51.500000 [好(内插)] 52 [好(内插)] 2015年4月22日03:01:00.000 60.000000 [良好(RAW)] 54.000000 [好(内插)] 54 [好(内插)] 2015年4月22日03:01:05.000 65.000000 [好(内插)] 56.500000 [好(内插)] 57 [好(内插)] 2015年4月22日03:01:10.000 70.000000 [不确定(生)] 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),‘好’)
reampledgood = 1乘1的OPC UA数据对象数组:时间戳浮- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2015-04-22 03:00:10.000 13.478261[好(插值)]2015-04-22 03:00:15.000 15.652174[好(插值)]2015-04-22 03:00:20.000 17.826086[好(插值)]2015-04-22 03:00:25.000 20.000000[好(生)]2015-04-22 03:00:30.000 25.833334[好(插值)]2015-04-22 03:00:35.000 27.916666[好(插值)]2015-04-22 03:00:40.000 30.000000[好(生)]2015-04-22 03:00:45.000 2.000000[好(插值)]2015-04-22 03:00:50.000 27.000000[好(插值)]2015-04-22 03:00:55.000 51.500000[好(插值)]2015-04-22 03:01:00.000 54.000000[好(插值)]2015-04-22 03:01:05.000 56.500000[好(插值)]2015-04-22 03:01:10.000 59.000000[好(插值)]2015-04-22 03:01:15.000 66.000000[好(插值)]2015-04-22 03:01:20.000 70.000000[好(插值)]2015-04-22 03:01:25.000 76.666664[好(插值)]2015-04-22 03:01:30.000 90.000000(好(生))

过滤重采样数据的第二个元素,只返回插值数据。将过滤后的数据与原始数据进行可视化。

resampledInterpolated = filterByQuality(dataResampled(2),“起源”,“插入”)图;情节(dataResampled (2))图(resampledGood,“标记”,“+”,“线型”,“没有”,“DisplayName的”,‘好’);情节(resampledInterpolated“标记”,“x”,“线型”,“没有”,“DisplayName的”,“插入”);传奇('位置',“西北”)
reampled插值= 1乘1的OPC UA数据对象数组:时间戳浮- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2015-04-22 03:00:10.000 13.478261[好(插值)]2015-04-22 03:00:15.000 15.652174[好(插值)]2015-04-22 03:00:20.000 17.826086[好(插值)]2015-04-22 03:00:30.000 25.833334[好(插值)]2015-04-22 03:00:35.000 27.916666[好(插值)]2015-04-22 03:00:45.000 2.000000[好(插值)]2015-04-22 03:00:50.000 27.000000[好(插值)]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)]