cathy 发表于 2007-9-21 08:55

增量式PID的S函数

我想做一个增量式PID的S函数,然后在SIMULINK中使用,想请教一下该怎么编写,小女子十分感谢!

xptan 发表于 2007-9-21 13:42

我也很想知道,怎么编写这个模块:'(

jack_boy 发表于 2007-9-21 14:09

这个问题记得前不久好像人问过,其实不用害怕怎么写s函数,按照s函数的规则写就是了(一个简单的办法就是改写toolbox\simulink\blocks\sfuntmpl.m),如果不会写S函数,还是先看看书吧。在S函数中实现du=Kp*(e(k)-e(k-1))+Ki*e(k)+Kd*(e(k)-2e(k-1)+e(k-2))不是件难事,输出u(k)=u(k-1)+du就是了。

xptan 发表于 2007-9-21 16:13

jack_boy ,你好,增量式是这样的吗?我只在输出这个函数改动了,不过好像不对,能指点一下吗,谢谢了
function = sfuntmpl(t,x,u,flag,Kp,Ki,Kd)
。。。。。。
sizes.NumOutputs   = 1;
sizes.NumInputs      = 1;
。。。。。。
function sys=mdlOutputs(t,x,u)
du=Kp*(e(t)-e(t-1))+(Kp*0.01/Ti)*e(t)+(Kd*Kp/0.01)*(e(t)-2e(t-1)+e(t-2));
sys(t)=sys(t-1)+du;

jack_boy 发表于 2007-9-22 08:39

原帖由 xptan 于 2007-9-21 16:13 发表 http://www.chinavib.com/forum/images/common/back.gif
jack_boy ,你好,增量式是这样的吗?我只在输出这个函数改动了,不过好像不对,能指点一下吗,谢谢了
function = sfuntmpl(t,x,u,flag,Kp,Ki,Kd)
。。。。。。
sizes.NumOutputs   = 1;
sizes.NumInputs      = 1;
。。。。。。
function sys=mdlOutputs(t,x,u)
du=Kp*(e(t)-e(t-1))+(Kp*0.01/Ti)*e(t)+(Kd*Kp/0.01)*(e(t)-2e(t-1)+e(t-2));
sys(t)=sys(t-1)+du;
...
我先说两点吧
1、sys(t)代表的是什么意思呢?按照我的理解sys是一个向量,t代表仿真时间,sys似乎含义不明确吧
sys(1),sys(2)……该这么写吧,如sys(1)=u(2)+du;
2、如果设定输入为1的话,实现起来可能会繁琐一点,得到u(k-1)的话,要定义一个变量uk_1初值为0,要动态修改的话,要将他设为全局变量global,或者在将其作为状态x。还有e(k-1)、e(k-2)也是要这么处理,感觉比较麻烦。让我做的话,我会选择多输入输入e(k)、e(k-1)、e(k-2)、u(k-1)、这样处理起来会方便一点,你觉得呢?

xptan 发表于 2007-9-22 09:24

谢谢楼上的,你写的我会试试的,不过感觉还是比较难,尤其第二点还是不太清楚该怎么编写,不过还是谢谢

jack_boy 发表于 2007-9-22 09:40

原帖由 xptan 于 2007-9-22 09:24 发表 http://www.chinavib.com/forum/images/common/back.gif
谢谢楼上的,你写的我会试试的,不过感觉还是比较难,尤其第二点还是不太清楚该怎么编写,不过还是谢谢
发挥想像,编程的方法很多,每个人都不一样
第二点只是一点建议,按照自己的思路做,别人的当作参考

yongren 发表于 2007-9-24 10:24

是不是用离散模型更好点呢
function sys=mdlOutputs(t,x,u)
此处的sys是输入的表示

du=Kp*(e-e-2e[t-1)+e[t-2)),
输出u=u+du

sys=u
t作为采样时间

但是有点不明白的是e是已知的吗?
页: [1]
查看完整版本: 增量式PID的S函数