本页面提供的是上一版软件的文档。当前版本中已删除对应的英文页面。

在 MATLAB 中使用 ASAM CDFX 文件

此示例说明如何将标定数据文件导入 MATLAB 中,检查和修改其内容,并将更改导出回磁盘上的文件。

导入 CDFX 文件

使用 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 文件包含有关车辆 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"         [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"

对于包含多个 ECU 系统的标定数据的 CDFX 文件,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)。

要查看 CUBOID 实例,请先调用 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

将标定数据导出到文件

您可以写回到同一文件,或者通过指定文件路径写到新文件。

write(cdfxObj, "NewExampleFile.cdfx");