exponenta event banner

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

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

Введение в правила преобразования 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: текстовая таблица Битфилда

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. 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