从 MDF 文件中读取物理和原始数据
此示例说明如何从 MDF 文件中读取通道数据作为物理值和原始值。
ASAM MDF 转换规则简介
根据 ASAM MDF 标准,在 MDF 通道中编码的数据值表示为原始值。可以使用转换规则将其转换为具有工程单位的物理值。转换规则是在通道级别定义的将原始值转换为物理值的方法。
ASAM MDF V4.2.0 支持以下转换规则:
无转换
CC_Type 0:恒等(“1:1”)转换
值到值转换
CC_Type 1:线性转换
CC_Type 2:有理转换公式
CC_Type 3:代数转换
CC_Type 4:值到值表查找和插值
CC_Type 5:值到值表查找,无插值
CC_Type 6:值范围到值表查找
数值到文本转换
CC_Type 7:值到文本/标度转换表查找
CC_Type 8:数值范围到文本/标度转换表查找
文本到值的转换
CC_Type 9:文本到值表查找
文本到文本转换
CC_Type 10:文本到文本表查找
其他转换
CC_Type 11:位域文本表
默认情况下,mdfRead
函数从 MDF 文件中读取物理值,但它也提供通过 ReadRaw
选项读取原始值的能力。
ReadRaw
为false
(默认值)- 应用所有数值和文本转换 (CC_Type 1-10)。所有数据都读取为物理值。ReadRaw
为true
- 不应用任何转换。所有数据都读取为原始值。
请注意,如果通道中存在恒等转换 (CC_Type 0) 或无转换(无转换规则),则无论指定哪个 ReadRaw
选项,数据都将读取为原始值。
查看通道详细信息
使用 mdfChannelInfo
函数查看关于 MDF_Conversion_Example.mf4
中所有通道的详细信息。将 AdditionalMetadata
选项指定为 true
以包括其他元数据,该元数据包含有关 DataType
和 NumBits
中的原始数据类型的信息,以及 ConversionType
中的转换规则。
chanInfo = mdfChannelInfo("MDF_Conversion_Example.mf4", AdditionalMetadata=true)
chanInfo=6×25 table
Name GroupNumber GroupNumSamples GroupAcquisitionName GroupComment GroupSourceName GroupSourcePath DisplayName Unit Comment ExtendedNamePrefix SourceName SourcePath Type SyncType DataType NumBits ComponentType CompositionType ConversionType SourceComment SourceType SourceBusType SourceBusChannelNumber SourceSimulated
______________________________ ___________ _______________ _______________________ ____________ _______________________ _______________________ ___________ ___________ ___________ _______________________ _______________________ _______________________ ______________ ________ ___________________________ _______ _____________ _______________ ______________ _____________ ___________ _____________ ______________________ _______________
"Ambient temperature" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" °F <undefined> <undefined> <undefined> <undefined> FixedLength None RealLittleEndian 64 None None Unspecified "" Unspecified Unspecified 0 false
"Engine temperature" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" °C <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerSignedLittleEndian 32 None None Linear "" Unspecified Unspecified 0 false
"Fault code" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" <undefined> <undefined> <undefined> <undefined> <undefined> VariableLength None StringUTF8 64 None None TextToText "" Unspecified Unspecified 0 false
"Gear position" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerUnsignedLittleEndian 8 None None ValueToText "" Unspecified Unspecified 0 false
"Windshield wiper speed level" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" <undefined> <undefined> <undefined> <undefined> <undefined> VariableLength None StringUTF8 64 None None TextToValue "" Unspecified Unspecified 0 false
"time" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" s <undefined> Signal with conversions Signal with conversions Signal with conversions Master Time RealLittleEndian 64 None None Unspecified "" Tool None 0 false
在返回的表中只显示几个相关变量,包括 Name
、GroupNumber
、GroupNumSamples
、Unit
、DataType
、NumBits
和 ConversionType
。
chanInfo(:, ["Name", "GroupNumber", "GroupNumSamples", "Unit", "DataType", "NumBits", "ConversionType"])
ans=6×7 table
Name GroupNumber GroupNumSamples Unit DataType NumBits ConversionType
______________________________ ___________ _______________ ___________ ___________________________ _______ ______________
"Ambient temperature" 1 5 °F RealLittleEndian 64 Unspecified
"Engine temperature" 1 5 °C IntegerSignedLittleEndian 32 Linear
"Fault code" 1 5 <undefined> StringUTF8 64 TextToText
"Gear position" 1 5 <undefined> IntegerUnsignedLittleEndian 8 ValueToText
"Windshield wiper speed level" 1 5 <undefined> StringUTF8 64 TextToValue
"time" 1 5 s RealLittleEndian 64 Unspecified
从包含值到值转换的通道读取数据
名为“Engine temperature”的通道包含 Linear
转换 (CC_Type 1)。
chanInfo.ConversionType(chanInfo.Name == "Engine temperature")
ans = ChannelConversionType enumeration Linear
从“Engine temperature”中读取数据。默认情况下,返回数据类型 double
的物理值。
engTempPhy = mdfRead("MDF_Conversion_Example.mf4", Channel="Engine temperature"); engTempPhy{1}
ans=5×1 timetable
time Engine temperature
________ __________________
0 sec 35
0.25 sec 35.556
0.5 sec 36.111
0.75 sec 36.667
1 sec 37.222
class(engTempPhy{1}.("Engine temperature"))
ans = 'double'
将选项 ReadRaw
设置为 true
,以数据类型 int32
的原始值形式从“Engine temperature”中读取数据。原始数据类型在 DataType
中定义为 IntegerSignedLittleEndian
(2),在 NumBits
中定义为 32。
engTempRaw = mdfRead("MDF_Conversion_Example.mf4", Channel="Engine temperature", ReadRaw=true); engTempRaw{1}
ans=5×1 timetable
time Engine temperature
________ __________________
0 sec 95
0.25 sec 96
0.5 sec 97
0.75 sec 98
1 sec 99
class(engTempRaw{1}.("Engine temperature"))
ans = 'int32'
从具有值到文本转换的通道读取数据
名为“Gear position”的通道包含 ValueToText
转换 (CC_Type 7)。
chanInfo.ConversionType(chanInfo.Name == "Gear position")
ans = ChannelConversionType enumeration ValueToText
从“Gear position”读取数据。默认情况下,返回数据类型 string
的物理值。
gearPosPhy = mdfRead("MDF_Conversion_Example.mf4", Channel="Gear position"); gearPosPhy{1}
ans=5×1 timetable
time Gear position
________ _________________
0 sec "Gear position 2"
0.25 sec "Gear position 3"
0.5 sec "Invalid"
0.75 sec "Gear position 2"
1 sec "Gear position 1"
class(gearPosPhy{1}.("Gear position"))
ans = 'string'
将选项 ReadRaw
设置为 true
,以数据类型 uint8
的原始值形式从“Gear position”读取数据。原始数据类型在 DataType
中定义为 IntegerUnsignedLittleEndian
(0),在 NumBits
中定义为 8。
gearPosRaw = mdfRead("MDF_Conversion_Example.mf4", Channel="Gear position", ReadRaw=true); gearPosRaw{1}
ans=5×1 timetable
time Gear position
________ _____________
0 sec 2
0.25 sec 3
0.5 sec 0
0.75 sec 2
1 sec 1
class(gearPosRaw{1}.("Gear position"))
ans = 'uint8'
从不进行转换的通道读取数据
名为“Ambient temperature”的通道不包含转换。
chanInfo.ConversionType(chanInfo.Name == "Ambient temperature")
ans = ChannelConversionType enumeration Unspecified
从“Ambient temperature”中读取数据作为物理值和原始值。由于通道不包含转换,因此返回的物理值与返回的原始值相同。
请注意,物理值与原始值具有相同的数据类型 double
。原始数据类型在 DataType
中定义为 RealLittleEndian
(4),在 NumBits
中定义为 64。
ambTempPhy = mdfRead("MDF_Conversion_Example.mf4", Channel="Ambient temperature"); ambTempPhy{1}
ans=5×1 timetable
time Ambient temperature
________ ___________________
0 sec 81.7
0.25 sec 81.9
0.5 sec 82
0.75 sec 81.8
1 sec 81.9
class(ambTempPhy{1}.("Ambient temperature"))
ans = 'double'
ambTempRaw = mdfRead("MDF_Conversion_Example.mf4", Channel="Ambient temperature", ReadRaw=true); ambTempRaw{1}
ans=5×1 timetable
time Ambient temperature
________ ___________________
0 sec 81.7
0.25 sec 81.9
0.5 sec 82
0.75 sec 81.8
1 sec 81.9
class(ambTempRaw{1}.("Ambient temperature"))
ans = 'double'
其他转换示例
MDF 文件中还有另外两个通道。
名为“Windshield wiper speed level”的通道包含 TextToValue
转换 (CC_Type 9)。
chanInfo.ConversionType(chanInfo.Name == "Windshield wiper speed level")
ans = ChannelConversionType enumeration TextToValue
名为“Fault code”的通道包含 TextToText
转换 (CC_Type 10)。
chanInfo.ConversionType(chanInfo.Name == "Fault code")
ans = ChannelConversionType enumeration TextToText
您可以尝试使用不同 ReadRaw
选项读取这些通道中的数据。