六层电梯听上去没什么新鲜的但真把它当成一个完整的PLC顺序控制项目来对待从IO规划到运行调试能暴露出来的问题远比你想象的多。这个项目我用的是西门子S7-1200CPU 1214C DC/DC/DC配博图TIA Portal V15.1完成了一部六层电梯的呼叫、定向、开关门、楼层定位和基础保护逻辑。写这篇文章不是要给你一套拷贝就能用的“万能程序”而是想把我从组态、写逻辑到现场查错的全过程拆开讲清楚包括那些文档里不会告诉你的取舍和坑。如果你正打算用S7-1200做类似的多楼层顺序控制或者被电梯、物流分拣这类“信号多、时序强”的项目折磨过这篇文章应该能帮你少走不少弯路。需要先说清楚一件事电梯属于特种设备任何与安全相关的功能急停、门锁、限速器、抱闸都必须由硬件安全回路和机械装置保障。PLC程序可以做状态监控和逻辑互锁但不能替代安全硬件。我这套程序面向教学、仿真、非载人实验平台这类场景载人电梯请务必找有资质的整梯厂家和电气设计单位来做。1. 项目需求与总体方案设计1.1 六层电梯的控制需求拆解拿到需求时先别急着写程序把“电梯会怎么被人使用”翻译成PLC能识别的信号和状态这是最要紧的一步。六层电梯的典型控制需求可以拆成下面几条每个楼层厅外有上下行呼叫按钮一层只有上行顶层只有下行中间层上下行各一个。轿厢内有六个目的楼层按钮乘客选了哪层程序就要知道“轿厢要去几楼”。运行方向由当前楼层和所有待响应信号的位置共同决定核心规则是“顺向截梯、反向不响应、到端换向”。开关门动作要有时间控制关门超时、开门延续、光幕/安全触板触发后重新开门都是基本要求。平层停靠必须靠楼层感应信号定位不能靠“走固定时间”来猜。实际写的时候我还要给每个输入信号做防抖给楼层信号做“登记/消号”给方向信号做互锁。这些听起来琐碎但每一条都在减少现场调试时的意外。1.2 硬件选型与IO规划CPU我选了S7-1214C DC/DC/DC。之所以不选1211C是因为六层电梯的数字量输入要25个左右1211C的板载IO太少不选1215C是因为这个项目没有大量模拟量和高频计数需求1214C的14DI/10DO加上扩展模块已经足够成本也更友好。按最常规的IO分配来算信号类型数量说明轿厢内选楼层按钮6每个楼层一个自复位按钮厅外上行呼梯按钮5一层到五层厅外下行呼梯按钮5二层到六层楼层感应开关6每层一个平层/门区感应开门按钮/关门按钮2轿厢操作面板光幕/安全触板1门区防夹急停、检修、门锁信号3安全类状态监视上下行接触器输出2控制电机方向开门/关门继电器输出2控制门机运行状态指示灯等4楼层显示、方向指示总共DI约28点、DO约8点1214C板载14DI/10DO不够用我加了一块SM 1221 16DI数字量输入模块。值得提醒的是选扩展模块时一定要算好CPU的5V总线电流余量1214C能带的模块数量有限别把总线电流卡得太死。1.3 程序架构划分写博图程序最容易犯的错是把所有逻辑堆在OB1里。逻辑少的时候没问题一旦楼层多、信号多OB1会变成一坨谁都不敢动的“意大利面”。这个项目我按功能拆成了四块FC_Direction专职计算上下行方向和三选一换向。FC_Call_Register负责外呼、内选信号的登记、保持和消号。FC_Door_Control开关门输出、开门延时、关门超时、光幕重开。FC_Floor_Sync楼层定位、平层状态、运行到站判定。这样分的好处是现场调试时怀疑哪一部分直接只看对应FC不用在一千行梯形图里翻来翻去。四个FC在OB1里按固定顺序调用保证每个扫描周期的处理节奏一致。2. 核心逻辑模块逐块拆解2.1 楼层定位与运行方向判定楼层定位是电梯逻辑的地基。我的做法是在每层装一个磁感应开关或者用井道凸轮微动开关感应板装轿厢上。程序里把“当前楼层号”保存在一个INT变量里每个扫描周期比对6个楼层感应信号谁动作就把当前楼层置成几。这里有个细节很多初学者会漏平层感应信号动作不等于电梯一定停在该层轿厢经过楼层时感应器也会动作。所以我会区分“经过楼层”和“平层锁定”两个状态。平层锁定的条件是电梯速度已经降下来、且感应信号稳定持续超过0.3秒再配合门区信号才算真实停靠。方向判定的规则我直接用“顺向优先”实现电梯当前静止先登记的信号对应的方向优先。电梯正在上行所有大于当前楼层的呼梯信号内选加外呼都响应小于当前楼层的只登记不响应等到了最高层往下换向后才消化。反向信号来了不换向但必须登记在案不能丢。我见过有人用“最远楼层”来算方向比如把最远的内选楼层当成目标电梯一层层“拉抽屉”跑。这种算法效率太低乘客体验也差不推荐用在六层这样的场景。2.2 外呼和内选信号的登记与消号呼梯按钮本质是自复位按钮按一下是一瞬间的脉冲程序必须把它“记住”等电梯到了再“忘掉”。博图里最好用的工具就是置位/复位线圈。我习惯的做法每个楼层对应两个BOOL变量一个存上行呼梯登记一个存下行呼梯登记内选则用数组或6个独立的BOOL变量。呼梯信号来一个脉冲就置位电梯到站且方向满足时复位。面板上的呼梯指示灯直接由这个登记变量驱动信号登记和显示天然一体省很多事。需要注意的是防抖。按钮触点抖动、井道信号干扰都可能导致一次按压被识别成多次。我通常用一个0.05秒的延时接通定时器做滤波信号稳定后再置位。这个习惯在现场救过我很多次尤其是老式按钮面板抖动问题非常普遍。2.3 开关门控制与超时机制门控逻辑直接关系乘客安全和体验但这个部分的PLC程序其实不复杂核心就是几个定时器和互锁开门条件电梯平层停稳、方向已消除、门锁释放、没有运行指令。关门条件关门按钮按下、或者开门延时到点默认5秒可调同时光幕没有被遮挡。光幕触发门正在关时被遮挡立即停止关门并反转重新开门开门延时重新计时。关门超时如果光幕一直挡着导致关门动作无法完成不能无限等下去一般等2-3分钟后就持续蜂鸣提醒让乘客离开门区。还有一个细节轿门和厅门是联动的如果门锁信号没有到位即便门机继电器动作了电梯也不允许启动。这个门锁信号必须进PLC监视但真正切断运行还得靠硬件接触器互锁。2.4 安全回路与运行使能逻辑安全回路是电梯项目里最严肃的部分。程序里的安全逻辑和硬件安全回路是两层东西硬件负责真正切断程序负责状态监视、报警提示、禁止输出。我列出了这些必须监视的信号急停按钮状态。轿顶检修开关状态检修状态下所有自动运行一律不响应。门锁回路信号任何一个门没关好就不允许启动。上下行接触器反馈指令和反馈不一致时报故障并停机。在程序里我用了一个“Master_Enable”总使能位所有输出线圈的梯级都串上这个位。它由安全信号、门锁信号、检修状态共同决定只要有一个条件不满足整台梯就禁止动作。这样做的代码量增加很少但排错时非常直观——电梯不动了先看Master_Enable一大半问题都能定位。3. 博图V15.1项目实操与程序实现3.1 设备和网络组态里的三个坑博图V15.1建站时S7-1200的固件版本值得单独提一句。不同固件版本对通信指令、DB访问方式支持不一样我习惯把CPU固件选到V4.4以上很多新功能才完整。项目组态时还要手动指定PLC的IP地址我用的是192.168.0.10和上位机保持在同一个网段。这个项目还做了一路UDP通信把电梯运行状态实时广播给上位机监控屏用的是S7-1200的UDP组播功能。组播地址我选了239.255.0.10端口6000。组播的好处是一个PLC发送多个监控终端能同时收到不用逐个建立单播连接。现场组态时有三个坑要注意第一Send/Receive指令的DB必须用“优化的块访问”否则UDP数据块里没法方便地绑定字符串或者数组。第二UDP组播发送的目标IP填组播地址接收端网卡必须支持组播并且软件要主动加入组播组不然收不到数据。第三PLC侧不需要连接确认UDP本身就是无连接的但本地端口要固定否则上位机没法按端口过滤报文。通信数据我按报文帧组织内容包含运行状态、方向、当前楼层总共12个字节上位机按字节解析就行。3.2 符号表和变量表的组织习惯博图里的符号名是给人和程序看的命名好能让调试效率翻倍。我用“楼层_信号_方向”的结构来命名比如Floor1_UpCall一层上行呼梯按钮输入。Car_Call_5轿厢内选五楼按钮。FloorSensor_Arrive平层感应到位信号。Door_Open_Cmd开门输出命令。变量表里把同一类信号放在相邻行顺序按DI区、DO区、M区、DB区排。DB块我单独建了一个“Elevator_Data”全局数据块所有跨功能块共享的状态都放里面FC之间不直接耦合变量全靠这个DB中转。这个习惯保证了四个FC之间的调用关系清晰不会出现“改了一个FC就影响另一个FC”的连锁问题。3.3 核心程序块接口设计与梯形图写法来看一个实际的FC接口设计以FC_Direction为例它的输入输出定义如下FUNCTION FC_Direction : VOID VAR_INPUT Current_Floor : INT; // 当前楼层 Up_Call_Active : BOOL; // 有上行呼叫请求存在 Down_Call_Active : BOOL; // 有下行呼叫请求存在 END_VAR VAR_IN_OUT Run_Direction_Up : BOOL; // 上行输出 Run_Direction_Down : BOOL; // 下行输出 END_VAR方向判定我用梯形图加互锁。核心思路是上行方向线圈仅在“当前有上行请求、电梯没到顶、下行方向未激活”时置位下行同理。两个方向线圈之间加硬件和软件双重互锁保证同一扫描周期永远不会同时为真。下面的梯形图结构是方向判定的简化逻辑// 上行方向置位条件 A Elevator_Data.Up_Call_Active // 存在上行请求 A Elevator_Data.Master_Enable // 总使能无报警 A( L Elevator_Data.Current_Floor // 当前层 L 6 // 顶层 I // 未到顶 ) AN Elevator_Data.Run_Direction_Down // 下行方向不激活 S Elevator_Data.Run_Direction_Up // 置位上行这段代码的巧妙之处在于用“当前层是否等于顶层”作为上行方向的上限条件。每次扫描都计算一次不需要额外的终点标志位逻辑简洁也省变量。下行方向对称处理只是把顶层换成底层。3.4 模拟调试的方法和技巧博图自带的PLCSIM仿真在这个项目里非常好用。我搭了一套模拟逻辑专门用来“骗”程序里的楼层感应信号用一个变量模拟电梯最底层到顶层的运动每300毫秒递增一层让程序认为轿厢在“行驶”到了一层就把对应的平层感应信号置位。这样不需要真的造一部电梯就能把定向、响应、消号这些核心流程跑通。写模拟程序时注意模拟逻辑只是辅助不能留在最终交付的程序里。我在模拟逻辑外面加了一个Sim_Mode总开关调试时置1跑真梯时置0。有一次我忘记关掉模拟信号真梯在两层之间反复震荡查了一个多小时才发现是变量被模拟程序覆盖。这个教训让我养成了“交付前对照变量列表逐个查模拟逻辑”的习惯。4. 现场调试经验与查错手册4.1 电梯跑错层先怀疑信号再怀疑逻辑现场调试最常见的故障是电梯停错楼层表现为“明明按了四楼电梯去了五楼才停”。遇到这种问题我一般按这三步排查第一步查看当前楼层信号是否准确。多数情况是井道感应器位置不对感应板在楼层中间触发导致定位偏高或偏低半层。调整感应器支架就能解决。第二步检查消号逻辑。如果消号条件里没有加入“平层锁定”确认电梯经过目标楼层时信号提前消除轿厢就不会停。这个逻辑错误在仿真里很容易被忽略到真梯上就暴露出来。第三步看方向判定。如果电梯正在上行四楼的上行外呼被消掉了但四楼内选还在会出现电梯跑到顶层换向后又返回来停到四楼。这种“过站再回头”的现象基本都是顺向截梯逻辑没写完整。我还整理了一张查错速查表调试时直接对号入座省不少事故障现象优先排查点常见原因电梯完全不动Master_Enable、门锁、急停安全回路线没接通电梯过层不停消号信号提前置位平层锁定条件缺失电梯到站后无法开门平层信号是否稳定门区感应器位置漂移电梯关门后不启动门锁反馈信号门锁继电器没有吸合上下行同时输出方向互锁继电器/接触器硬互锁失效4.2 关门夹人和开关门频闪问题开关门频闪是调试里非常恶心的问题现象是门永远关不上好不容易合上又自己弹开。第一次遇到时我怀疑是光幕敏感度太高后来用博图的变量监控表盯着光幕信号看发现是光幕信号存在微秒级的瞬间断开把程序里的“关门速度慢/门锁到位”逻辑打断了。处理办法有两个层次程序上增加一个0.1秒的延时断开定时器把光幕瞬间扰动过滤掉硬件上给光幕供电并检查屏蔽层接地减少电磁干扰。双管齐下之后频闪问题彻底消失。这个经验告诉我遇到重复性问题别急着改逻辑先用监控表把信号波形看明白根源找准了改动才有意义。4.3 博图编程规范和版本管理的一些教训我在这个项目里用的是博图V15.1期间还因为沟通问题吃过一次亏现场工程师拿电脑在线修改了一个FC回来的版本和原始文件不一致导致第二天我自己调程序时对着新旧两版逻辑怎么都合不上。后来我定了一条死规矩所有程序改动必须先改离线项目写好改动说明再整机下载。除非发生紧急故障停机否则不碰在线修改。另外S7-1200的存储空间虽然不小但全局DB和程序块多了之后下载时间会明显拉长。我每隔一段时间就整理一次删掉不用的临时变量和测试块给正式程序留足空间。程序注释我坚持写清楚修改人和修改日期电梯这种项目周期长、参与人多没有注释的代码三个月后亲妈都认不出来。跑完这个六层电梯项目我自己最大的体会是电梯程序的核心难点不在指令复杂而在“状态之间的互锁关系”是否滴水不漏。楼层定位、方向判定、信号登记消号三大块逻辑像齿轮一样咬合任何一个变量出现问题整台梯的运行姿态都会变形。所以调试时别怕慢多拉几次变量监控波形多模拟几趟“从底层到顶层再回到底层”的完整行程问题提前暴露得越多真梯运行的时候就越稳。最后分享一个小技巧博图里的“监控表”和“强制表”是调试利器查信号用监控锁信号用强制但强制完必须撤销否则带着强制值下载轻则逻辑错乱重则输出抖动我在现场吃过苦头希望你不用再吃一遍。