Matlab编程技巧:导入MDF文件

文章目录

  • [1 问题引入](#1 问题引入)
  • [2 导入MDF文件示例](#2 导入MDF文件示例)
  • [3 将信号导入Simulink](#3 将信号导入Simulink)
  • [4 总结](#4 总结)

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

博主以前写过一篇文章《仿真与测试:通过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模型中进行仿真。

>>返回个人博客总目录

相关推荐
煤泥做不到的!21 分钟前
挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存
开发语言·c++
F-2H23 分钟前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
bryant_meng1 小时前
【python】OpenCV—Image Moments
开发语言·python·opencv·moments·图片矩
若亦_Royi2 小时前
C++ 的大括号的用法合集
开发语言·c++
沅_Yuan3 小时前
基于GRU门控循环神经网络的多分类预测【MATLAB】
matlab·分类·gru
资源补给站3 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
m0_748247553 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
6.943 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
Aileen_0v04 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
是小胡嘛4 小时前
数据结构之旅:红黑树如何驱动 Set 和 Map
数据结构·算法