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

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

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

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

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

       Name: "CDFXExampleFile.cdfx"
       Path: "/tmp/BR2020bd_1459859_228739/mlx_to_docbook1/tpe7428071/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"    {5x1 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"    {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.

Чтобы смотреть экземпляр КУБОИДА, сначала вызовите 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     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: [5x1 double]
     IsReferenced: 0
disp(iValueMap.Axis2)
    ReferenceName: "ASAM.C.COM_AXIS"
         Category: "COM_AXIS"
    PhysicalValue: [5x1 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: [5x5 double]
            Axis1: [1x1 struct]
            Axis2: [1x1 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: [5x5 double]
            Axis1: [1x1 struct]
            Axis2: [1x1 struct]

iValueMapNew.Axis2.PhysicalValue
ans = 5×1

     1
     2
     3
     4
     5

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

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

write(cdfxObj, "NewExampleFile.cdfx");