如何将 Scilab 上差分方程形式的 PID 控制器应用于连续工厂
How can I apply a PID controller in a difference equation form on Scilab to a continuous plant
我刚刚计算了 PID 控制的差分方程,我需要在 scilab 中对其进行评估,现在,我的问题是如何将差分方程添加到系统中以查看控制器是否正在执行预期的操作.
我在这个 document 中看到了如何在 Xcos 中执行此操作,但我想通过程序或控制台进行操作,因为我编写了一个应用程序来执行这些计算。
我一直在阅读,使用函数 filter 我可以将方程作为 z 变换应用于我想要的信号,但我不知道我是否可以使用差分方程。我的另一个疑问是,在使用过滤器的情况下,如何将错误作为过滤器的输入。
如果您想做所有离散的事情(系统和控制器),那么最简单的方法是 运行 自己进行离散时间循环。例如,如果您的方程式如下:
- System: x[k]=A*x[k-1]+B*u[k-1], y[k]=C*x[k]
- Error: e[k]=yd[k]-y[k-1]
- Integral: i[k]=i[k-1]+Ts*(e[k]+e[k-1])/2
- Derivative: d[k]=(e[k]-e[k-1])/Ts
- Control equation: u[k]=Kp*e[k]+Ki*i[k]+Kd*d[k]
你只需要在 Scilab 中编写上面的内容(我假设你的状态是一个向量,但输出和控制是标量,yd 是要跟踪的输出):
x(:,1)=x0;
u=zeros(1,N);
y=zeros(1,N);
e=zeros(1,N);
yd=ones(1,N);
i=0;
for k=2:N
x(:,k)=A*x(:,k-1)+B*u(k-1)
y(k)=C*x(:,k)
e(k)=yd(k)-y(k)
i=i+Ts*(e(k)+e(k-1))/2
d=(e(k)-e(k-1))/Ts
u(k)=Kp*e(k)+Ki*i+Kd*d
end
如果你不需要所有的信号历史记录,上面的内容可以简化(我已经在上面对积分和微分部分做了)。
另一种可能性是使用 ltitr
(参见 https://help.scilab.org/docs/6.1.1/en_US/ltitr.html),但在这种情况下,您必须以标准 (A,B) 形式表达闭环系统。
我刚刚计算了 PID 控制的差分方程,我需要在 scilab 中对其进行评估,现在,我的问题是如何将差分方程添加到系统中以查看控制器是否正在执行预期的操作.
我在这个 document 中看到了如何在 Xcos 中执行此操作,但我想通过程序或控制台进行操作,因为我编写了一个应用程序来执行这些计算。
我一直在阅读,使用函数 filter 我可以将方程作为 z 变换应用于我想要的信号,但我不知道我是否可以使用差分方程。我的另一个疑问是,在使用过滤器的情况下,如何将错误作为过滤器的输入。
如果您想做所有离散的事情(系统和控制器),那么最简单的方法是 运行 自己进行离散时间循环。例如,如果您的方程式如下:
- System: x[k]=A*x[k-1]+B*u[k-1], y[k]=C*x[k]
- Error: e[k]=yd[k]-y[k-1]
- Integral: i[k]=i[k-1]+Ts*(e[k]+e[k-1])/2
- Derivative: d[k]=(e[k]-e[k-1])/Ts
- Control equation: u[k]=Kp*e[k]+Ki*i[k]+Kd*d[k]
你只需要在 Scilab 中编写上面的内容(我假设你的状态是一个向量,但输出和控制是标量,yd 是要跟踪的输出):
x(:,1)=x0;
u=zeros(1,N);
y=zeros(1,N);
e=zeros(1,N);
yd=ones(1,N);
i=0;
for k=2:N
x(:,k)=A*x(:,k-1)+B*u(k-1)
y(k)=C*x(:,k)
e(k)=yd(k)-y(k)
i=i+Ts*(e(k)+e(k-1))/2
d=(e(k)-e(k-1))/Ts
u(k)=Kp*e(k)+Ki*i+Kd*d
end
如果你不需要所有的信号历史记录,上面的内容可以简化(我已经在上面对积分和微分部分做了)。
另一种可能性是使用 ltitr
(参见 https://help.scilab.org/docs/6.1.1/en_US/ltitr.html),但在这种情况下,您必须以标准 (A,B) 形式表达闭环系统。