基于西门子 S7-1200 PLC — 顺序功能图 (SFC) 设计与程序实现
| 📥 输入信号 | 📤 输出信号 | ||||
|---|---|---|---|---|---|
| SB1 | 启动按钮 | I0.0 | H1 | 提升机电机 | Q0.0 |
| SB2 | 停止按钮 | I0.1 | H3 | 地面煤仓指示灯 | Q0.1 |
| S5 | 限位开关(卸料位) | I0.2 | H4 | 井下煤仓 | Q0.2 |
| S6 | 限位开关(中间位) | I0.3 | H5 | 给煤机 | Q0.3 |
| S7 | 限位开关(装料位) | I0.4 | H6 | 上升运行指示 | Q0.4 |
| S1 | 失速下滑检测 | I0.5 | H7 | 下降运行指示 | Q0.5 |
| R1 | 箕斗重量(模拟量) | IW64 | H8 | 系统运行指示 | Q0.6 |
| H9 | 系统故障指示 | Q0.7 | |||
| H2 | 抱闸系统 | Q1.0 | |||
基于西门子 S7-1200(1215 模块),采用置位复位法(SET/RST)实现 SFC 步序逻辑。
| 变量 | 类型 | 说明 |
|---|---|---|
| M0.0 ~ M1.3 | Bool | 步序标志位(M0~M11, Mf) |
| M1.4 | Bool | 停止请求标志(SB2 按下时置位) |
| M1.5 | Bool | 故障标志 |
| MW10 | Int | 重量换算值(0~12000 对应 0~120%) |
| T1 ~ T5 | IEC_Timer | 延时定时器 |
| DB1 | Global DB | 定时器和脉冲发生数据块 |
// 在 OB1 或循环中断中产生三种频率脉冲 // 0.5Hz = 1s on / 1s off // 1Hz = 0.5s on / 0.5s off // 2Hz = 0.25s on / 0.25s off // 使用系统时钟存储器或自建脉冲 // 设置 MB1 为时钟存储器字节: // M1.0 = 0.5Hz (2s周期) // M1.1 = 1Hz (1s周期) // M1.2 = 2Hz (0.5s周期) // 或在 TIA 中设置 "时钟存储器" 地址为 MB1 "Clock_0_5Hz" := M1.0; // 0.5Hz 时钟脉冲 "Clock_1Hz" := M1.1; // 1Hz 时钟脉冲 "Clock_2Hz" := M1.2; // 2Hz 时钟脉冲
// ========================================== // 矿井提升机控制系统 - 步序控制 (SCL) // 置位复位法实现顺序功能图 // 西门子 S7-1200 / TIA Portal // ========================================== // ---------- 故障检测(全局优先)---------- // 任意活动步下失速即跳转故障步 IF #S1 AND (NOT #Mf) THEN // 复位所有步 FOR #i := 0 TO 11 DO #M[#i] := FALSE; END_FOR; #Mf := TRUE; // 激活故障步 #FaultFlag := TRUE; // 故障标志 END_IF; // ---------- 故障步 Mf ---------- IF #Mf THEN #H2 := TRUE; // 抱闸启动 #H1 := FALSE; // 电机停止 #H9 := TRUE; // 故障指示 // 清除其他所有输出 #H3 := FALSE; #H4 := FALSE; #H5 := FALSE; #H6 := FALSE; #H7 := FALSE; #H8 := FALSE; // 故障恢复:操作员处理完毕 + 按 SB1 返回初始 IF NOT #S1 AND #SB1 AND #S5 THEN #Mf := FALSE; #FaultFlag := FALSE; #M0 := TRUE; // 回到初始步 END_IF; END_IF; // ---------- 初始步 M0 ---------- // 系统就绪,等待启动 IF #M0 THEN #H8 := FALSE; // 系统运行指示关闭 // 启动条件:SB1按下 + 在原位S5 + 无故障 IF #SB1 AND #S5 AND (NOT #FaultFlag) THEN #M0 := FALSE; #M1 := TRUE; #StopReq := FALSE; // 清除停止请求 END_IF; END_IF; // ---------- 步 M1:下行运行 ---------- IF #M1 THEN // 输出:H1正转(正转=TRUE),H7常亮,H8系统运行 #H1 := TRUE; // 电机正转(下行) #H7 := TRUE; // 下行指示 #H8 := TRUE; // 系统运行 // 转换条件:S6到达 IF #S6 THEN #M1 := FALSE; #M2 := TRUE; END_IF; END_IF; // ---------- 步 M2:减速下行 ---------- IF #M2 THEN #H1 := #Clock_0_5Hz; // 0.5Hz 闪烁(模拟减速) #H7 := TRUE; // 下行指示 #H8 := TRUE; // 系统运行 // 转换条件:S7到达 IF #S7 THEN #M2 := FALSE; #M3 := TRUE; #T1(IN := TRUE, PT := T#2s); // 启动延时 END_IF; END_IF; // ---------- 步 M3:停止(装料位) ---------- IF #M3 THEN #H1 := FALSE; // 电机停止 #H7 := FALSE; // 下行指示灭 #H8 := TRUE; // 系统运行 // 延时2s后转移 #T1(IN := TRUE, PT := T#2s); IF #T1.Q THEN #M3 := FALSE; #M4 := TRUE; END_IF; END_IF; // ---------- 步 M4:给煤机运行 ---------- IF #M4 THEN #H5 := TRUE; // 给煤机 #H8 := TRUE; // 系统运行 // 延时2s后转移 #T2(IN := TRUE, PT := T#2s); IF #T2.Q THEN #M4 := FALSE; #M5 := TRUE; END_IF; END_IF; // ---------- 步 M5:装煤 ---------- IF #M5 THEN #H4 := TRUE; // 井下煤仓打开 #H5 := TRUE; // 给煤机继续 #H8 := TRUE; // 系统运行 // 转换条件:重量 ≥ 90% // 模拟量 IW64 归一化计算(0~27648 → 0~120%) // 90% 对应数值 = 27648 * 90 / 120 IF #WeightRaw >= 20736 THEN #M5 := FALSE; #M6 := TRUE; #T3(IN := TRUE, PT := T#10s); END_IF; END_IF; // ---------- 步 M6:关闭煤仓 ---------- IF #M6 THEN #H4 := FALSE; // 关闭煤仓 #H5 := TRUE; // 给煤机继续(剩余时间) #H8 := TRUE; // 系统运行 // 延时 10s 后给煤机停止 #T3(IN := TRUE, PT := T#10s); IF #T3.Q THEN #M6 := FALSE; #M7 := TRUE; END_IF; END_IF; // ---------- 步 M7:上行运行 ---------- IF #M7 THEN #H5 := FALSE; // 给煤机停止 #H1 := #Clock_2Hz; // 电机反转输出(2Hz闪烁=高速上行) #H6 := #Clock_2Hz; // 上行指示 2Hz闪烁 #H8 := TRUE; // 系统运行 // 转换条件:S6到达 IF #S6 THEN #M7 := FALSE; #M8 := TRUE; END_IF; END_IF; // ---------- 步 M8:加速上行 ---------- IF #M8 THEN #H1 := #Clock_1Hz; // 电机反转(1Hz闪烁=加速上行) #H6 := #Clock_1Hz; // 上行指示 1Hz闪烁 #H8 := TRUE; // 系统运行 // 转换条件:S5到达 IF #S5 THEN #M8 := FALSE; #M9 := TRUE; #T4(IN := TRUE, PT := T#2s); END_IF; END_IF; // ---------- 步 M9:停止(卸料位) ---------- IF #M9 THEN #H1 := FALSE; // 电机停止 #H6 := FALSE; // 上行指示灭 #H8 := TRUE; // 系统运行 // 延时 2s 后卸煤 #T4(IN := TRUE, PT := T#2s); IF #T4.Q THEN #M9 := FALSE; #M10 := TRUE; END_IF; END_IF; // ---------- 步 M10:卸煤 ---------- IF #M10 THEN #H3 := TRUE; // 卸煤指示 #H8 := TRUE; // 系统运行 // 延时 20s 卸煤完成 #T5(IN := TRUE, PT := T#20s); IF #T5.Q THEN #M10 := FALSE; #M11 := TRUE; END_IF; END_IF; // ---------- 步 M11:循环判断 ---------- IF #M11 THEN #H3 := FALSE; // 卸煤指示灭 // 判断是否需要停止 IF #StopReq THEN // 收到停止请求,回到初始步 #M11 := FALSE; #M0 := TRUE; #H8 := FALSE; // 系统运行指示灭 ELSE // 无停止请求,继续下一循环 #M11 := FALSE; #M1 := TRUE; // 回到 M1 继续下行 END_IF; END_IF; // ---------- 停止按钮处理 ---------- // 任意时刻按下 SB2,设置停止请求标志 // 系统执行完当前循环后才停止 IF #SB1_Rising THEN // 在非故障状态下设置停止请求 IF (NOT #M0) AND (NOT #Mf) THEN #StopReq := TRUE; END_IF; END_IF;
// 将变量映射到实际物理输出 // 可在 OB1 末尾或单独 FC 中处理 "Q0.0" := #H1; // 提升机电机 "Q0.1" := #H3; // 地面煤仓指示 "Q0.2" := #H4; // 井下煤仓 "Q0.3" := #H5; // 给煤机 "Q0.4" := #H6; // 上升指示 "Q0.5" := #H7; // 下降指示 "Q0.6" := #H8; // 系统运行指示 "Q0.7" := #H9; // 系统故障指示 "Q1.0" := #H2; // 抱闸系统
| 步 | 活动步条件 | 执行动作 |
|---|---|---|
| M0 | 初始状态(上电初始) | H8灭,等待启动 |
| M1 | SB1 + S5 + 无故障 | H1正转(下行),H7常亮,H8亮 |
| M2 | S6 到达 | H1 0.5Hz 闪烁(减速),H7亮 |
| M3 | S7 到达 + T1 2s | H1停,H7灭,等待 2s |
| M4 | T1 完成 | H5运行(给煤机),等待 2s |
| M5 | T2 完成 | H4开(装煤),H5继续,监测重量 |
| M6 | 重量 ≥ 90% | H4关,H5继续,等待 10s |
| M7 | T3 完成 | H5停,H1反转(上行),H6 2Hz闪烁 |
| M8 | S6 到达 | H1反转,H6 1Hz闪烁(加速) |
| M9 | S5 到达 + T4 2s | H1停,H6灭,等待 2s |
| M10 | T4 完成 | H3亮(卸煤),等待 20s |
| M11 | T5 完成 | H3灭,判断 StopReq→回 M0 或 M1 |
| Mf | S1=1(失速) | H2常亮,H1停,H9亮,等待恢复 |
📅 生成日期:2026-06-23 | 📋 基于《矿井提升机实训指导书》
💡 适用于西门子 S7-1200(1215) + TIA Portal V16+