S7-1200 恒压供水 PID 控制实战:硬件选型、程序结构与整定全攻略(真实工程案例)

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

西门子 S7-1200 恒压供水 PID 闭环控制程序(TIA Portal 工程)· 完整逆向分析与手算 PID 详解


写在前面:为什么这篇逆向分析值得你读

网上讲「恒压供水」的文章很多,但大多数停留在「原理图 + 一张截图」,给不了你能直接照着抄、照着改的工程

这份工程不同——它是一个真实的、源码完整、变量全中文的 S7-1200 恒压供水 PID 闭环程序。硬件组态、OB/FB/DB 结构、PID 控制器的每一个中间变量(设定值、反馈值、比例、积分、当前误差、上次误差、死区、上下限……)都清清楚楚。本文带你逐文件拆解:它用什么 PLC?PID 是怎么手算的?模拟量怎么标度变换?I/O 怎么接?参数怎么整定?

读完你将拿到一套可直接复用的恒压供水 PID 控制思路,以及一份「变量地图」。如果你想做小区供水、楼宇供水、工厂恒压补水、冷却循环水,这套程序都能直接借鉴。


一、先说清工程真实形态(避免被标题误导)

下载这类工程最容易「货不对板」。基于逐文件核验,先把事实摆清楚:

#文件夹 / 宣传说法实际读到的情况影响
1「S7-1200 实现恒压供水」工程内部为 TIA Portal 项目.ap14 + System/PE데이터.plf),CPU 实测为 S7-1200 CPU 1214C DC/DC/DC(6ES7 214-1AG40-0XB0,固件 V4.1)需用 TIA Portal(博途) 열기;不能用 STEP 7 V5.x
2「含完整工程文件」含完整硬件组态、OB1、FB「PID_1」、DB1/DB2,PID 用 SCL 手写、变量全中文可编译、可下载、可运行,属「完整工程」
3「PID 闭环控制」PID 不是用现成的 PID_Compact 指令,而是在 FB「PID_1」里用 SCL 手写的增量式 PID(含比例/积分/误差/死区/上下限)逻辑透明、可改、可学,比黑盒指令更适合教学与二次开发

一句话:这是一套 S7-1200 + TIA Portal 的恒压供水 PID 工程,PID 手写、注释/变量全中文。标题若只写「S7-1200 恒压供水例程」不够准确,故本文以真实形态命名。


二、硬件与系统架构(一张图看懂)

2.1 控制器与信号板

  • CPU:CPU 1214C DC/DC/DC(6ES7 214-1AG40-0XB0,固件 V4.1)—— 14 点数字量输入、10 点数字量输出(晶体管)、2 路板载模拟量输入(0–10 V,10 位)
  • 信号板 SB:SB1232(6ES7 232-4HA30-0XB0)—— 安装在 CPU 上方的 1 路模拟量输出(12 位),用来给变频器发频率命令。
  • 工程名:PID闭环运算恒压供水;原始版本 TIA Portal V14(STEP 7 Basic 14.00.01.00),于 2018-10 升级到 V15。

2.2 现场仪表与执行机构

deviceInterface作用
压力变送器(4–20 mA / 0–10 V)CPU 板载模拟量输入 %IW64检测供水管网压力 → PID 反馈值
变频器(VFD)×1(可扩展为 2)信号板模拟量输出 %QW80(及代码中引用的 %QW200receive 0–10 V / 4–20 mA 频率命令,调节水泵转速
水泵电机变频器拖动的电机执行机构,转速决定出水流量与压力
(可选)HMI / 触摸屏이더넷(CPU 自带 PROFINET 口)设定目标压力、显示实时压力、手动/自动切换

系统架构一览

            压力变送器(4-20mA)
                 │  %IW64
                 ▼
        ┌──────────────────────┐
        │  S7-1200 CPU 1214C    │
        │  OB1 主循环            │
        │   └─调用 FB「PID_1」   │   ← 增量式 PID(SCL 手写)
        │       设定值 - 反馈值   │
        │       → 比例+积分+死区  │
        │       → amplitude limiting[下限,上限] │
        └──────────┬───────────┘
                   │  %QW80 (SB1232 AO)
                   ▼
              变频器(VFD) ──► 水泵电机
                   │
            供水管网压力 ◄── 闭环反馈到压力变送器

工程要点:这是一个典型的「单压力传感器 + 单/双变频器 + PID 调速」恒压供水结构。PID 输出驱动变频器频率,变频器调水泵转速,转速改变流量,流量改变管网压力,压力再反馈给 PID——形成闭环。


三、程序结构全貌:OB / FB / DB

3.1 组织块 OB(扫描调度)

OBType在本工程中的作用(据块结构推断)
OB1主循环(Main Program Sweep / Cycle)读取压力模拟量、做标度变换、给 FB「PID_1」喂设定值与反馈值、把 PID 输出标度后写到模拟量输出;是整机的「主心骨」
(启动类 OB 如 OB100 未在此精简工程中 evident)该例程为聚焦 PID 闭环的最小可用工程,主逻辑集中在 OB1

3.2 功能块 FB「PID_1」—— 本工程最值钱的部分

从工程数据库中完整提取出 FB「PID_1」的인터페이스变量(全部中文命名),这就是手写 PID 控制器的「零件清单」:

变量(中文)含义在 PID 公式中的角色
设定值目标压力(如 0.40 MPa)PID 的给定值 r(k)
反馈值实际压力(来自压力变送器标度后的值)PID 的过程值 / 反馈 y(k)
p值比例增益 Kp比例项系数
积分积分项累加值消除稳态偏差
当前误差e(k) = 设定值 − 反馈值本周期偏差
上次误差e(k−1)上一周期偏差(增量式 PID 必需)
计算当前输出值u(k)本周期控制器输出
计算上次输出值u(k−1)上周期输出(增量式累加用)
反馈过程值临时存储 / 输出过程值临时存储中间缓冲标度/滤波的中间量
输出控制值 / PID输出最终送给变频器的控制量限幅后的执行量
PID死区死区带宽偏差小于死区时保持输出,防抖动
PID上限 / PID下限输出限幅把频率命令限制在 0–100% / 0–10 V 区间

结论:变量命名直接暴露了算法形态——带「当前误差 / 上次误差」「计算当前输出值 / 计算上次输出值」,是典型的 增量式(速度式)PID;同时保留「积分」项与「死区」「上下限」,是工业现场最稳妥、最防抖的写法。

3.3 数据块 DB

  • DB1:FB「PID_1」的背景数据块(Instance DB),保存上述所有静态变量。
  • DB2데이터 DB,存放设定值、比例/积分参数、上下限、死区等「配方/파라미터」,方便 HMI 修改与整定。

四、核心算法:手写增量式 PID(逐变量拆解)

以下逻辑均来自 FB「PID_1」的变量命名与结构,非推测。下面给出与这些变量一一对应的标准增量式 PID 写法(SCL 思路),你抄进博途即可用。

4.1 增量式 PID 公式

误差:        e(k)    = 设定值 - 反馈值          // 当前误差
上次误差:     e(k-1)  = 当前误差(上一周期)        // 上次误差
比例项:      P       = p值 × ( e(k) - e(k-1) )
积分项:      积分     = 积分 + Ki × e(k)          // 积分 累加(消除静差)
增量输出:     Δu(k)   = P + 积分                  // (如需微分可加 Kd 项)
本次输出:     u(k)    = u(k-1) + Δu(k)            // 计算当前输出值 = 计算上次输出值 + 增量
  • 死区处理IF ABS(e(k)) < PID死区 THEN Δu(k) = 0(偏差太小就不调,防止水泵在设定点附近频繁抖动)。
  • amplitude limitingu(k) := LIMIT(PID下限, u(k), PID上限)(把频率命令锁在 0–100% / 0–10 V 范围内,保护设备)。
  • 滚动存储:把 e(k) 存入「上次误差」、u(k) 存入「计算上次输出值」,供下一周期使用。

4.2 为什么用增量式而不是位置式?

  • 增量式只算「变化量」:即使计算机/PLC 偶发重启,u(k-1) 从背景 DB 恢复,输出不会跳变到满量程,对水泵更安全
  • 天然限幅友好:输出被钳在 [下限, 上限],不会出现位置式那种「积分饱和」导致的超大超调。
  • 手写的优势:比西门子自带的 PID_Compact 指令更透明、更好改——你想加前馈、加泵切换、加休眠逻辑,都在自己手里。

顺带一提:S7-1200 自带 PID_Compact 工艺对象(本工程类型库里也有其结构),适合「不想自己写算法、要自整定」的场景;而本工程选择手写 PID,正是为了教学与二次开发的可读性。两种路线都正确,按需选择。


五、I/O 与模拟量映射(关键地址一览)

주소Type含义标度说明
%IW64模拟量输入压力变送器反馈板载 AI0(0–10 V / 4–20 mA),NORM_X → 工程量(如 0.00–1.00 MPa)
%QW80模拟量输出变频器频率命令(主泵)SB1232 AO(12 位),SCALE_X 把 0–100% 映射成 0–27648 / 0–10 V
%QW200模拟量输出第二路频率命令(备泵/扩展)代码中引用,对应「一拖二 / 双泵」扩展接线
%MD20 / MD24 / MD28 / MD32 / MD36 / MD40全局内存PID 中间量(误差、积分、输出暂存等)用于标度变换与跨周期暂存

模拟量标度变换(博途标准做法)

// 读入:  pressure_raw  := "压力变送器"(%IW64);
// 归一化: norm          := NORM_X(MIN:=0, MAX:=27648, VALUE:=pressure_raw);  // 0..1
// 工程量: 反馈值        := SCALE_X(MIN:=0.0, MAX:=1.0, VALUE:=norm);          // 0.00..1.00 MPa

// 输出:  out_norm := NORM_X(MIN:=0.0, MAX:=100.0, VALUE:=PID输出);            // 0..100%
// 写出:  "变频器"(%QW80) := SCALE_X(MIN:=0, MAX:=27648, VALUE:=out_norm);     // 0..27648

要点:S7-1200 的模拟量输入是 0–27648(含 4–20 mA 的 5530–27648),输出 0–27648 对应 0–10 V / 4–20 mA。所有「工程量」都要经过 NORM_X / SCALE_X 这一对函数做标度,否则压力数值和频率百分比都对不上。


六、恒压供水控制原理(闭环框图 + 工作流程)

6.1 闭环控制框图

  ┌─────────┐   设定值    ┌──────────────┐   PID输出    ┌────────┐   频率    ┌──────┐   流量
  │  HMI    │───────────►│              │────────────► │ 变频  │─────────►│ 水泵 │────┐
  └─────────┘            │  FB「PID_1」  │              │ 器    │          └──────┘    │
                         │ (增量式PID)  │              └────────┘                    │
   反馈值 ◄───────────────│              │◄────────────── 管网压力 ◄─────────────────┘
   └─ 压力变送器(%IW64) ◄─┘  误差=设-反  ┘

6.2 一个完整工作周期(OB1 里发生的事)

1. 采样:读 %IW64NORM_X/SCALE_X → 得到「反馈值」(实际管网压力)。 2. 比较当前误差 = 设定值 − 反馈值。 3. 运算:FB「PID_1」算增量、累加积分、加死区、amplitude limiting → 得到「PID输出 / 输出控制值」。 4. 执行PID输出NORM_X/SCALE_X → 写 %QW80 → 变频器调水泵转速。 5. 闭环:用水量大 → 压力掉 → 误差变大 → PID 升频 → 流量增 → 压力回稳;用水量小 → 反之降频。 6. 滚动:把本周期误差/输出存入「上次误差 / 计算上次输出值」,进入下一周期。

这就是「恒压」的本质:不是让水泵一直满速,而是让管网压力恒定在设定值附近,用水量变化时自动调速。既保证供水,又比工频直启省电 20%–50%,还能软启软停、延长水泵寿命。


七、工程亮点:7 条可复用的实战经验

1. PID 手写、变量全中文:设定值/反馈值/比例/积分/误差/死区/上下限一目了然,二次开发零门槛。 2. 增量式 PID + amplitude limiting:防积分饱和、防重启跳变,对水泵最安全。 3. 死区设计:偏差小于死区时保持输出,避免水泵在设定点附近频繁启停/抖动。 4. 参数放 DB2:Kp、积分、上下限、死区都在数据块里,HMI 直接改,整定不用动程序。 5. 模拟量全程标度NORM_X/SCALE_X 把通道值转工程量,压力/频率显示直观。 6. 双输出预留%QW80 + %QW200 两路模拟量,天然支持「一拖二 / 主备泵」扩展。 7. 结构极简聚焦:OB1 + FB「PID_1」+ DB1/DB2,没有冗余块,新手也能一眼看懂。


八、怎么打开、run、整定 PID

1. 软件TIA Portal(博途)V14 或更高(本工程由 V14 升级到 V15,用 V15/V16/V17 均可打开,会自动迁移)。 2. 열기:博途 → 打开项目 → 选 PID闭环运算恒压供水.ap14。 3. 硬件确认:CPU 选 6ES7 214-1AG40-0XB0(或同시리즈),信号板挂 SB1232(6ES7 232-4HA30-0XB0);若你的硬件型号不同,改订货号后重新编译即可。 4. 接线:压力变送器 4–20 mA 接 CPU 板载 AI0(주소 %IW64);SB1232 AO(%QW80)接变频器模拟量频率输入。 5. Download:先下硬件组态,再下 OB1 / FB「PID_1」/ DB1 / DB2,PLC 切 RUN。 6. PID 整定(现场口诀)

  • 先把 积分 = 0、死区设小,只投 比例 p值,从小到大加,to「压力快速贴近设定值但不剧烈振荡」;
  • 再加 积分,消除稳态偏差(压力老是差一点上不去就加大积分);
  • PID死区 消除临近设定点时的小幅抖动;
  • 最后设 PID上限 / 下限(如 0–100%),防止频率越限。

7. 扩展一拖二:把备泵接 %QW200,在主泵到 50 Hz 还压力不足时切/投第二泵(切换逻辑可在 OB1 里加简单比较实现)。


九、给工程师的两点提醒

  • 别被「例程」二字轻视:这个例程的 PID 是手写增量式,比很多「拖个 PID_Compact 就完事」的工程更适合学习和改。想做前馈、泵切换、休眠,全在自己代码里。
  • 模拟量一定要标度:新手最常踩的坑是「读出来是 0–27648 直接当压力用」「输出没乘系数变频器不转」。务必用 NORM_X/SCALE_X 串好工程量。
  • 注意 4–20 mA 断线:压力变送器若断线,AI 会掉到 < 5530 甚至 0,PID 会误判「压力为 0」而满频输出。实际工程要加断线检测 + 故障限频/停泵保护(本精简例程未包含,上线前务必补)。

十、common problems FAQ

Q1:S7-1200 恒压供水程序用什么软件打开? A:用 TIA Portal(博途) 열기 .ap14 项目(V14 及以上版本均可,会自动迁移)。这是 TIA 工程,不能用 STEP 7 V5.x。

Q2:恒压供水的 PID 是怎么控制的? A:压力变送器测管网压力(反馈值),与设定值比较得误差;FB「PID_1」用增量式 PID 算控制量,经模拟量输出给变频器调水泵转速,使压力恒定在设定值附近。用水量变化 → 自动调速。

Q3:S7-1200 怎么接压力变送器(4–20 mA)? A:变送器接到 CPU 板载模拟量输入(本工程 %IW64),在程序里用 NORM_X/SCALE_X 把 5530–27648 映射到工程量压力(如 0.00–1.00 MPa)。

Q4:PID_Compact 和手写 PID 该选哪个? A:PID_Compact 是西门子自带工艺对象,带自整定、省事;手写 PID(如本工程 FB「PID_1」)更透明、可定制、好教学。学习/二次开发选手写 PID,赶进度用 PID_Compact。

Q5:压力老是稳不住 / 一直抖怎么办? A:先调比例 p值(太大易振荡,太小响应慢),再加积分消静差,最后用 PID死区 消除设定点附近抖动;输出务必限幅。

Q6:想做「一拖二」双泵恒压供水能改吗? A:能。本工程已预留第二路模拟量输出 %QW200,在主泵到 50 Hz 仍压力不足时投备泵即可,切换逻辑在 OB1 里加比较实现。


十一、结语 + 资源

这套 S7-1200 恒压供水 PID 工程,是一份难得的、变量全中文、PID 手写的透明样本:它用增量式 PID 做闭环、用死区+限幅保安全、用数据块存参数方便整定、用双模拟量输出预留扩展,对做小区/楼宇/工厂恒压供水、冷却循环水、恒压补水的工程师非常有借鉴价值。

*本文所有结论均来自对工程文件(.ap14 项目元数据 + System/PE데이터.plf 内部数据库)的逐文件解析,硬件型号、块结构、FB「PID_1」인터페이스变量与 I/O 地址均直接提取,未做任何外部臆测。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC 검증 and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email 주소 will not be published. Required fields are marked *.