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

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

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

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

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

       Name: "CDFXExampleFile.cdfx"
       Path: "/tmp/BR2021ad_1655202_62692/mlx_to_docbook1/tp4da62608/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"         {1x1 struct     }    ""         "Sample_Model_13"
    "ASAM.C.COM_AXIS"               "ExampleSystem"    "COM_AXIS"    {[-9 -8 -5 -3 0]}    "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"    {1x4 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.

Чтобы просмотреть образец CUBOID, сначала вызовите getValue, затем исследуйте свойства возвращаемой структуры. Заметьте, что с каждой осью связаны дополнительные данные, включая тип оси, ее физические значения и ссылки на значения осей из другого образца объекта CDFX.

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

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

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

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

Figure contains an axes. The axes contains an object of type surface.

Изменение физического значения этого образца работает так же, как и для скаляров. Обновите поле физического значения структуры и передайте его назад в 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: [5x5 double]
            Axis1: [1x1 struct]
            Axis2: [1x1 struct]

disp(iValueMapNew.PhysicalValue)
     4    15    27    40    55
    10    17    30    42    57
    14    20    32    47    60
    20    22    35    50    62
    24    25    37    52    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 = 1×5

    -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: [5x5 double]
            Axis1: [1x1 struct]
            Axis2: [1x1 struct]

iValueMapNew.Axis2.PhysicalValue
ans = 1×5

     1     2     3     4     5

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

Можно записать назад в тот же файл или в новый файл, задав filepath.

write(cdfxObj, "NewExampleFile.cdfx");