Main Content

使用动态 DAQ 列表读取 XCP 测量变量

此示例说明如何使用 XCP 协议功能连接 XCP Sample 服务器并从中采集数据。XCP Sample 服务器是专门为 XCP 示例设计的。

Vehicle Network Toolbox™ 提供 MATLAB 函数,用于通过多个传输层与服务器对接,包括控制器局域网 (CAN)、控制器局域网灵活数据速率 (CAN FD)、传输控制协议 (TCP) 和用户数据报协议 (UDP)。此示例使用动态 DAQ 列表读取 XCP Sample 服务器的测量变量参数。

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/Bdoc24a_2511836_3090053/tpeb21c448/vnt-ex17137611/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 FD 协议进行演示。

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

创建 XCP 通道

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

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

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

连接到服务器

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

connect(xcpCh);

为 DAQ 创建测量变量列表

XCP 中的测量变量表示模型内存中的变量。服务器提供的测量变量在 A2L 文件中定义。读取测量数据的一种方法是使用动态 DAQ 列表。使用 createMeasurementList 函数创建一个动态 DAQ 列表,其中包含用于触发数据采集和包含该列表的测量变量的指定事件。

createMeasurementList(xcpCh, "DAQ", "Event DAQ 100ms", ["Sine", "PWM", "Line"]);

使用 viewMeasurementLists 函数查看配置的动态 DAQ 列表。

viewMeasurementLists(xcpCh)
DAQ List #1 using the "Event DAQ 100ms" event @ 0.100000 seconds with timestamp enabled and the following measurements:
   Line
   PWM
   Sine

从 XCP 服务器采集数据

使用 startMeasurement 函数启动已配置的动态 DAQ 列表。它开始从服务器传输 DAQ 数据,并将 DAQ 数据存储在 XCP 通道中。运行几秒后,使用 stopMeasurement 函数停止测量。

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

读取所有可用的测量数据

要以时间表格式从 XCP 通道检索所有测量数据,请使用 readDAQList 函数。该函数需要一个对 XCP 通道的引用。readDAQList 返回一个包含 XCP 通道保留的所有可用采样的时间表。readDAQList 返回的测量值使用 A2L 文件中为这些测量值定义的计算方法进行完全缩放。

data = readDAQList(xcpCh);

data 包含由一个元胞数组中的 createMeasurementList 函数定义的所有测量变量列表。每个 DAQ 列表表示返回的元胞数组中的一个索引。在本例中只创建了一个测量变量列表,因此我们可以通过调用对应的时间表来可视化数据。

data{1}
ans=60×3 timetable
      Time        Line      PWM     Sine 
    ________    ________    ___    ______

    0 sec       0.039963     2     2.5266
    0.05 sec    0.091195     2     3.1424
    0.1 sec      0.11188     2     3.3572
    0.15 sec     0.12942     2     3.5193
    0.2 sec      0.16046     2     3.7541
    0.25 sec     0.18941     2     3.9059
    0.3 sec      0.21938     2     3.9883
    0.35 sec     0.24938     2     3.9916
    0.4 sec      0.27936     2     3.9156
    0.45 sec     0.30944     2     3.7627
    0.5 sec      0.33928     2     3.5411
    0.55 sec     0.36965     2     3.2533
    0.6 sec      0.39953     2     2.9201
    0.65 sec     0.42955     2     2.5487
    0.7 sec      0.45983     2      2.152
    0.75 sec     0.48981     0      1.753
      ⋮

检索 Sine 测量变量数据

要从 Sine 测量变量的 XCP 通道中检索采集的数据,请从 readDAQList 函数的输出时间表中查找数据。

plot(data{1}.Sine, "o-")
title("Sine Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

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

检索 Line 测量变量数据

要从 Line 测量变量的 XCP 通道中检索采集的数据,请从 readDAQList 函数的输出时间表中查找数据。

plot(data{1}.Line, "o-")
title("Line Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

Figure contains an axes object. The axes object with title Line Measurement Data, xlabel Data Point, ylabel Data Value contains an object of type line.

检索 PWM 测量变量数据

要从 PWM 测量变量的 XCP 通道中检索采集的数据,请从 readDAQList 函数的输出时间表中查找数据。

plot(data{1}.PWM, "o-")
title("PWM Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

Figure contains an axes object. The axes object with title PWM Measurement Data, xlabel Data Point, ylabel Data Value contains an object of type line.

断开与服务器的连接

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

disconnect(xcpCh);

清理

clear sampleServer a2lInfo