主要内容

校准XCP特性

这个示例展示了如何使用XCP协议功能来连接和校准部署到Windows可执行文件的Simulink模型中的可用特征数据。金宝app该示例使用TCP和直接内存访问修改模型的参数,并比较了校准前后的测量值。XCP是一种高级协议,用于访问和修改模型、算法或ECU的内部参数和变量。有关更多信息,请参阅ASAM标准

算法概述

本例中使用的算法是作为XCP服务器构建和部署的Simulink模型。金宝app模型已经编译过了,可以在文件中运行XCPServerSineWaveGenerator.exe。此外,A2L文件XCPServerSineWaveGenerator.a2l作为该构建过程的输出提供。该模型包含三个测量值和两个特性,可通过XCP访问。因为模型已经部署,所以运行这个示例不需要Simulink。金宝app下面的图片说明了这个模型。

信号SineAfterGain是通过使用乘法器获得的获得缩放源信号正弦,以及信号SineAfterTable是用一维查表修改源信号得到的正弦.校准参数获得和一维查表产生的结果不同SineAfterGainSineAfterTable相应的波形。

有关如何构建Simulink模型,包括XCP服务器和生成a2l文件金宝app的详细信息,请参见导出ASAP2文件用于数据测量和校准(金宝app仿真软件编码器)

运行XCP服务器模型

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

sysCommand = [“””,完整文件(pwd,“XCPServerSineWaveGenerator.exe”),“””“&”];系统(所);

打开A2L-File

建立到XCP服务器的连接需要一个a2l文件。a2l文件描述了XCP服务器提供的所有功能和功能,以及如何连接到服务器的详细信息。使用xcpA2L函数打开描述服务器型号的a2l文件。

a2lInfo = xcpA2L (“XCPServerSineWaveGenerator.a2l”
a2lInfo=A2L,带属性:文件详细信息文件名:“XCPServerSineWaveGenerator.A2L”文件路径:“C:\Users\siyingl\OneDrive-MathWorks\Documents\MATLAB\Examples\vnt-ex09112476\XCPServerSineWaveGenerator.A2L”服务器名称:“ModuleName”警告:[0×0字符串]参数详细信息事件:{100毫秒}事件信息:[1×1 xcp.A2L.Event]测量值:{'Sine''SineAfterGain''SineAfterGain''SineAfterGain''SineAfterGain''SineAfterGain''SineAfterGain''SineAfterTable''XCPServer_DW.lastCos''XCPServer_DW.lastSin''XCPServer_DW.lastSin''XCPServer_DW.systemEnable'}MeasurementInfo:[6×1 containers.Map]特征:{'Gain''ydata'}特征信息:[2×1 containers.Map]AxisInfo:[1 containers.Map][0×1 containers.Map]CompuvTab:[0×1 containers.Map]XCP协议详细信息ProtocolLayerInfo:[1×1 XCP.a2l.ProtocolLayer]DAQInfo:[1×1 XCP.a2l.DAQ]TransportLayerCANInfo:[0×0 XCP.a2l.XCPonIP]TransportLayerCpinfo:[1×1 XCP.a2l.Xponip]

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

a2lInfo.TransportLayerTCPInfo
ans = XCPonIP with properties:CommonParameters] TransportLayerInstance: " Port: 17725 Address: 2.1307e+09 AddressString: '127.0.0.1'

创建XCP通道

要创建到服务器的活动XCP连接,请使用xcpChannel函数。该函数需要对服务器A2L-file的引用,以及用于服务器消息传递的传输协议类型。

xcpCh = xcpChannel (a2lInfo,“TCP”
xcpCh = Channel with properties: ServerName: 'ModuleName' A2LFileName: 'XCPServerSineWaveGenerator. xcpCh = Channel with properties: ServerName: 'ModuleName'a2l' TransportLayer: 'TCP' TransportLayerDevice: [1×1 struct] SeedKeyDLL: []

连接到服务器

要使与服务器的通信活动,请使用连接函数。

连接(xcpCh)

查看可用的特征从a2l文件

XCP中的特性表示模型内存中的可调参数。可用于校准的特性定义在a2l文件中,并可在特征财产。注意参数获得是乘数和ydata指定一维查找表的输出数据点。

a2lInfo。特征
ans =1×2细胞{“增益”}{' ydata '}
a2lInfo。CharacteristicInfo (“获得”
ans = character with properties: Name: 'Gain' LongIdentifier: " charactertictype: VALUE ECUAddress: 5499960 Deposit: [1×1 xcp.a2l.]MaxDiff: 0转换:[1×1 xcp.a2l。CompuMethod] LowerLimit: -5 UpperLimit: 5 Dimension: 1 AxisConversion: {1×0 cell} BitMask: [] ByteOrder: MSB_LAST Discrete: [] ECUAddressExtension: 0 Format: " Number: [] PhysUnit: "
a2lInfo。CharacteristicInfo (“ydata”
ans = Characteristic with properties: Name: 'ydata' LongIdentifier: 'Y data' charactertype: CURVE ECUAddress: 550024 Deposit: [1×1 xcp.a2l.]MaxDiff: 0转换:[1×1 xcp.a2l。CompuMethod] LowerLimit: -2 UpperLimit: 2 Dimension: 7 AxisConversion: {[1×1 xcp.a2l.]} BitMask: [] ByteOrder: MSB_LAST Discrete: [] ECUAddressExtension: 0 Format: " Number: [] PhysUnit: "

检查预加载特性值

读取特性的当前值获得这个readCharacteristic函数直接从服务器读取给定特征。

initialGain = readCharacteristic (xcpCh,“获得”
initialGain = 2

阅读当前一维查找表的特点使用readAxisreadCharacteristic,然后绘制映射。此表有效地将任何正输入值映射为零输出。

inputBreakpoints = readAxis (xcpCh,“扩展数据”
inputBreakpoints =1×7-1.0000 -0.5000 -0.2000 0 0.2000 0.5000 1.0000
outputPoints = readCharacteristic (xcpCh,“ydata”
输出点=1×7-1.0000 -0.5000 -0.2000 0000
情节(inputBreakpoints outputPoints);标题(《初始一维查找表图》);包含(“输入值”);ylabel (“产值”);

创建测量列表

这个例子探讨了度量的价值正弦,未修饰和被修饰两种特征。使不断变化的值可视化正弦校准前和校准后,使用DAQ列表获取测量数据值。使用createMeasurementList函数创建包含所有数据的DAQ列表正弦基于服务器的度量。

createMeasurementList(xcpCh,“数据采集”“100 ms”, (“正弦”“SineAfterGain”“SineAfterTable”])

在校正前量度

使用startMeasurement功能和测报功能,在短时间内运行DAQ列表。

startMeasurement (xcpCh);暂停(3);stopMeasurement (xcpCh);

要检索所有基于正弦的测量数据,请使用readDAQ功能。100毫秒事件发生后3秒钟内检索到的样本数预计为30,但由于XCP服务器在Windows上运行,而Windows不是实时操作系统,因此实际检索到的样本数可能少于30,具体取决于操作系统的占用情况。

正弦=读取数据量(xcpCh,“正弦”);sineAfterGain = readDAQ (xcpCh,“SineAfterGain”);sineAfterTable = readDAQ (xcpCh,“SineAfterTable”);

在校正前检查测量结果

画出SineAfterGain对底测量正弦测量。后的值获得基于原始测量,被提升了2倍,因为预加载的特性值获得为2,如上所示。

情节(sin,“啊——”);持有在…上; 绘图(后增益,"*-");持有;头衔(“校正前:正弦信号与增益后的正弦信号”);传奇(“原始”“获得”之后);包含(“数据点”);ylabel (“数据值”);

画出SineAfterTable对底测量正弦测量。原始测量值的任何正值都会根据预加载的一维查找表被映射为零,因此修改后的信号看起来被截断了,没有任何正值。

情节(sin,“啊——”);持有在…上;情节(sineAfterTable"*-");持有;头衔("校正前:正弦信号与表后正弦信号");传奇(“原始”“表”);包含(“数据点”);ylabel (“数据值”);

校准增益和一维查找表

向特性写入一个新值获得使用书写特征,并执行读取以验证更改使用readCharacteristic

writeCharacteristic (xcpCh“获得”, 0.5);newGain = readCharacteristic (xcpCh,“获得”
newGain = 0.5000

使用。将新的数据点写入1-D查找表的输出书写特征

writeCharacteristic (xcpCh“ydata”, [0 0 0 0 0.2 0.5 1]);

使用读取新的一维查找表数据readAxisreadCharacteristic,然后绘制映射图。现在,该表有效地将任何负输入值映射为零输出。

inputBreakpoints = readAxis (xcpCh,“扩展数据”
inputBreakpoints =1×7-1.0000 -0.5000 -0.2000 0 0.2000 0.5000 1.0000
newOutputPoints = readCharacteristic (xcpCh,“ydata”
newOutputPoints =1×7000 0.2000 0.5000 1.0000
绘图(输入断点、新输出点);标题(“新的一维查找表地图”);包含(“输入值”);ylabel (“产值”);

校正后量度

使用startMeasurement功能和测报功能,在短时间内运行DAQ列表。

startMeasurement (xcpCh);暂停(3);stopMeasurement (xcpCh);

要检索所有基于正弦的测量数据,请使用readDAQ函数。

正弦=读取数据量(xcpCh,“正弦”);sineAfterGain = readDAQ (xcpCh,“SineAfterGain”);sineAfterTable = readDAQ (xcpCh,“SineAfterTable”);

校正后检查测量结果

画出SineAfterGain对底测量正弦测量。现在是后面的值获得在原始测量的基础上减少了2倍,因为特征值获得校正后设置为0.5。

情节(sin,“啊——”);持有在…上; 绘图(后增益,"*-");持有;头衔(校正后:正弦信号vs增益后正弦信号);传奇(“原始”“获得”之后);包含(“数据点”);ylabel (“数据值”);

画出SineAfterTable对底测量正弦测量。根据新的一维查找表,原始测量值的任何负值都被映射为零,因此修改后的信号看起来被截断了,没有任何负值。

情节(sin,“啊——”);持有在…上;情节(sineAfterTable"*-");持有;头衔(“校准后:正弦信号与表格后的正弦信号”);传奇(“原始”“表”);包含(“数据点”);ylabel (“数据值”);

断开与服务器的连接

要停用与服务器的通信,请使用断开连接功能。断开连接后,XCP服务器可以安全关闭。

断开(xcpCh)

清理

清楚的a2lInfo