在汽车电控开发中,测试标定工程师可以通过CANape将控制器运行时的观测量实时地录制下来,保存成MDF文件。MDF文件中的数据有助于工程师排查控制器的问题,从而优化控制策略。
对于简单的问题,工程师只要看一看MDF文件的数据,就能定位到问题在模型的位置。对于更加复杂的问题,可以将模型的输入信号从MDF文件中摘取出来,导入到模型中进行仿真调试,从而在模型层面复现问题。这个过程,汽车软件工程师称之为数据回灌。
进行数据回灌首先需要将MDF中的数据解析出来,转化为Simulink可以识别的格式。然后通过Simulink中的FromWorkspace导入模型进行仿真。
本文研究通过Matlab脚本解析MDF文件,并转换为Simulink可以识别的输入信号。
1)首先打开Matlab安装路径 C:\Program Files\Polyspace\R2019a\examples\vnt\CANape.MF4 ,从中可以获取Matlab的示例文件CANape.MF4;
2)通过CANape打开该文件,·可以看到其中所有的观测量随时间的变化;
3)对于想要提取的信号,例如PWM,可以右键Proterties打开属性对话框,在Group Information中可以看到它的Group是“10ms”;
这个很重要,在后面解析信号的时候需要先知道它的组;
4)在Matlab中运行以下函数,可以以该文件创建一个mdf对象;
>> m = mdf('CANape.MF4')
m =
MDF - 属性:
File Details
Name: 'CANape.MF4'
Path: 'E:\Lesson\Blog\Mathworks\Matlab\MDF\CANape.MF4'
Author: 'Otmar Schneider'
Department: 'PMC @ Vector Informatik GmbH'
Project: 'Demo'
Subject: 'XCPSim'
Comment: 'Example file created with Vector CANape'
Version: '4.10'
DataSize: 176545
InitialTimestamp: 2016-04-21 14:27:17.000010629
Creator Details
ProgramIdentifier: 'MCD14.02'
Creator: [1×1 struct]
File Contents
Attachment: [0×0 struct]
ChannelNames: {2×1 cell}
ChannelGroup: [1×2 struct]
运行该函数会返回很多关于此MDF文件的信息,其中最后一行表示该MDF文件中有两个ChannelGroup;
5)再输入以下代码并回车,可以知道两个ChannelGroup的具体信息;
>> m.ChannelGroup(1)
ans =
包含以下字段的 struct:
AcquisitionName: '10 ms'
Comment: '10 ms'
NumSamples: 1993
DataSize: 153461
Sorted: 1
Channel: [1×74 struct]
>> m.ChannelGroup(2)
ans =
包含以下字段的 struct:
AcquisitionName: '100ms'
Comment: '100ms'
NumSamples: 199
DataSize: 23084
Sorted: 1
Channel: [1×46 struct]
其中,第一个ChannelGroup的名字是“10ms”,也就是想要提取的信号PWM所在的组;
6)接着,通过read函数可以读出PWM信号的具体数据,返回的格式是一个随时间变化的TimeTable;
>> read(m,1,'PWM')
ans =
1993×1 timetable
Time PWM
____________ ___
0.00082554秒 100
0.010826秒 100
0.020826秒 100
0.030826秒 100
0.040826秒 100
第一列是时间序列,并且有1993个时刻点;第二列是PWM信号的数据数值,与时间序列对应;至此,就已经解析出来了PWM的数据信息。
博主以前写过一篇文章《仿真与测试:通过From Workspace模块导入外部数据》,介绍了TimeSeries类型的数据可以导入Simulink进行仿真测试。本章节就通过这个思路写一个脚本,把PWM信号转为TimeSeries类型,从而进行仿真测试。
1)结合上一章的内容,编写脚本如下:
clear;clc;
m = mdf('CANape.MF4');
pwm_timetable = read(m,1,'PWM');
pwm_timeseries = timeseries(pwm_timetable.PWM,(0:0.01:size(pwm_timetable.PWM,1)*0.01-0.01));
最后一行脚本把timetable转为了timeseries,并且强制把时间序列转为等间隔的0.01s,如下所示:
这是因为再CANape中会有采样偏差,但是在Simulink中是理想的时间间隔模型,不存在偏差;
2)运行脚本,就会在工作空间生成pwm_timeseries对象,作为模型的输入;
3)在Simulink中新建一个Fromworkspace模块和一个Scope模块,并且将模型配置成FixStep,以及时间步长改为0.01s;
4)运行模型,打开Scope模块,可以看到MDF中的PWM信号数据导入了模型;
对于实际工作而言,只要把模型中的Inport换成FromWorkspace,再把MDF中对于的信号一个个地匹配起来即可。
本文研究了如何用脚本解析MDF文件,将其中的信号回灌到Simulink模型中进行仿真。