使用动态 DAQ 列表读取 XCP 测量变量
此示例说明如何使用 XCP 协议功能来连接和采集部署到 Windows® 可执行文件的 Simulink® 模型中的数据。该示例使用 TCP 和动态 DAQ 列表读取模型的测量变量参数。XCP 是一种高级协议,用于访问和修改模型、算法或 ECU 的内部参数和变量。有关详细信息,请参阅 ASAM standards。
算法概述
此示例中使用的算法是构建并部署为 XCP 服务器的 Simulink 模型。模型已编译,可在文件 XCPServerSineWaveGenerator.exe
中运行。此外,A2L 文件 XCPServerSineWaveGenerator.a2l
是作为该编译过程的输出提供的。该模型包含三个测量变量和两个特征变量,均可通过 XCP 访问。由于模型已部署,因此不需要 Simulink 来运行此示例。下图展示了该模型。
有关如何编译 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