Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

标定 XCP 特征变量

此示例说明如何使用 XCP 协议功能连接和标定来自 XCP Sample 服务器的可用特征变量数据。XCP Sample 服务器是专门为 XCP 示例设计的。

Vehicle Network Toolbox™ 提供 MATLAB 函数,用于通过多个传输层与服务器对接,包括控制器局域网 (CAN)、控制器局域网灵活数据速率 (CAN FD)、传输控制协议 (TCP) 和用户数据报协议 (UDP)。此示例执行写入以标定参数,然后比较标定前后的测量变量值。

XCP 是一种高级协议,用于访问和修改模型、算法或 ECU 的内部参数和变量。有关详细信息,请参阅 ASAM 标准

打开 A2L 文件

建立与 XCP 服务器的连接需要 A2L 文件。A2L 文件说明 XCP 服务器提供的所有功能,以及如何连接到该服务器的详细信息。使用 xcpA2L 函数打开说明服务器模型的 A2L 文件。

a2lInfo = xcpA2L("SampleECU.a2l")
a2lInfo = 
  A2L with properties:

   File Details
                 FileName: 'SampleECU.a2l'
                 FilePath: '/tmp/Bdoc23b_2369753_866595/tp66681156/vnt-ex60761655/SampleECU.a2l'
               ServerName: 'SampleServer'
                 Warnings: [0x0 string]

   Parameter Details
                   Events: {'Event DAQ 100ms'}
                EventInfo: [1x1 xcp.a2l.Event]
             Measurements: {'Line'  'PWM'  'Sine'}
          MeasurementInfo: [3x1 containers.Map]
          Characteristics: {'Gain'  'yData'}
       CharacteristicInfo: [2x1 containers.Map]
                 AxisInfo: [1x1 containers.Map]
            RecordLayouts: [3x1 containers.Map]
             CompuMethods: [1x1 containers.Map]
                CompuTabs: [0x1 containers.Map]
               CompuVTabs: [0x1 containers.Map]

   XCP Protocol Details
        ProtocolLayerInfo: [1x1 xcp.a2l.ProtocolLayer]
                  DAQInfo: [1x1 xcp.a2l.DAQ]
    TransportLayerCANInfo: [1x1 xcp.a2l.XCPonCAN]
    TransportLayerUDPInfo: [0x0 xcp.a2l.XCPonIP]
    TransportLayerTCPInfo: [1x1 xcp.a2l.XCPonIP]

启动 XCP Sample 服务器

XCP Sample 服务器以可控方式模拟真实 XCP 服务器的行为。在这种情况下,它仅用于演示功能有限的示例。使用本地 SampleECU 类创建 Sample 服务器对象,Sample 服务器将在 MATLAB 工作区中创建。XCP Sample 服务器支持 CAN、CAN FD 和 TCP。此示例选择 CAN 协议进行演示。

sampleServer = SampleECU(a2lInfo,"CAN","MathWorks","Virtual 1",1);

创建 XCP 通道

要创建到服务器的活动 XCP 连接,请使用 xcpChannel 函数。该函数需要引用服务器 A2L 文件以及用于与服务器进行报文传输的传输协议类型。XCP 通道必须使用与 Sample 服务器相同的设备和 a2l 文件,以确保它们可以连接。

xcpCh = xcpChannel(a2lInfo,"CAN","MathWorks","Virtual 1",1)
xcpCh = 
  Channel with properties:

              ServerName: 'SampleServer'
             A2LFileName: 'SampleECU.a2l'
          TransportLayer: 'CAN'
    TransportLayerDevice: [1x1 struct]
              SeedKeyDLL: []

连接到服务器

要激活与服务器的通信,请使用 connect 函数。

connect(xcpCh);

从 A2L 文件查看可用特征变量

XCP 的特征变量表示模型内存中的可调参数。可用于标定的特征变量在 A2L 文件中定义,可在 Characteristics 属性中找到。请注意,参数 Gain 是乘数,yData 指定一维查找表的输出数据点。

a2lInfo.Characteristics
ans = 1x2 cell
    {'Gain'}    {'yData'}

a2lInfo.CharacteristicInfo("Gain")
ans = 
  Characteristic with properties:
                   Name: 'Gain'
         LongIdentifier: 'Scalar SBYTE'
     CharacteristicType: VALUE
             ECUAddress: 8454145
                Deposit: [1x1 xcp.a2l.RecordLayout]
                MaxDiff: 0
             Conversion: [1x1 xcp.a2l.CompuMethod]
             LowerLimit: -100
             UpperLimit: 100
              Dimension: 1
         AxisConversion: {1x0 cell}
                BitMask: []
              ByteOrder: MSB_LAST
               Discrete: []
    ECUAddressExtension: 0
                 Format: '%6.1'
                 Number: []
               PhysUnit: ''

a2lInfo.CharacteristicInfo("yData")
ans = 
  Characteristic with properties:
                   Name: 'yData'
         LongIdentifier: 'Curve with standard axis'
     CharacteristicType: CURVE
             ECUAddress: 8454912
                Deposit: [1x1 xcp.a2l.RecordLayout]
                MaxDiff: 0
             Conversion: [1x1 xcp.a2l.CompuMethod]
             LowerLimit: 0
             UpperLimit: 255
              Dimension: 8
         AxisConversion: {[1x1 xcp.a2l.CompuMethod]}
                BitMask: []
              ByteOrder: MSB_LAST
               Discrete: []
    ECUAddressExtension: 0
                 Format: ''
                 Number: []
               PhysUnit: ''

标定特征变量增益值

特征变量 Gain 用于计算测量变量 Sine 的值。Gain 的值用于控制测量变量 Sine 的振幅。

检查预加载的特征变量值

读取特征变量 Gain 的当前值。readCharacteristic 函数对给定的特征变量执行从服务器的直接读取。

initialGain = readCharacteristic(xcpCh, "Gain")
initialGain = 2

获取标定前的测量变量值

创建测量变量列表

此示例探讨了原始的和经两个特征变量修改的测量变量 Sine 的值。要可视化标定前后 Sine 的连续变化值,请使用 DAQ 列表采集测量数据值。使用 createMeasurementList 函数创建一个包含来自服务器的 Sine 测量变量的 DAQ 列表。

createMeasurementList(xcpCh, "DAQ", "Event DAQ 100ms", "Sine");

从 XCP 服务器采集数据

使用 startMeasurement 函数和 stopMeasurement 函数短时间运行 DAQ 列表。

startMeasurement(xcpCh);
pause(6);
stopMeasurement(xcpCh);

检索 Sine 测量变量数据

要检索 DAQ 列表所采集的 Sine 测量变量数据,请使用 readDAQ 函数。

sineBeforeCalibration = readDAQ(xcpCh, "Sine");

绘制 Sine 测量变量值

绘制应用了 Gain 值的 Sine 测量变量值。Sine 测量变量值反映了在 Gain 的值设置为 2 的情况下有所增加,如前所示。

plot(sineBeforeCalibration, "o-");
title("Before Calibration Sine Signal");
xlabel("Data Point");
ylabel("Data Value");

Figure contains an axes object. The axes object with title Before Calibration Sine Signal, xlabel Data Point, ylabel Data Value contains an object of type line.

标定增益特征变量

使用 writeCharacteristic 将新值写入特征变量 Gain,并使用 readCharacteristic 执行读取以验证更改。Gain 的新值是 5,这意味着新 Gain 值 5 将会增加 Sine 测量变量值。

writeCharacteristic(xcpCh, "Gain", 5);
newGain = readCharacteristic(xcpCh, "Gain")
newGain = 5

获取标定后的测量变量值

从 XCP 服务器采集数据

使用 startMeasurement 函数和 stopMeasurement 函数短时间运行 DAQ 列表。

startMeasurement(xcpCh);
pause(6);
stopMeasurement(xcpCh);

检索 Sine 测量变量数据

要检索 DAQ 列表所采集的 Sine 测量变量数据,请使用 readDAQ 函数。

sineAfterCalibration = readDAQ(xcpCh, "Sine");

绘制 Sine 测量变量值

绘制 SineAfterCalibration 测量变量值与 SineBeforeCalibration 测量变量值的关系图。现在,Sine 测量变量信号具有更高的振幅,因为特征变量 Gain 的值在标定后设置为 5。

plot(sineBeforeCalibration, "o-"); hold on;
plot(sineAfterCalibration, "*-"); hold off;
title("Sine Signal before Calibration vs after Calibration");
legend("Before", "After");
xlabel("Data Point");
ylabel("Data Value");

Figure contains an axes object. The axes object with title Sine Signal before Calibration vs after Calibration, xlabel Data Point, ylabel Data Value contains 2 objects of type line. These objects represent Before, After.

标定特征变量一维查找表

查找表在工业中广泛用于控制参数。因此,下节介绍如何在 XCP Sample 服务器中使用轴 xData 和特征变量 yData 标定一维查找表。

使用 readAxisreadCharacteristic 读取当前一维查找表特征变量,然后绘制映射图。下表将输入值有效地映射到了对应的输出值。

inputBreakpoints = readAxis(xcpCh, "xData")
inputBreakpoints = 1×8

     0     1     2     3     4     5     6     7

outputPoints = readCharacteristic(xcpCh, "yData")
outputPoints = 1×8

   100   101   102   103   104   105   106   107

plot(inputBreakpoints, outputPoints);
title("Initial 1-D Look-up Table Map");
xlabel("Input Value");
ylabel("Output Value");

Figure contains an axes object. The axes object with title Initial 1-D Look-up Table Map, xlabel Input Value, ylabel Output Value contains an object of type line.

使用 writeCharacteristic 将新数据点写入一维查找表的输出。

writeCharacteristic(xcpCh, "yData", 103:110);

使用 readAxisreadCharacteristic 读取新一维查找表数据,然后绘制映射。现在,新的 yData 特征变量已设置为更高的值。

xData = readAxis(xcpCh, "xData");
newOutputPoints = readCharacteristic(xcpCh, "yData")
newOutputPoints = 1×8

   103   104   105   106   107   108   109   110

plot(inputBreakpoints, outputPoints, "o-"); hold on
plot(inputBreakpoints, newOutputPoints, "*-"); hold off;
title("1-D Look-up Table Map before Calibration vs after Calibration");
legend("Before", "After");
xlabel("Input Value");
ylabel("Output Value");

Figure contains an axes object. The axes object with title 1-D Look-up Table Map before Calibration vs after Calibration, xlabel Input Value, ylabel Output Value contains 2 objects of type line. These objects represent Before, After.

断开与服务器的连接

要使与服务器的通信处于非活动状态,请使用 disconnect 函数。断开连接后,XCP 服务器可以安全关闭。

disconnect(xcpCh);

清理

clear sampleServer a2lInfo