Работа с файлами ASAM CDFX в MATLAB

Этот пример показывает, как импортировать калибровочный файл данных в MATLAB, исследовать и изменить его содержимое и экспортировать изменения назад в файле на диске.

Импорт файла CDFX

Импортируйте данные из файла CDFX с помощью функции cdfx.

cdfxObj = cdfx("CDFXExampleFile.cdfx")
cdfxObj = 
  CDFX with properties:

       Name: "CDFXExampleFile.cdfx"
       Path: "\\fs-01-mi\shome$\rollinb\Documents\MATLAB\Examples\vnt-ex38787800\CDFXExampleFile.cdfx"
    Version: "CDF20"

Визуализация калибровочных данных

Файлы CDFX содержат информацию об ЭКЮ автомобиля (системы) и их параметры (экземпляры). Используйте instanceList и systemList, чтобы визуализировать калибровочные данные в табличной форме. Эти функции также позволяют фильтровать на основе системных кратких названий или экземпляра.

iList = instanceList(cdfxObj)
iList=4×6 table
             ShortName                  System          Category        Value         Units     FeatureReference 
    ____________________________    _______________    __________    ____________    _______    _________________

    "ASAM.C.SCALAR.GAIN"            "ExampleSystem"    "VALUE"       [         3]    "gain"     "FunctionScalar" 
    "ASAM.C.SCALAR.BITMASK_0001"    "ExampleSystem"    "BOOLEAN"     [         1]    ""         "FunctionScalar" 
    "ASAM.C.MAP"                    "ExampleSystem"    "MAP"         [1×1 struct]    ""         "Sample_Model_13"
    "ASAM.C.COM_AXIS"               "ExampleSystem"    "COM_AXIS"    [5×1 double]    "hours"    ""               

Если вы хотите отфильтровать таблицу на основе желаемого краткого названия, передайте строку в качестве второго аргумента.

iListArray = instanceList(cdfxObj, "ASAM.C.SCALAR")
iListArray=2×6 table
             ShortName                  System         Category     Value    Units     FeatureReference
    ____________________________    _______________    _________    _____    ______    ________________

    "ASAM.C.SCALAR.GAIN"            "ExampleSystem"    "VALUE"       [3]     "gain"    "FunctionScalar"
    "ASAM.C.SCALAR.BITMASK_0001"    "ExampleSystem"    "BOOLEAN"     [1]     ""        "FunctionScalar"

Поведение запроса значения по умолчанию возвратит таблицу для всех экземпляров, краткие названия которых частично совпадают со строкой поиска. Чтобы отфильтровать для точного соответствия имени экземпляра, используйте пару "имя-значение" ExactMatch.

iListArrayExact = instanceList(cdfxObj, "ASAM.C.SCALAR.BITMASK_0001", "ExampleSystem", 'ExactMatch', true)
iListArrayExact=1×6 table
             ShortName                  System         Category     Value    Units    FeatureReference
    ____________________________    _______________    _________    _____    _____    ________________

    "ASAM.C.SCALAR.BITMASK_0001"    "ExampleSystem"    "BOOLEAN"     [1]      ""      "FunctionScalar"

Для файлов CDFX, которые содержат калибровочные данные больше чем для одной системы ECU, systemList может быть полезным, чтобы просмотреть содержимое каждой системы на высоком уровне.

sList = systemList(cdfxObj)
sList=1×3 table
       ShortName        Instances      Metadata
    _______________    ____________    ________

    "ExampleSystem"    [1×4 string]    "NO_VCD"

Исследование и изменение простых калибровочных параметров

Используйте getValue, чтобы извлечь значение экземпляра от объекта CDFX. Используйте setValue, чтобы изменить значение экземпляра.

iValueScalar = getValue(cdfxObj, "ASAM.C.SCALAR.GAIN")
iValueScalar = 3
iValueScalarNew = iValueScalar + 20;
setValue(cdfxObj, "ASAM.C.SCALAR.GAIN", iValueScalarNew);
iValueScalarNew = getValue(cdfxObj, "ASAM.C.SCALAR.GAIN")
iValueScalarNew = 23

Работа с более комплексными типами параметра

Определенные категории экземпляра содержат больше, чем только физическое значение. Эти экземпляры часто являются многомерными массивами, которые масштабируются согласно оси. Вызов getValue на этих экземплярах возвращает структуру, которая содержит каждую ось как отдельное поле, отличное от PhysicalValue.

Чтобы осмотреть экземпляр КУБОИДА, сначала вызовите getValue, затем исследуйте свойства возвращенной структуры. Заметьте, что существуют дополнительные данные, сопоставленные с каждой осью, включая тип оси, ее физических значений, и ссылаются ли на значения оси от другого экземпляра на объекте CDFX.

iValueMap = getValue(cdfxObj, "ASAM.C.MAP")
iValueMap = struct with fields:
    PhysicalValue: [5×5 double]
            Axis1: [1×1 struct]
            Axis2: [1×1 struct]

disp(iValueMap.PhysicalValue)
     2     5     7    10    12
    15    17    20    22    25
    27    30    32    35    37
    40    42    47    50    52
    55    57    60    62    65
disp(iValueMap.Axis1)
    ReferenceName: ""
         Category: "STD_AXIS"
    PhysicalValue: [5×1 double]
     IsReferenced: 0
disp(iValueMap.Axis2)
    ReferenceName: "ASAM.C.COM_AXIS"
         Category: "COM_AXIS"
    PhysicalValue: [5×1 double]
     IsReferenced: 1

Мы можем также визуализировать использование значений экземпляра функции построения графика MATLAB. Для многомерных массивов используйте физические значения структур осей, чтобы задать оси на графике.

surf('ZDataSource', 'iValueMap.PhysicalValue', 'XDataSource', 'iValueMap.Axis1.PhysicalValue', 'YDataSource', 'iValueMap.Axis2.PhysicalValue')
refreshdata;

Изменение физического значения этого экземпляра работает то же самое что касается скаляров. Обновите физическое поле значения структуры и пасуйте назад его к setValue.

iValueMap.PhysicalValue(:, 1) = iValueMap.PhysicalValue(:, 1)*2;
setValue(cdfxObj, "ASAM.C.MAP", iValueMap);

Теперь мы можем заметить, что изменения посвятили себя объекту CDFX в рабочей области.

iValueMapNew = getValue(cdfxObj, "ASAM.C.MAP")
iValueMapNew = struct with fields:
    PhysicalValue: [5×5 double]
            Axis1: [1×1 struct]
            Axis2: [1×1 struct]

disp(iValueMapNew.PhysicalValue)
     4     5     7    10    12
    30    17    20    22    25
    54    30    32    35    37
    80    42    47    50    52
   110    57    60    62    65

Чтобы изменить значения оси этого экземпляра, мы сначала должны знать, ссылаются ли на ось, которую мы хотим изменить, или нет. Это может быть определено путем исследования поля IsReferenced каждой структуры оси. Если на ось не ссылаются, мы просто изменяем поле PhysicalValue структуры оси и пасуем назад структуру верхнего уровня к setValue.

disp(iValueMapNew.Axis1.PhysicalValue)
     0
    63
   126
   189
   252
iValueMapNew.Axis1.PhysicalValue = iValueMapNew.Axis1.PhysicalValue*10;
setValue(cdfxObj, "ASAM.C.MAP", iValueMapNew);
iValueMapNewAxis = getValue(cdfxObj, "ASAM.C.MAP");
disp(iValueMapNewAxis.Axis1.PhysicalValue)
           0
         630
        1260
        1890
        2520

Однако некоторые оси не заданы на самом экземпляре и вместо этого ссылаются от другого экземпляра. Существуют определенные категории экземпляра для представления значений оси, на которые ссылаются (COM_AXIS, RES_AXIS и CURVE_AXIS). Попытка изменить ось, на которую ссылаются, от экземпляра ссылки приведет к ошибке. Решение состоит в том, чтобы обновить значения непосредственно на самом экземпляре оси. Информация о том, использует ли ось значения, на которые ссылаются, включая краткое название ссылаемого экземпляра, может быть найдена на полях оси структуры верхнего уровня.

iValueCommonAxis = getValue(cdfxObj, iValueMapNewAxis.Axis2.ReferenceName)
iValueCommonAxis = 5×1

    -9
    -8
    -5
    -3
     0

iValueCommonAxis(:) = 1:5;
setValue(cdfxObj, iValueMapNewAxis.Axis2.ReferenceName, iValueCommonAxis);

Теперь, когда мы изменили исходный экземпляр, мы можем заметить, что изменения отражаются в экземпляре ссылки.

iValueMapNew = getValue(cdfxObj, "ASAM.C.MAP")
iValueMapNew = struct with fields:
    PhysicalValue: [5×5 double]
            Axis1: [1×1 struct]
            Axis2: [1×1 struct]

iValueMapNew.Axis2.PhysicalValue
ans = 5×1

     1
     2
     3
     4
     5

Экспортирование калибровочных данных к файлу

Можно записать обратно к тому же файлу, или к новому файлу путем определения filepath.

write(cdfxObj, "NewExampleFile.cdfx");