exponenta event banner

Работа с файлами 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

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

Можно выполнить обратную запись в тот же файл или в новый файл, указав путь к файлу.

write(cdfxObj, "NewExampleFile.cdfx");