Этот пример показывает, как импортировать калибровочный файл данных в MATLAB, исследовать и изменить его содержимое и экспортировать изменения назад в файле на диске.
Импортируйте данные из файла CDFX с помощью функции cdfx
.
cdfxObj = cdfx("CDFXExampleFile.cdfx")
cdfxObj = CDFX with properties: Name: "CDFXExampleFile.cdfx" Path: "\\fs-01-mi\shome$\rollinb\Documents\MATLAB\Examples\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" [1×1 struct] "" "Sample_Model_13"
"ASAM.C.COM_AXIS" "ExampleSystem" "COM_AXIS" [5×1 double] "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" [1×4 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.
Чтобы осмотреть экземпляр КУБОИДА, сначала вызовите getValue
, затем исследуйте свойства возвращенной структуры. Заметьте, что существуют дополнительные данные, сопоставленные с каждой осью, включая тип оси, ее физических значений, и ссылаются ли на значения оси от другого экземпляра на объекте CDFX.
iValueMap = getValue(cdfxObj, "ASAM.C.MAP")
iValueMap = struct with fields:
PhysicalValue: [5×5 double]
Axis1: [1×1 struct]
Axis2: [1×1 struct]
disp(iValueMap.PhysicalValue)
2 5 7 10 12 15 17 20 22 25 27 30 32 35 37 40 42 47 50 52 55 57 60 62 65
disp(iValueMap.Axis1)
ReferenceName: "" Category: "STD_AXIS" PhysicalValue: [5×1 double] IsReferenced: 0
disp(iValueMap.Axis2)
ReferenceName: "ASAM.C.COM_AXIS" Category: "COM_AXIS" PhysicalValue: [5×1 double] 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: [5×5 double]
Axis1: [1×1 struct]
Axis2: [1×1 struct]
disp(iValueMapNew.PhysicalValue)
4 5 7 10 12 30 17 20 22 25 54 30 32 35 37 80 42 47 50 52 110 57 60 62 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 = 5×1
-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: [5×5 double]
Axis1: [1×1 struct]
Axis2: [1×1 struct]
iValueMapNew.Axis2.PhysicalValue
ans = 5×1
1
2
3
4
5
Можно записать обратно к тому же файлу, или к новому файлу путем определения filepath.
write(cdfxObj, "NewExampleFile.cdfx");