CDFX 文件快速入门
此示例说明如何将标定数据文件导入 MATLAB® 中,检查和修改其内容,并将更改导出回磁盘上的文件。
导入 CDFX 文件
使用 cdfx
函数从 CDFX 文件导入数据。
cdfxObj = cdfx("CDFXExampleFile.cdfx")
cdfxObj = CDFX with properties: Name: "CDFXExampleFile.cdfx" Path: "/tmp/Bdoc24a_2511836_3070643/tp8879c7f7/vnt-ex38787800/CDFXExampleFile.cdfx" Version: "CDF20"
可视化标定数据
CDFX 文件包含有关车辆 ECU(系统)及其参数(实例)的信息。使用 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"
对于包含多个 ECU 系统的标定数据的 CDFX 文件,systemList
可用于在高级别查看每个系统的内容。
sList = systemList(cdfxObj)
sList=1×3 table
ShortName Instances Metadata
_______________ _____________________________________________________________________________________________ ________
"ExampleSystem" {["ASAM.C.SCALAR.GAIN" "ASAM.C.SCALAR.BITMASK_0001" "ASAM.C.MAP" "ASAM.C.COM_AXIS"]} "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
将标定数据导出到文件
使用 CDFX write
函数,您可以写回到同一文件,或者通过指定文件路径写到新文件。
write(cdfxObj, "NewExampleFile.cdfx");