工业级恒压供水系统解决方案,包含系统架构设计、硬件配置、PLC 程序设计、PID 调节、变频器通讯和上位机组态。


一、系统总体设计

1. 系统架构图

┌─────────────────────────────────────────────────────────────────┐
│                    恒压供水系统架构                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  压力传感器(4-20mA) ──▶ 模拟量输入模块(SM331) ──▶ S7-300 PLC    │
│                                                                 │
│  液位传感器(4-20mA) ──▶ 模拟量输入模块(SM331) ──▶ CPU 315-2DP  │
│                                                                 │
│  PLC ──▶ PROFIBUS-DP ──▶ 变频器(ABB ACS510) ──▶ 水泵电机        │
│       │                                                           │
│       ├──▶ 数字量输出 ──▶ 接触器 ──▶ 备用水泵                                   │
│       │                                                           │
│       └──▶ Ethernet ──▶ 上位机(WinCC) ──▶ 监控与数据记录         │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

2. 控制原理

控制方式 说明
PID闭环控制 根据管网压力反馈自动调节变频器频率
变频调速 通过改变电机转速实现恒压供水
多泵切换 主泵+备用泵自动轮换,故障切换
休眠功能 夜间低流量时停泵,保压休眠
节能运行 根据用水量自动调节运行频率

二、硬件配置清单

1. PLC 硬件配置(STEP 7 硬件组态)

模块 型号 数量 功能
电源模块 PS 307 5A 1 24V DC 供电
CPU CPU 315-2 DP 1 主控制器,带PROFIBUS接口
数字量输入 SM 321 DI16×DC24V 1 按钮、限位开关、故障信号
数字量输出 SM 322 DO16×DC24V 1 接触器、指示灯、报警器
模拟量输入 SM 331 AI8×12Bit 1 压力、液位、流量信号
模拟量输出 SM 332 AO4×12Bit 1 变频器速度给定

2. 现场设备清单

设备 规格 数量 备注
变频器 ABB ACS510-01-025A-4 2 11kW,PROFIBUS-DP通讯
压力变送器 E+H PMC51 2 0-1.6MPa,4-20mA
液位变送器 E+H FMP40 1 0-5m,4-20mA
水泵 ISG80-160 2 11kW,2900rpm
接触器 LC1-D2510 4 控制水泵启停
断路器 NSX100N 2 电机保护

三、PLC 程序设计

1. 变量定义(符号表)

// 系统参数
MW10   设定压力值      REAL    // 目标压力 (bar)
MW20   实际压力值      REAL    // 当前压力 (bar)
MW30   PID输出值       REAL    // 变频器频率 (%)
MW40   运行模式        INT     // 0=手动, 1=自动
MW50   当前泵号        INT     // 1=1#泵, 2=2#泵
MW60   系统状态        INT     // 0=停止, 1=运行, 2=故障

// 模拟量
PIW256  压力反馈       INT     // 压力传感器输入 (0-27648)
PIW258  液位反馈       INT     // 液位传感器输入 (0-27648)
PQW260  频率输出       INT     // 变频器速度给定 (0-27648)

// 数字量
I0.0    启动按钮       BOOL
I0.1    停止按钮       BOOL
I0.2    1#泵故障       BOOL
I0.3    2#泵故障       BOOL
I0.4    缺水保护       BOOL
I0.5    超压保护       BOOL

Q0.0    1#泵运行       BOOL
Q0.1    2#泵运行       BOOL
Q0.2    报警指示       BOOL
Q0.3    系统运行指示   BOOL

2. 主程序(OB1)

ORGANIZATION_BLOCK OB1
VAR_TEMP
    Temp_Real : REAL;
END_VAR

BEGIN
    // 系统初始化
    CALL FC1;  // 初始化功能块
    
    // 模拟量采集与转换
    CALL FC10; // 模拟量处理
    
    // 运行模式选择
    IF "运行模式" = 0 THEN
        CALL FC20; // 手动控制
    ELSE
        CALL FC30; // 自动控制
    END_IF;
    
    // PID调节
    CALL FB41; // PID控制器
    
    // 多泵逻辑控制
    CALL FC40; // 水泵切换逻辑
    
    // 变频器通讯
    CALL FB125; // PROFIBUS通讯
    
    // 故障检测与保护
    CALL FC50; // 安全保护
    
    // 数据记录与上位机通讯
    CALL FC60; // 数据交换
END_ORGANIZATION_BLOCK

3. 模拟量处理(FC10)

FUNCTION FC10 : VOID
VAR_INPUT
    Pressure_Raw : INT;    // 原始压力值 (0-27648)
    Level_Raw : INT;       // 原始液位值 (0-27648)
END_VAR
VAR_OUTPUT
    Pressure_Real : REAL;  // 转换后压力 (bar)
    Level_Real : REAL;     // 转换后液位 (m)
END_VAR

BEGIN
    // 压力转换 (0-1.6MPa 对应 0-27648)
    Pressure_Real := INT_TO_REAL(Pressure_Raw) * 1.6 / 27648.0;
    
    // 液位转换 (0-5m 对应 0-27648)
    Level_Real := INT_TO_REAL(Level_Raw) * 5.0 / 27648.0;
    
    // 滤波处理
    Pressure_Real := (Pressure_Real + "上次压力值") / 2.0;
    
    // 更新全局变量
    "实际压力值" := Pressure_Real;
    "实际液位值" := Level_Real;
END_FUNCTION

4. PID 控制器(FB41 - CONT_C)

FUNCTION_BLOCK FB41
VAR_INPUT
    COM_RST : BOOL := FALSE;   // 完全重启
    MAN_ON : BOOL := FALSE;    // 手动模式
    PVPER_ON : BOOL := FALSE;  // 外部过程值
    P_SEL : BOOL := TRUE;      // 比例作用
    I_SEL : BOOL := TRUE;      // 积分作用
    D_SEL : BOOL := FALSE;     // 微分作用
    CYCLE : TIME := T#100ms;  // 采样周期
    SP_INT : REAL := 0.5;      // 内部设定值 (bar)
    PV_IN : REAL;              // 过程值输入
    PV_PER : WORD;             // 外部过程值
    MAN : REAL;                // 手动值
    GAIN : REAL := 2.0;        // 比例增益
    TI : TIME := T#20s;        // 积分时间
    TD : TIME := T#10s;        // 微分时间
    DEADB_W : REAL := 0.02;    // 死区宽度
END_VAR
VAR_OUTPUT
    LMN : REAL;                // 控制器输出
    LMN_PER : WORD;            // 外部输出
    QLMN_HLM : BOOL;           // 输出上限报警
    QLMN_LLM : BOOL;           // 输出下限报警
END_VAR
VAR
    PID : FB_PID;              // PID实例
END_VAR

BEGIN
    // 设定目标压力
    SP_INT := "设定压力值";
    
    // 过程值输入
    PV_IN := "实际压力值";
    
    // 调用PID算法
    PID(
        COM_RST := COM_RST,
        MAN_ON := MAN_ON,
        PVPER_ON := PVPER_ON,
        P_SEL := P_SEL,
        I_SEL := I_SEL,
        D_SEL := D_SEL,
        CYCLE := CYCLE,
        SP_INT := SP_INT,
        PV_IN := PV_IN,
        MAN := MAN,
        GAIN := GAIN,
        TI := TI,
        TD := TD,
        DEADB_W := DEADB_W,
        LMN => LMN,
        LMN_PER => LMN_PER
    );
    
    // 输出限幅 (20-50Hz)
    IF LMN < 20.0 THEN
        LMN := 20.0;
    ELSIF LMN > 50.0 THEN
        LMN := 50.0;
    END_IF;
    
    // 更新全局输出
    "PID输出值" := LMN;
END_FUNCTION_BLOCK

5. 多泵切换逻辑(FC40)

FUNCTION FC40 : VOID
VAR_STATIC
    Pump_Runtime[1..2] : TIME;  // 泵运行时间
    Last_Switch_Time : TIME;    // 上次切换时间
    Switch_Delay : TIME := T#3600s; // 切换延时1小时
END_VAR

BEGIN
    // 泵运行时间累计
    IF "1#泵运行" THEN
        Pump_Runtime[1] := Pump_Runtime[1] + T#1s;
    END_IF;
    
    IF "2#泵运行" THEN
        Pump_Runtime[2] := Pump_Runtime[2] + T#1s;
    END_IF;
    
    // 自动切换逻辑
    IF "运行模式" = 1 AND "系统状态" = 1 THEN
        
        // 主泵运行
        IF "当前泵号" = 1 THEN
            "1#泵运行" := TRUE;
            "2#泵运行" := FALSE;
            
            // 运行时间到,切换到备用泵
            IF Pump_Runtime[1] >= Switch_Delay THEN
                "当前泵号" := 2;
                Pump_Runtime[1] := T#0s;
            END_IF;
            
            // 主泵故障,切换到备用泵
            IF "1#泵故障" THEN
                "当前泵号" := 2;
                "报警指示" := TRUE;
            END_IF;
            
        // 备用泵运行
        ELSE
            "1#泵运行" := FALSE;
            "2#泵运行" := TRUE;
            
            // 运行时间到,切换回主泵
            IF Pump_Runtime[2] >= Switch_Delay THEN
                "当前泵号" := 1;
                Pump_Runtime[2] := T#0s;
            END_IF;
            
            // 备用泵故障,切换回主泵
            IF "2#泵故障" THEN
                "当前泵号" := 1;
                "报警指示" := TRUE;
            END_IF;
        END_IF;
    END_IF;
    
    // 休眠功能(低流量时停泵)
    IF "实际压力值" > "设定压力值" + 0.1 AND "PID输出值" < 25.0 THEN
        "1#泵运行" := FALSE;
        "2#泵运行" := FALSE;
        "系统状态" := 0;  // 进入休眠
    END_IF;
END_FUNCTION

6. 变频器通讯(FB125 - PROFIBUS)

FUNCTION_BLOCK FB125
VAR_INPUT
    Start : BOOL;              // 启动命令
    Stop : BOOL;               // 停止命令
    Speed_SP : REAL;           // 速度设定 (%)
END_VAR
VAR_OUTPUT
    Speed_Act : REAL;          // 实际速度 (%)
    Current : REAL;            // 电机电流 (A)
    Fault : BOOL;              // 故障状态
    Ready : BOOL;              // 就绪状态
END_VAR
VAR
    Comm_Data : ARRAY[0..15] OF BYTE; // 通讯数据
END_VAR

BEGIN
    // PROFIBUS-DP通讯
    // 发送数据到变频器
    Comm_Data[0] := REAL_TO_BYTE(Speed_SP);  // 速度设定
    Comm_Data[1] := 16#01;                    // 启动命令
    
    // 接收数据从变频器
    Speed_Act := BYTE_TO_REAL(Comm_Data[2]);  // 实际速度
    Current := BYTE_TO_REAL(Comm_Data[3]);    // 电流
    Fault := Comm_Data[4] = 16#01;            // 故障状态
    Ready := Comm_Data[5] = 16#01;            // 就绪状态
    
    // 更新模拟量输出
    "PQW260" := REAL_TO_INT(Speed_SP * 27648.0 / 100.0);
END_FUNCTION_BLOCK

7. 安全保护(FC50)

FUNCTION FC50 : VOID
BEGIN
    // 缺水保护
    IF "实际液位值" < 0.5 THEN  // 液位低于0.5m
        "1#泵运行" := FALSE;
        "2#泵运行" := FALSE;
        "报警指示" := TRUE;
        "系统状态" := 2;  // 故障状态
    END_IF;
    
    // 超压保护
    IF "实际压力值" > 1.8 THEN  // 压力超过1.8MPa
        "1#泵运行" := FALSE;
        "2#泵运行" := FALSE;
        "报警指示" := TRUE;
        "系统状态" := 2;
    END_IF;
    
    // 电机过载保护
    IF "1#泵故障" OR "2#泵故障" THEN
        "报警指示" := TRUE;
        "系统状态" := 2;
    END_IF;
    
    // 紧急停止
    IF "停止按钮" THEN
        "1#泵运行" := FALSE;
        "2#泵运行" := FALSE;
        "系统状态" := 0;
    END_IF;
END_FUNCTION

四、WinCC 上位机组态

1. 画面设计

┌─────────────────────────────────────────────────────────────┐
│                    恒压供水监控系统                         │
├─────────────────────────────────────────────────────────────┤
│  [系统概览] [实时曲线] [历史数据] [报警记录] [参数设置] [帮助] │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────┐  ┌─────────────────────────────┐  │
│  │    工艺流程图        │  │      实时数据面板            │  │
│  │                     │  │                             │  │
│  │  [水池] ──▶ [泵1]   │  │  设定压力: 0.50 MPa         │  │
│  │     ↓       ↓       │  │  实际压力: 0.48 MPa         │  │
│  │  [泵2] ──▶ [管网]   │  │  运行频率: 35.2 Hz          │  │
│  │     ↓       ↓       │  │  电机电流: 12.5 A           │  │
│  │  [用户] ──▶ [出口]  │  │  运行时间: 1256.5 h         │  │
│  │                     │  │  当前泵号: 1#泵             │  │
│  │  ●运行 ○停止 ●故障  │  │  系统状态: 正常运行          │  │
│  └─────────────────────┘  └─────────────────────────────┘  │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                  压力趋势图                          │   │
│  │                                                     │   │
│  │  0.6 ┤                                             │   │
│  │  0.5 ┤    ╱╲                                        │   │
│  │  0.4 ┤   ╱  ╲                                       │   │
│  │  0.3 ┤  ╱    ╲                                      │   │
│  │  0.2 ┤ ╱      ╲                                     │   │
│  │  0.1 ┤╱        ╲                                    │   │
│  │  0.0 ┼──────────╲───────────────────────────────────│   │
│  │      10:00     11:00     12:00     13:00     14:00  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2. 变量连接表

WinCC变量名 PLC地址 数据类型 说明
Set_Pressure MW10 Float 设定压力
Act_Pressure MW20 Float 实际压力
Pump_Speed MW30 Float 泵转速
Run_Status MW60 Int 运行状态
Pump1_Run Q0.0 Bool 1#泵运行
Alarm_Status Q0.2 Bool 报警状态

五、PID 参数整定

1. 整定步骤

1. 关闭积分和微分作用 (Ti=∞,Td=0)
2. 逐渐增大比例增益 Kp,直到系统出现临界振荡
3. 记录临界增益 Ku 和临界周期 Tu
4. 按Ziegler-Nichols公式计算PID参数:
   - Kp = 0.6 × Ku
   - Ti = 0.5 × Tu  
   - Td = 0.125 × Tu

2. 推荐参数

系统类型 Kp Ti(s) Td(s)
恒压供水 2.0 20 5
快速响应 3.5 15 3
稳定优先 1.2 30 8

参考代码 S7300 PLC写的恒压供水系统 www.youwenfan.com/contentcsv/112929.html

六、系统调试

1. 调试流程

1. I/O检查
   ├── 模拟量输入校准 (4-20mA对应0-27648)
   ├── 数字量输入输出测试
   └── 变频器通讯测试

2. 单机测试
   ├── 手动启停水泵
   ├── 变频器本地控制
   └── 阀门开度检查

3. 联动测试
   ├── PID闭环控制
   ├── 多泵切换逻辑
   └── 故障保护功能

4. 负载测试
   ├── 不同用水量下的压力稳定性
   ├── 长时间运行可靠性
   └── 节能效果评估

2. 常见问题处理

问题 原因 解决方法
压力波动大 PID参数不合适 减小Kp,增大Ti
响应慢 比例增益太小 增大Kp
超调量大 积分时间太短 增大Ti
变频器不启动 通讯故障 检查PROFIBUS地址和电缆
压力不准 传感器零点漂移 重新校准传感器

七、项目文件结构

S7-300_Water_Supply/
├── STEP7_Project/
│   ├── Blocks/
│   │   ├── OB1.AWL          # 主程序
│   │   ├── FB41.AWL         # PID控制器
│   │   ├── FC1.AWL          # 初始化
│   │   ├── FC10.AWL         # 模拟量处理
│   │   ├── FC30.AWL         # 自动控制
│   │   └── FC50.AWL         # 安全保护
│   ├── Symbols/
│   │   └── Symbol.sdf      # 符号表
│   └── Hardware/
│       └── Config.hwc      # 硬件组态
├── WinCC_Project/
│   ├── Pictures/
│   │   ├── Main.pdl        # 主画面
│   │   ├── Trend.pdl       # 趋势图
│   │   └── Alarm.pdl       # 报警画面
│   └── Tags/
│       └── Tag.csv         # 变量表
├── Documents/
│   ├── Design_Spec.pdf     # 设计说明书
│   ├── IO_List.xlsx        # I/O清单
│   ├── PID_Tuning.pdf      # PID整定报告
│   └── Test_Report.pdf     # 测试报告
└── README.md

八、系统扩展功能

1. 远程监控

// 通过GPRS/4G远程监控
CALL FB100; // 远程通讯模块
    IP_Address := "192.168.1.100";
    Port := 502;
    Data_Send := "系统状态数据";
END_CALL;

2. 能耗管理

// 电能计量
Energy_Consumption := Energy_Consumption + Current * Voltage * Time;

3. 预测性维护

// 轴承温度监测
IF Bearing_Temp > 80.0 THEN
    Maintenance_Alert := TRUE;
END_IF;

这个恒压供水系统采用标准的工业控制架构,具有良好的稳定性、可靠性和可维护性。系统支持多种运行模式,具备完善的保护功能,能够满足不同场合的供水需求。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐