matlab虽然后simulink,但是再复杂系统的仿真的时候简单的simulink中模块不能满足要求,因此需要自己建立s函数,作为仿真中的一个模块
在控制系统中分为控制器和被控对象。
matlab---s函数讲解之二连杆动力学仿真
零、原理
1、定点控制时,期望为常数,所以可以利用导数为0的特性构造误差动力学,然后构造李雅普诺夫函数,证明稳定性。

一、控制器
1、功能选择函数(flag)
function [sys,x0,str,ts] = spacemodel(t,x,u,flag)
switch flag
case 0
[sys,x0,str,ts] = mdlInitializeSizes;
case 3
sys = mdlOutputs(t,x,u);
case {
2,4,9}
sys = [];
otherwise
error(['Unhandlede flag = ',num2str(flag)]);
end
end
在s函数中,这是必须的一个函数,s函数中的标志为flag有10个,据说目前支持的有0、1、2、3、4、9等几个数值。matlab中S函数的概念及使用
1)flag=0。进行系统的初始化过程,调用mdlInitializeSizes函数,对参数进行初始化设置,比如离散状态个数、连续状态个数、模块输入和输出的路数、模块的采样周期个数、状态变量初始数值等。2)flag=1。进行连续状态变量的更新,调用mdlDerivatives函数。3)flag=2。进行离散状态变量的更新,调用mdlUpdate函数。4)flag=3。求取系统的输出信号,调用mdlOutputs函数。5)flag=4。调用mdlGetTimeOfNextVarHit函数,计算下一仿真时刻,由sys返回。6)flag=9。终止仿真过程,调用mdlTerminate函数。
同时,需要注意对于离散状态更新,每个仿真步内必然调用该子函数,不论是否有意义。Matlab S-function 使用总结
2、初始化函数
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumOutputs = 2;
sizes.NumInputs = 6;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [0 0];
end
可以看到在控制器中一般没有状态变量,而状态变量一般都在被控对象中。这也就导致了没有连续状态变量的定义,也就没有了连续状态更新的函数定义(状态方程)。(ps:虽然离散状态更新每个仿真中都会调用,flag=2.)
所以x0不需要定义值,只需要定义空就可以。
ts的值表示每个连续的采样时间步都运行。
sizes.DirFeedthrough = 1:只要输出函数中有u就需要=1。
3、输出函数
function sys = mdlOutputs(t,x,u)
R1 = u(1);dr1 = 0;
R2 = u(2);dr2 = 0;
x(1) = u(3);
x(2) = u(4);
x(3) = u(5);
x(4) = u(6);
e1 = R1 - x(1);
e2 = R2 - x(3);
e = [e1;e2];
de1 = dr1 - x(2);
de2 = dr2 - x(4);
de = [de1;de2];
Kp
MATLAB S函数与二连杆动力学仿真

本文深入探讨了MATLAB中S函数的使用,特别是在二连杆动力学仿真的应用。详细介绍了S函数中不同flag值的功能,如初始化、状态更新和输出。并展示了如何通过S函数实现控制器和被控对象的设计,包括状态方程的构建和动力学方程的求解。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



