校准XCP特点
这个例子展示了如何使用可用的XCP协议功能连接和校准特征的数据模型®模型部署到Windows®可执行。金宝app这个例子写修改模型的参数使用TCP和直接存储器存取,并比较测量之前和之后的校准。的XCP高层协议用于访问和修改内部参数和变量的模型,算法,或者ECU。有关更多信息,请参考ASAM标准。
算法概述
在这个例子中使用的算法是一个仿真软件模型构建和部署作为XCP服务器。金宝app可用的模型已经被编译和运行的文件XCPServerSineWaveGenerator.exe
。此外,A2L-fileXCPServerSineWaveGenerator.a2l
是一个构建过程的输出。模型包含三个测量和两个特点,通过XCP。因为已经部署模型,模型不需要运行这个例子。金宝app下图显示了模型。
信号SineAfterGain
通过使用乘数获得
规模的源信号正弦
,信号SineAfterTable
通过使用一维查找表来修改源信号正弦
。校准参数获得
和一维查找表产生不同SineAfterGain
和SineAfterTable
相应的波形。
如何构建一个仿真软件模型的详细信息,包括一个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
读取当前的一维查找表使用特征readAxis
和readCharacteristic
,然后情节映射。这个表有效映射任何积极的输入输出值为零。
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);
看新的一维查找表数据使用readAxis
和readCharacteristic
,然后情节映射。现在表有效映射任何负面输出输入值为零。
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