Main Content

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(系统)及其参数(实例)的信息。使用 instanceListsystemList 以表形式可视化标定数据。这些函数还允许基于实例或系统短名称进行过滤。

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"

检查和修改简单标定参数

使用 getValueCDFX 对象中提取实例的值。使用 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;

Figure contains an axes object. The axes object contains an object of type surface.

修改此实例的物理值的方式与修改标量的方式相同。更新结构体的物理值字段,并将其传回 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");