这个示例展示了如何使用XCP协议功能来连接和校准部署到Windows可执行文件的Simulink模型中的可用特征数据。金宝app该示例使用TCP和直接内存访问修改模型的参数,并比较了校准前后的测量值。XCP是一种高级协议,用于访问和修改模型、算法或ECU的内部参数和变量。有关更多信息,请参阅ASAM标准.
本例中使用的算法是作为XCP服务器构建和部署的Simulink模型。金宝app模型已经编译过了,可以在文件中运行XCPServerSineWaveGenerator.exe
。此外,A2L文件XCPServerSineWaveGenerator.a2l
作为该构建过程的输出提供。该模型包含三个测量值和两个特性,可通过XCP访问。因为模型已经部署,所以运行这个示例不需要Simulink。金宝app下面的图片说明了这个模型。
信号SineAfterGain
是通过使用乘法器获得的获得
缩放源信号正弦
,以及信号SineAfterTable
是用一维查表修改源信号得到的正弦
.校准参数获得
和一维查表产生的结果不同SineAfterGain
和SineAfterTable
相应的波形。
有关如何构建Simulink模型,包括XCP服务器和生成a2l文件金宝app的详细信息,请参见导出ASAP2文件用于数据测量和校准(金宝app仿真软件编码器).
要与XCP服务器通信,必须运行部署的模型。通过使用系统
函数,您可以执行XCPServer.exe
从MATLAB。该函数需要构造一个指向可执行文件的参数列表。将打开一个单独的命令窗口并显示来自服务器的正在运行的输出。
sysCommand = [“””,完整文件(pwd,“XCPServerSineWaveGenerator.exe”),“””,“&”];系统(所);
建立到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连接,请使用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)
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
阅读当前一维查找表的特点使用readAxis
和readCharacteristic
,然后绘制映射。此表有效地将任何正输入值映射为零输出。
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]);
使用读取新的一维查找表数据readAxis
和readCharacteristic
,然后绘制映射图。现在,该表有效地将任何负输入值映射为零输出。
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