简介:这是一份基于西门子博途V15.1软件的单步六层电梯控制程序资源,面向自动化专业学生、PLC开发人员及电梯控制技术爱好者,适合用于理解楼层呼叫、顺向集中控制与反向呼叫无效策略等典型控制逻辑。资源共52个文件,压缩包大小7.95MB,以工程配置和程序文件为主,其中包含ap15_1项目主文件、xml配置描述、plf/idx布局索引、cfs/db等数据文件,以及HMI相关画面与搜索索引文件,基本覆盖博途项目从PLC程序到触摸屏组态的主要模块,解压后可直接在软件中打开分析,文件分类清楚,便于按需查找。当前已有874人学习或下载这一资源。阅读工程可了解复位、启动、多楼层顺向逐层运行、同层重新计时以及运行中反向呼叫无效等场景的编程实现,帮助快速上手博途项目结构,也可作为课设或竞赛中电梯控制题目的参考模板,尤其适合进行功能仿真与定时调试验证。 说实在的,第一次看到“单步六层电梯(博图V15.1)”这个题目时,你可能以为是个简单的课程设计,但真正上手后会发现,电梯控制几乎是PLC逻辑控制的集大成者——楼层判断、方向互锁、呼梯响应、平层停车、开关门时序,全挤在这么一个小系统里。我当年带学生做这个项目时,很多人卡在“电梯不走”或者“停错楼层”上,最后发现基本都是逻辑顺序不对、变量规划不清。这篇就来把这套单步六层电梯从方案设计到程序实现、再到仿真调试的完整过程捋一遍,用的就是西门子博图V15.1 + S7-1200这套组合。不管你是自动化专业的在校生、刚入行的PLC工程师,还是培训机构里正在啃电梯案例的学员,这篇文章都能给你一条相对完整的路线。
先解释一个概念,什么叫“单步”。电梯控制按响应策略分很多种,单步是最基础的一种:系统一次只响应一个呼梯指令,处理完这个指令(到达楼层、开门、关门)再去处理下一个。它不像全集选那样会提前规划路径、顺路捎带,也不涉及群控调度。优点就是逻辑清晰、安全可靠、代码量小,非常适合拿来理解电梯控制的核心流程。等单步逻辑吃透了,后面再写顺向集选、加减速曲线,无非是在这个骨架上添砖加瓦。
1. 项目整体设计与控制思路
1.1 单步控制策略的核心逻辑
既然叫“单步”,那么整个控制流程必须符合一个状态链条:空闲等待 → 收到呼梯 → 判断方向 → 运行 → 平层停车 → 开门 → 延时关门 → 复位呼梯 → 回到空闲。这条链路上每一步都有严格的触发条件,少一个条件程序就会卡住。
这里有个很关键的设计决策:呼梯信号要不要锁存?必须锁存。按钮是瞬时的,人按一下可能只有几百毫秒,扫描周期一过信号就没了,必须用置位指令把呼梯请求记下来,等电梯完成服务后再复位。这个“置位-等待-复位”的过程就是电梯控制最核心的节奏。
另外一个容易忽略的点是:单步模式下,如果多个楼层同时呼梯怎么办?真实电梯有完善的排队算法,但单步教学项目通常采用简化策略——固定优先级。常见的实现是楼层号低者优先,或者直接在第一个呼梯信号到来时锁定目标楼层,后续呼梯全部忽略,直到本次服务完成。我在实际带项目时倾向于用“锁定目标楼层”方案,因为逻辑最简单、跑起来最稳定,程序调试的时候不会出现目标楼层来回跳的诡异现象。
1.2 博图V15.1与硬件选型方案
博图V15.1(TIA Portal V15.1)是西门子全集成自动化平台的一个经典版本,支持S7-1200、S7-1500、S7-300/400等系列PLC的组态、编程和调试。做这个项目选S7-1200系列是完全够用的,具体型号常用CPU 1214C DC/DC/DC,自带14路数字量输入和10路数字量输出,单步六层电梯的数字量I/O点刚好能覆盖住,不需要额外扩展模块(除非你要把每个按钮的状态灯都接出来)。
硬件组态这一步没啥门槛,但要养成好习惯:新建设备时一定要核对订货号。很多新手卡在“组态的设备在线找不到”,十有八九是订货号跟实物不一致。博图V15.1里创建项目后,在“添加新设备”里直接选CPU 1214C,确认固件版本和订货号即可。下载到真实PLC之前,也可以先通过PLCSIM做纯仿真调试,节省现场时间。
选博图还有个好处:梯形图、SCL、STL三种编程语言可以混用。后面我会重点说为什么这类控制逻辑用SCL写状态机更舒服,但梯形图的互锁逻辑也不能丢。两种语言各干各擅长的事,才是工程上比较合理的用法。
2. 系统I/O规划与内部数据结构
2.1 I/O点表:从现场信号到PLC地址
我在教程里见过很多版本的点表,有的把外呼按钮设计成“每层一个单按钮”,有的设计成“上行/下行双按钮”,有的甚至还加了超载开关、光幕信号。但作为单步教学项目,我建议不要一上来就把点填得太满,把核心信号规划好就够了。下面这套点表是实际验证过、能跑通整个流程的:
| 类型 | 地址 | 名称 | 说明 |
|---|---|---|---|
| 输入 | I0.0 | 内呼一层按钮 | 轿厢内选层,楼层按钮 |
| 输入 | I0.1 | 内呼二层按钮 | 轿厢内选层 |
| 输入 | I0.2 | 内呼三层按钮 | 轿厢内选层 |
| 输入 | I0.3 | 内呼四层按钮 | 轿厢内选层 |
| 输入 | I0.4 | 内呼五层按钮 | 轿厢内选层 |
| 输入 | I0.5 | 内呼六层按钮 | 轿厢内选层 |
| 输入 | I1.0 | 一层外呼按钮 | 每层一个,简化版不区分上下行 |
| 输入 | I1.1 | 二层外呼按钮 | 同上 |
| 输入 | I1.2 | 三层外呼按钮 | 同上 |
| 输入 | I1.3 | 四层外呼按钮 | 同上 |
| 输入 | I1.4 | 五层外呼按钮 | 同上 |
| 输入 | I1.5 | 六层外呼按钮 | 同上 |
| 输入 | I2.0 | 一层平层开关 | 每层安装平层感应器 |
| 输入 | I2.1 | 二层平层开关 | 同上 |
| 输入 | I2.2 | 三层平层开关 | 同上 |
| 输入 | I2.3 | 四层平层开关 | 同上 |
| 输入 | I2.4 | 五层平层开关 | 同上 |
| 输入 | I2.5 | 六层平层开关 | 同上 |
| 输入 | I3.0 | 开门按钮 | 轿厢内开门按钮 |
| 输入 | I3.1 | 关门按钮 | 轿厢内关门按钮 |
| 输入 | I3.2 | 开门到位限位 | 门开到位反馈 |
| 输入 | I3.3 | 关门到位限位 | 门关到位反馈 |
| 输出 | Q0.0 | 上行接触器 | 电机正转,控制轿厢上升 |
| 输出 | Q0.1 | 下行接触器 | 电机反转,控制轿厢下降 |
| 输出 | Q0.2 | 开门继电器 | 开门机构动作 |
| 输出 | Q0.3 | 关门继电器 | 关门机构动作 |
| 输出 | Q0.4 | 运行状态指示灯 | 电梯运行指示 |
| 输出 | Q0.5 | 到站指示/蜂鸣器 | 平层到站提示 |
这套点表最大的特点就是“够用、不臃肿”。外呼和内呼分开,但逻辑上可以共用一套目标楼层处理流程,编程省事。外呼不区分上下方向,意味着乘客按下外呼按钮后,电梯只需要到达楼层即可,不需要判断“是要上行还是要下行”,对单步项目来说非常友好。
2.2 内部变量与数据块设计
很多新手一上来就写梯形图,写完一个网络又一个网络,最后自己都看不懂。核心问题在于:没有先想清楚“系统里需要哪些中间变量”。电梯控制本质上是在维护几个关键状态,建议用一个独立的DB块管理这些数据。
我习惯建立一个DB_ElevatorData数据块,内部变量大致如下:
CurrentFloor:当前楼层,INT类型,由平层开关信号实时刷新,电梯到哪一层就更新成对应楼层号。TargetFloor:目标楼层,INT类型,呼梯信号触发后锁存,服务完成后清空。UpCommand:上行命令,BOOL类型,方向判断的结果。DownCommand:下行命令,BOOL类型,同上。CallLock[1..6]:内呼锁存位,数组或6个独立的BOOL变量。OutCallLock[1..6]:外呼锁存位,同理。State:系统状态编码,INT类型,0=空闲,1=上行,2=下行,3=开门,4=关门。
为什么要单独建DB块而不是直接用M区?结构化。变量多了之后,M区地址容易记混,而且博图对DB块变量支持符号寻址,调试时看监控表非常直观。写梯形图时直接拽变量名,程序可读性比裸地址高一个档次。
当前楼层的维护值得特别说一句:不要用“电梯运行时间或脉冲数推算当前位置”,要用平层开关的信号刷新。这是保证电梯不“跑丢”的唯一可靠手段。程序里每个扫描周期扫一遍6个平层输入,哪个亮了就把CurrentFloor更新成对应的楼层号。这个方法简单到没什么技术含量,但它就是绝对可靠。
3. 核心程序逻辑与关键实现
3.1 呼梯信号锁存与目标楼层锁定
呼梯处理是整个程序的入口,推荐用梯形图实现,因为按钮信号和锁存位的关系非常直观。以一层内呼为例:I0.0的常开触点串联一个“电梯未到达一层”的常闭条件,驱动M0.0置位;当电梯到达一层、门打开、服务完成后再用复位指令清掉M0.0。锁存的意义前面说了,就是防止按钮松开后请求丢失。
目标楼层的锁定逻辑要单独写,不能用简单的赋值指令直接覆盖。我的做法是:在空闲状态(State=0)下,如果有任何一个呼梯锁存位置位,就把对应的楼层号写入TargetFloor,同时把State从0切到“运行准备”状态。一旦TargetFloor被写入,后续的呼梯信号只置位对应的锁存位,不再更新TargetFloor——直到本次服务结束,CallLock和OutCallLock全部清空,State回到0,才允许重新锁定目标。
这个设计就是单步控制“一次只处理一个指令”的代码体现。如果不加这个锁定条件,程序就会反复执行“取最后出现的呼梯”这个动作,运行中途目标楼层一变,电梯就会在楼层之间来回折腾,看着就像抽风。
3.2 运行方向判断与电机正反转互锁
方向判断逻辑本身并不复杂:TargetFloor > CurrentFloor就上行,TargetFloor < CurrentFloor就下行,相等就该平层开门。但在工程实现里有一个非常容易踩的坑:方向指令不能只给一个扫描周期,必须“保持住”。
为什么?因为电梯运行过程中,每经过一层平层开关都会刷新CurrentFloor,假如目标楼层是5层,电梯刚过3层时CurrentFloor=3,条件成立继续运行;到4层时又刷新成4,还是成立,继续走;只有到5层时TargetFloor=5,等于条件,方向指令撤销,停车。如果你只在某个扫描周期进行一次比较、不保持输出,电梯刚起步方向就丢了,根本到不了目标楼层。
电机控制还必须做双重互锁。硬件上,上行接触器KM1和下行接触器KM2的常闭触点要串进对方的线圈回路,这是硬互锁,防反接短路;程序里也要做软互锁——Q0.0的线圈回路里串Q0.1的常闭触点,Q0.1的线圈回路里串Q0.0的常闭触点。博图编程时这个操作很简单,但千万别省。我曾经见过一个学生做了硬互锁就忽略了软互锁,结果调试时程序逻辑出了一次错,两个输出同时为1,接触器直接“啪”地跳闸,太吓人了。
3.3 平层停车与开关门时序控制
电梯到达目标楼层后,触发平层开关,程序需要完成一串动作:停方向输出 → 启动开门 → 延时 → 关门 → 关门到位 → 复位呼梯锁存 → 回到空闲。这串动作用梯形图写网络能写六七个,但用状态机思路加SCL来写会清晰很多。
我给一个简化版的SCL状态机片段,展示核心逻辑走向:
CASE #State OF 0: // 空闲,等待呼梯 IF #InnerCall_1 THEN #TargetFloor := 1; #State := 1; ELSIF #OutCall_3 THEN #TargetFloor := 3; #State := 1; END_IF; 1: // 判断方向并启动运行 IF #CurrentFloor < #TargetFloor THEN #UpCommand := TRUE; #State := 2; ELSIF #CurrentFloor > #TargetFloor THEN #DownCommand := TRUE; #State := 3; ELSE #State := 4; // 目标就是当前层,直接开门 END_IF; 2: // 上行运行,等待平层 IF #FloorSensor[#TargetFloor] THEN #UpCommand := FALSE; #State := 4; END_IF; 3: // 下行运行,等待平层 IF #FloorSensor[#TargetFloor] THEN #DownCommand := FALSE; #State := 4; END_IF; 4: // 开门 #OpenDoor := TRUE; #DoorTimer(IN := TRUE, PT := T#5S); IF #DoorOpenLimit THEN #State := 5; END_IF; 5: // 开门延时后关门 IF #DoorTimer.Q THEN #OpenDoor := FALSE; #CloseDoor := TRUE; #State := 6; END_IF; 6: // 关门完成,复位呼梯,回到空闲 IF #DoorCloseLimit THEN #CloseDoor := FALSE; #ResetAllCall(); #State := 0; END_IF; END_CASE;这段代码不是完整项目,但状态脉络非常清楚。这里有个细节值得展开:平层开关的判断用的是“第几个平层传感器亮了”,也就是数组索引#FloorSensor[#TargetFloor]。如果平层输入在真实接线里是按楼层顺序接的,索引直接对应楼层号,代码简洁且不容易出错。如果接线顺序乱了,就必须在写地址时做一个映射表,否则电梯永远找不到家。这一条,项目验收时很多同学翻过车。
3.4 梯形图与SCL的混用策略
可能有读者要问:全用梯形图行不行?行,但不是最佳方案。全用SCL行不行?也行,但互锁逻辑的可视化程度会低。工程上我推荐混用:呼梯锁存、输出互锁用梯形图,运行状态机用SCL。
原因是,呼梯锁存和互锁本质是“电路逻辑”,梯形图跟继电器电路同构,现场电工看着也熟,出了问题好排查;而状态机本质是“流程逻辑”,SCL的CASE语句天然匹配“状态-事件-迁移”的写法,比梯形图一串串跳转指令直观得多。S7-1200支持在同一个项目中创建多个FC/FB,每个块可以选用不同语言,调用时互相嵌套完全没问题。
实测下来,这种混用结构在调试阶段的优势最明显。梯形图部分可以用监视模式直接看每个网络的通断状态,SCL部分则可以在变量监控表里盯住State的值变化。电梯卡在哪个状态、为什么卡住,一眼就能定位。
4. PLCSIM仿真调试与问题排查实录
4.1 用PLCSIM做全流程模拟验证
没有真实PLC的时候,博图V15.1自带的PLCSIM就派上大用场了。操作流程不复杂:写好程序后,在博图里点“启动仿真”按钮,软件会自动拉起S7-PLCSIM,然后把硬件组态和程序一起下载进虚拟PLC。之后就可以像操作真机一样监视变量、强制输入。
仿真的关键技巧是熟练掌握“强制表”。比如要模拟“3层内呼被按下”,可以在强制表里把I0.2强制为TRUE,扫描几个周期后恢复FALSE,模拟一个真实的按钮动作过程。同样,模拟电梯到达目标楼层时,把对应层平层开关强制为TRUE,程序状态机就会向后推进。整个过程不需要接一根线,纯粹靠强制输入模拟现场信号,非常适合初学者在动手接线前先把逻辑跑通。
需要注意,PLCSIM的定时器行为跟真实PLC基本一致,但仿真速度可能受电脑性能影响。如果发现延时时间明显偏长或偏短,先别怀疑程序,看看是不是仿真负载太高。
4.2 常见问题速查与解决思路
做这个项目过程中,我遇到过、也见学生遇到过很多典型问题,整理成一张速查表,挨个对照排查效率很高:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 按下呼梯按钮后电梯完全没反应 | 呼梯锁存位未置位;门锁条件未满足;目标楼层锁定逻辑未触发 | 监控呼梯锁存位和State值,确认按钮输入有上升沿,确认关门到位信号为TRUE |
| 电梯运行后冲过目标楼层才停 | 平层信号未接入;平层开关地址映射错误;停梯条件写成了“楼层相等”而非“平层开关触发” | 检查目标楼层的平层开关强制信号,确认FloorSensor[#TargetFloor]能变成TRUE |
| 电梯在本层反复启停、抖动 | 方向判断在多个扫描周期里反复执行;目标楼层未锁定 | 检查TargetFloor是否被锁定到服务结束,方向输出是否持续保持 |
| 到站后开门,但门一直不关 | 开门延时计时器未触发;关门输出条件缺失;开门到位限位常闭条件没串对 | 监控DoorTimer.Q和关门输出,确认计时器在开门后启动 |
| 运行中两个输出同时为1 | 软互锁未做或做得有误 | 检查上行输出网络里是否串联了下行输出常闭触点,反之亦然 |
| 仿真时一切正常,真实PLC上不走 | 输入接线接反;信号地未接;接近开关类型不匹配 | 先在线监视输入点,操作按钮看对应I点是否翻转 |
这里面我想特别强调“平层开关”的处理。很多学生习惯用“当前楼层等于目标楼层”来判断是否停车,但电梯在真实运行时,因为惯性,平层开关触发和编码器/传感器读数会有微小偏差,直接比较楼层号容易造成停车位置不准。更稳的做法是:运行过程中持续扫描6个平层开关,一旦目标楼层的那个平层开关变为TRUE,立刻停方向输出。这样就算CurrentFloor刷新稍有延迟,停梯位置也是可靠的。
4.3 实操心得与几个值得优化的方向
项目做完之后,如果只停留在“能跑”这一步,收获会打折扣。我每次带人做这个项目,都会建议在基础版本之上做几个小升级,既加深理解又锻炼水平。
第一个方向是加“显示功能”。当前方案里没有做楼层显示和方向指示,实际教学中可以加一个七段数码管显示当前楼层,或者用触摸屏做个简单的HMI画面。博图V15.1里面集成了WinCC,组态一个画面把CurrentFloor、State、呼梯锁存位显示出来,交互感一下子就上来了。这块内容不多,但能把“PLC逻辑编程”和“HMI画面组态”串起来,对找工作写简历也有帮助。
第二个方向是给开关门加“安全逻辑”。比如开门状态下禁止运行、关门过程中检测到障碍物自动开门、超载时不启动等。这些在实际电梯标准里都是强制要求,教学项目虽然可以简化,但至少应该理解其背后的设计思想。加一两个条件并不复杂,但对理解“安全回路”的概念非常有帮助。
第三个方向是做一个加宽版本的“双步排队”策略——一次可以记录两个呼梯指令,电梯完成第一个后自动响应第二个。这是从单步到全集选之间的一个很自然的中间过渡,改起来也只需要把“锁定目标楼层”改成“维护一个长度为2的优先级队列”,状态机结构不需要大动。有了单步六层的基础,这个扩展项目我见过最快的同学两天就搞定了。
最后再分享一个真实调试中的小教训:无论仿真跑得多顺利,第一次接真实PLC测试时,一定先把主回路断开,只给PLC和输入输出模块通电,手动操作按钮,确认每个I/O点都跟点表对得上,再接通电机主回路。这一步听起来麻烦,但它能避免大多数“接线错误烧接触器”的事故。我见过不止一个聪明学生省了这一步,最后花了三倍时间排查,还搭进去几个元器件。
单步六层电梯这个项目,说难不难,说简单也绝不含糊。它把一个完整工业控制系统该有的输入采集、逻辑运算、输出驱动、状态管理全走了一遍。你在调试过程中踩过的每一个坑、理清的每一段逻辑,后面做再复杂的系统都用得上。先把这条单步链路跑通,电梯控制的半壁江山,基本就到手了。
本文还有配套的精品资源,点击获取