
前几天有个朋友问我搞一套三层楼的电梯PLC控制程序到底难不难。我说你把它想成一个活在继电器世界里、同时被十几个按钮和限位开关逼着做决定的“社畜”就懂了——它得一边响应乘客的内呼外呼一边盯着门锁、平层、上下限位还要决定自己现在是往上走、往下走还是老实待在原地。说难不难但细节特别多尤其是用西门子S7-200这种老而弥坚的小型PLC去做梯形图的组织方式直接决定你后期调试是省心还是崩溃。这篇文章我就以S7-200为平台把三层电梯的核心控制逻辑掰开揉碎讲一遍。不是那种只贴个完整程序让你对着抄的教程而是带你从“电梯到底要处理哪些信号”出发一步步把召唤登记、方向选择、运行控制、平层停车和开关门这套逻辑用梯形图搭出来顺带把我实际调试中踩过的坑和总结的排查方法也交代清楚。适合刚接触PLC但已经会用基本指令的朋友也适合要做课设、毕设或者小项目但不知道从哪下手的同学参考。1. 先盘清楚电梯到底要“纠结”什么1.1 三层电梯的输入输出信号拆解电梯控制程序之所以看起来乱原因不在于逻辑本身有多高深而在于输入信号多、状态多、动作条件也多。就像一个人同时收到十几条微信消息每条都很重要但你得排个优先级。写程序之前先把信号盘清楚后面能省一半事。三层电梯的输入信号大致分几类。第一类是内呼信号也就是电梯轿厢里面的选层按钮每层一个所以三层就是三个输入点。第二类是外呼信号一楼通常只有上行呼梯按钮三楼通常只有下行呼梯按钮二楼因为是中间层一般上行和下行两个按钮都有这一共就是四个输入点。第三类是平层信号每层一个平层感应开关用来告诉PLC“我现在停在哪一层”这是三个点。第四类是门区相关信号比如开门到位、关门到位、门锁闭合反馈这些直接关系到能不能启动运行是安全逻辑里最重要的一环。输出信号也不少。最核心的是上行接触器和下行接触器一个控制电机正转一个控制反转。然后是开门继电器和关门继电器控制门机动作。再就是楼层显示可以用七段数码管或者直接用文本显示器按层楼编码输出。我习惯先把I/O表列出来再开始写程序不然编到一半发现I点不够用或者输出反了改起来比重新写还烦。下面是我自己常用的分配表可以作为参考。类型地址说明输入I0.01楼内呼按钮输入I0.12楼内呼按钮输入I0.23楼内呼按钮输入I0.31楼外呼上行输入I0.42楼外呼上行输入I0.52楼外呼下行输入I0.63楼外呼下行输入I0.7开门按钮输入I1.0关门按钮输入I1.11楼平层开关输入I1.22楼平层开关输入I1.33楼平层开关输入I1.4开门到位限位输入I1.5关门到位限位输入I1.6门锁闭合反馈输入I1.7超载开关输出Q0.0上行接触器输出Q0.1下行接触器输出Q0.2开门继电器输出Q0.3关门继电器输出Q0.4-Q0.6楼层显示编码1.2 为什么选S7-200而不是新平台有人可能会问都什么年代了还写S7-200现在博途里S7-1200/1500不香吗这个问题我每次带项目都会被问一次。选S7-200不光是因为它老、它经典更重要的是它的指令集足够简单梯形图的表达方式非常直接适合用来建立PLC编程的基本思维。S7-200的编程软件STEP 7-Micro/WIN虽然界面复古但里面提供的指令其实非常清晰尤其是置位/复位、边沿检测、定时器、计数器这些基础指令对于一个中小型逻辑控制系统来说完全够用。而且市面上二手模块便宜、教学资源多、相关资料好找作为学习和入门平台它反而比新平台更友好。等我这次把核心逻辑用S7-200捋顺了你以后再转到哪种平台思路都是通的。2. 核心逻辑召唤登记与呼梯消除2.1 内呼外呼怎么“记住”电梯让人最直观的感觉就是“它记得你要去哪”。这个“记得”在PLC里其实就是置位一个中间继电器人话讲就是把这个呼梯信号锁存起来。比如在1楼按了内呼按钮PLC就用一个M点把“1楼有内呼”这个状态记下来即使按钮松开这个M点依然是导通的直到电梯到达1楼并把门打开这个M点才被复位。这一块我用的是置位和复位指令而不是传统的自锁回路。原因很简单自锁回路虽然也能锁存信号但它的结构比置位/复位要啰嗦而且后期如果想加“检修模式强制清除所有呼梯”这种功能用复位指令一行就搞定了用自锁回路你得一个个去断。内呼登记的程序可以这样写每个楼层内呼按钮的常开触点接输入点后面直接跟一个置位指令把对应的中间继电器置位。同时把“电梯已到达该层且门已打开”作为复位的条件把对应的中间继电器复位。我实际写的时候还会给每个呼梯信号加一个“本层已响应”的保护条件。什么意思呢就是如果电梯当前就停在这层门还没开你按了这层的内呼程序不应该把这个信号登记进去或者应该立刻把它消掉否则会出现门开完之后又重新关门又开门的情况纯粹是自己折腾自己。2.2 外呼信号和处理上的差异外呼信号比内呼稍微复杂一点。内呼的目的地明确电梯只要判断自己能不能到那一层就行了。外呼不仅要登记“哪个楼层有人要坐电梯”还要记录“他是要往上还是要往下”这直接影响电梯的方向选择逻辑。在写程序时外呼信号同样用置位来做登记。2楼有两个外呼按钮一个是上行一个是下行所以2楼外呼上行和2楼外呼下行分别占一个M点不能混在一起。否则电梯在2楼接了上行的人结果又以为下行也有人要坐本来该往上走的又开始犹豫要不要往下程序就跑得很傻。外呼消除的条件也不光是一句“到达该层”就完了还要看方向。比如电梯从1楼往上走到了2楼那么2楼外呼上行这个信号应该被消掉因为电梯正好是上行方向可以顺路接人。但2楼外呼下行这个信号不能消因为电梯现在并没有往下走乘客要去楼下他需要等电梯下一次运行方向改为下行时才能被接走。这个“方向匹配”的细节是很多新手程序跑起来奇怪的根本原因。2.3 方向选择内呼优先还是顺路优先三层电梯最核心的决策逻辑就是“当前往哪个方向走”。S7-200的程序里我一般用一组中间继电器来表示当前请求的集合然后通过比较当前楼层和请求楼层的关系来决定方向。方向选择的基本思路可以这样概括如果当前没有运行方向优先响应上行方向的外呼和内呼中位置最低的请求或者统一按“从低到高”顺序响应。如果电梯当前正在上行那么只响应“高于当前层”的请求包括上行外呼和高层内呼。同层的外呼如果方向匹配就消号开门。当没有更高层的请求时电梯转为下行开始响应下行请求。如果电梯停在2楼同时有1楼内呼和3楼内呼这就看哪个请求先到或者按常规定义优先响应上行因为电梯在中间层时一般默认往上走响应高层呼叫更符合大多数人的乘梯习惯。这里我实际做的时候加了一个“方向锁定”的技巧。电梯一旦确定上行方向就保持上行状态直到把所有高于当前层的请求全部处理完才允许切换方向。不要在中途因为某个低层呼梯信号来了就立刻掉头往下走那样既浪费能源又让乘客觉得这电梯精神不正常。这个方向锁定用置位/复位来做非常清晰。3. 运行控制与平层停车3.1 上行下行输出怎么加互锁方向一旦确定接下来就是输出到电机接触器。这里有一个电气控制里的铁律上行和下行绝对不能同时导通。一旦上下行接触器同时吸合主回路就是相间短路轻则跳闸烧保险重则直接炸接触器甚至损坏电机。所以在PLC程序里上行输出和下行输出必须做互锁而且这个互锁要做两道。第一道是软件互锁。梯形图里写Q0.0上行的时候串一个Q0.1下行的常闭触点反过来也一样。这种写法在继电器电路里叫电气互锁在PLC里叫软件互锁。第二道是硬件互锁就是在接触器的控制回路里把上行接触器的常闭触点串在下行接触器的线圈回路里把下行接触器的常闭触点串在上行接触器的线圈回路里这样哪怕PLC程序出了问题两个接触器也没法同时吸合。我在实际调试的时候还遇到过一种情况就是程序里已经做了互锁但Q0.0和Q0.1确实同时亮过排查后发现是PLC输出模块的晶体管/继电器切换延迟导致的问题。这种情况虽然少见但也说明硬件互锁这道保险绝对不能省。3.2 平层感应与停车减速逻辑电梯运行到目标楼层之后怎么停下来靠的就是平层开关。三层电梯通常每层装一个平层感应器有的用永磁感应器有的用光电开关。当电梯走到该楼层时感应器动作PLC就能知道电梯到达了哪一层。我这里采用的停车逻辑是电梯运行中一旦检测到目标楼层的平层信号就立刻复位运行输出同时置位开门输出。但实际电梯不能真的“立刻停”因为机械结构有惯性所以一般程序里会加一个短延时或者用提前减速的方式处理。讲一个我常用的优化思路不停靠的楼层电梯应该快速通过目标楼层电梯提前减速。三层楼的模拟项目里这个差距不明显但在真实多楼层电梯里高速运行和低速爬行是两个不同的接触器或变频器信号。在S7-200程序里可以做一个“目标楼层判断”的网络如果当前运行方向上的下一个呼梯层不是本层就不触发减速如果就是本层就触发减速输出。这样既保护机械也让乘坐体验好不少。3.3 停车到位后怎么消号开门电梯到位之后呼梯信号要消掉门要打开这一步的顺序如果搞错就会出现“电梯到了但门不开”或者“门开了但信号还在”的莫名其妙的问题。我的做法是平层信号上升沿触发一个“到达脉冲”这个到达脉冲一方面把对应的内呼、外呼信号复位另一方面把方向锁定标志复位同时给开门继电器一个置位信号。开门到位限位动作之后再延时若干秒然后置位关门继电器。这里为什么要用上升沿而不是用电平因为平层感应器在电梯通过平层区的时候可能一直导通如果用电平触发PLC会反复消号、反复置位开门动作乱成一团。用上升沿就只触发一次干净利落。这个边沿触发的思路在PLC编程里用得太多了刷门禁、计数、故障记录全都用得到。4. 开关门控制与安全保护4.1 开关门时间怎么控制开关门看着简单就两个输出一个开门一个关门但细究起来坑很多。门机不是一通电就完事的它需要到位限位来告诉PLC门已经打开了或者已经关上了。如果门关到位了关门继电器还继续输出门机电机会一直堵转时间长了不是烧电机就是打齿。我的程序里开门逻辑是收到开门条件后置位Q0.2开门当开门到位信号I1.4接通后复位Q0.2同时开始一个定时器。定时器时间到之后置位Q0.3关门。关门到位信号I1.5接通后复位Q0.3。如果关门过程中有人按了开门按钮或者光幕/安全触板动作就要立刻转到开门状态。这里有人可能会在开门到位后不加定时器直接关门结果门刚开一条缝就关回去了乘客根本来不及进出。我一般把开门保持时间设为3到5秒如果超载就延长保持时间同时程序里不再执行关门动作。这种带有“点人”性格的处理其实就是你程序写得细不细的体现。4.2 门锁回路运行的硬前提电梯的门锁反馈是几乎所有安全规范里都强调的点。意思就是电梯想要运行所有厅门和轿门必须关好门锁回路必须闭合。在S7-200程序里我把I1.6门锁闭合反馈串在运行输出的主回路上门锁不通上下行接触器一律不得吸合。有人可能觉得这只是个输入条件串不串无所谓电梯嘛运行起来再把门关上不就行了但真实逻辑不是这样。你可以想象一个场景电梯正在从1楼到3楼的途中程序运行得好好的结果到了2楼时有人把2楼厅门扒开了门锁回路断开。如果程序里没有门锁条件电梯会继续往上跑这绝对是不可接受的。所以运行输出的梯形图里门锁反馈不是可有可无的辅助条件而是必须串接的硬条件。另外提一个细节点光靠I1.6一个点去判断门锁整个回路是闭合的其实有风险因为串联回路中只要有一层厅门没关好I1.6就是不导通但程序只会知道“门锁没通”不知道具体是哪层门的问题。在真实项目里每一层厅门锁都是一个微动开关串联成一条回路接到PLC再用一个地址去判断。调试点位的功夫往往就花在这种细节上。4.3 超载与故障状态的处理超载信号在模拟项目里可以不做但真机上这个信号必须给PLC。超载开关通常装在轿厢底部的称重装置上一旦超载输入点动作。我的程序逻辑是超载时不允许关门同时点亮超载指示灯直到超载信号消失才恢复。这里最容易犯的错误是只在自动运行模式里处理超载检修或者消防模式下就觉得无所谓。其实检修模式也应当做超载保护只是允许维修人员强制关门而已。故障状态的处理我一般分成两类一类是即时故障比如门锁断开、安全回路断开这类故障要立刻切断运行输出让电梯停下来另一类是累积故障比如开门超过设定次数、连续几次开门不到位这类故障要给个报警输出让人来检查。S7-200的定时器和计数器可以很好地做这类逻辑故障保持用置位做故障消除用复位做一目了然。5. 实操中的常见坑与排错思路5.1 按钮信号抖动和误触发我第一次调试电梯程序时被一个现象折磨了很久楼层呼梯按钮按一下程序好像登记了两次或者有时候明明按下去了电梯却没反应。查了一圈发现不是PLC程序的问题而是按钮本身的机械抖动。按钮按下时触点会快速弹跳几次PLC扫描周期又短一次按压被当成多次信号处理了。解决办法有两个方向。一个是在程序里加延时检测到按钮闭合后延时几十毫秒再确认有效另一个是直接用S7-200的计数器加定时器做个滤波逻辑或者干脆用带硬件消抖的按钮模块。对于教学项目我建议程序里加个轻微延时滤波不需要太复杂只要让信号稳定后再判断就行。5.2 呼梯信号不消除或者乱消除呼梯信号不消除是我见过最多的问题而且通常伴随另一个怪现象——电梯明明到了这层也开门了但指示灯还是亮的。出问题的原因大概率是消号条件里缺少“方向匹配”的判断或者用的触发方式不对。比如我之前说的电梯从1楼上到3楼中间经过2楼时你程序里假设把2楼的上行外呼消掉了但如果消号条件是“到达2楼且方向是上”而你的程序里方向判断的中间继电器没有正确置位那这个信号就永远消不掉。排查这类问题最好的方式是在程序里加几个临时状态位通过状态监控看方向标志是否和预期一致优先级比盯着输出猜快得多。还有另一个极端信号消得太快。电梯还没到2楼只是在前往2楼的途中某个边沿触发的条件不够严谨结果把2楼的呼梯信号提前消了。这样电梯到了2楼也不停。我还遇到过一种情况是2楼的平层感应器安装位置太靠上电梯减速时正好扫到感应器但轿厢还没完全到平层结果提前消号门开在半空。这种问题通常得靠调整感应器位置来解决程序再怎么改都救不了。5.3 上下行切换瞬间的“纠结”三层电梯因为楼层少有时候会出现一个特别有意思的现象电梯刚往上走两步程序发现高层呼梯被取消了于是下行判断又成立电梯马上换向往下走。这种来回折腾不仅效率低而且乘客在轿厢里能明显感觉到晃动。我在方向切换的程序里加了一个机制——方向切换延时。当当前方向已经确定时即使另一方向的呼梯条件满足也要经过一段延时比如1秒才能切换方向。这个延时的作用是防止瞬间反向的误判。S7-200里用接通延时定时器TON很容易实现。你在实际做的时候也可以根据电梯的实际运行速度去调这个时间跑得快就短一点跑得慢就长一点。再补充一点如果同一个楼层既有上行外呼又有下行外呼电梯到达该楼层时方向如果匹配就应该把对应的外呼消掉另一个留着继续等下个方向。这个前面讲过但实际调试时一定要确认两个外呼信号没有共用一个中间继电器地址否则二楼乘客一按上行就把下行的信号也覆盖了电梯就会漏接人。5.4 输入点不够怎么办三层电梯用到的输入点其实不少如果用的是S7-200的CPU 221这种只有6个输入点的小家伙那肯定不够。这时候有人会想到扩展模块但如果你手头没有扩展模块就得想点别的办法。我的经验是把非关键信号做并接或者减少冗余采集。比如内呼按钮和外呼按钮同时放在常开触点上信号进入PLC前先经过继电器转接用一个输入点做一层楼的“呼梯总信号”方向再由内部中间继电器区分。这种做法虽然会让信号采集少一些细节但在I点紧巴巴的项目里很实用。不过提醒一句安全相关的信号门锁、安全回路绝对不能省输入点那里出了偏差是要出事的。6. 程序结构组织与小技巧6.1 梯形图的段怎么划分才不乱S7-200的程序结构不像博途里有OB、FB、FC可以拆得那么细致但它也支持用主程序、子程序和中断程序来组织代码。我写电梯程序时的习惯是主程序只管框架逻辑包括呼梯登记、方向选择、运行控制。子程序放一些重复调用的逻辑比如楼层显示转换。中断程序处理一些需要高实时性的信号比如急停、门锁断开这类安全信号。如果非要用一个梯形图把从输入到输出全写完也不是不行但程序一长后面想改一个地方经常要往上翻好几屏才能找到相关触点效率极低。分段的话我最常分的是“呼梯登记”“方向选择”“运行控制”“平层处理”“开关门控制”“故障处理”这几个网络块每个块之间用网络标题隔开再写注释。6.2 中间继电器地址规划写PLC程序最忌讳的是中间继电器地址乱用今天用M0.0表示一楼内呼明天又用M0.0表示门锁状态后面排查的时候根本分不清谁是谁。我规划M点的时候会按功能分类预留地址段。比如M0.0到M0.7留给内呼M1.0到M1.7留给外呼M2.0到M2.7留给方向与状态标志M3.0以下留给故障与安全逻辑。这样写起来思路清晰读程序的人也不需要一边猜一边看。尤其在多人协作或者后期维护的时候一个清晰的地址规划表比任何注释都管用。6.3 用状态监控加速排查S7-200的编程软件里有一个状态图表功能可以实时监视和修改M点、Q点、I点的值。我调试电梯程序时一定会开一个状态窗口把方向标志、呼梯登记、当前楼层、门锁状态、超载状态全部拉进去。这样调试的时候眼睛看状态表就知道电梯当前在“想什么”。比如电梯不动你看方向标志是不是已经置位了如果置位了那就是运行输出的启动条件没满足可能门锁没通如果方向标志都没置位那就是方向选择逻辑有问题往上查呼梯登记对不对。用这个思路排查基本没有查不出来的问题。7. 一个小彩蛋怎么让电梯“有点性格”标题里说“带性格的电梯控制程序”其实所谓性格就是通过程序写进去的响应偏好。比如有的电梯停靠时间比较长方便老人小孩有的电梯响应外呼更积极尽可能少让人等有的电梯在闲时自动回到一楼待命。三层电梯的模拟项目里最容易体现“性格”的几个点空闲停车楼层设定。如果长时间没有呼梯电梯自动返回一楼并把门打开。这个在S7-200里用一个长时间定时器加比较指令就能做。高峰时段优化。比如上班高峰期程序优先响应上行呼梯下行呼梯可以稍微等一下。这个通过改变方向选择逻辑里的优先级实现。故障响应策略。某些非关键故障比如某层外呼按钮损坏可以跳过该层继续服务而不是整梯停运。当然这只针对辅助信号安全回路故障必须整梯停运。这些东西听起来不算复杂真正写起来却需要你对前面这些基础逻辑掌握得很牢。等你能随意修改电梯的“性格”而不影响安全逻辑时你的PLC编程水平就已经过了最辛苦的那个阶段了。我在实际做这类项目时最有体会的一点是PLC程序表面上写的是逻辑本质上是把你的控制思路用机器能理解的方式精确表达出来。很多问题在调试台上反复出现根源往往不是指令不会用而是控制流程没想清楚。所以写程序之前多花点时间把电梯当作一个人去思考它每一步会做什么、为什么会这样做、哪些情况它会蒙写出来的梯形图自然会从“能跑”变成“好跑”。