主要内容

校准XCP特点

这个例子展示了如何使用可用的XCP协议功能连接和校准特征的数据模型®模型部署到Windows®可执行。金宝app这个例子写修改模型的参数使用TCP和直接存储器存取,并比较测量之前和之后的校准。的XCP高层协议用于访问和修改内部参数和变量的模型,算法,或者ECU。有关更多信息,请参考ASAM标准

算法概述

在这个例子中使用的算法是一个仿真软件模型构建和部署作为XCP服务器。金宝app可用的模型已经被编译和运行的文件XCPServerSineWaveGenerator.exe。此外,A2L-fileXCPServerSineWaveGenerator.a2l是一个构建过程的输出。模型包含三个测量和两个特点,通过XCP。因为已经部署模型,模型不需要运行这个例子。金宝app下图显示了模型。

信号SineAfterGain通过使用乘数获得规模的源信号正弦,信号SineAfterTable通过使用一维查找表来修改源信号正弦。校准参数获得和一维查找表产生不同SineAfterGainSineAfterTable相应的波形。

如何构建一个仿真软件模型的详细信息,包括一个XCP服务器并生成一个金宝appA2L-file,明白了导出ASAP2文件进行数据测量和校准(金宝app仿真软件编码器)

运行XCP服务器模型

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

sysCommand = [“””fullfile (pwd,“XCPServerSineWaveGenerator.exe”),“””,“&”];系统(所);

打开A2L-File

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

a2lInfo = xcpA2L (“XCPServerSineWaveGenerator.a2l”)
a2lInfo = A2L属性:文件名文件细节:“XCPServerSineWaveGenerator。a2l‘FilePath: C: \ \用户siyingl \ OneDrive——MathWorks \ \ MATLAB \ \ vnt-ex09112476 \ XCPServerSineWaveGenerator示例文档。a2l ' ServerName:“ModuleName”警告:(0×0的字符串)参数细节事件:{“100 ms的}EventInfo: [1×1 xcp.a2l。事件)测量:{“正弦”“SineAfterGain”XCPServer_DW SineAfterTable”。lastCos“XCPServer_DW。lastSin“XCPServer_DW。系统Enable'} 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属性:CommonParameters:(1×1 xcp.a2l。CommonParameters] TransportLayerInstance:“端口:17725地址:2.1307 e + 09 AddressString: 127.0.0.1的

创建一个XCP通道

创建一个活跃的XCP连接到服务器,使用xcpChannel函数。函数需要一个引用类型的服务器A2L-file和传输协议用于与服务器通讯。

xcpCh = xcpChannel (a2lInfo,“TCP”)
xcpCh =通道属性:ServerName:“ModuleName”A2LFileName:“XCPServerSineWaveGenerator。a2l TransportLayer: TCP的TransportLayerDevice: [1×1 struct] SeedKeyDLL: []

连接到服务器

与服务器通信活动,利用连接函数。

连接(xcpCh)

从A2L-File视图可用特征

一种特征XCP代表一个可调参数的内存模型。用于校准A2L-file中定义和特点可以发现的特征财产。注意,参数获得乘数和ydata指定输出一维查找表的数据点。

a2lInfo.Characteristics
ans =1×2细胞{“增益”}{' ydata '}
a2lInfo.CharacteristicInfo (“获得”)
ans =特征与属性:名称:“获得”LongIdentifier:“CharacteristicType:价值ECUAddress: 549960存款:(1×1 xcp.a2l。RecordLayout] MaxDiff: 0转换:[1×1 xcp.a2l。CompuMethod] LowerLimit: 5 UpperLimit: 5维度:1 AxisConversion:{1×0细胞}位掩码:[]ByteOrder: MSB_LAST离散:[]ECUAddressExtension: 0格式:“数量:[]PhysUnit:“
a2lInfo.CharacteristicInfo (“ydata”)
ans =特征与属性:名称:“ydata”LongIdentifier:“Y数据”CharacteristicType:曲线ECUAddress: 550024存款:[1×1 xcp.a2l。RecordLayout] MaxDiff: 0转换:[1×1 xcp.a2l。CompuMethod] LowerLimit: 2 UpperLimit: 2尺寸:7 AxisConversion: {[1×1 xcp.a2l。CompuMethod]}位掩码:[]ByteOrder: MSB_LAST离散:[]ECUAddressExtension: 0格式:“数量:[]PhysUnit:“

检查加载特征值

读取的当前值的特点获得。的readCharacteristic函数执行直接从服务器读取给定特征。

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

读取当前的一维查找表使用特征readAxisreadCharacteristic,然后情节映射。这个表有效映射任何积极的输入输出值为零。

inputBreakpoints = readAxis (xcpCh,“xdata”)
inputBreakpoints =1×70.2000 0.5000 1.0000 -1.0000 -0.5000 -0.2000 0
outputPoints = readCharacteristic (xcpCh,“ydata”)
outputPoints =1×7-1.0000 -0.5000 -0.2000 0 0 0 0
情节(inputBreakpoints outputPoints);标题(“最初的一维查找表图”);包含(“输入值”);ylabel (“产值”);

创建一个测量列表

这个例子中探索的价值测量正弦修改的和修改的两个特点。可视化的不断变化的价值正弦预处理和post-calibration、获取测量数据值使用数据收集表。使用createMeasurementList函数创建一个数据收集列表包含所有正弦从服务器可用的测量。

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

之前获得的测量校准

使用startMeasurement功能和stopMeasurement函数运行很短的时间内采集列表。

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

检索获得的数据采集列表Sine-based测量,使用readDAQ函数。获取样本的数量在3秒100毫秒事件预计将是30,但由于XCP服务器运行在Windows上,它不是一个实时操作系统,获取样本的实际数量可能不到30,这取决于操作系统。

正弦= readDAQ (xcpCh,“正弦”);sineAfterGain = readDAQ (xcpCh,“SineAfterGain”);sineAfterTable = readDAQ (xcpCh,“SineAfterTable”);

检查测量校准之前

画出SineAfterGain测量的基础正弦测量。后的值获得提高了2倍,基于原始的测量,因为加载值的特征获得以前是2,如图所示。

情节(sin,“啊——”);持有;情节(sineAfterGain“* - - - - - -”);持有;标题(“之前校准:正弦信号和正弦信号后获得“);传奇(“原始”,“获得”之后);包含(“数据点”);ylabel (“数据值”);

画出SineAfterTable测量的基础正弦测量。任何积极的原始测量值是根据加载一维查找表映射到零,因此修改后的信号看起来截断和没有任何积极的价值观。

情节(sin,“啊——”);持有;情节(sineAfterTable“* - - - - - -”);持有;标题(“之前校准:正弦信号和正弦信号后表”);传奇(“原始”,“表”);包含(“数据点”);ylabel (“数据值”);

校准和一维查找表

写一个新的价值获得使用writeCharacteristic,执行一个读来验证使用的变化readCharacteristic

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

写新数据点的输出一维查找表使用writeCharacteristic

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

看新的一维查找表数据使用readAxisreadCharacteristic,然后情节映射。现在表有效映射任何负面输出输入值为零。

inputBreakpoints = readAxis (xcpCh,“xdata”)
inputBreakpoints =1×70.2000 0.5000 1.0000 -1.0000 -0.5000 -0.2000 0
newOutputPoints = readCharacteristic (xcpCh,“ydata”)
newOutputPoints =1×70 0 0 0 0.2000 0.5000 1.0000
情节(inputBreakpoints newOutputPoints);标题(“新一维查找表图”);包含(“输入值”);ylabel (“产值”);

获得测量校准后

使用startMeasurement功能和stopMeasurement函数运行很短的时间内采集列表。

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

检索获得的数据采集列表Sine-based测量,使用readDAQ函数。

正弦= readDAQ (xcpCh,“正弦”);sineAfterGain = readDAQ (xcpCh,“SineAfterGain”);sineAfterTable = readDAQ (xcpCh,“SineAfterTable”);

检查测量校准后

画出SineAfterGain测量的基础正弦测量。现在的价值获得下降了2倍,基于最初的测量,因为特色的价值获得校准后设置为0.5。

情节(sin,“啊——”);持有;情节(sineAfterGain“* - - - - - -”);持有;标题(校准后:正弦信号和正弦信号后获得“);传奇(“原始”,“获得”之后);包含(“数据点”);ylabel (“数据值”);

画出SineAfterTable测量的基础正弦测量。任何负面的原始测量值是根据新的一维查找表映射到零,因此修改信号截断不同,没有任何负面的价值。

情节(sin,“啊——”);持有;情节(sineAfterTable“* - - - - - -”);持有;标题(校准后:正弦信号和正弦信号后表”);传奇(“原始”,“表”);包含(“数据点”);ylabel (“数据值”);

从服务器断开连接

要禁用与服务器的通信,使用断开连接函数。断开后的XCP服务器可以安全地关闭。

断开(xcpCh)

清理

清晰的a2lInfo