近日来为了对所研究的对象进行建模分析,开始了matlab这款工具软件的学习。此前的本科课堂上也教授过它的使用,所以很容易就可上手操作,但是真正应用它去实现基本的应用例程时,遇到的困难没有成堆也有那么一箩筐。下面就来把这两天来困扰我的“embedded
matlab funtion”模块使用方法梳理一遍。
模块说明:“embedded matlab
funtion”是simulink中用户自定义类的模块,它可以内部嵌入function程序,可用它来定义想要的数据操作功能,下面用EMF缩写代指该模块。
使用举例:制作这样一个模块,输入基本的时间基准,输出参数可调的三角波,初始编写嵌入程序如下。
function y = sin_wave(t;a;f;scale;bias)
%this function is used to produce a arbitrarily sawtooth wave
%
a 幅度
%
f 频率
%
t 时间
% scale 0-1偏移角,0.5为对称三角波
% bias 偏置值
T =
1/f;
t0 = t(2)-t(1);
t1 = [0:t0:T*scale];
t2 = [0:t0:T*(1-scale)];
k1 = a/T/scale;
k2 = a/T/(1-scale);
y1 = bias + k1*t1;
y2 = bias + a -k2*t2;
y3 = [y1,y2];
y=[];
int16 n;
n=max(t)/T+1;
for k=0:n
y=[y,y3];
end
y=y(1:length(t));
end
这个程序是事先在.m文件中实现过的,说明不违反基本的matlab语法。
艰难的debug过程:
问题1.首先遇到的是变量定义的问题。EMF模块仅提供有一个输入和一个输出接口,且无法自定义接口数量,本例中遇到的是多输入,单输出的情况。按照function
y = sin_wave(t;a;f;scale;bias)的定义,编译报告无法找到括号中定义的变量。后面发现可通过simulink中另一模块“mux”来将多个输入组合成一个矩阵形式输入,程序内部再把矩阵拆分开来使用,定义函数式改成function
y = sin_wave(u)形式即可,其中u为一个矩阵。
问题2.程序中该如何将需要的5个变量对应赋给u呢?开始我用的是u=[t;a;f;scale;bias];的写法,报告出错,分析这里是犯了本末倒置的错误。因为仿真时,每一步的变量参数是先通过Mux模块传递给u的,按理说应该把u中的内容再依次传递给各变量,而这里相当于把变量值赋给了u,这样问题当然就来了。之后改成t=u(1);a=u(2);f=u(3);scale=u(4);bias=u(5);形式,问题解决。
问题3.t0 = t(2)-t(1);这条语句处报告了这样一个错误“Attempted to access element 2. The valid
range is
1-1.”意思是t本来只有1个元素,这里企图用它的两个,造成错误。分析原因可能是和simulink的仿真原理有关,在命令窗口中给t赋值是一组数据赋给一个向量,而simulink仿真时是一步增添一个新元素,在仿真开始第一步时,t只有一个元素。所以解决办法只能是更改程序实现方法,且先不管。
问题4.程序运行到t1 = [0:t0:T*scale];t2 =
[0:t0:T*(1-scale)];这两句时又出现了新的情况,错误报告是这样的“Computed maximum size of the output
of function 'colon' is not bounded.Static memory allocation
requires all sizes to be bounded.
”大致意思就是说t1,t2两个变量所占空间大小没有受到约束。直接分析可以知道这两个变量的数值是可以直接计算出来的,不存在元素个数不确定的情况,但有可能还是因为对simulink仿真原理不清晰造成的问题,目前还没有找到解决办法。
问题5.这个错误出在最后一句“end”上面,我们知道matlab的function写法都是要在后面加上一句“end”代表程序的结束,但在simulink中就不同了,你不加,没事;你加了,反而报错。
问题6.在我把编好的模块封装成一个subsystem(子系统)时,因为模块中含有变量,所以在封装模块时对这些变量在属性中进行了初始化设置,但不慎在这个过程中加入了汉字的说明,导致最后文件无法保存,提示说模块中含有不能编码的格式部分,需要把它移除。好样的,就这个问题都废了我老长时间才定位到这个上面来。
总结:模块应用到最后,没能实现我最初想要做的三角波发生器,但在这一次次的碰壁过程中也算是大致摸清楚了整个模块房间的结构,什么地方不能碰,具体路线该怎么走都有了一个比较清晰的概念。通过这个总结希望能给学习这个模块的朋友一些提示,也希望大家对我未能解决的一些问题能够给出指引,最后附上仿真模型图。