В этом примере показано, как импортировать файл калибровочных данных в 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
Можно выполнить обратную запись в тот же файл или в новый файл, указав путь к файлу.
write(cdfxObj, "NewExampleFile.cdfx");