Начало работы с CDFX-файлами

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

Импортируйте CDFX-File

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

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

       Name: "CDFXExampleFile.cdfx"
       Path: "/tmp/BR2021bd_1751886_255755/mlx_to_docbook1/tp43650a5e/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"    {["ASAM.C.SCALAR.GAIN"    "ASAM.C.SCALAR.BITMASK_0001"    ...    ]}    "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    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 object. The axes object 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 функция, можно записать обратно к тому же файлу или к новому файлу путем определения filepath.

write(cdfxObj, "NewExampleFile.cdfx");
Для просмотра документации необходимо авторизоваться на сайте