2008年12月24日星期三

圣诞节到了,介绍几个好模块

1.Variable Transport Delay:
用于实现信号的动态延迟,两个输入,一个输入原始信号,另外一个输入信号延迟的时间T。

2.FM Modulator Passband:
用于实现通过输入信号的大小变化动态的改变输出信号的频率。

未完待续......

simulink图形中线条粗细和模块视图大小的讨论

如何调整simulink图形的线条和模块大小、粗细呢?

目前已知如下几种方法,供广大网友参考:

1.在simulink模型的format菜单上,最下面三个(我的是MATLAB7.0.1)都是关于display的,可以进行有限的设置;
2.simulink模型里面view菜单下,zoom in、zoom out 等可以放大缩小整个视图;
3.还是在simulink模型里面view菜单下,选项fit system to view,整个图都会变大变粗以适应屏幕大小,对应快捷键为 空格键;
4.在3中,如果选中了某个模块,则选项fit system to view会自动变成fit selection to view,选中的模块会变粗变大,但整体图会出现比例不协调的现象。

感谢ljelly,后两种方法参考了ljelly在simwe上的回答,具体参见:
http://forum.simwe.com/thread-860177-1-1.html

2008年12月18日星期四

simulink对rising(上升沿)的定义

众所周知,上升沿(rising)的意思就是信号以一个脉冲的形式突然上升。但是,最近我发现simulink好像不这样认为~~

假如simulink也是这么认为的,那么下面这个模块的输出应该显示Triggered Subsystem在仿真的10s内被触发9次:

但是,遗憾的是,示波器的输出显示,只被触发了一次,而且是在从0上升到1的时候被触发的: 那么这是怎么回事呢,这也许就是我们和simulink对上升沿的理解不同,simulink认为,只有从0到1的上升沿才叫上升沿,为什么这么说呢,上述问题又如何解决呢?

我们在Digital Clock和Triggered Subsystem之间加一个Monostable即可:

这时候,相当于每次都让Triggered Subsystem从0到1触发,那么输出的结果呢?
可见,被触发了9次,目的达到了~~

2008年12月17日星期三

Matlab GUI中嵌入到窗口内的waitbar

最近用到了waitbar,但是Matlab的waitbar总游离于主窗口之外,网上有人介绍放入主窗口的办法,事实上就是精简Matlab本身的waitbar,但是这仍然不能满足我的要求,主要是我的界面还要另外plot新的figure,而patch不检查当前绘图区域,所以如果在waitbar绘制过程中点击了plot出来的figure或者别的figure,那么进度条r就会在当前的figure下画,问题很让人头疼
关于patch,按照Matlab说法,它不像其他高级绘图命令,patch不检查figure和axes的所有权,只是简单的向当前axes上画patch,如果有多个figure或者axes,像我这种情况,麻烦就来了
所以在使用patch前,必须告诉Matlab,把要画的figure和axes说清楚。这样,基本就实现了完美的嵌入式进度条显示:
首先在GUI窗口中找出一块空地,放上一个axes,起个名字,我起的名字是TheWaitBar,然后,如果某一时刻触发,使waitbar开始画图(比如点了开始计算的OK键),那么加入下面一段话的执行:

TheEndTime = 6000; % 自己定义的循环次数
h = get(handles.TheWaitBar,'title');
set(h,'String','Please Wait...');
for t = 1:TheEndTime
MyWaitBar(t/TheEndTime,handles);
V(t) = sin(t); % 举个计算的例子
end
cla;
set(h,'String',''); % 打扫战场

其中的handles就是GUI中的handles。
调用下面自己写的waitbar函数:

function MyWaitBar(t,handles)
if nargin == 2
set(0,'CurrentFigure',handles.figure1); % 告诉Matlab当前的绘图窗口
set(handles.figure1,'CurrentAxes',handles.TheWaitBar); % 告诉Matlab当前的绘图区域
end
x = t*100;
xpatch = [0 x x 0];
ypatch = [0 0 1 1];
patch(xpatch,ypatch,'b','EdgeColor','b','EraseMode','none');
drawnow;

其中handles.figure1是当前GUI主窗口(也就是TheWaitBar所在窗口的句柄),如果你有多个GUI窗口,在程序里写个handles不加分号看一看TheWaitBar在哪个里就可以了。这样的话,如果你有多个figure,无论你如何用鼠标选择当前窗口,程序都会在TheWaitBar控件上绘制图形进度条。

2008年12月16日星期二

在MATLAB的GUI中区分str2double和str2num函数

有网友提示说在GUI的edit控件上,使用str2num函数会导致错误,我看了一下MATLAB帮助文档,其在edit控件上推荐使用str2double函数而不是str2num,具体我编了一个程序试验了一下,有兴趣的网友可以测试一下下面的代码:
a = '20'
b = {'10'}
a_num = str2num(a)
a_double = str2double(a)
try
b_num = str2num(b)
catch
b_double = str2double(b)
end

通过上面的代码我们可以清楚的了解str2double和str2num这两个函数的区别,其中,str2num不能转换cell元素,但是,str2double却可以胜任。
后来又专门查阅了str2double和str2num这两个函数的帮助,感觉似乎任何时候使用str2double都比较合适,各位网友不妨发表一下意见~

关于动态修改simulink模型参数的探讨

问题提出:

simulink运行到中间时刻,然后动态修改模型中的参数,然后再从断点开始接着运行

问题解决:

先说模块:如果仿真时simulink模块对话框里允许改动的,那么,就可以改,而且,改完之后,simulink似乎就认同这种改动,并按照改动后的数据继续仿真;不允许改动的当然就不行了,比如打开对话框之后是灰色的部分。

但是,这些的前提是不用命令修改,我发现,无论是增益(gain)模块还是Constant模块(其他未验证),如果里面写上变量名K,仿真前给K赋值为1,仿真暂停再赋值为10,继续仿真,似乎更改根本没有效果,仍然按照K=1进行仿真。而如果暂停时直接修改gain模块对话框里的值,就有效果。不知道我说清楚没有

再说函数:对于simulink调用m函数,也就是用MATLAB fun模块,在仿真进行过程中simulink支持m文件的任何改动,即使不暂停也可以,只要改动后保存,在仿真过程中立即生效;而对于embedded MATLAB function模块,就是嵌入到simulink内部的m函数,在仿真过程中语句是不能够改动的,暂停后,打开embedded MATLAB function模块,显示的是locked,也就是说仿真过程中不可更改;最后是s函数,如果在仿真中如果修改了s-function的m文件代码,那么对于仿真一点效果都没有,仿真仍然按照仿真开始时候的s-function的代码运行,除非是在没有仿真的时候里修改s-function的代码,否则没有效果。

也就是说,s-function应该是在仿真开始时就编译好了,中间修改是没有效果的;而一般的m函数可以直接修改,在仿真中将立即生效。

2008年11月27日星期四

让瞬间信号保持1s或更长时间的模块

某些时候,我们需要将一个瞬间出现的信号保持1s或其他的时间长度,比如将触发器触发获得的信号保持指定的时间长度,那么可以采用如下一种方法:
* 采用Monostable模块保持指定的时间长度;
* 在模型中放入一个Triggered Subsystem模块,用于保持这个瞬时信号;
* 在模型中放入一个Matlab function模块,用于将瞬时信号转化成正的标量;
* 用乘法器将Monostable模块的输出和Triggered Subsystem模块的输出相乘即可。



再封装一下,就实现了输入一个脉冲信号,输出一个宽度为1s的幅值为同样大小的方波信号。

2008年11月25日星期二

有趣的Matlab注释-自己写m文件函数帮助的技巧

每当我们help一个函数的时候,我们可以看到,Matlab会在最后加上See also,其实,自己写的m文件帮助也可以加上See also 后面带有链接这种功能的东西
如果在函数的第二行开始写注释,就可以实现用help function命令显示帮助信息的功能,这可能大家都知道了,就不多说了,关键是如何实现See also
See also 的具体实现不知道Matlab是怎么做到的,但是,只要我们注意一下写的格式,就可以写出See also来:
在See also FUNCTIONNAME的后面,一般是英文句号,其后一定要有空格,并且See also 必须这样写,不可以写成see also 或者别的什么,最重要的,See also 后面的函数名字要全部大写
function testHelp
%testHelp tests help
% You can get help from it
% See also TESTHELP.

出来的效果如下:
testHelp tests help
You can get help from it
See also testhelp.

可以看到,上面的testhelp被自动小写,而且加了链接
如果有一个字母没有大写,比如第一个t:

function testHelp
%testHelp tests help
% You can get help from it
% See also tESTHELP.


效果如下:
testHelp tests help
You can get help from it
See also testhelp.

可以看到,除了t之外,后面的esthelp被链接了
如果英文的句号后面没有空格:
function testHelp
%testHelp tests help
% You can get help from it
% See also TESTHELP.

效果如下:
testHelp tests help
You can get help from it
See also

这下一点也显示不出来了,很有意思,如果有多个函数需要see also,直接打逗号再写就可以了。

The Interesting Characters of Triggered Subsystem

Maybe sb. is not very familiar with Triggered Subsystem. In fact, there are many interesting characters in Triggered Subsystem.
This is the figure of Triggered Subsystems. One of its useful characters is that it keeps the value of the time when it has been triggered, until it is been triggered the next time. For example:Make the Trigger input of the Triggered Subsystem the Step signal, whose step time has been set to 1s. Thus the Triggered Subsystem would be triggered at 1 second. And the input of the empty Triggered Subsystem is Clock block. It is interesting to guess what is the output.
The answer is that at 1 second, the Triggered Subsystem keeps the value of that time until the simulation ended. As is shown in the below.
This is to say that at the time of simulation, we can use this model to save some value which we are interested in. Also, we can use the command of PERSISTENT to define the persistent variable in m-file to save some value while simulating.

2008年11月19日星期三

Get An Exact Result By Simulink Without Shorten The Step Size

If we want to get a exact result from simulink, we have to shorten the step size of simulation. But if it needs a very long time?
Sometimes, in a very long time simulaion, there is only a very short period when we have to shorten the step size. And at the other periods, we needn't to simulated in a very low speed, for only a litter time are important which we have to focus on. For example, only a little time when the moto works, which is so called the important period.In this situation, we can change the step size dynamically. Here is a very simple way to get it:
When the moto are working, we can make a Enable Subsystem to work which include a Pulse Generator block. If you want a step size of 1s at that time, you should make the period of the Pulse Generator to be double of 1s, and then you can make sure that the step size have changed to 1s even if it was 100s before!The blocks in the Enable Subsystem is shown below:

2008年11月18日星期二

触发子系统特性浅析

Triggered模块就是触发模块,也许有的人对他并不熟悉,其实,Triggered有许多有意思的地方需要我们去了解,而且,了解之后,我们可以利用它做很多有用的事情



上图就是Triggered模块的内部示意图,通过修改正上方的Trigger,可以指定是上升沿触发,还是下降沿触发,还是either,都触发。
我们以上升沿触发为例,说明它的一个特殊的功效。
* Triggered模块在触发之后,保持了它触发那一瞬间的值。
也就是说,在Triggered模块被触发之后,只要还没有被再次触发,它将一直输出触发那一瞬间的值,比如
我们让触发器为上升沿触发,接入step信号,step time 设定为 1s,那么将在仿真1s时触发Triggered Subsystem,Triggered Subsystem的输入是时间,内部为空,如上图所示,那么输出是什么呢?模块如下图所示

答案是,输出将在1s以后一直保持1,因为step上升的时间是1s,因此Triggered Subsystem保存了这个值,直到被下次触发。结果如下图所示:

也就是说,在仿真的时候,我们可以利用这一特性,保存一些我们需要的值。

关键是我们要认识到触发子系统不被触发的时候保存了输出,而不是将输出恢复到触发前的水平。

在不改变步长的情况下提高simulink的仿真精度

一般情况下,如果我们需要提高simulink的仿真精度,我们会缩短仿真步长,但是如果整个仿真持续很长很长时间呢?
有一种比较广泛的特殊情况,我们无需缩短步长,仍然可以提高仿真精度,这样,就大大减少了我们等待simulink完成仿真的时间~~
问题描述:
在有些时间较长的仿真中,可能存在某一个或几个时刻,要求仿真步长非常短,以达到足够的精度,而在其余时间,整个系统的仿真步长可以较大。比如某个时候发动机需要工作0.017s,而在其他不工作的时刻,系统只需按1s或者10s的步长运行100,000s即可。如果将整个的仿真步长限制在0.001s,这样仿真时间就太长了,得不偿失。
问题的解决:
如何解决这个问题呢,我想了如下一个方法,在此抛砖引玉,希望大家都能发表一下自己的意见:当发动机工作的时候,利用使能子系统(Enable Subsystem)让一个方波信号(Pulse Generator)开始输出(事实上输出并不用做什么,只是用他的采样时间),令方波信号的周期在你希望的步长的2倍上,如上文就是0.002s,其他时刻方波信号不进行输出(使能子系统不工作)。这样的话,即使将整个系统的仿真最大步长设置为10s,当发动机工作时候,还能够提供0.001s的工作精度,并且,Simulink的仿真时间并没有显著没有增长!
使能子系统仿真模块内部构造如下图所示:

Introduce to My Bolg

Welcome to my space!
I am a phD. of a Chinese university, I will write some of my research in the blog in the future. If this space became a communication place of our research, I would be very happy!
This is the end of today's log, it is so short and I have to make it known to all that my English is not very good, possibly very bad. But I will do my best to make my foreigner friends easy to learn!

2008年11月16日星期日

Changing From Microsoft to Google

Today I decide to change my blog address from Windows Live of Microsoft to blogger of Google.
Well, let me tell you what my early blog address is: http://kokyo52.spaces.live.com/
I wish to have a new begin with the help of Google here. And thanks Microsoft of giving me a place in the Internet to display myself before.
Welcome Everybody to My New Home!