⛏️ 矿井提升机控制系统

基于西门子 S7-1200 PLC — 顺序功能图 (SFC) 设计与程序实现

一、I/O 分配表

📥 输入信号📤 输出信号
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

二、顺序功能图 (SFC)

初始步
普通步
故障步
━ 转移条件
M0 初始 启动 SB1 · 箕斗在 S5 M1 下行运行 H1正转 H7常亮 H8亮 S6(中间位) M2 减速下行 H1 0.5Hz闪烁 H7亮 S7(装料位) M3 停止 H1停 H7灭 延时 2s (T1) M4 给煤机 H5运行 延时 2s (T2) M5 装煤 H4开 开始装煤 箕斗重量 ≥ 90% M6 关煤仓 H4关 延时 10s (T3) M7 上行运行 H5停 H1反转 H6 2Hz闪 S6(中间位) M8 加速上行 H1反转 H6 1Hz闪烁 S5(卸料位) M9 停止 H1停 H6灭 延时 2s (T4) M10 卸煤 H3亮 延时 20s (T5) M11 循环判断 H3灭 SB2未按 → 下一循环 循环 SB2已按 → 停止 故障分支(每步均可触发) S1=1(失速下滑)→ 跳转至故障步 Mf 故障处理 H2常亮 H1停 H9亮 故障排除 + 按 SB1 故障转移条件: 当 S1=1(检测到失速下滑)时, 当前步 → 立即转移至 Mf 故障步 重量检测说明: R1 模拟箕斗重量,0-100% 正常值 100-120% 极限承重值 PLC 通过模拟量输入 IW64 读取 换算后判定是否 ≥ 90%

三、PLC 程序实现(SCL 语言)

基于西门子 S7-1200(1215 模块),采用置位复位法(SET/RST)实现 SFC 步序逻辑。

3.1 全局变量 / 中间变量

变量类型说明
M0.0 ~ M1.3Bool步序标志位(M0~M11, Mf)
M1.4Bool停止请求标志(SB2 按下时置位)
M1.5Bool故障标志
MW10Int重量换算值(0~12000 对应 0~120%)
T1 ~ T5IEC_Timer延时定时器
DB1Global DB定时器和脉冲发生数据块

3.2 脉冲发生器(用于闪烁输出)

// 在 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 时钟脉冲

3.3 主程序(Main [OB1])— 步序控制

// ==========================================
// 矿井提升机控制系统 - 步序控制 (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;

3.4 输出映射

// 将变量映射到实际物理输出
// 可在 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灭,等待启动
M1SB1 + S5 + 无故障H1正转(下行),H7常亮,H8亮
M2S6 到达H1 0.5Hz 闪烁(减速),H7亮
M3S7 到达 + T1 2sH1停,H7灭,等待 2s
M4T1 完成H5运行(给煤机),等待 2s
M5T2 完成H4开(装煤),H5继续,监测重量
M6重量 ≥ 90%H4关,H5继续,等待 10s
M7T3 完成H5停,H1反转(上行),H6 2Hz闪烁
M8S6 到达H1反转,H6 1Hz闪烁(加速)
M9S5 到达 + T4 2sH1停,H6灭,等待 2s
M10T4 完成H3亮(卸煤),等待 20s
M11T5 完成H3灭,判断 StopReq→回 M0 或 M1
MfS1=1(失速)H2常亮,H1停,H9亮,等待恢复

功能总结

  1. 自动循环: 按 SB1 启动后,系统自动完成"下行→装煤→上行→卸煤"循环
  2. 停止保护: 任何时候按 SB2,完成当前循环后自动停止至 M0
  3. 故障保护: S1 信号触发时立即停车,抱闸启动,H9 故障指示
  4. 故障恢复: 排除故障后,S1 复位,按 SB1 重新从初始步启动
  5. 脉冲输出: 通过系统时钟存储器实现 0.5Hz/1Hz/2Hz 闪烁输出
  6. 重量检测: 通过模拟量输入 IW64 读取 R1 信号,归一化判断 ≥90%

📅 生成日期:2026-06-23  |  📋 基于《矿井提升机实训指导书》

💡 适用于西门子 S7-1200(1215) + TIA Portal V16+