
简介本资源是一套基于西门子S7-1200 PLC实现的六层电梯控制系统完整工程文件面向自动化、电气工程及相关专业初学者与实践者解决电梯逻辑控制建模、多楼层召唤响应、平层定位、开关门协同及安全保护等核心问题。压缩包共34个文件含6个XML配置文件用于设备组态与通信参数、5个DEL与CFS文件系统数据块与符号表支持、1个.tis项目结构文件及多个.plf、.idx、.db等TIA Portal工程必需的底层编译与索引文件整体大小为638KB结构符合标准S7-1200项目组织规范。已有513人学习下载可直接导入TIA Portal V15及以上版本进行编译、仿真与硬件下载。读者将获得可运行的梯形图/ST混合逻辑程序、完整的PLC地址分配表、楼层信号采集与状态机控制流程、以及包含UserFiles、PEData、XRef等模块的成熟工程目录结构是理解工业级电梯控制逻辑与PLC工程化开发的优质实操范例。 从学生时代的课程设计开始一直到后来做真实的三层、六层甚至高层电梯改造“基于PLC的六层电梯控制程序S7-1200”基本上是绕不开的经典题目。去年整理硬盘的时候我翻出自己这套用博途TIA Portal写的S7-1200六层电梯控制程序顺手重新打开工程跑了一遍仿真发现核心逻辑放到今天依然通用只是当年踩过的那些坑、总结出来的调试方法现在再回头看更清晰了。这篇就把整个设计思路、I/O分配、程序架构、实操步骤和排查经验完整拆开讲不管你是准备PLC课程设计、毕业设计还是初学者接了电梯改造项目都能拿来直接参考。1. 项目概述电梯控制程序到底要解决什么问题1.1 电梯控制的核心是“调度”而不是“动作”很多新手第一次接触电梯控制第一反应是纠结“怎么让电机转起来”实际上PLC控制电梯和变频器控制电机是两回事。在标准电梯改造中六层电梯的拖动电机一般由变频器带动PLC根本不需要直接输出PID调速信号它只负责决定“往上还是往下”“到第几层停”“门开多久”。也就是说PLC站在调度层采集各种按钮和传感器信号通过逻辑判断产生方向指令、停层指令、开关门指令再把这些指令输出到接触器、继电器或变频器让对方去执行。所以六层电梯控制程序的核心本质上是三个逻辑问题呼叫如何登记、方向如何判定、到站如何停车开关门。把这三个问题想透了程序怎么写都不会乱。1.2 为什么选S7-1200做六层电梯六层电梯的开关量点位大概在40点以内输入约25到30点输出约10到15点这个规模用西门子S7-1200来跑非常舒服。S7-1200的CPU自带14DI/10DO配合一个SM 1221数字量输入模块或者SM 1223数字量混合模块点位完全够用硬件成本不高。编程软件TIA Portal博途是现在西门子的主流环境比Step 7老界面友好太多支持梯形图、SCL、FBD初学和学习工控的人上手快。集成以太网口下载调试方便网线一插就能在线监控变量、强制信号比老式MPI/DP电缆体验好一个时代。后续如果要接上位机C#、LabVIEW、Java读数据或者Profinet远程从站S7-1200都是现成支持不用换平台。从课程设计和工程应用两个角度来说S7-1200都是“性价比很高的选择”。有些学校教材还在用200SMART或三菱FX系列做电梯那也很好只是我下面讲的具体组态和指令会以S7-1200博途为准。1.3 六层电梯系统整体构成整套控制系统可以分为三个部分信号输入侧、PLC控制器、执行输出侧。信号输入侧包括轿厢内选层按钮1到6层共6个、厅外召唤按钮1层只有上召6层只有下召中间2到5层有上召和下召共10个、每层平层开关/楼层感应开关共6个用于判断轿厢当前到哪一层、门锁信号、开关门到位信号、超载信号、急停信号、检修模式信号。执行输出侧包括上行接触器、下行接触器、开门继电器、关门继电器、楼层显示驱动、方向指示灯、到站提示铃。这样一个系统输入点位可以做到26到30个输出点位10到14个。所以我建议CPU选择1214C DC/DC/DC再扩展一块SM 1221 DI 16或者用SM 1223的8DI/8DO组合。后者虽然模块多一块但能让输出冗余更充裕。2. 硬件搭建与I/O信号分配2.1 输入信号梳理不能只数按钮把输入信号列出来这一步看着简单实际上一错后面全乱。很多初学者拿到的参考图纸里I/O表写得七零八落照着接线后程序怎么调都别扭大部分问题出在平层信号和门区信号的处理上。六层电梯最常用的楼层检测方案是在井道内每层安装一个感应开关或隔磁板轿厢侧面安装一个平层感应器。轿厢经过哪一层哪一层的信号就有效PLC据此判断当前楼层。注意这个信号不是“持续保持”的轿厢离开该层后信号就消失所以程序中必须用当前楼层记忆机制运行到某层时把当前楼层号更新并保持直到下一次更新。还有一种方案是接近开关加计数用高速计数器HSC统计脉冲算楼层但六层电梯用不到这么复杂每个楼层一个感应点最简单可靠。内呼和外呼按钮就更直接了内呼6个外呼10个1层上召、6层下召、2到5层上下召各一全部为自复位按钮接到PLC数字量输入点。这些按钮在程序中要用置位/复位方式“记住”不能被瞬时的按钮脉冲冲掉所以要登记和消号。下面是我实际项目中常用的一组I/O分配参考你可以直接用PLC地址信号名称说明I0.0~I0.5内呼1~6层按钮轿厢内选层I0.61层上召唤厅外呼梯上I0.7、I1.0、I1.12/3/4层上召唤厅外呼梯上I1.25层上召唤厅外呼梯上I1.32层下召唤厅外呼梯下I1.4、I1.5、I2.03/4/5层下召唤厅外呼梯下I2.16层下召唤厅外呼梯下I2.2~I2.71~6层平层开关井道楼层感应I3.0门锁信号所有厅门轿门闭合I3.1开门到位信号开门机反馈I3.2关门到位信号开门机反馈I3.3超载信号超载开关I3.4急停信号常闭串入I3.5检修/慢车模式检修时强制低速Q0.0上行接触器控制电机正向Q0.1下行接触器控制电机反向Q0.2开门继电器开门机动作Q0.3关门继电器关门机动作Q0.4楼层显示ABCD编码个位Q0.5楼层显示BBCD编码Q0.6楼层显示CBCD编码Q1.0上行方向灯指示上行Q1.1下行方向灯指示下行Q1.2到站铃/蜂鸣器到站提醒这张表不是死的。比如平层开关数量、外呼接线顺序都可以根据现场调整但有一个原则必须保证所有输入点中急停、门锁、上下行接触器这类安全相关信号必须接常闭逻辑也就是线路断开时PLC读到的必须是“停车条件不满足”而不是“允许运行”。这样一旦断线电梯停在原处而不是疯跑。2.2 输出侧执行机构接触器互锁是保命项输出侧最核心的是上行接触器和下行接触器。这两个接触器任何时刻只能有一个吸合否则主回路短路轻则跳闸重则烧变频器。程序里当然要做互锁即上行条件满足时强制复位下行输出下行条件满足时强制复位上行输出但程序互锁不等于物理互锁。在电气回路上同样必须用接触器辅助触点做硬件互锁KM1的常闭触点串联在KM2线圈回路里KM2的常闭触点串联在KM1线圈回路里。这是我反复强调的程序只是软逻辑硬件才是保命底线。开门和关门继电器也是一样不能同时输出。虽然开门机和关门机在物理上通常自带限位但PLC在逻辑上还是要做到二选一而且要有“关门途中再次开门”的处理。至于楼层显示最省输出的方式是用BCD码输出3个输出点Q0.4、Q0.5、Q0.6组合代表1到6层二进制再接一个BCD到七段码的译码器驱动数码管。这样比直接给七段码输出省一半以上的点。有些项目直接用触摸屏显示楼层号那就更省了PLC只需把当前楼层号放到一个整型变量里。2.3 接线实操注意强弱电混装最容易出问题电梯控制柜里既有220VAC的接触器、变压器又有24VDC的传感器和PLC接线时最忌讳强电和弱点捆在一起走线槽。我在现场吃过亏PLC输入信号线跟接触器线走同一根扎带接触器一吸合PLC的AI/AO信号乱跳。后来改成强弱电分离输入信号用屏蔽双绞线传感器和PLC电源用一个独立的DC24V开关电源问题才消失。另外S7-1200数字量输入默认是漏型接法也就是NPN传感器接法公共端M接DC24V负极。如果你现场用的是PNP型传感器在自动化行业很常见要么选源型输入接法要么用中间继电器转接。这个接错了指示灯不亮但信号一直没进来排查起来特别浪费时间。3. 核心控制逻辑设计与程序架构3.1 程序架构用OB、FB、DB把逻辑拆干净S7-1200的程序不建议全部堆在OB1里做六层电梯虽然逻辑不算复杂但把功能拆开后期调试、改型号、换楼层数都会方便很多。我习惯这样分程序块功能OB1主循环调用下列所有功能FC1输入去抖与呼叫登记FC2当前楼层识别与楼层记忆FC3目标楼层汇总与方向决策FC4停层判断与开关门控制FC5显示输出与指示FB1电梯主控状态机可选进阶用DB1电梯运行数据区当前层、目标层、呼叫数组等OB1作为主程序去调用各个FC看起来多了一层但实际上每个功能的代码量都不大而且能独立测试。尤其是方向决策和停层判断这两块单独拉出来写出现问题时不至于在几百行梯形图里翻。3.2 楼层识别从输入信号到当前楼层号楼层识别虽然不复杂但处理不好会出现楼层乱跳。我用一个整型变量CurrentFloor存储当前楼层类型Int。当每一层的平层开关信号有效时把这个楼层号写入CurrentFloor。梯形图或SCL里写法是IF #FloorSensor[1] THEN #CurrentFloor : 1; ELSIF #FloorSensor[2] THEN #CurrentFloor : 2; ELSIF #FloorSensor[3] THEN #CurrentFloor : 3; ELSIF #FloorSensor[4] THEN #CurrentFloor : 4; ELSIF #FloorSensor[5] THEN #CurrentFloor : 5; ELSIF #FloorSensor[6] THEN #CurrentFloor : 6; END_IF;这看着简单但实际工程中会出现一种情况电梯运行速度太快PLC扫描周期长结果经过中间某一层时该层平层开关的脉冲刚好被扫描周期漏掉导致楼层显示跳到两层之外。解决方法是在接近预定停靠楼层时提前减速让轿厢以慢车速度通过平层区这样每次扫描都能稳定捕捉到每层信号。如果在纯开关量方案里没有变频器减速配合那就在程序里多做几次采样确认或者用高速计数方式捕捉但一般电梯调试时首车都会调慢车。3.3 呼叫登记与消号用置位/复位别用自锁内呼和外呼按钮都是瞬时脉冲按下1秒松开PLC必须在松开后依然“记得”这个呼叫。初学者最容易想到的是自锁电路用按钮接通一个中间继电器Q再用Q的常开触点保持回路。这个在PLC里完全可以做但更推荐用置位/复位SR因为清晰、不容易出错。以1层内呼为例梯形图逻辑是网络1I0.0按下有效则 SET #CallInside[1]网络2当电梯到达1层且开门到位时满足消号条件则 RESET #CallInside[1]这样每个呼叫按钮就对应一个Bool变量登记就是置位到达消号就是复位。外呼同理只是外呼还得分上行呼叫和下行呼叫。有个细节值得注意厅外呼叫按钮不像内呼到站后要不要消号要看电梯运行方向。比如电梯正在上行5层有人按了上召电梯到达5层停靠这时候上召消号没问题。但如果5层有人按下召而电梯正在上行会先经过5层不停因为不顺路这时下召不能被消掉必须等电梯下行到达5层再消。这就是顺向截梯规则中的“方向性消号”。3.4 方向决策顺向截梯算法方向决策是整个电梯控制程序中最有含金量的部分。六层电梯虽然规模小但算法逻辑和三十层电梯是同一个套路。我的做法是构造两个数组内呼数组CallInside[1..6]、外呼上召数组CallUp[1..6]、外呼下召数组CallDown[1..6]。这里注意1层没有下召6层没有上召但数组下标统一没用的地方置FALSE即可。上行决策电梯当前处于停止状态或者正在上行过程中。如果当前是停止状态只要存在任何一个目标楼层高于当前楼层就进入上行状态。如果电梯正在上行任何高于当前楼层的有效呼叫内呼上召下召都可以被纳入目标范围但这些呼叫要分优先级顺向的呼叫对上行来说上召是顺路内呼也是顺路优先响应下行召唤只在它位于电梯当前行驶方向前方时才会被“顺路”带上否则要等下一次下行。下行决策同理反向处理。在实际的纯PLC梯形图里我不会写太多复杂的循环多用比较和置位。比如用MaxFloor变量保存当前方向上“最远目标楼层”。找到所有高于当前层的有效呼叫取最大值作为本次上行的“终点层”。电梯向上运行过程中只要CurrentFloor等于某个有效目标楼层就停层。到达终点层后再判断是否有反方向的呼叫如果有就换向下行如果没有电梯停在终点层待机。用SCL写这段逻辑会更直观// 搜索上方向最远目标楼层 #HighestTarget : #CurrentFloor; FOR #i : #CurrentFloor 1 TO 6 DO IF #CallInside[#i] OR #CallUp[#i] OR #CallDown[#i] THEN #HighestTarget : #i; END_IF; END_FOR; // 存在高于当前层的目标则输出上行 IF #HighestTarget #CurrentFloor THEN #DirectionUp : TRUE; ELSE #DirectionUp : FALSE; END_IF;注意这个FOR循环在OB1里执行没有压力六层循环周期极短整个PLC扫描周期也就几毫秒完全不影响实时性。3.5 停层与开关门控制别忽略平层精度电梯运行到了目标楼层怎么停下来不是一到位就立即开门而是要经过“平层检测→减速停车→开门继电器动作→开门到位→延时→关门继电器动作→关门到位→运行准备”这一整个流程。门联锁是电梯里最重要的一环电梯运行前门锁信号必须有效I3.0为TRUE表示所有厅门和轿门都已闭合运行过程中如果门锁信号突然消失程序必须立刻断开上下行输出让电梯急停。这个逻辑要用硬件回路和程序双重保证。开门延时一般设5到8秒具体看现场客流量。延时可以用S7-1200的TON定时器。关门过程中要判断关门到位信号如果一定时间内门没关到位要能再次开门重新关这是最基础的防夹逻辑。真实电梯还有光幕或安全触板但六层电梯教学项目里可以用“开门到位信号断开”来简单模拟。3.6 显示与指示BCD显示和方向灯当前楼层号送到显示输出时要把CurrentFloor整数转换成BCD输出。如果需要用Q0.4、Q0.5、Q0.6三位输出表示1到6层可以写成#DisplayBCD : #CurrentFloor; // 1~6 #Out_A : #DisplayBCD.0; // 位0 #Out_B : #DisplayBCD.1; // 位1 #Out_C : #DisplayBCD.2; // 位2上行/下行方向指示灯直接由方向标志驱动。到站铃可以在平层完成的瞬间输出一个0.5秒脉冲用TON实现。4. 博途实操从建工程到在线调试4.1 新建项目与硬件组态打开TIA Portal新建项目设备里选择S7-1200对应的CPU型号。我手头版本如果是V15及以上基本都能选到1214C DC/DC/DC固件版本一般选V4.x。建完CPU后添加SM 1221数字量输入模块16点或SM 1223模块。组态界面上可以看到每个I/O点的地址自动分配。建议在组态里把设备名称、IP地址先设置好比如IP设为192.168.0.10这样后面仿真和下载不容易混乱。注意博途不同版本打开同版本工程也会有系统提示需要升级的情况。老版本工程用新版本打开会弹出“项目升级”提示确认即可。但如果你的工程是V18做的V15是打不开的这一点下载别人工程前一定先确认版本。4.2 程序编写先搭变量表再写逻辑写程序前我强烈建议先建好全局变量表PLC tags。把I0.0、Q0.0这些实际地址和语义名称绑定好后面写梯形图全是看名字不会写错地址。我的习惯是输入信号统一命名In_InnerCall_1F、In_UpCall_3F、In_FloorSensor_5F、In_DoorLock输出信号统一命名Out_MotorUp、Out_MotorDown、Out_DoorOpen、Out_DoorClose程序内部变量统一放DBCurrentFloor、DirectionUp、CallInside数组等然后OB1里依次调用FC1到FC5。FC1里写输入去抖用S7-1200自带的输入延时滤波器或者简单用TON做20ms去抖。FC2做楼层识别FC3做方向决策FC4做停层开关门FC5做显示输出。这里给一个FC3方向决策的简化SCL参考方便你理解整体逻辑// 先复位方向输出 #Out_MotorUp : FALSE; #Out_MotorDown : FALSE; // 上行条件有高于当前层的目标 #DirUpReq : FALSE; FOR #i : #CurrentFloor 1 TO 6 DO IF #CallInside[#i] OR #CallUp[#i] OR #CallDown[#i] THEN #DirUpReq : TRUE; END_IF; END_FOR; // 下行条件有低于当前层的目标 #DirDownReq : FALSE; FOR #i : 1 TO #CurrentFloor - 1 DO IF #CallInside[#i] OR #CallUp[#i] OR #CallDown[#i] THEN #DirDownReq : TRUE; END_IF; END_FOR; // 互锁输出 IF #DirUpReq AND NOT #DirDownReq THEN #Out_MotorUp : TRUE; ELSIF #DirDownReq AND NOT #DirUpReq THEN #Out_MotorDown : TRUE; ELSE // 上下方向同时有请求按当前所处位置顺序处理 // 简单做法优先运行当前方向一致的一侧 END_IF;这段代码还可以再优化但作为六层电梯的第一版已经能跑。真正投入现场前一定要在仿真里反复测试边界情况。4.3 使用PLCSIM仿真验证S7-1200在博途V15及以上版本可以使用S7-PLCSIM仿真。仿真启动后把程序下载到虚拟PLC然后在“仿真PLC”里手动改变输入变量状态来模拟按钮信号、平层开关信号。好处是不需要真实硬件课程设计答辩前完全可以跑通整个流程。我测试逻辑的时候一般按这个顺序在1层模拟按下6层内呼按钮观察方向输出是否上行、楼层显示是否变化。把2到5层平层开关依次短暂置位模拟电梯经过观察CurrentFloor是否更新递增。到了6层观察是否消号、是否开门到位。在6层模拟按下2层外呼下召观察电梯是否反向下降、2层是否消号。测试门锁断开电梯运行中把In_DoorLock复位看上下行输出是否立刻断开。如果仿真中这5步全部通过程序的基本功能就没大问题。4.4 下载与在线调试仿真通过后连接真实PLC。用网线连接电脑和CPU博途中选择“在线访问”设置PG/PC接口为对应网卡。设置PLC的IP地址保证电脑和PLC在同一网段。下载硬件组态和程序。下载完成后把CPU切换到RUN模式。在线监控打开监控表把所有I/O变量和关键中间变量都拉出来实时看状态变化。调试现场要注意首次上电前断开主回路只给PLC送电先检查输入信号采集是否正确。逐个按下按钮看对应的输入变量是否置位。如果输入信号没反应优先查线路、查公共端别急着改程序。输入部分确认没问题后再接通主回路用检修模式低速点动检查电机转向是否与方向指令一致。5. 常见问题与排查技巧实录5.1 输入抖动导致呼叫反复触发按钮和继电器触点按下过程会有机械抖动PLC可能一个按钮按下去同一信号在0.1秒内跳变数次。结果就是内呼按一下楼层显示乱跳或者消号瞬间又被再次登记。解决方法是给每个按钮信号加20ms左右的去抖用TON定时器或读取输入滤波器参数。S7-1200的DI模块可以在组态里直接设置数字量输入滤波时间0.1ms到20ms可选调试时设成6.4ms或10ms即可。5.2 电梯运行中楼层数跳变或丢失最常见原因是平层开关信号在PLC扫描周期内有效时间太短刚好被漏掉。典型场景是快车速度过快轿厢经过一层时的信号持续时间小于一个扫描周期。解决思路校核电梯快车速度必要时加装提前减速信号双平层开关方案。在程序里用“多周期确认”逻辑平层信号连续两个扫描周期有效才更新楼层号。确认平层开关的常开/常闭接法有没有和程序反了。5.3 门锁断开后电梯还在运行这个现象一旦出现必须停线检查。不仅是程序问题很可能硬件回路里门锁触点没串进运行接触器回路。我调试时遇到过一种情况门锁信号接的是PLC的输入点但是接触器吸合回路里没有串门锁触点结果门锁一断PLC程序虽然输出了停车但接触器仍然保持吸合电梯继续走。所以安全回路必须硬接线串到接触器控制回路不能只靠PLC逻辑。这也是我一直强调的“程序互锁≠物理互锁”。问题现象可能原因排查顺序按钮按下无反应公共端接错、传感器类型不对先查硬件接线再看PLC在线信号电梯到达楼层不停平层信号没扫到、目标楼层判断错误检查平层信号状态和CurrentFloor变化上下行同时输出程序互锁缺失、输出点短路立刻断电检查硬件互锁楼层显示乱跳输入抖动、平层开关离得太近加滤波、检查安装间距关门后无法运行门锁信号没到、关门到位没延时监控门锁和关门到位信号时序仿真正常现场不行干扰、接线、电源地不干净检查屏蔽接地、强弱电分槽5.4 电梯停在中间楼层没有任何呼叫时乱跑电梯没有呼叫时应停在当前楼层不动。如果出现乱跑多半是方向决策逻辑里“请求信号”没有被正确清零。例如外呼按钮信号置位后电梯到了一层的上召消号但程序里忘复位对应的CallUp[1]导致呼叫一直存在。所以调试时要把每一个置过的呼叫变量在合适时机都复位并且用监控表跟踪呼叫数组的状态。5.5 博途版本、固件与工程兼容性问题热词里有人问“博途V18支持S7-1200 CPU1211C所有版本固件吗”这里统一回复一下博途V18对S7-1200系列的支持是全面的1211C、1214C这些型号都支持但不代表所有老固件都能直接下载。CPU固件V4.x基本没问题个别V2.0/V3.0的老版本可能需要升级固件后才能在V18工程里使用。下载别人做的程序包时先确认对方是哪个博途版本V15还是V16还是V18版本差太多一般打不开或需要升级升级前先备份工程。另外S7-1200和S7-200 SMART的工程文件不互通用200SMART的梯形图不能直接拖到S7-1200里运行知识点可以迁移但程序要重建。6. 扩展思考从六层电梯到群控和上位机完成六层电梯控制后如果想往深走有两个方向我特别推荐一个是多电梯群控。两部电梯同时工作需要对前后门、召回、闲梯停靠做调度核心仍然是方向决策和呼叫分配但要把“呼叫归属”做出来内呼只能由当前轿厢响应外呼则需要根据哪部梯更顺路来分配。可以用S7-1200之间的Profinet通信或者I/O交换来实现这是我做过最有趣的控制扩展。另一个是上位机数据采集。通过S7-1200的以太网口上位机用C#、Java或LabVIEW可以读取PLC里的当前楼层、运行方向、故障信号做成电梯监控界面。S7-1200支持S7协议通信上位机轮询读取DB里的数据PLC端不需要额外编程只要把要监控的数据放到全局DB并保证可访问状态即可。这部分和当前热门的工业物联网采集是同一个思路很多初学者从电梯项目入门再拓展到上位机正好形成完整的工控知识闭环。在折腾这套六层电梯程序的过程中我最大的感受是电梯控制这个题目虽然看起来简单但能把呼叫登记、方向判断、停车开关门这些逻辑做到稳、不冲突、不丢信号需要非常缜密的思路这也是很多公司招聘PLC工程师时喜欢拿电梯当面试题的原因。你把它做完一遍再回头看那些机械手、分拣线、运动控制的程序很多套路是相通的。本文还有配套的精品资源点击获取