1. 项目概述与硬件配置
这个基于西门子S7-1200 PLC的溢流水循环控制系统,是我在去年为某大型水处理厂设计的解决方案。系统核心功能是实现工业循环水系统的自动水位控制和异常处理,目前已在23台设备上稳定运行超过4000小时。整套系统由三大部分组成:PLC控制单元(CPU 1215C)、TP1200 Comfort触摸屏人机界面,以及现场传感器/执行器网络。
硬件选型上,我选择了1215C这款中端PLC,主要考虑其具备:
- 2个内置PROFINET端口(方便同时连接HMI和上位机)
- 工作内存75KB(满足复杂逻辑控制需求)
- 支持最多8个扩展模块(为后期升级留余地)
实际配置如下表所示:
| 模块类型 | 型号 | 数量 | 用途说明 |
|---|---|---|---|
| CPU | 6ES7 215-1AG40-0XB0 | 1 | 主控制器 |
| AI模块 | 6ES7 234-4HE32-0XB0 | 2 | 4通道模拟量输入 |
| AQ模块 | 6ES7 232-4HD32-0XB0 | 1 | 2通道模拟量输出 |
| DI模块 | 6ES7 221-1BH32-0XB0 | 1 | 16点数字量输入 |
| DO模块 | 6ES7 222-1HH32-0XB0 | 1 | 16点数字量输出 |
关键提示:AI模块必须选择支持4-20mA电流输入的型号(如6ES7 234-4HE32-0XB0),因为现场水位传感器和压力变送器普遍采用电流信号传输,抗干扰能力远优于电压信号。
2. 传感器与信号处理
2.1 水位检测实现
水位传感器采用E+H的FMR50雷达液位计,量程0-5米,输出4-20mA信号。在博图V15中的硬件配置需要特别注意:
- 在设备视图双击AI模块
- 选择"输入"选项卡
- 将测量类型设为"电流(4-20mA)"
- 量程下限设为0.0,上限设为100.0(对应0-5米水位)
- 勾选"启用溢出诊断"
实际程序处理时,原始AD值需要经过三重处理:
- 量程转换:将0-27648的原始值转换为0-100%的工程值
- 数字滤波:采用移动平均算法,窗口大小设为10个采样点
- 异常检测:当值持续1秒超过95%时触发预报警
滤波算法实现代码如下:
code复制// 在FB中声明的静态变量
#MovingAverage : Array[0..9] of Real;
#Index : Int := 0;
#Sum : Real := 0.0;
// 滤波处理逻辑
#Sum := #Sum - #MovingAverage[#Index];
#MovingAverage[#Index] := "WaterLevel_RAW";
#Sum := #Sum + #MovingAverage[#Index];
"WaterLevel_Filtered" := #Sum / 10.0;
#Index := (#Index + 1) MOD 10;
2.2 模拟量信号抗干扰措施
现场调试时发现,模拟量信号容易受到变频器干扰,导致水位值跳变。我们最终采取以下措施:
- 所有信号线使用双层屏蔽电缆(内层铝箔+外层铜网)
- 电缆屏蔽层在PLC端单点接地
- 在AI模块输入端并联0.1μF电容
- 信号线走线避开动力电缆至少30cm
3. 控制逻辑实现
3.1 PID调节阀控制
系统采用西门子PID_Compact指令块控制调节阀,关键参数设置如下:
| 参数 | 设定值 | 说明 |
|---|---|---|
| Cycle | 100ms | 执行周期 |
| Input_PER | %IW64 | 水位反馈通道 |
| Output_PER | %QW80 | 阀门输出通道 |
| Gain | 0.7 | 比理论值低30% |
| Ti | 12s | 积分时间 |
| Td | 0s | 禁用微分 |
| Man_ON | FALSE | 初始自动模式 |
经验分享:对于水流系统,积分时间通常需要设为系统响应时间的1/2左右。我们通过阶跃测试测得水位响应时间约25秒,因此Ti设为12秒效果最佳。
调试技巧:
- 先将增益设为0.5,Ti设为999999(相当于纯比例控制)
- 逐步增大增益直到出现轻微振荡
- 将增益降至振荡临界值的70%
- 逐步减小Ti直到消除静差
- 始终通过趋势图观察调节过程
3.2 安全联锁逻辑
系统包含三级安全保护:
- 水位超高限立即停泵
- 压力超限延时3秒停泵
- 急停按钮直接切断动力电源
对应的PLC程序采用结构化文本实现:
code复制// 急停处理
IF "Emergency_Stop" THEN
"Pump_Run" := FALSE;
"Valve_Open" := 0.0;
RETURN;
END_IF;
// 水位超高保护
IF "WaterLevel" >= 98.0 THEN
"Alarm_01" := TRUE;
"Pump_Run" := FALSE;
END_IF;
// 压力保护
IF "Pressure" > 1.2 THEN
#Pressure_Timer(IN := TRUE);
IF #Pressure_Timer.Q THEN
"Alarm_02" := TRUE;
"Pump_Run" := FALSE;
END_IF;
ELSE
#Pressure_Timer(IN := FALSE);
END_IF;
4. HMI界面设计
4.1 主画面布局
TP1200触摸屏采用800x480分辨率,主画面包含:
- 实时数据显示区(水位、压力、阀门开度)
- 趋势图显示框
- 模式切换按钮组
- 报警信息栏
- 系统状态指示灯
设计要点:
- 关键操作按钮尺寸不小于80x80像素
- 重要数据字体大小至少24pt
- 颜色编码:正常状态绿色,报警红色,警告黄色
- 所有按钮添加操作确认对话框
4.2 报警管理系统
采用环形缓冲区实现报警历史记录,结构如下:
code复制// 数据块定义
TYPE Alarm_Entry :
STRUCT
Code : WORD;
Time : DATE_AND_TIME;
Message : STRING[30];
END_STRUCT;
END_TYPE
VAR
Alarm_Buffer : ARRAY[1..10] OF Alarm_Entry;
Alm_Ptr : INT := 1;
END_VAR
报警处理逻辑:
code复制// 报警触发处理
IF Alarm_Trigger THEN
Alarm_Buffer[Alm_Ptr].Code := Alarm_Code;
Alarm_Buffer[Alm_Ptr].Time := "SystemTime";
Alarm_Buffer[Alm_Ptr].Message := Alarm_Text;
Alm_Ptr := Alm_Ptr MOD 10 + 1; // 环形索引
// 更新当前报警显示
"Active_Alarm" := Alarm_Code;
END_IF;
5. 系统维护技巧
5.1 参数备份与恢复
利用S7-1200的数据块保持功能,将设备参数存储在DB101中:
- 在DB属性中勾选"非易失性"
- 上电时自动从装载存储器恢复
- 添加参数导出/导入功能:
code复制// 导出到存储卡
"Export_Done" := FALSE;
"Export_Req" := TRUE;
IF "Export_Status" = 16#7001 THEN
"Export_Done" := TRUE;
"Export_Req" := FALSE;
END_IF;
// 从存储卡导入
"Import_Done" := FALSE;
"Import_Req" := TRUE;
IF "Import_Status" = 16#7001 THEN
"Import_Done" := TRUE;
"Import_Req" := FALSE;
END_IF;
5.2 现场调试工具
推荐使用以下工具提高调试效率:
- 博图Trace功能:实时记录多个变量变化
- Web服务器功能:通过网页监控PLC状态
- HMI模拟器:离线测试画面逻辑
- PUT/GET通信:与上位机数据交换
6. 抗干扰实战经验
在多个现场部署后总结的硬件抗干扰措施:
-
电源处理:
- PLC电源前加装隔离变压器
- 所有继电器线圈并联续流二极管
- 接触器线圈增加RC吸收回路(R=100Ω,C=0.1μF)
-
布线规范:
- 动力电缆与信号电缆分槽敷设
- 模拟量信号采用双绞屏蔽线
- 屏蔽层在控制柜端单点接地
-
接地系统:
- 建立独立的仪表接地极
- 接地电阻小于4Ω
- 所有机柜接地排用35mm²铜缆连接
这套系统经过三年现场验证,平均无故障时间达到8600小时。最关键的体会是:工业自动化系统30%靠程序,70%靠硬件设计和安装规范。程序可以后期优化,但硬件基础没打好,后期维护成本会非常高。