Main Content

从 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 选项读取原始值的能力。

  • ReadRawfalse(默认值)- 应用所有数值和文本转换 (CC_Type 1-10)。所有数据都读取为物理值。

  • ReadRawtrue - 不应用任何转换。所有数据都读取为原始值。

请注意,如果通道中存在恒等转换 (CC_Type 0) 或无转换(无转换规则),则无论指定哪个 ReadRaw 选项,数据都将读取为原始值。

查看通道详细信息

使用 mdfChannelInfo 函数查看关于 MDF_Conversion_Example.mf4 中所有通道的详细信息。将 AdditionalMetadata 选项指定为 true 以包括其他元数据,该元数据包含有关 DataTypeNumBits 中的原始数据类型的信息,以及 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     

在返回的表中只显示几个相关变量,包括 NameGroupNumberGroupNumSamplesUnitDataTypeNumBitsConversionType

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 选项读取这些通道中的数据。