Main Content

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

此示例说明如何使用 XCP 协议功能来连接和采集部署到 Windows® 可执行文件的 Simulink® 模型中的数据。该示例使用 TCP 和动态 DAQ 列表读取模型的测量变量参数。XCP 是一种高级协议,用于访问和修改模型、算法或 ECU 的内部参数和变量。有关详细信息,请参阅 ASAM standards

算法概述

此示例中使用的算法是构建并部署为 XCP 服务器的 Simulink 模型。模型已编译,可在文件 XCPServerSineWaveGenerator.exe 中运行。此外,A2L 文件 XCPServerSineWaveGenerator.a2l 是作为该编译过程的输出提供的。该模型包含三个测量变量和两个特征变量,均可通过 XCP 访问。由于模型已部署,因此不需要 Simulink 来运行此示例。下图展示了该模型。

Screenshot 2021-05-03 164730.png

有关如何编译 Simulink 模型的详细信息,包括 XCP 服务器和生成 A2L 文件,请参阅导出 ASAP2 文件用于数据测量和标定 (Simulink Coder)

运行 XCP 服务器模型

要与 XCP 服务器通信,必须运行部署的模型。通过使用 system 函数,您可以从 MATLAB® 内部执行 XCPServerSineWaveGenerator.exe。该函数需要构造一个指向可执行文件的参数列表。将打开一个单独的命令行窗口,显示服务器正在运行的输出。

sysCommand = ['"', fullfile(pwd, 'XCPServerSineWaveGenerator.exe'),'"', ' &'];
system(sysCommand);

打开 A2L 文件

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

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

   File Details
                 FileName: 'XCPServerSineWaveGenerator.a2l'
                 FilePath: 'C:\Users\kuanliu\Documents\MATLAB\Examples\vnt-ex16421241\XCPServerSineWaveGenerator.a2l'
               ServerName: 'ModuleName'
                 Warnings: [0×0 string]

   Parameter Details
                   Events: {'100 ms'}
                EventInfo: [1×1 xcp.a2l.Event]
             Measurements: {'Sine'  'SineAfterGain'  'SineAfterTable'  'XCPServer_DW.lastCos'  'XCPServer_DW.lastSin'  'XCPServer_DW.systemEnable'}
          MeasurementInfo: [6×1 containers.Map]
          Characteristics: {'Gain'  'ydata'}
       CharacteristicInfo: [2×1 containers.Map]
                 AxisInfo: [1×1 containers.Map]
            RecordLayouts: [4×1 containers.Map]
             CompuMethods: [3×1 containers.Map]
                CompuTabs: [0×1 containers.Map]
               CompuVTabs: [0×1 containers.Map]

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

TCP 是用于与 XCP 服务器通信的传输协议。TCP 连接的详细信息,如 IP 地址和端口号,包含在 TransportLayerTCPInfo 属性中。

a2lInfo.TransportLayerTCPInfo
ans = 
  XCPonIP with properties:
          CommonParameters: [1×1 xcp.a2l.CommonParameters]
    TransportLayerInstance: ''
                      Port: 17725
                   Address: 2.1307e+09
             AddressString: '127.0.0.1'

创建 XCP 通道

要创建到服务器的活动 XCP 连接,请使用 xcpChannel 函数。该函数需要引用服务器 A2L 文件以及用于与服务器进行报文传输的传输协议类型。

xcpCh = xcpChannel(a2lInfo, "TCP")
xcpCh = 
  Channel with properties:

              ServerName: 'ModuleName'
             A2LFileName: 'XCPServerSineWaveGenerator.a2l'
          TransportLayer: 'TCP'
    TransportLayerDevice: [1×1 struct]
              SeedKeyDLL: []

连接到服务器

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

connect(xcpCh)

创建和查看测量变量列表

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

createMeasurementList(xcpCh, "DAQ", "100 ms", ["Sine", "SineAfterGain", "SineAfterTable"]) 

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

viewMeasurementLists(xcpCh)
DAQ List #1 using the "100 ms" event @ 0.100000 seconds and the following measurements:
   Sine
   SineAfterGain
   SineAfterTable

从 XCP 服务器采集数据

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

startMeasurement(xcpCh)
pause(3);
stopMeasurement(xcpCh)

检索 Sine 测量变量的数据

要检索从 XCP 通道采集的 Sine 测量变量的数据,请使用 readDAQ 函数。该函数需要一个对 XCP 通道的引用和指定的测量变量才能读取。readDAQ 返回 XCP 通道保留的所有可用采样。readDAQ 返回的测量变量的数据使用 A2L 文件中为测量变量定义的计算方法进行完全缩放。

dataSine = readDAQ(xcpCh, "Sine");
plot(dataSine, "o-")
title("Sine Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

检索 SineAfterGain 测量变量的数据

要检索从 XCP 通道采集的 SineAfterGain 测量变量的数据,请使用 readDAQ 函数。

dataSineAfterGain = readDAQ(xcpCh, "SineAfterGain");
plot(dataSineAfterGain, "o-")
title("SineAfterGain Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

检索 SineAfterTable 测量变量的数据

要检索从 XCP 通道采集的 SineAfterTable 测量变量的数据,请使用 readDAQ 函数。

dataSineAfterTable = readDAQ(xcpCh, "SineAfterTable");
plot(dataSineAfterTable, "o-")
title("SineAfterTable Measurement Data")
xlabel("Data Point")
ylabel("Data Value")

断开与服务器的连接

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

disconnect(xcpCh)

清理

clear a2lInfo