admin 管理员组

文章数量: 1184232

1 问题引入

在汽车电控开发中,测试标定工程师可以通过CANape将控制器运行时的观测量实时地录制下来,保存成MDF文件。MDF文件中的数据有助于工程师排查控制器的问题,从而优化控制策略。

对于简单的问题,工程师只要看一看MDF文件的数据,就能定位到问题在模型的位置。对于更加复杂的问题,可以将模型的输入信号从MDF文件中摘取出来,导入到模型中进行仿真调试,从而在模型层面复现问题。这个过程,汽车软件工程师称之为数据回灌。

进行数据回灌首先需要将MDF中的数据解析出来,转化为Simulink可以识别的格式。然后通过Simulink中的FromWorkspace导入模型进行仿真。

2 导入MDF文件示例

1)首先打开Matlab安装路径 C:\Program Files\Polyspace\R2019a\examples\vnt\CANape.MF4 ,从中可以获取Matlab的示例文件CANape.MF4;

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的数据信息。

3 将信号导入Simulink

博主以前写过一篇文章 ,介绍了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中对于的信号一个个地匹配起来即可。

4 总结

本文研究了如何用脚本解析MDF文件,将其中的信号回灌到Simulink模型中进行仿真。

本文标签: 导入 编程 系统