matlab simulink自定义结构体变量并在函数模块中应用

能“徒手”写matlab脚本,却是simulink小白一枚。前段时间“硬着头皮”给一个simulink模型添加了一个函数模块,函数的输出是4个结构体变量,因此涉及到在simulink中自定义结构体类型的变量,以及显示输出的结构体变量。

完成这一任务的过程还是费了一些劲的,在翻阅各大网站查找问题的解决方法的过程中,也发现很多帖子并没有把问题解决得明明白白,当时就立下flag:当我完成这个任务之后,我一定要把这个过程写下来(而且越详细越好!!!),说不定还可以帮助碰到类似问题的同志们少走些弯路少踩些坑,同时也是记录下这次摸索的过程......

废话也说了不少了,接下来说正事儿了......

        1. 一些基础的步骤

在Simulink Library Browser里找到MATLAB Function这个模块,把它拖出来放到显示Simulink模型界面的空白处,然后双击这个模块,窗口会自动切换到matlab主界面,编辑器中出现一个名为MATLAB Function的空白脚本正在等着你发挥自己的创造力。在这个脚本里,根据自己的需要写下该函数模块需要实现的功能的相关代码并保存,再切回simulink界面,你会发现之前那个函数模块的左边就是你写的函数的输入变量,函数模块的右边就是函数的输出变量。具体操作如下图,至于这个函数模块的输入变量从哪里来的,这不是本文需要操心的问题......

matlab simulink自定义结构体变量并在函数模块中应用_第1张图片

 本来我这个函数模块就是输入一堆数值矩阵,再输出一堆数值矩阵,然后把输出display一下确认函数实现了它应该实现的功能就完事儿了。然而......几天之后我被告知,要把它改成输出结构体类型的变量!!!

于是,我开始了simulink自定义结构体变量的漫漫摸索之路......

2. Simulink自定义结构体变量

Simulink自带的变量类型只有uint8,uint32,long......这样一类的基础数值类型,要用结构体,那就只能靠自己了。我这里用的方法是:先写一个.h文件,定义好自己要用的结构体长啥样,然后把它import到simulink里面去,接着就可以在模块里面用它了。以下开始详细描述这一过程(由于不太熟悉simulink的一些专业术语,C/C++也是用到哪里学到哪里,所以描述的语言可能不太专业......):

(1) 写一个.h文件,把自己要用的结构体定义好,然后把这个.h文件放到模型所在的文件夹下

matlab simulink自定义结构体变量并在函数模块中应用_第2张图片

(2) 通过mex命令,在工作区(workspace)生成自定义的结构体变量并完成函数脚本编写

matlab是不认识.h文件的,要用mex这样的一种工具作为matlab和C/C++之间的桥梁以让它俩认识。那么,我们要先确认一下自己的matlab是否安装了可以执行mex命令的工具,我是在matlab的附加功能里装了一个mingw,然后才使得我在命令行窗口输入带mex的语句而不报错的......

详细过程继续看图......

matlab simulink自定义结构体变量并在函数模块中应用_第3张图片

matlab simulink自定义结构体变量并在函数模块中应用_第4张图片

在我查找解决问题的方法的过程中,大多数的帖子教我做到这一步就没有然后了,可是对一个simulink小白(痴)的我来说,做到这一步,后面呢?我还是不会呀!!!

请教了身边会这一系列操作的人,再加上自己慢慢摸索,后面的步骤是这样的......

matlab simulink自定义结构体变量并在函数模块中应用_第5张图片

matlab simulink自定义结构体变量并在函数模块中应用_第6张图片

变量类型已经改好了,在写函数脚本的过程中,就大胆的按照这个变量是结构体的样子来写就可以了,不用担心,没问题哒!

写完之后运行一下simulink模型,可以看到函数模块有如下变化:输入输出变量的size会出现在横线上,结构体变量的那根表示输出的箭头线会变粗。

matlab simulink自定义结构体变量并在函数模块中应用_第7张图片

到这里,我们的问题就都解决了,但是!!!当你满心欢喜的关掉simulink,又关掉了matlab去休息玩耍了,然后过了几个小时或者一两天以后,你再次打开matlab,想再次运行一下这个模型,然后你就会惊讶的发现!!!模型在生成的过程中出错了!!!它跟我说输出的变量类型是它不认识的!!!什么毛病???我辛辛苦苦费了半天劲才跑通的模型咋是个只能成功一次的???很好,你已经成功的激发了我的斗志,新的挑战又来了,继续摸索......

(3) 将混合编译.h文件的步骤放进模型里

冷静下来想想,出现上述重新打开matlab 模型就不认识自定义变量的状况也是正常的,我们前面用mex对自己编写的.h文件进行编译使得matlab认识了它,但是生成在工作区的变量,随着matlab的关闭它就消失了啊,我们又没保存它,那么matlab重新打开的时候它当然不认识了......可是每次跑模型之前都要来一遍(2)中的这一套步骤也太麻烦了吧,而且这样岂不是显得我很愚蠢嘛?!那么有没有什么办法可以让模型在运行之前自己去跑那两句编译.h文件的语句,这样你matlab不能说你不认识它了吧,那我们的问题也就有了靠谱的解决方案了......

强大如matlab/Simulink,这样的解决方案当然是有办法实现的,来看图解步骤:

matlab simulink自定义结构体变量并在函数模块中应用_第8张图片

matlab simulink自定义结构体变量并在函数模块中应用_第9张图片

由于在(2)中进行过定义函数输入输出变量类型的操作,因此完成上述设置模型的Callback函数的操作之后问题就搞定了。不放心的话(那搁谁第一次操作完这一波都不放心啊),我们把Simulink关掉,matlab也关掉,然后再重新启动matlab,打开模型,直接点击Run,可以看到模型运行毫无问题,这回是真的可以安心啦!

3. 显示输出的自定义结构体变量

本来问题是都解决了的,但有时候我们需要通过函数的输出来确认一下这个函数的脚本写得对不对,它是不是按着我们的思路去执行了它应该实现的功能。本来呢,如果输出是矩阵的话,我们在输出的地方加几个display的模块,就可以看到函数输出的变量的数值了,多么的直观和简单啊。可是display它不能显示结构体啊,那么有什么办法可以解决一下嘛?

在这里,我只能说,好在我这个函数本来就是输入几个矩阵,然后让函数脚本对它操作一番,最后再输出几个矩阵,只是因为有特殊要求,要把输出的矩阵重新整合一下变成结构体,这些个结构体里的每一个元素本质上还是数值,那么我用笨办法也得让它display出来。请教了一下周围的人,再开发一下自己贫乏的创造力,我找到了一种显示结构体变量的方法:给每个输出的结构体变量接上一个Scope模块,这个Scope虽然不能显示具体的数值,但是它能显示一条一条的曲线,也算是有个可以比较朦胧的看到结构体里每个变量的值的一种方法了,而为了能够显示结构体里每个元素的具体数值,不得已我把改造输出之前的那几个矩阵也放到函数的输出里了,然后给它接上display,一样可以看嘛。直观一点就是这个模型的样子被我改成了下图中这样:

matlab simulink自定义结构体变量并在函数模块中应用_第10张图片

既不耽误输出结构体的要求,也能帮助我们通过观察输出值确认函数脚本写得有没有毛病,这方法我觉得还不错。

至此,所有问题都得到了解决。

The End......

一点感想:第一次写帖子,挺不容易的,要把问题讲清楚,就得图文并茂,做这几个图可是费了我老大的劲了,用电脑自带的画图工具来把截下来的图拼起来,还要在图上加文字,纠结截图会不会把一些不该显示的信息泄露了,还要涂掉一些文件名和变量名,真的还挺费劲。一篇文章断断续续也写了三个晚上才完成,中间还经历了一次因为网络不佳,一部分已经写完的内容没有被保存,又自己重新措辞重新写。最后,致敬那些常年在各大网站上写原创技术帖的大佬们!

你可能感兴趣的:(matlab simulink自定义结构体变量并在函数模块中应用)