| |
这学期刚开学的时候曾经花了两个星期啃《Matlab在电气工程中的应用》这本书,其中唯一没有消化的就是S-function这一部分,可能是因为有代码,而且当时没有学线性系统的原因吧。昨天因为做一个仿真不得不用到了这部分,所以硬着头皮看了下,竟然看懂了!
说白了,Simulink中的S-function就是根据所要解的微分方程建立仿真模块。建立S-function的M文件用模板最方便,因为这是个超级模式化的过程。有篇文章上说模块只有一个输入一个输出,我觉得这么说是不严密的。因为在模板里你可以看到输入变量个数的设定还有输出变量个数的设定。这样,如果需要两个输入的话——我们以u来代替输入,这是个向量——u(1)就会代表第一个输入,而u(2)代表第二个输入。可是我们在将S-function模块拖入mdl文件的时候就会看到上面的确只有一个输入口,这时就需要Mux这个模块放到S-function模块的前面,接收两个输入变量,是有顺序的,上边的对应u(1),下边的对应u(2)。三个及以上的变量都依此类推。
然后是核心编程。我觉得S-function无非就是两个部分,流程控制部分和函数定义部分。流程控制,是靠flag的值来实现的。一个完整的S-function文件中有5个flag值:1 2 3 4 9。注意到每个flag后都有一句话,将sys引到对应的函数里面。具体的S-function执行过程要是解释起来估计要用到深层次的Simulink原理,我就不清楚了。不过个人觉得,只要是知道了各个flag与所要解的微分方程的关系就可以了。flag=1,将sys引到初始化的函数中(别看函数名那么长,可是就是纸老虎,会点儿英语的都明白那函数是干什么的),在这里我们就碰到了前面说过的输出输入个数问题。好像有五六个值需要自己改,状态变量,输入输出变量等跟所要解的微分方程意义是一样的。这里还有扩大概念的意思:可以选择只有状态方程,也可以选择只有输出方程。如果是后者记得将状态变量个数置零,其他也一样。然后有直馈feedthrought这个东西的值需要设定。直馈是个什么概念呢,我觉得是输出方程只与输入状态有关,而不用经过状态变量就是直馈。比如方程的最基本形式,输出=输入,这个就是直馈。flag=2 3 4 就是要将sys赋值状态方程。而flag=9是将sys赋值输出方程。9是一般情况下都需要的,而2 3 4 有连续离散等之分,只要根据自己的需要选择一个就可以了。另外,在流程控制阶段,假如只用到了flag=1 2 9,那么其他两个要置空即sys=[ ];。相应的函数在函数定义部分就干脆不用写了,因为你用不到它们!
其实这个过程很简单,想想任何一个线性微分方程的解的过程:附初值、迭代、输出。其实S-function也是一样的:附初值,给方程形式让计算机来解(当然这个过程用到输入u),然后向下一个模块传递解出来的值。
在我的仿真里还有个问题有待解决:编出来的S-function不能将发电机的模型的输出当做输入。下一步重点解决这个问题。