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