Чтение данных из MDF-файла с примененными правилами преобразования

В этом примере показано, как считать данные канала, применяющие правила преобразования из MDF-файла, и сконфигурировать различные опции чтения в MATLAB.

Введение в правила преобразования MDF ASAM

Согласно стандарту 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: Текстовая таблица Битфилда

Vehicle Network Toolbox предоставляет функциональность для чтения требуемых данных из MDF-файла с различными Conversion опции. Допустимые опции:

  • Numeric - Применить только число к числовым преобразованиям (CC_Type 1-6). Данные с другими правилами преобразования считаются необработанными значениями.

  • None - Не применять преобразование. Все данные считываются необработанными значениями.

  • All - Применить все числовые и текстовые преобразования (CC_Type 1-10). Все данные считываются как физические значения.

Обратите внимание, что если в канале существуют тождества (CC_Type 0) или нет преобразования (без правила преобразования), данные считываются необработанными значениями независимо от того, какие Conversion задан параметр.

Откройте MDF-файл

Откройте доступ к MDF-файлу с помощью mdf функция. Объект mdfObj имеет свойство Conversion со значением по умолчанию Numeric.

mdfObj = mdf('MDF_Conversion_Example.mf4')
mdfObj = 
  MDF with properties:

   File Details
                 Name: 'MDF_Conversion_Example.mf4'
                 Path: 'C:\Users\kuanliu\OneDrive - MathWorks\Documents\MATLAB\Examples\vnt-ex96016136\MDF_Conversion_Example.mf4'
               Author: ''
           Department: ''
              Project: ''
              Subject: ''
              Comment: ''
              Version: '4.10'
             DataSize: 185
     InitialTimestamp: 1980-01-01 05:00:00.000000000

   Creator Details
    ProgramIdentifier: 'amdf5206'
              Creator: [1×1 struct]

   File Contents
           Attachment: [0×1 struct]
         ChannelNames: {{6×1 cell}}
         ChannelGroup: [1×1 struct]

   Options
           Conversion: Numeric

Используйте channelList функция для просмотра списка каналов, доступных в mdfObj

channelList(mdfObj)
ans=6×9 table
             ChannelName              ChannelGroupNumber    ChannelGroupNumSamples    ChannelGroupAcquisitionName    ChannelGroupComment    ChannelDisplayName    ChannelUnit    ChannelComment    ChannelDescription
    ______________________________    __________________    ______________________    ___________________________    ___________________    __________________    ___________    ______________    __________________

    "Ambient temperature"                     1                       5                 Signal with conversions          <undefined>                ""            °F              <undefined>              ""        
    "Engine temperature"                      1                       5                 Signal with conversions          <undefined>                ""            °C              <undefined>              ""        
    "Fault code"                              1                       5                 Signal with conversions          <undefined>                ""            <undefined>     <undefined>              ""        
    "Gear position"                           1                       5                 Signal with conversions          <undefined>                ""            <undefined>     <undefined>              ""        
    "time"                                    1                       5                 Signal with conversions          <undefined>                ""            s               <undefined>              ""        
    "Windshield wiper speed level"            1                       5                 Signal with conversions          <undefined>                ""            <undefined>     <undefined>              ""        

Понимание Conversion Свойство и Conversion Пара "имя-значение"

Вы можете выбрать Conversion опция для применения при считывании данных из MDF-файла в MATLAB. Вы задаете опцию одним из следующих способов:

  • Установите Conversion свойство объекта MDF и вызов read функция.

  • Задайте Conversion Пара "имя-значение" при вызове read функция.

Просмотрите подробности о канале Engine temperature в группе 1 канала. Этот выход показывает, что он имеет Linear преобразование (CC_Type 1).

mdfObj.ChannelGroup(1).Channel(2)
ans = struct with fields:
                  Name: 'Engine temperature'
           DisplayName: ''
    ExtendedNamePrefix: ''
           Description: ''
               Comment: ''
                  Unit: '°C'
                  Type: FixedLength
              DataType: IntegerSignedLittleEndian
               NumBits: 32
         ComponentType: None
       CompositionType: None
        ConversionType: Linear

Можно задать Conversion свойство mdfObj чтобы быть Numeric и считывайте данные из канальных Engine temperature в группе 1 канала.

mdfObj.Conversion = "Numeric"
mdfObj = 
  MDF with properties:

   File Details
                 Name: 'MDF_Conversion_Example.mf4'
                 Path: 'C:\Users\kuanliu\OneDrive - MathWorks\Documents\MATLAB\Examples\vnt-ex96016136\MDF_Conversion_Example.mf4'
               Author: ''
           Department: ''
              Project: ''
              Subject: ''
              Comment: ''
              Version: '4.10'
             DataSize: 185
     InitialTimestamp: 1980-01-01 05:00:00.000000000

   Creator Details
    ProgramIdentifier: 'amdf5206'
              Creator: [1×1 struct]

   File Contents
           Attachment: [0×1 struct]
         ChannelNames: {{6×1 cell}}
         ChannelGroup: [1×1 struct]

   Options
           Conversion: Numeric

dataPropNum = read(mdfObj, 1, "Engine temperature")
dataPropNum=5×1 timetable
      Time      EngineTemperature
    ________    _________________

    0 sec                35      
    0.25 sec         35.556      
    0.5 sec          36.111      
    0.75 sec         36.667      
    1 sec            37.222      

Можно также считать данные с парой "имя-значение" Conversion, None. Обратите внимание, что Conversion пара "имя-значение" имеет более высокий приоритет, чем Conversion свойство, что означает, что пара "имя-значение" применяется, когда значения различаются.

dataNameValueNone = read(mdfObj, 1, "Engine temperature", "Conversion", "None")
dataNameValueNone=5×1 timetable
      Time      EngineTemperature
    ________    _________________

    0 sec              95        
    0.25 sec           96        
    0.5 sec            97        
    0.75 sec           98        
    1 sec              99        

Использование Conversion пара "имя-значение" не меняет Conversion свойство mdfObj. The Conversion значение свойства mdfObj после чтения данных с парой "имя-значение" все еще Numeric.

mdfObj.Conversion
ans = 
Numeric

Чтение данных с различными Conversion Опции для числовых преобразований в числовые

Следующий код показывает, как считать ваши желаемые данные из канала с числовым в числовое преобразование. Канал Engine temperature имеет Linear преобразование (CC_Type 1) и оно выбирается так, чтобы представлять чтение числового преобразования в числовое (CC_Type 1-6).

Считайте данные с парой "имя-значение" Conversion, Numeric. В этом случае Linear преобразование применяется при чтении данных, потому что Numeric опция поддерживает числовые преобразования в числа. Физические данные возвращаются, и физические числовые данные имеют тип данных double.

dataLinearNum = read(mdfObj, 1, "Engine temperature", "Conversion", "Numeric")
dataLinearNum=5×1 timetable
      Time      EngineTemperature
    ________    _________________

    0 sec                35      
    0.25 sec         35.556      
    0.5 sec          36.111      
    0.75 sec         36.667      
    1 sec            37.222      

class(dataLinearNum.EngineTemperature)
ans = 
'double'

Считайте данные с парой "имя-значение" Conversion,None. В этом случае Linear преобразование не применяется при чтении данных, потому что None опция не применяет преобразование. Необработанные данные возвращаются с исходным типом данных, который является int32.

dataLinearNone = read(mdfObj, 1, "Engine temperature", "Conversion", "None")
dataLinearNone=5×1 timetable
      Time      EngineTemperature
    ________    _________________

    0 sec              95        
    0.25 sec           96        
    0.5 sec            97        
    0.75 sec           98        
    1 sec              99        

class(dataLinearNone.EngineTemperature)
ans = 
'int32'

Считайте данные с парой "имя-значение" "Conversion","All". В этом случае Linear преобразование применяется при чтении данных, потому что All опция поддерживает все числовые и текстовые преобразования. Физические данные возвращаются, и физические числовые данные имеют тип данных double.

dataLinearAll = read(mdfObj, 1, "Engine temperature", "Conversion", "All")
dataLinearAll=5×1 timetable
      Time      EngineTemperature
    ________    _________________

    0 sec                35      
    0.25 sec         35.556      
    0.5 sec          36.111      
    0.75 sec         36.667      
    1 sec            37.222      

class(dataLinearAll.EngineTemperature)
ans = 
'double'

Чтение данных с различными Conversion Опции для преобразования числа в текст

Следующий код показывает, как считать ваши желаемые данные из канала с числовым преобразованием в текст. Канал Gear position имеет ValueToText преобразование (CC_Type 7) и оно выбирается так, чтобы представлять чтение числового преобразования в текст (CC_Type 7-8).

Просмотрите подробности о канале Gear position в группе 1 канала. Этот выход показывает, что он имеет ValueToText преобразование.

mdfObj.ChannelGroup(1).Channel(3)
ans = struct with fields:
                  Name: 'Gear position'
           DisplayName: ''
    ExtendedNamePrefix: ''
           Description: ''
               Comment: ''
                  Unit: ''
                  Type: FixedLength
              DataType: IntegerUnsignedLittleEndian
               NumBits: 8
         ComponentType: None
       CompositionType: None
        ConversionType: ValueToText

Считайте данные с парой "имя-значение" Conversion,Numeric. В этом случае ValueToText преобразование не применяется при чтении данных, потому что Numeric опция поддерживает только числовые преобразования в числа. Необработанные данные возвращаются с исходным типом данных, который является int8.

dataV2TNum = read(mdfObj, 1, "Gear position", "Conversion", "Numeric")
dataV2TNum=5×1 timetable
      Time      GearPosition
    ________    ____________

    0 sec            2      
    0.25 sec         3      
    0.5 sec          0      
    0.75 sec         2      
    1 sec            1      

class(dataV2TNum.GearPosition)
ans = 
'uint8'

Считайте данные с парой "имя-значение" Conversion,None. В этом случае ValueToText преобразование не применяется при чтении данных, потому что None опция не применяет преобразование. Необработанные данные возвращаются с исходным типом данных, который является int8.

dataV2TNone = read(mdfObj, 1, "Gear position", "Conversion", "None")
dataV2TNone=5×1 timetable
      Time      GearPosition
    ________    ____________

    0 sec            2      
    0.25 sec         3      
    0.5 sec          0      
    0.75 sec         2      
    1 sec            1      

class(dataV2TNone.GearPosition)
ans = 
'uint8'

Считайте данные с парой "имя-значение" Conversion,All. В этом случае ValueToText преобразование применяется при чтении данных, потому что All опция поддерживает все числовые и текстовые преобразования. Физические данные возвращаются, а данные физического текста имеют тип данных char.

dataV2TAll = read(mdfObj, 1, "Gear position", "Conversion", "All")
dataV2TAll=5×1 timetable
      Time         GearPosition    
    ________    ___________________

    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(dataV2TAll.GearPosition{1})
ans = 
'char'

Другие примеры преобразования

В mdfObj есть некоторые другие каналы. Каналы Ambient temperature, Windshield wiper speed level и Fault code имеют преобразования None, TextToValue, и TextToText, соответственно. Можно попробовать прочитать эти каналы с различными Conversion опции.

Просмотрите подробности о канале Ambient temperature в группе 1 канала. Этот выход показывает, что он имеет None преобразование.

mdfObj.ChannelGroup(1).Channel(1)
ans = struct with fields:
                  Name: 'Ambient temperature'
           DisplayName: ''
    ExtendedNamePrefix: ''
           Description: ''
               Comment: ''
                  Unit: '°F'
                  Type: FixedLength
              DataType: RealLittleEndian
               NumBits: 64
         ComponentType: None
       CompositionType: None
        ConversionType: None

Просмотрите подробности о канале Windshield wiper speed level в группе 1 канала. Этот выход показывает, что он имеет TextToValue преобразование.

mdfObj.ChannelGroup(1).Channel(4)
ans = struct with fields:
                  Name: 'Windshield wiper speed level'
           DisplayName: ''
    ExtendedNamePrefix: ''
           Description: ''
               Comment: ''
                  Unit: ''
                  Type: VariableLength
              DataType: StringUTF8
               NumBits: 64
         ComponentType: None
       CompositionType: None
        ConversionType: TextToValue

Просмотрите подробности о канале Fault cod"в группе 1 канала. Этот выход показывает, что он имеет TextToText преобразование.

mdfObj.ChannelGroup(1).Channel(5)
ans = struct with fields:
                  Name: 'Fault code'
           DisplayName: ''
    ExtendedNamePrefix: ''
           Description: ''
               Comment: ''
                  Unit: ''
                  Type: VariableLength
              DataType: StringUTF8
               NumBits: 64
         ComponentType: None
       CompositionType: None
        ConversionType: TextToText

Закройте файл

Закройте доступ к MDF-файлу путем удаления переменной из рабочей области.

clear mdfObj