
简介围绕PLC与工控组态软件的单容水箱液位控制文档面向自动化、控制工程专业的师生及实验实训人员可用于课程设计、过程控制实验与PID串级控制自学。文档讲解单容水箱液位控制系统构成涵盖PLC编程、串级PID控制、传感器检测、组态软件监控及二阶对象模拟并给出智能仪表、DCS、S7-300/S7-200、三菱PLC等多种控制器与MCGS、组态王、WinCC等软件选配思路。包内共1个docx文件约100KB内容紧凑便于查阅与二次整理。系统技术指标涉及亚克力水箱、液位与流量传感器、水泵参数实验部分还包含水箱建模、阶跃响应法、PID参数整定、硬件设计、流量标定与对象特性测试等。已有342人学习适合希望把控制理论落到实验平台、快速搭建液位控制方案并理解工业自动化配置流程的读者参考。1. 单容水箱液位控制系统到底在练什么做 PLC 课程设计的人常遇到一个尴尬梯形图写完了PID 指令也调了可水箱液位曲线像心电图谁也不服谁。基于 PLC 和工控组态软件的单容水箱液位控制系统型号 DSO58PLC-1就是解决这种尴尬的平台。它是一个把控制理论从纸面拉到桌面的装置亚克力水箱 1.7L、储水槽 6L液位传感器 DC±12V 供电、0-5V 输出、量程 0-1m流量计 5V 脉冲、量程 0-5L/min水泵 DC12V、最大 1A、最大 5LPM、0.5MPa。它的适用人群很明确自动化、电气、测控专业做过程控制实验、课程设计、毕业设计的学生以及需要复现串级 PID 整定流程的工程师。核心链路只有四个环节——组态软件给设定值PLC 读液位和流量PID 算出输出输出调水泵转速把液位拉回设定值。液位变化既能在水箱刻度上肉眼看也能经传感器上传到组态软件画成趋势曲线。控制器可选 S7-200、S7-300、三菱 PLC、智能仪表、DCS、单片机、以太网控制、PCI 采集卡组态软件可选 MCGS、组态王、和利时 MACS V、STEP7、WinCC。选哪一套取决于你手头已有的设备和要不要保留远程数据采集接口。2. 单容水箱对象特性测试与一阶自衡模型辨识2.1 单容自衡水箱的物理模型与容量参数先别急着写 PID得先搞清楚被控对象是什么脾气。水箱进水来自水泵流量记作 Q1出水流经底部阀门或阻力孔板靠重力流出流量记作 Q2。单容自衡的意思是液位升高出水口压差变大Q2 跟着变大自己会把液位往下拉。这一条特性决定了它是一阶惯性对象而不是积分对象。把物料平衡写出来A·dh/dt Q1 − Q2其中 A 是水箱有效截面积h 是液位高度。出水按孔口出流近似 Q2 k·√h工作点附近线性化后可以写成 T·dh/dt h K·uu 是水泵控制量。T A·R 是时间常数R 是出水阻力K 是静态增益。常见做法是把阀门开度固定住做实验开度越小 R 越大T 越大液位涨得越慢开度大了响应快但稳态液位对泵输出的变化更敏感。装置各部件在建模里的角色可以对照下表理解部件规格在建模/控制里的作用水箱1 个1.7L亚克力被控对象本体截面积 A 决定 T储水槽1 个6L循环水源液位太低会让泵吸入空气液位传感器DC±12V0-5V0-1m主回路反馈标定斜率决定 mm 换算流量传感器DC5V脉冲0-5L/min副回路反馈脉冲当量需要标定水泵DC12V1A5LPM0.5MPa执行器u 与 Q1 的映射非线性出水阀门手动可调决定自衡阻力 R 和时间常数 T2.2 阶跃响应曲线法采数据开环测试流程模型辨识的数据必须开环采闭环保 PID 采出来的响应含控制器作用算出来的参数不对应对象本身。我一般按这个顺序走组态软件里切到手动PLC 停止调用 PID泵输出由手写值给定。把出水阀开到一个固定开度之后整个实验别再动它。手动给泵 50% 输出等液位稳定记录稳态值 h0 和对应的 u0。在一个采样时刻把输出阶跃到 65%同时启动定时采样。每 200ms 采一次液位一直采到液位在 ±1mm 内不再变化为止通常要等 3 到 4 倍时间常数。导出一份 CSV列是时间 t_s、液位 h_mm、泵输出 u_pct。提示阶跃幅度不要太大15% 左右足够幅度过大液位会冲顶溢出实验得重来。采样周期建议取时间常数的十分之一以内采样太疏会漏掉上升段。2.3 一阶模型参数辨识代码把 CSV 丢给一段几十行的脚本就能把 K、T、纯滞后 τ 一并算出来比手工作切线准得多。# -*- coding: utf-8 -*- # 单容自衡水箱阶跃响应辨识h(t) h0 K*du*(1 - exp(-(t - t_step - td)/T)) import numpy as np import pandas as pd df pd.read_csv(step_response.csv) # 列t_s秒、h_mm液位、u_pct泵输出百分比 t df[t_s].to_numpy(dtypefloat) h df[h_mm].to_numpy(dtypefloat) u df[u_pct].to_numpy(dtypefloat) # 1) 定位阶跃时刻输出变化超过 5% 的第一个点 du_idx np.argmax(np.abs(np.diff(u)) 5.0) 1 u0, u1 u[:du_idx].mean(), u[du_idx:].mean() du u1 - u0 # 2) 稳态值取阶跃后最后 20% 数据的均值避开尾部噪声 h0 h[:du_idx].mean() h_inf h[int(len(h) * 0.8):].mean() K (h_inf - h0) / du # 静态增益单位 mm/% # 3) 63.2% 法粗估时间常数 T target h0 0.632 * (h_inf - h0) t63 t[du_idx np.argmax(h[du_idx:] target)] T_63 t63 - t[du_idx] # 4) 网格搜索精修 T 和纯滞后 td误差用 RMSE 衡量 tau_grid np.linspace(max(T_63 * 0.3, 0.1), T_63 * 3.0, 400) td_grid np.linspace(0.0, 3.0, 120) T, td, rmse None, None, 1e9 for tau in tau_grid: for delay in td_grid: pred h0 K * du * (1 - np.exp(-np.clip(t - t[du_idx] - delay, 0, None) / tau)) err np.sqrt(np.mean((pred - h) ** 2)) if err rmse: T, td, rmse tau, delay, err print(fK{K:.3f} mm/%, T{T:.2f} s, tau{td:.2f} s, RMSE{rmse:.3f} mm) print(f建议采样周期 Ts {T/10:.2f} sPID 采样时间取 {max(round(T/10, 1), 0.1)} s)逻辑说明先靠输出跳变定位阶跃点再把阶跃前后的液位均值当作 h0 和稳态值避免把噪声当成稳态。K 是单位控制量变化引起的液位变化量直接决定后面比例增益该给多大。T_63 只是粗估真正交付用的是网格搜索出来的 T 和 τRMSE 用来判断模型可不可信——如果 RMSE 超过量程的 2%说明对象不是干净的一阶可能出水有脉动或泵特性太非线性。参数说明tau_grid 的上下界按 T_63 的 0.3 到 3 倍取覆盖常见的水箱对象td_grid 封顶 3 秒是因为这套装置的传感器和管路滞后一般不超过这个量级。采样周期取 T 的十分之一是离散控制里防止相位损失过多的经验值。示例结果可以整理成对照表参数含义示例值对控制的影响K静态增益8.5 mm/%越大比例带要越宽T时间常数22 s积分时间起点参考它τ纯滞后1.2 s偏大时必须压增益A水箱截面积约 85 cm²用注水法实测更准截面积 A 的实测方法是关死出水阀用量杯往水箱加 500mL 水读液位上升高度 ΔhA ΔV/Δh。有了 A 和 R 的关系就能解释为什么换一个阀门开度后 T 会变实验报告里这一段比空谈公式有说服力。3. S7-200/S7-300 侧 PLC 程序模拟量标定与串级 PID 回路3.1 模拟量通道标定与工程量转换PLC 拿到的是原始整数不是毫米也不是升每分钟第一步必须做标定。常见通道分配如下信号模块/地址原始范围工程量液位EM231AIW00-320000-1000 mm流量高速计数 HSC0 / I0.0脉冲频率0-5 L/min泵输出AQW0 或 Q0.0 PWM0-32000 / 占空比0-100%阀门输出AQW2可选6400-320000-100%S7-200 上用 STL 写标定和断线判断// 液位标定AIW0 的 0-32000 对应 0-1000 mm结果存 VW200 LD SM0.0 ITD AIW0, VD100 // 整数转双整数 DTR VD100, VD104 // 双整数转实数 /R 32000.0, VD104 // 归一化到 0-1 *R 1000.0, VD104 // 换算成毫米 ROUND VD104, VD108 DTI VD108, VW200 // 存整数毫米供组态软件读取 // 传感器断线保护读数过低或过高判为异常 LDW AIW0, 100 OW AIW0, 31500 M10.0 // 传感器故障标志送到组态做报警逻辑说明ITD、DTR 是 S7-200 里整数转双整数再转实数的固定套路不转成实数就直接乘系数会丢小数。分母用 32000 而不是 32767是因为模块满量程对应 32000用 32767 会让满量程附近的读数偏大。断线判断取 100 和 31500 两个阈值低于下限通常是信号线断或传感器没供电高于上限多是短路或量程接错。S7-300 上用 SCL 写成可复用功能块更清爽FUNCTION_BLOCK FB_LVL_SCALE VAR_INPUT Raw : INT; // 例如 PIW256 LoRaw : INT : 0; // 0-5V 量程用 04-20mA 量程用 6400 HiRaw : INT : 32000; LoEU : REAL : 0.0; HiEU : REAL : 1000.0; // 毫米 END_VAR VAR_OUTPUT EU : REAL; Fault : BOOL; END_VAR BEGIN IF (Raw LoRaw - 500) OR (Raw HiRaw 500) THEN Fault : TRUE; EU : 0.0; ELSE Fault : FALSE; EU : LoEU INT_TO_REAL(Raw - LoRaw) * (HiEU - LoEU) / INT_TO_REAL(HiRaw - LoRaw); EU : LIMIT(MN : LoEU, IN : EU, MX : HiEU); END_IF; END_FUNCTION_BLOCK参数说明LoRaw 和 HiRaw 是量程端点对应的原始值0-5V 输入取 0 和 320004-20mA 输入取 6400 和 32000LoEU 和 HiEU 换成实际工程量。LIMIT 做最终限幅防止浮点误差把液位算出负值。这个块可以直接在 OB1 里反复调用液位、流量、压力各实例化一份。3.2 手自动切换、软启动与泵保护联锁实做时学员最容易在切换瞬间把泵打飞。手动时输出是手写值切自动的一刹那如果 PID 输出还停在初值泵会突然全速或全停。无扰切换的做法是切换前把当前手动输出折算成 PID 的积分项前值让 PID 从当前工作点接着算。S7-300 的 FB41 自带手动通道调用时把 MAN_ON 接切换开关即可// 在 OB35 中调用循环周期 100ms CALL CONT_C, DB41 ( COM_RST : FALSE, MAN_ON : 手自动切换, // TRUE 走手动 PV_PER : PIW256, // 液位原始值 SP_INT : 液位设定值_mm, // 主回路设定值 PV_FAC : 1000.0 / 27648.0, // 原始值到毫米的缩放系数 PV_OFF : 0.0, GAIN : 2.5, TI : T#30S, TD : T#2S, CYCLE : T#100MS, MAN : 手动输出, LMN_PER : PQW256); // 送到执行器通道说明PV_PER 走的是外设输入FB41 内部按 PV PV_PER × PV_FAC PV_OFF 换算缩放系数必须和前面标定块的量程一致否则设定值和反馈值不在同一坐标系PID 会一直往一个方向顶。CYCLE 必须和 OB35 的实际周期相同填错会导致积分时间失真。泵的保护联锁别偷懒储水槽低位时直接封锁输出泵启动做 2 秒斜坡上升手动模式下也保留输出限幅 0-100%。这几条用几条梯形图就能搭出来但省掉它们水箱抽空和泵空转就会变成常态。3.3 串级结构的回路分配与 PID 参数落地这套装置做串级常见分法不是拿两个水箱串而是液位—流量串级主回路控液位输出作为副回路设定值副回路控进水流量输出直接给泵。好处是泵的输出特性和管路阻力变化都被副回路包进去主回路面对的是一个特性更稳的广义对象。回路被控量检测输出增益初值积分时间微分采样主液位0-1000 mm液位传感器副回路 SP0-5 L/min2.040 s0200 ms副流量0-5 L/min脉冲流量计泵输出 0-100%1.26 s0100 ms副回路采样要比主回路快一般取主回路的一半到十分之一。主回路积分时间从辨识出的 T 起步先给 1 到 2 倍 T 再往下收比凭感觉填一个数靠谱得多。如果只做单回路实验把副回路去掉PID 直接驱动泵积分时间仍从 T 量级起步增益按 K 的倒数估算再折半。4. MCGS 与 WinCC 组态变量库、趋势曲线与串级监控画面4.1 通讯通道选型PPI、以太网与 Modbus TCP组态软件和 PLC 对不上八成是通道选错。常见搭配如下组态软件PLC通道关键设置MCGSS7-200PPIRS485站号、波特率 9.6/19.2kbps、PC/PPI 电缆拨码MCGSS7-300MPI 或以太网需 CP343-1 走 S7 协议组态王S7-200/300西门子 S7 驱动变量地址按 V/M/I/Q/D 规则填WinCCS7-300/1200/1500TCP/IPWinCC 8.0 先建连接再关联 PLC 变量任意任意Modbus TCP/RTU寄存器映射要自己定并写进文档以太网控制这一路值得单独说把 PLC 当 Modbus TCP 从站网关或上位机做客户端定时轮询液位和流量就能上报到上一层的数据平台。做远程数据采集实验时这条链路比串口线方便也贴近现在工业互联网场景里设备上云的实际做法。寄存器映射建议写成表谁对接都不会猜寄存器类型含义单位系数40001保持寄存器液位mm×140002保持寄存器液位设定值mm×140003保持寄存器进水流量0.01 L/min×0.0140004保持寄存器泵输出0.1%×0.100001线圈手自动0/1—00002线圈泵启停0/1—4.2 MCGS 实时数据库变量组态与脚本MCGS 的变量要先在实时数据库里建好再在画面里挂。变量表和 PLC 地址必须一一对齐错一个地址曲线就永远是直线。变量名类型初值连接地址用途液位_h数值型0PLC VW200主回路反馈液位设定数值型400内部变量主回路设定值流量_q数值型0PLC VW220副回路反馈泵输出数值型0PLC VW210手动/自动输出手自动开关型0PLC M0.00 手动1 自动传感器故障开关型0PLC M10.0报警位循环脚本负责限幅和保护语法是类 Basic 风格 MCGS 循环脚本运行策略里设为每 200ms 执行一次 设定值限幅防止误操作把水箱抽干或溢出 IF 液位设定 50 THEN 液位设定 50 ELSEIF 液位设定 900 THEN 液位设定 900 ENDIF 传感器故障时强制切手动并停泵避免 PID 拿错反馈乱输出 IF 传感器故障 1 THEN 手自动 0 泵输出 0 ENDIF 实时计算偏差供画面显示和历史曲线对比 偏差 液位设定 - 液位_h说明循环脚本的周期在运行策略的属性里配置写 200ms 是为了和主回路采样周期对齐。限幅放在脚本里而不是画面输入框里是因为画面控件可以被绕过脚本每周期都执行兜底更稳。偏差变量单独算出来可以让历史曲线同时显示设定值、反馈值和偏差三条线一眼看出是超调还是静差。4.3 趋势曲线、报警与实验数据归档实时曲线看动态历史曲线看指标。配置时选液位_h、液位设定、泵输出三条曲线叠加纵轴范围 0-1000mm采样周期 200ms存盘周期 1s。历史曲线里读四个指标超调量 σ、峰值时间 tp、调节时间 ts进入 ±2% 误差带并保持、稳态误差。这四个数直接进实验报告比截图有说服力。报警配置至少挂三条液位高于 900mm 报高限低于 50mm 报低限传感器故障位报设备异常。报警记录要带时间戳配合历史曲线能还原每次调试发生了什么。数据归档用组态软件自带的存盘数据导出功能导出 CSV文件名建议写成“日期_阀门开度_增益_积分时间”下一轮实验要复现参数时直接按文件名找。5. 串级 PID 参数整定与现场排错清单5.1 先副后主的整定顺序与判据串级整定的顺序不能颠倒。先把主回路切手动给副回路一个固定设定值按 PI 调副回路增益从 1 开始往上加加到流量响应出现小幅超调但不持续振荡为止积分时间取副回路时间常数的 0.5 到 1 倍。副回路的标准是快、稳、允许一点超调它要能快速跟随主回路给出的设定值变化。再合上主回路调液位。先只给比例把增益加到曲线出现第一个明显峰然后退回 60% 到 70%。再加积分从辨识出的 T 量级开始往小收直到稳态误差进 ±1mm 且不来回摆。液位对象里微分基本不用纯滞后 τ 稍大时用微分只会把泵输出抖得更厉害。指标目标值从曲线上怎么读超调量 σ小于 20%第一个峰值与稳态值之差除以稳态值峰值时间 tp越小越好但不可抖曲线到达第一个峰的时间调节时间 ts约 3T进入 ±2% 误差带不再出来的时刻稳态误差±1 mm稳定后 60s 数据的均值与设定值之差5.2 常见故障定位表现象可能原因排查动作液位读数一直不动AIW0 恒 0 或恒 32000量传感器供电是否 DC±12V信号线是否 0-5V曲线锯齿明显采样太快或没做滤波主回路采样改 200msAIW 做 8 次平均液位冲顶溢出输出方向反了或积分饱和确认 PID 正反作用加输出限幅 0-100%泵启动即保护电流超过 1A 或驱动能力不足加 2s 软启动泵单独用 12V/2A 电源改设定值无反应组态地址错或没写回 PLC对照地址表用编程软件状态表强制验证手动切自动跳变无扰切换没做切换前把手动输出预置进积分项前值流量读数偏大脉冲当量未标定用量筒计时法标定脉冲数/升组态连不上 PLC站号、波特率、地址冲突先用编程软件在线再开组态软件差压类传感器的零点迁移单独提一句水箱放空、两个取压口在同一高度时调零输出应是 0V 或 4mA若存在安装高差带来的静压用零点迁移螺钉或软件里加偏置补偿掉否则整个量程的读数都会平移。流量传感器标定用一个量筒就够接满 1L数脉冲数 N脉冲当量就是 N 脉冲每升再在 5L/min 附近复测一次线性度。最后留一个提效的小技巧每次整定完把历史曲线导出成图片连同 PID 参数组、阀门开度、采样周期一起放进同一个文件夹文件夹名带上关键参数。下次换个方案做对比直接并排两张曲线超调和调节时间的差别一目了然不用重新翻记录本猜上次到底填了多少。本文还有配套的精品资源点击获取