做电梯控制项目,最怕的不是逻辑复杂,而是整套控制逻辑全藏在几十个继电器的线束里,想改一条线、加一个功能,都得拆柜子、查图纸,调试一次像打仗一样。用三菱PLC做五层电梯控制系统,恰好就是把继电器这团乱麻彻底抽掉,把逻辑放进梯形图里的最佳实践。这个项目在工业自动化和电气控制两个方向里都是非常经典的训练课题:输入点数不算多,输出也不算复杂,但内部逻辑刚好覆盖了按钮锁存、运行方向判定、顺向截梯、平层停车、开关门互锁这些电梯控制的核心机制,既不会简单到没有挑战,也不会复杂到让人直接放弃。它非常适合刚学完PLC基础指令的人拿来练手,也适合在做小型电梯改造或者实训设备时用作参考,尤其是调度策略和现场抗干扰的处理思路,往后做到八层、十层的商用电梯项目时一样用得上。
我前两年带一个实训团队做这个项目时,用的是三菱FX3U系列PLC,五层电梯的模型套件是自制的,电机用的是带减速器的直流电机,楼层感应用的光电开关。整个系统从I/O分配、梯形图编写,到GX Works2仿真、实物接线调试,前后花了大概两周的业余时间。这篇文章我会把整个设计探索过程从头到尾拆一遍,重点讲清楚三件事:第一,五层电梯的控制逻辑到底应该怎么想,方向判断和顺向截梯的原理是什么;第二,I/O分配和梯形图设计的完整实操流程;第三,调试过程中最常见的坑和排查思路。看完之后,你应该能自己动手把一个五层电梯的PLC控制程序写出来,并且知道每一步为什么这么做。
1. 项目定位:五层电梯为何是PLC控制的最佳练兵场
1.1 从继电器到PLC:控制方案怎么选
电梯控制的本质是什么?它不是一个复杂的数学模型,而是一堆离散逻辑的组合:有人按下按钮,我要记住这个请求;电梯正在上行,我经过一个楼层时要不要停;门开了之后要等多久再关;关门过程中有人挡门怎么办。这些逻辑用继电器也能做,而且早期电梯确实是这么做的。但五层电梯如果全用继电器实现,大概需要三十到五十个中间继电器,再加上时间继电器、行程开关和接触器,控制柜里密密麻麻全是线,每一根线都代表一条逻辑条件,查故障的时候只能用万用表一根一根量,效率非常低。
换成PLC之后,这些逻辑全部变成程序里的软元件。按钮的锁存用SET/RST指令,方向判断用比较指令,门延时用定时器T,楼层编码用寄存器D,改动逻辑只需要修改程序再下载,不需要动任何一根硬线。这也是为什么“基于三菱PLC的五层电梯控制系统”这个题目在各个院校和企业培训里反复出现,它用最少的硬件资源,讲清楚了工业控制里最典型的几类逻辑:记忆、互锁、条件判断、顺序动作。
1.2 硬件选型与I/O资源预评估
选PLC之前,先把I/O点数大概算一下,这个习惯在真实工程项目里非常重要,因为选型选小了后面加功能会很被动。以五层电梯为例:
- 轿厢内呼按钮:5个,每层一个。
- 各楼层外呼按钮:1到4楼有上行按钮,2到5楼有下行按钮,一共8个。
- 平层感应器:每层一个,用来告诉PLC电梯当前停在哪一层,一共5个。
- 开关门到位信号:开门到位和关门到位各一个限位,2个。
- 门锁回路检测:一个输入点,用来判断门是否完全关闭且锁定。
- 超载开关:一个输入点。
这样统计下来,输入点大概是5加8加5加2加1加1,22个。输出点方面,上行和下行接触器各一个,开门和关门继电器各一个,每层呼梯指示灯加楼层显示,再加上运行方向指示灯和超载报警,大概在16到18个左右。所以我选的是三菱FX3U-48MR,输入24点、输出24点,继电器输出型,余量留了百分之二十以上。
2. 控制逻辑拆解:内外呼、方向判定与停层规则
2.1 呼叫信号采集与锁存的设计思路
电梯里所有的呼梯按钮都是点动的,乘客按一下,按钮触点闭合一瞬间就松开了。如果PLC不去记这个瞬间的信号,那这个请求就会丢失,所以呼叫信号必须锁存。这个逻辑在梯形图里很简单,用SET指令把对应的中间继电器置位,等电梯确实到了这一层并开门之后,再用RST指令复位。我习惯把每一层的呼叫状态单独放在一个中间继电器里,比如M100到M104对应1到5层的内呼,M200到M203对应1到4层的上外呼,M204到M207对应2到5层的下外呼。
这里有一个非常容易被忽视的细节:复位呼叫信号的时间点。很多初学者会把呼叫复位放在关门之后,甚至放在电梯启动之后,这个做法是错的。正确的时间点应该是电梯已经平层、门正在打开的那一刻复位。为什么?因为如果门还没开就复位,假如开门动作失败,乘客看到门没开,再按一次按钮,其实请求已经丢了;如果放在关门后复位,那车门正在开的时候,如果乘客又按了一次按钮,这个呼叫会被当作新请求记录下来,电梯就会在门还没完全关闭时又被触发,逻辑乱掉,反复开关门。所以复位时机要严格绑定在平层开门信号上,这是电梯逻辑里非常经典的一个“时序陷阱”。
2.2 运行方向判定:顺向截梯到底怎么截
方向判定是整个五层电梯程序里最难写明白的部分。简单的做法是:所有呼叫楼层里,高于当前层的就判定为上行,低于当前层就判定为下行。但实际电梯不是这么跑的,真实电梯用的是“顺向截梯”策略,也就是电梯沿一个方向运行时,只响应与当前运行方向相同的呼梯请求,这样才能保证电梯不会来来回回空跑。
举个例子:电梯现在在3楼向上运行,目标是5楼。这时候2楼有人按了上行外呼,也有人按了上行外呼到4楼;同时4楼还有一个人按了外呼下行。真实电梯的处理方式是:它继续向上,先停4楼(因为4楼在运行方向前方,且4楼有呼梯请求),再停5楼;至于2楼的请求,即使离得近,也要等电梯掉头向下之后才去响应。这就是顺向截梯,本质上是让电梯批次处理同一方向上的请求,减少频繁换向。
在程序里实现这个逻辑,我给每个楼层定义了一组有效呼叫标志:内呼对任何方向都有效,外呼只对同方向有效。电梯上行过程中,只要前方某一层有有效呼叫,而且电梯已经平层到了这一层,就置位停车信号。所谓“前方”,判断标准就一条:当前运行方向是上行时,当前层数加1到最大层范围内的呼梯请求。我用比较指令把当前楼层D0和目标楼层逐层比较,最高层和最低层做成软限位,防止程序越界。
停车之后还有一个关键动作:判断是否换向。换向的条件是当前方向前方已经没有任何有效呼叫,而反方向还有呼叫。这个判断必须在停车状态进行,绝对不能运行途中突然换向,否则电梯会出现反向溜车的危险。我在程序里设置了一个运行状态标志M8000不可直接拿来用,我自定义了M30作为“运行中”标志,M31作为“上行方向”,M32作为“下行方向”,所有的换向判断都必须在M30关闭状态下执行。
2.3 平层停车与开关门时序
平层停车控制是电梯安全逻辑里面最重要的一环,也是最容易写错的一环。电梯在井道里运行时,每经过一个楼层,平层感应器都会短暂导通一次。如果程序只是简单地“看到感应器信号就停车”,电梯就会在运行途中每经过一层都急停一次,然后继续跑,那体验简直就是灾难。
正确逻辑是:平层感应器信号只是“当前楼层位置”的输入,真正决定停不停的,是“当前楼层位置加有效呼叫加方向匹配”这个三合一条件。也就是说,电梯经过4楼,4楼的感应器导通了,但如果4楼没有有效呼叫,PLC应该把4楼的感应器信号当作纯粹的位置信息,更新D0当前楼层寄存器,然后继续运行;只有当你判断出4楼有上楼需求的乘客,或者轿厢内有人按了4楼,同时当前方向是上行时,才输出停车信号。这个“位置更新”和“停车判断”分离的思想,是我写这个程序时感觉收获最大的一点。
开关门时序相对固定:停车信号置位之后,先输出开门信号,开门到位限位导通后撤掉开门输出,开始计时T0,关门延时通常设6秒,时间到了输出关门信号,关门到位限位导通后撤掉关门输出。其中开门和关门输出必须互锁,我在梯形图里用ANI指令把两个输出点互相串进对方回路里,硬件上接触器也加了机械互锁,这样双保险。门锁回路信号X22必须在上行或下行接触器吸合之前为ON,否则电机不能启动,这是电梯的一个基本安全要求。
3. 实操落地:I/O分配、梯形图设计与仿真调试
3.1 完整I/O地址分配表
实际的I/O分配表如下,这份表格我建议直接抄走,做五层电梯项目时基本不用改,除非你用的是不同的PLC型号:
| 输入地址 | 元件编号 | 功能说明 | 输出地址 | 元件编号 | 功能说明 |
|---|---|---|---|---|---|
| X0 | SB1 | 1楼轿内选层按钮 | Y0 | KM1 | 上行接触器 |
| X1 | SB2 | 2楼轿内选层按钮 | Y1 | KM2 | 下行接触器 |
| X2 | SB3 | 3楼轿内选层按钮 | Y2 | KM3 | 开门继电器 |
| X3 | SB4 | 4楼轿内选层按钮 | Y3 | KM4 | 关门继电器 |
| X4 | SB5 | 5楼轿内选层按钮 | Y4 | HL1 | 1楼呼梯指示灯 |
| X5 | SB6 | 1楼上行外呼按钮 | Y5 | HL2 | 2楼呼梯指示灯 |
| X6 | SB7 | 2楼上行外呼按钮 | Y6 | HL3 | 3楼呼梯指示灯 |
| X7 | SB8 | 3楼上行外呼按钮 | Y7 | HL4 | 4楼呼梯指示灯 |
| X8 | SB9 | 4楼上行外呼按钮 | Y8 | HL5 | 5楼呼梯指示灯 |
| X9 | SB10 | 2楼下行外呼按钮 | Y10 | HL6 | 上行运行指示灯 |
| X10 | SB11 | 3楼下行外呼按钮 | Y11 | HL7 | 下行运行指示灯 |
| X11 | SB12 | 4楼下行外呼按钮 | Y12 | HL8 | 超载报警指示灯 |
| X12 | SB13 | 5楼下行外呼按钮 | Y13 | BCD1 | 楼层显示BCD码最低位 |
| X13 | SQ1 | 1楼平层感应器 | Y14 | BCD2 | 楼层显示BCD码第二位 |
| X14 | SQ2 | 2楼平层感应器 | Y15 | BCD3 | 楼层显示BCD码第三位 |
| X15 | SQ3 | 3楼平层感应器 | Y16 | BCD4 | 楼层显示BCD码最高位 |
| X16 | SQ4 | 4楼平层感应器 | |||
| X17 | SQ5 | 5楼平层感应器 | |||
| X20 | SQ6 | 开门到位限位 | |||
| X21 | SQ7 | 关门到位限位 | |||
| X22 | SQ8 | 门锁回路检测 | |||
| X23 | SQ9 | 超载开关 |
这里有个细节值得说明:楼层显示我用的是BCD码输出,也就是Y13到Y16四根线,外接一个CD4511译码芯片加一个共阴数码管,这样四根线就能显示1到5的数字,比配七段码的七根线要省三个输出点。如果你手头的PLC点数充裕,直接接七段码也可以,程序上用比较指令做译码输出就行,两种做法我都试过,BCD方式更省点,但对硬件焊接要求更高一点。
3.2 关键梯形图程序段解读
程序分段来说,我按功能块管理,每块都用GX Works2的注释标注好名称,方便后期维护。第一块是楼层编码和定位。五层感应器的信号进PLC之后,我用了五条指令做“读到哪个感应器就把对应楼层号写入D0寄存器”的操作,比如X13为ON时MOV K1到D0,X14为ON时MOV K2到D0,以此类推。
这里有个隐患:电梯平层区内感应器可能会同时压住两个,比如4楼和5楼的感应器靠得近,电梯在某个位置两个感应器同时导通,程序就会先执行4楼编码再执行5楼编码,最后D0变成了5,楼层定位就错了。解决的办法有两个,二选一:一种是用“优先权”方式,给楼层编码加互锁,即X13编码时X14必须是OFF;另一种更稳,用“最后保持”的方式,设定一个扫描顺序,后执行的覆盖先执行的,物理上把感应器安装间距拉开。实际项目里我两种都加上了,感应器间距留够了,程序互锁也加了,调试时没有再出现跳层现象。
第二块是呼叫登记和清除。每一个呼叫按钮对应一组SET/RST,以1楼内呼为例:
LD X0 SET M100 LD M500 RST M100M500就是我定义的1楼平层停车完成信号,它由后面的停车控制块输出。注意这里“停车完成”不是一个瞬间脉冲,而是一个持续信号,所以RST写在LD M500后面是安全的,门开启期间这个信号一直存在,呼叫位会被复位并保持。
第三块是方向判定,这是整个程序的核心。我的做法是先用比较指令判断当前楼层与目标楼层的关系,再分上行、下行、停止三种状态处理。不把比较结果直接输出,而是先写成“上行请求”和“下行请求”两个中间标志,再经过换向条件过滤,最后才输出Y0和Y1接触器。这样做的原因是防止电梯在停止状态同时接通两个方向的接触器,造成硬件短路。换向逻辑这部分,我陆续改过三版,最后稳定下来的是这套思路:
- 电梯停止且无方向时,先扫描所有有效呼叫,找到离当前层最近的呼叫作为目标。
- 当前层之上有呼叫,优先定为上行;当前层之下有呼叫,定为下行。
- 运行中只响应本方向前方呼叫,运行到本方向最远呼叫点之后,如果反方向还有呼叫,在停车状态下切换方向。
为了让这段逻辑在梯形图里可读性更强,我画了一张状态转移表贴在编程站旁边,每个方向对应一组允许响应的楼层,调试的时候对着表检查程序,效率很高。
第四块是平层停车。以4楼上行停车为例,我写了一个综合条件:
LD X16 AND M40 AND M32 OUT M504M40是“4楼有有效呼叫”的综合标志,M32是“正在上行”的标志,X16是4楼平层感应器。三者同时成立,说明电梯到达4楼且4楼有请求且方向匹配,那就输出4楼停车信号。这个思路对每一层都是对称的,只要把楼层感应器、楼层呼叫标志和方向标志替换掉,其他层完全一样的结构。
3.3 GX Works2仿真调试流程
梯形图写完之后不要急着下载到PLC,先用GX Works2自带的GX Simulator做一遍软件仿真,把逻辑层面的大问题先捞出来。我的操作流程如下:先在工程菜单里启动模拟器,然后打开“软元件测试”窗口,在这里可以强制各输入点的ON/OFF状态,模拟按钮动作。
调试顺序很有讲究,别一上来就乱点。第一步测楼层定位:依次强制X13到X17为ON,看D0寄存器的当前值是否按顺序变成1到5,确认楼层编码没有互锁冲突。第二步测呼叫锁存:强制X0为ON,看M100是否置位,然后给平层停车信号,看M100是否复位。第三步测方向判定,这是最花时间的:把D0手动改到3楼,强制强制2楼下呼按钮,看Y1是否输出;再强制4楼上呼按钮,看Y0是否输出。第四步做整梯联动模拟:模拟电梯从1楼上行经过2楼、3楼、4楼,每一层都故意设置不同的呼叫组合,检查电梯是否在正确楼层停车、停车后是否开门、关门后是否继续运行。
仿真器的“时序图”功能在这个阶段非常好用,可以同时观察D0、各呼叫M、Y0到Y3这几个关键软元件的波形,逻辑关系对不上时一眼就能看出来。有一次我在仿真里发现电梯明明已经停车开门了,但上行接触器Y0仍然保持吸合,查了半天是停车信号写反了,把它输出了但没切断运行条件,这种问题在时序图里非常明显,在纯纸上逻辑推演反而不容易发现。
4. 监控与通讯扩展:触摸屏和MC协议怎么接
4.1 用触摸屏做楼层监控与呼叫面板
五层电梯本身用实体按钮和指示灯就能完成人机交互,但实际工程项目里,客户通常都会要求配一个显示屏,实时看电梯在哪层、运行方向是什么、有没有超载报警。这个小项目很自然的延伸方向就是加一块触摸屏,顺便把数据通讯的链路打通。
我用的是威纶通MT8071iP,配三菱FX3U,通信方式走RS485,触摸屏这边COM口设成PLC型号FX3U,波特率9600,数据格式8E1,协议选三菱的编程口协议。连接建立之后,我直接在触摸屏软件里建画面:用数值元件显示D0当前楼层,用位状态指示灯显示Y0、Y1、Y12这几个点,用位按钮直接绑定X0到X17对应的呼叫输入,这样触摸屏就变成了一个可编程的呼梯面板和监控面板。这里不需要写一行通讯程序,触摸屏软件里配置好地址就行,对初学者最友好。
4.2 三菱MC通讯协议要点和报文格式
如果你想把电梯状态数据送给上位机电脑做记录,或者用组态软件做远程监控,那就需要对三菱的MC协议有基本了解。老手习惯叫它“三菱PLC通讯协议”,本质上是PLC对外提供的读写内部软元件的一套报文规范。FX3U的编程口默认就是MC协议,所以很幸运,我们用普通的USB转RS422线或者编程线就能直接和上位机调试通讯。
MC协议报文的结构是固定的:帧起始符、站号、命令码、起始地址、读取点数、帧结束符、校验。以读D0到D9这10个寄存器为例,ASCII模式报文大概是这样的:
02 30 30 46 46 30 31 30 30 30 30 30 30 30 41 03 37 44其中02是STX帧头,30 30 46 46是站号“00FF”,46 46是PLC默认站号,30 31是读命令,30 30 30 30是起始地址,30 30 30 41是读取点数“000A”,03是ETX帧尾,最后两个字符是累加和校验。如果你用串口调试助手抓取触摸屏和PLC之间的通讯报文,会看到一模一样的数据格式。校验的计算方法就是从站号开始到ETX之前所有字节的十六进制数值累加,取低8位后在转成两个ASCII字符。我一般建议新手先用串口助手手动发一帧读命令,观察PLC返回的数据帧,确认协议解析正确之后,再在C#或者Python里面封装通讯函数,这样问题更容易定位。
这块内容我多说一句:通讯协议调试最痛苦的不是协议本身,而是线序。FX3U的编程口要用RS422,不是RS232,网上买一根成品线最省心。另外下载线和通讯线不是同一根,我开始时用下载线想去做串口监控,结果数据完全读不出来,折腾了半天才发现是线的问题。
5. 常见问题与排查技巧实录
5.1 典型故障现象、原因与对策速查表
我把我调试过程中遇到过的问题,以及周围做这个项目的同学朋友踩过的坑整理成了下面这张速查表,基本覆盖了五层电梯项目九成以上的“疑难杂症”:
| 故障现象 | 可能原因 | 排查思路与对策 |
|---|---|---|
| 电梯到达楼层不停车 | 平层感应器信号没进PLC;呼叫标志未置位;方向判断错误 | 先看输入指示灯,强制感应器看对应X是否亮;再查该层呼叫M是否置位;最后核对方向标志,上行时只能响应上行呼叫 |
| 电梯冲顶或蹲底 | 程序里没有最高/最低层软限位 | 必须加两层保护:梯形图里限制D0不能超过5、不能小于1,硬件井道保留行程开关,双保险 |
| 呼叫灯亮但电梯不来 | 呼叫锁存正常但方向判定没覆盖该呼叫 | 检查该呼叫是不是“顺向”请求。比如上行时只响应上行呼叫,下行外呼在此时不会响应,这是正常现象,但新手往往误判为故障 |
| 门反复开关 | 关门限位信号丢失;关门到位检测不到 | 用万用表测关门到位限位,确认机械撞块是否确实到位;注意限位安装位置可能在震动下偏移 |
| 电梯平层定位跳层 | 两个感应器被同时压住 | 拉开感应器安装间距;程序里加楼层编码互锁 |
| 运行中接触器频繁吸合断开 | 接触器线圈电压不稳;PLC输出继电器触点容量不够 | 检查电源容量,接触器线圈两端并联阻容吸收;输出点加中间继电器过渡 |
| 超载时不报警 | 超载开关接线断开;输入点被占用 | 强制X23为ON,看Y12是否输出,缩小故障范围 |
5.2 现场调试避坑的几条独家经验
第一条经验:程序里凡是涉及到两个输出点互相排斥的地方,比如上行接触器和下行接触器、开门继电器和关门继电器,梯形图里面一定要用对方的常闭触点做软件互锁。这件事看起来是常识,但真正遇到过故障才会长记性。我调试时有一次因为程序里漏了互锁,下行接触器没有串上行接触器的常闭点,结果电梯上行过程中程序误触发了一个下行输出,两个接触器同时吸合,电机嗡嗡响,吓得我们赶紧断电。接触器机械互锁只能防慢速,程序互锁防的是逻辑错误,两者缺一不可。
第二条经验:输入信号防抖比你想的更重要。电梯井道环境恶劣,按钮和限位的导线长,电磁干扰大,PLC的输入端容易收到抖动信号。我在X0到X23这些输入点上统一使用了PLC的输入滤波功能,FX3U的输入滤波时间默认10毫秒,我把按钮类输入调到了20毫秒,平层感应器调到5毫秒,既过滤了抖动又不至于影响实时性。触摸屏调通讯参数时,要把PLC的程序扫描周期和控制策略的时效性一起考虑,不能只看通讯速度。
第三条经验:每次修改完程序下载之前,先用GX Works2的“程序检查”功能扫一遍,这个功能会提示未定义软元件、双线圈等问题。尤其是双线圈,我见过太多人把同一个输出Y在两个地方各写了一次,梯形图里看着没问题,实际运行是最后一个线圈才生效,前面的逻辑全都白写。用程序检查一分钟就能发现的事,现场排查可能要花一晚上。
第四条经验:做项目一定要留好文件备份。每一次调试改动的版本都单独存一个文件名,后面乱改发现不行为的时候,可以直接回退到上一个能跑的版本。这个习惯帮我省了不知道多少时间,也推荐给所有做PLC项目的人。
最后再分享一个小技巧:电梯调试阶段,在程序开头加一段手动调试模式很管用。用一个按钮X24作为调试模式开关,在这个模式下,上行和下行输出直接由两个按钮手动控制,不受自动调度逻辑影响。这样电梯第一次通电试运行的时候,我可以手动把它从1楼开到5楼,检查所有感应器是否正常工作,确认硬件没问题之后再切回自动模式。别小看这个功能,自动模式一旦有逻辑死锁,电梯卡在半空动不了,没有手动控制就只能干瞪眼了。