1. 项目概述:当PLC程序遇上"社畜电梯"
最近在改造一栋老式办公楼的三楼电梯时,我发现这个1998年安装的继电器控制系统简直是个"职场老油条"——每天要处理12个楼层按钮、8个轿厢指令按钮、4个安全开关信号,还得协调门机、变频器和楼层显示。就像个被KPI压垮的社畜,原有系统经常出现按钮响应延迟、楼层误停等"职业倦怠"症状。
这次我们用西门子S7-200 SMART PLC重构控制核心,特别设计了带"性格特征"的程序结构。这个CPU224XP自带14输入/10输出,支持RS485通信,正好满足三层电梯的DI/DO需求。最有趣的是,我们通过梯形图(LAD)编程时,刻意模拟了人类处理多任务时的决策逻辑——比如用S7-200的"先到先服务"算法解决同层多按钮冲突,用状态记忆位实现"电梯健忘症"防护。
关键认知:电梯PLC程序本质是"多线程"状态机,每个按钮信号都是中断事件,而安全回路则是最高优先级的看门狗。
2. 核心需求拆解与硬件配置
2.1 电梯控制的四维需求矩阵
这个三层电梯的控制需求可以分解为四个维度:
-
信号采集层:
- 12个外部按钮(每层上下各2个)
- 8个轿厢指令按钮(含开门/关门专用键)
- 4路安全信号(超重、门锁、急停、限位)
-
运动控制层:
- 变频器启停(Q0.0/Q0.1)
- 运行方向输出(Q0.2上行/Q0.3下行)
- 抱闸控制(Q0.4)
-
人机交互层:
- 7段数码管楼层显示
- 按钮背光反馈
- 语音播报模块
-
安全防护层:
- 门锁互锁(I0.5)
- 运行超时监控(T101)
- 故障自诊断(M20.0-M20.7)
2.2 S7-200 SMART硬件接线秘籍
实际接线时有个"潜规则":安全回路必须使用常闭触点。这是我们用鲜血换来的教训——去年有个项目因门锁使用常开触点,导致触点氧化后电梯失控。具体配置:
bash复制# 输入部分(全部DC24V)
I0.0 - 1楼上召
I0.1 - 2楼上召
I0.2 - 2楼下召
I0.3 - 3楼下召
I0.4 - 轿厢1楼
I0.5 - 门锁检测(NC)
I0.6 - 超重信号(NO)
I0.7 - 急停按钮(NC)
# 输出部分
Q0.0 - 变频器启动
Q0.1 - 变频器方向
Q0.2 - 上行指示灯
Q0.3 - 下行指示灯
Q0.4 - 抱闸释放
Q0.5 - 开门按钮灯
血泪经验:急停回路一定要串联在输出端子的公共端上!我们曾遇到PLC输出点粘连导致急停失效的事故。
3. 梯形图编程的"社畜逻辑"
3.1 按钮信号处理的"职场生存法则"
电梯按钮处理就像办公室接电话——要记住所有需求但不能搞混优先级。我们用S7-200的"先登记后执行"机制:
ladder复制Network 1: 1楼上召登记
LD I0.0 // 1楼呼叫
S M0.0,1 // 置位记忆位
Network 2: 呼叫响应条件
LD SM0.0
A M0.0 // 1楼呼叫待处理
AN M1.0 // 当前不在1楼
= M10.0 // 满足响应条件
这里有个精妙设计:用M区变量作"待办事项清单",而实际执行前要检查:
- 当前运行方向(M1.1上行/M1.2下行)
- 轿厢当前位置(M1.3-M1.5楼层状态)
- 安全条件(M2.0安全回路正常)
3.2 运动控制的"时间管理术"
电梯运行控制就像社畜安排会议,要处理各种冲突:
ladder复制Network 3: 上行启动逻辑
LD M10.0 // 有上行需求
A M1.1 // 当前方向上行
AN T37 // 未在减速阶段
= Q0.0 // 启动变频器
Network 4: 方向锁定
LD M10.0
O M10.1
AN M1.2
= M1.1 // 锁定上行方向
我们引入了三个关键定时器:
- T37(减速距离计时):提前1.5秒开始减速
- T38(开门保持时间):5秒后自动关门
- T39(按钮消抖延时):50ms防误触发
4. 安全回路的"生存本能"
4.1 五重安全防护设计
-
门锁互锁:
ladder复制LD I0.5 // 门锁闭合 AN I0.7 // 急停未触发 = M2.0 // 安全回路使能 -
运行超时监控:
ladder复制LD Q0.0 // 变频器运行 TON T101, 15000 // 15秒计时 LD T101 = M20.0 // 超时故障 -
楼层校正:
每层安装磁开关(I1.0-I1.2),在每次停靠时强制更新楼层计数器。 -
电源监测:
用SM0.1上电初始化,SM0.3检测电池故障。 -
紧急救援:
持续30秒无响应时,自动运行到最近楼层并开门。
4.2 故障诊断的"体检报告"
我们在OB35中断组织块中实现故障自诊断:
ladder复制Network 10: 故障代码生成
LD M20.0 // 超时故障
MOV_B 16#01, VB100 // 故障代码01
LD M20.1 // 门锁故障
MOV_B 16#02, VB100
通过VB100-VB103四个字节存储故障历史,可通过编程口读取最近5次故障记录。
5. 调试中的"职场PUA"应对方案
5.1 典型问题排查清单
| 故障现象 | 检查点 | 工具技巧 |
|---|---|---|
| 按钮无响应 | 测量I0.x电压 | 用万用表测通断时,要按住按钮 |
| 随机停层 | 磁开关间隙 | 用磁铁模拟测试,间隙应≤5mm |
| 开门抖动 | T38设定值 | 手持秒表实测时间 |
| 急停失效 | 输出回路接线 | 断电测Q0.x对COM电阻 |
5.2 在线调试的"读心术"
-
状态强制技巧:
在Micro/WIN中强制M0.0可以模拟按钮呼叫,但要注意:- 必须先禁用"运行中编辑"功能
- 强制后立即取消,避免遗留
-
时序抓取方法:
用趋势图监控关键点:python复制# 监控列表示例 AddWatch = [I0.0, Q0.0, M1.1, T37, T101] -
PLC死机急救:
若程序跑飞,快速复位三步法:- 断开所有输出负载
- 冷重启PLC
- 清除内存后重新下载
6. 程序优化的"升职加薪"之路
6.1 高级功能扩展
-
节能模式:
ladder复制LD SM0.5 // 1Hz时钟 LPS A M3.0 // 空闲状态 TON T40, 300 // 5分钟无操作 LPP LD T40 = Q0.6 // 关闭轿厢照明 -
高峰时段算法:
用时钟指令读取PLC实时钟,在8:00-9:30启用"高峰模式":- 忽略同方向中间层呼叫
- 缩短开门保持时间
-
远程监控:
通过EM277模块连接HMI,实时显示:- 累计运行次数
- 各按钮使用频率
- 故障热力图
6.2 代码重构心得
经过三个版本迭代,总结出梯形图编程的"三要三不要":
要:
- 使用有意义的变量名(如"M_UpCall"替代"M0.0")
- 每个Network只完成一个功能
- 重要逻辑添加注释行
不要:
- 避免过多使用SET/RST指令(易造成状态混乱)
- 不要跨Network跳转(破坏可读性)
- 禁用双线圈输出(Q点重复驱动)
这个项目的最大收获是:好的PLC程序应该像优秀的职场人——对输入信号快速响应但不忘安全底线,能同时处理多任务但保持逻辑清晰,在重复工作中依然保持可靠稳定。下次准备尝试用SCL语言实现更复杂的调度算法,毕竟电梯控制这个"社畜",也该有"升职"的一天。
