В этом примере показано, как импортировать файл калибровочных данных в MATLAB, изучить и изменить его содержимое и экспортировать изменения обратно в файл на диске.
Импорт данных из файла 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;
Изменение физического значения этого образца работает так же, как и для скаляров. Обновите поле физического значения структуры и передайте его назад в 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");