xx
这是一个稍微复杂一点的系统建模实验,重点在于如何用基本模块(积分、微分、增益)手动搭建一个 PID 控制器,以及处理高阶传递函数。
为了帮你省去在 Sysplorer 里一个一个拖拽模块并计算多项式系数的时间,我为你编写了完整的 Modelica 代码。这段代码严格按照图 3-19 的系统结构和 图 3-110 的 PID 内部结构编写。
实验代码:复杂控制系统阶跃响应
请在 MWORKS.Sysplorer 中新建一个 Model,切换到文本视图,粘贴以下代码:
model ComplexControlSystem "复杂控制系统阶跃响应实验"
// 引入标准库
import Modelica.Blocks.Sources;
import Modelica.Blocks.Math;
import Modelica.Blocks.Continuous;
// ==========================================
// 1. 定义参数 (根据题目给定数据)
// ==========================================
parameter Real Kc = 7.5175;
parameter Real Ti = 61.7903;
parameter Real Td = 1.1714;
parameter Real Kc2 = 5.941;
// ==========================================
// 2. 定义组件
// ==========================================
// (1) 输入信号: 单位阶跃
Sources.Step r(height = 1, startTime = 0)
annotation(Placement(transformation(origin = {-100, 0})));
// (2) 比较环节 (反馈节点)
Math.Feedback feedback
annotation(Placement(transformation(origin = {-80, 0})));
// (3) PID 控制器内部组件 (完全按照图 3-110 搭建)
// 公共增益 Kc
Math.Gain gain_Kc(k = Kc)
annotation(Placement(transformation(origin = {-50, 0})));
// 比例通道 (直接相连,无额外模块,为了代码清晰这里仅定义连接)
// 积分通道: 1/Ti -> Integrator
Math.Gain gain_invTi(k = 1/Ti)
annotation(Placement(transformation(origin = {-20, -40})));
Continuous.Integrator integrator
annotation(Placement(transformation(origin = {10, -40})));
// 微分通道: Td -> Derivative
Math.Gain gain_Td(k = Td)
annotation(Placement(transformation(origin = {-20, 40})));
Continuous.Derivative derivative
annotation(Placement(transformation(origin = {10, 40})));
// PID输出求和: Proportional + Integral + Derivative
Math.Add3 add3_PID
annotation(Placement(transformation(origin = {40, 0})));
// (4) 后级放大 Kc2
Math.Gain gain_Kc2(k = Kc2)
annotation(Placement(transformation(origin = {70, 0})));
// (5) 被控对象 Gp2(s)
// 原式: 1 / [ (10s+1)(s+1)^2 ]
// 分母展开: (10s+1)(s^2+2s+1) = 10s^3 + 20s^2 + 10s + s^2 + 2s + 1 = 10s^3 + 21s^2 + 12s + 1
Continuous.TransferFunction Gp2(b = {1}, a = {10, 21, 12, 1})
annotation(Placement(transformation(origin = {110, 0})));
// (6) 被控对象 Gp1(s)
// 原式: 1 / [ (30s+1)(3s+1) ]
// 分母展开: 90s^2 + 30s + 3s + 1 = 90s^2 + 33s + 1
Continuous.TransferFunction Gp1(b = {1}, a = {90, 33, 1})
annotation(Placement(transformation(origin = {150, 0})));
equation
// ==========================================
// 3. 定义连接关系
// ==========================================
// 输入 -> 反馈 -> PID公共增益
connect(r.y, feedback.u1);
connect(feedback.y, gain_Kc.u);
// PID 内部连接 (对应图 3-110)
// 公共增益输出 -> 分成三路
connect(gain_Kc.y, add3_PID.u2); // P路: 直接进加法器中间口
connect(gain_Kc.y, gain_invTi.u); // I路: 进 1/Ti
connect(gain_invTi.y, integrator.u); // 进 积分器
connect(integrator.y, add3_PID.u3); // 进 加法器下口
connect(gain_Kc.y, gain_Td.u); // D路: 进 Td
connect(gain_Td.y, derivative.u); // 进 微分器
connect(derivative.y, add3_PID.u1); // 进 加法器上口
// PID输出 -> 后级组件 -> 回路闭合
connect(add3_PID.y, gain_Kc2.u);
connect(gain_Kc2.y, Gp2.u);
connect(Gp2.y, Gp1.u);
// 大回路反馈: 最终输出 -> 反馈负端
connect(Gp1.y, feedback.u2);
annotation (uses(Modelica(version="4.0.0")));
end ComplexControlSystem;
必看:代码中的关键计算说明
为了保证实验准确性,我在代码中已经帮你完成了多项式的展开计算,原理如下(你可以写进实验报告):
-
PID 控制器的实现:
题目给出的公式是 \(K_c(1 + \frac{1}{T_i s} + T_d s)\)。
我在代码中采用了图 3-110 的结构:先经过一个公共增益 \(K_c\),然后分为三路:- 比例路 (P):直接相连(对应公式里的 1)。
- 积分路 (I):乘以系数 \(1/T_i\) 后进行积分(对应 \(\frac{1}{T_i s}\))。
- 微分路 (D):乘以系数 \(T_d\) 后进行微分(对应 \(T_d s\))。
- 最后将三者相加。
-
被控对象 \(G_{p2}(s)\) 的系数计算:
\[G_{p2}(s) = \frac{1}{(10s+1)(s+1)^2} = \frac{1}{(10s+1)(s^2+2s+1)} \]展开分母:
\[10s(s^2+2s+1) + 1(s^2+2s+1) = 10s^3 + 20s^2 + 10s + s^2 + 2s + 1 \]合并同类项:
\[10s^3 + 21s^2 + 12s + 1 \]代码对应:
a = {10, 21, 12, 1} -
被控对象 \(G_{p1}(s)\) 的系数计算:
\[G_{p1}(s) = \frac{1}{(30s+1)(3s+1)} \]展开分母:
\[90s^2 + 30s + 3s + 1 = 90s^2 + 33s + 1 \]代码对应:
a = {90, 33, 1}
仿真与观察
- 粘贴代码后,点击下方的**“图表” (Diagram)** 标签,你会看到一张自动连好的系统框图,结构应该与实验指导书完全一致。
- 点击工具栏的 仿真 (Simulate) 按钮。
- 在结果浏览器中,找到
Gp1.y(这是系统的最终输出 \(c(t)\))。 - 结果预期:由于有 PID 控制,系统输出应该会经历上升、超调,然后迅速稳定在 1.0 附近。你可以根据曲线的形状分析 PID 参数对调节时间及超调量的影响。

浙公网安备 33010602011771号