1 问题引入

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

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

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

在这里插入图片描述
本文研究通过Matlab脚本解析MDF文件,并转换为Simulink可以识别的输入信号。

2 导入MDF文件示例

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

3 将信号导入Simulink

博主以前写过一篇文章《仿真与测试:通过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中对于的信号一个个地匹配起来即可。

4 总结

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

>>返回个人博客总目录

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐