
前阵子帮朋友做了一个教学演示用的五层电梯模型硬件就是西门子S7-1200 PLC加一块KTP1200触摸屏。过去说起“电梯控制系统”很多人觉得是工厂里的专用控制柜或者直接用继电器搭个逻辑就完事等自己动手在TIA Portal里把S7-1200的程序和KTP1200的画面真正拉到一起才发现这里面的坑并不比一个中小型自动化项目少。这篇文章就按我实际做的这个项目来讲硬件怎么选、I/O怎么分、程序怎么组织、HMI怎么联动以及调试阶段非常容易碰到的层楼错乱和信号抖动问题。适合正在做电梯课题、或者想搞明白1200系列PLC和KTP触摸屏如何配合的工控朋友参考。1. 电梯控制系统到底要解决什么问题1.1 从使用场景倒推控制需求做任何控制系统第一步都别急着拉线写程序先把“这个系统到底要干哪些事”列清楚。我们的五层教学电梯模型最核心的就三件事知道电梯在哪知道乘客要去哪然后决定电梯怎么走、到哪停、开门关门。展开说就是电梯必须能检测到每一层的平层位置这是判断“电梯现在在第几层”的基础轿厢内要有楼层按钮每个楼层候梯厅要有上行、下行召唤按钮拿到这些呼梯信号之后PLC要判断运行方向、记录目标楼层等电梯运行到目标楼层平层位置时减速停下开门让乘客进出然后关门继续响应下一个呼梯。除了呼梯和位置还有一类信号最容易被人忽略——安全信号。急停、门锁反馈、上下限位、超载这些信号不参与电梯的正常调度但任何一个出问题电梯都必须立刻停止运行优先级是最高的。我在前面文章里也一直强调一个观点先按“输入—逻辑—输出”把需求拆开再谈硬件选型否则到后面程序一复杂I/O点不够、逻辑纠缠在一起返工成本特别高。1.2 为什么选S7-1200配KTP1200这套组合我见过不少入门项目用继电器搭电梯逻辑也有用单片机加数码管做的。继电器方案的问题在于逻辑改起来非常痛苦电梯这种“有方向、有记忆、有多层呼梯”的控制继电器回路搭完基本没法再动单片机方案便宜但调试时看不到内部状态出了问题只能对着代码猜。S7-1200加KTP1200的组合优势恰恰体现在这个地方。S7-1200属于西门子小型PLC里性价比很能打的一款自带以太网口支持PROFINET程序容量和指令功能对电梯这种规模的逻辑来说绰绰有餘KTP1200是一块12英寸的触摸屏可以直接通过PROFINET与S7-1200通信不需要额外转接。两者都在TIA Portal一个工程里组态开发调试体验非常顺。我做的这个五层模型CPU用的1214C DC/DC/DC数字量输入输出点数不够的地方加了一个SM 1223扩展模块成本可控逻辑覆盖又很完整。如果是做两层、三层的小模型S7-1200 CPU自带的I/O基本就够了。这也是我推荐用它做教学演示项目的原因——既不会因为资源太紧张而削足适履又不会像大型PLC那样配置繁琐。2. 硬件规划先算I/O点数再选模块2.1 I/O点数的完整计算过程很多人选PLC不问点数先买CPU结果硬件到现场发现输入输出差几个点被迫改设计或者加扩展模块耽误时间不说还很打击信心。正确的顺序应该是先把每一个输入信号、每一个输出负载列成清单再倒推CPU和模块型号。以五层电梯为例输入信号大约有这几类每层一个平层感应器5个、每层候梯厅呼梯按钮一层只设上行、顶层只设下行中间层上下行都有共8个、轿厢内楼层按钮5个、开门按钮1个、关门按钮1个、门锁反馈1个、上强迫换速开关1个、下强迫换速开关1个、上限位开关1个、下限位开关1个、急停1个、超载开关1个。合计约27个数字量输入。输出信号相对少上行接触器1个、下行接触器1个、开门继电器1个、关门继电器1个、到站钟1个再加上预留的两三个备用输出点大概需要6到8个数字量输出。1214C CPU自带14个数字量输入和10个数字量输出算下来输入不够输出勉强够用。所以我在CPU左边加了一个SM 1223模块8点输入加8点输出输入输出缺口全部补齐还留了备用点。这套方案的优势在于CPU和模块统一通过TIA Portal组态接线也规整不需要额外考虑通信接口。2.2 I/O分配表的实际标注I/O分配表看着简单写的时候有几处容易埋雷。一是编号要留冗余别从头到尾密密麻麻排满否则后面想加一个信号就得整体改程序里的地址引用二是把重要安全信号放在固定编号段方便查线和写程序时识别。我做的分配表大致如下信号描述PLC地址数据类型备注1层平层感应I0.0BOOL常开感应到铁片闭合2层平层感应I0.1BOOL同上3层平层感应I0.2BOOL同上4层平层感应I0.3BOOL同上5层平层感应I0.4BOOL同上1层上行呼梯I0.5BOOL按钮自复位2层上行呼梯I0.6BOOL按钮自复位2层下行呼梯I0.7BOOL按钮自复位3层上行呼梯I1.0BOOL按钮自复位3层下行呼梯I1.1BOOL按钮自复位4层上行呼梯I1.2BOOL按钮自复位4层下行呼梯I1.3BOOL按钮自复位5层下行呼梯I1.4BOOL按钮自复位轿内1层按钮I1.5BOOL按钮自复位轿内2层按钮I1.6BOOL按钮自复位轿内3层按钮I1.7BOOL按钮自复位轿内4层按钮I2.0BOOL按钮自复位轿内5层按钮I2.1BOOL按钮自复位开门按钮I2.2BOOL按钮自复位关门按钮I2.3BOOL按钮自复位门锁反馈I2.4BOOL门完全关闭闭合上强迫换速I2.5BOOL常闭信号下强迫换速I2.6BOOL常闭信号上限位I2.7BOOL常闭信号下限位I3.0BOOL常闭信号急停I3.1BOOL常闭信号超载I3.2BOOL常开信号上行接触器Q0.0BOOL驱动上行下行接触器Q0.1BOOL驱动下行开门继电器Q0.2BOOL驱动开门关门继电器Q0.3BOOL驱动关门到站钟Q0.4BOOL到站提醒备用Q0.5~Q0.7BOOL预留这张表里的I0.0到I2.7跨了三个字节实际1214C加上SM1223扩展后地址会按模块排列可能不是连续的。真正做的时候要以上位机分配的地址为准我只是给大家一个逻辑上的编排参考。重要的是思路先给危险信号和安全串链信号划定区域再安排普通呼梯信号。2.3 安全回路的接线思路平心而论教学模型的安全回路不需要像真实电梯那样满足严格的安全规范但逻辑设计必须保留安全优先的概念。我采用的是“安全链串接”的思路把急停、上限位、下限位、门锁反馈这些信号串联在一起任何一个断开PLC程序立刻切断上下行接触器输出。接线上这些开关串联程序里再用常闭逻辑判断。真实工程中的安全回路还可能包括限速器、安全钳、断绳保护等开关的串联并且有独立于PLC的硬件安全回路直接切断主接触器电源。即便是教学演示我也建议在硬线里串联急停和上下限位因为一旦程序跑飞或者模块损坏物理断链仍然能保证曳引机断电。这个习惯能避免很多演示现场“电梯刹不住”的事故。3. 电梯控制程序的核心逻辑呼梯、方向与平层3.1 程序架构OB、FC与DB怎么划分电梯控制逻辑比单纯的起保停电路复杂得多如果全部塞进OB1程序会变成一坨谁都看不懂的毛线团。我的习惯是建一个OB1主循环然后按功能拆成几个FC功能块FC1处理呼梯登记与复位FC2处理运行方向判断FC3处理楼层定位与平层停车FC4处理开关门控制FC5处理安全信号联锁。数据统一放在DB1里DB1里划分结构体比如内呼数组、外呼上行数组、外呼下行数组、当前楼层、目标楼层、运行方向等。这种分法的好处很明显第一将来要改“电梯到站开门”逻辑只动FC4不会碰方向判断第二调试的时候可以单独监控一个FC里的临时变量第三HMI要读取当前楼层和运行方向只需要关联DB1里的对应变量不需要在程序里到处找。DB1中我建议把变量名起得规范一些比如currentFloor、targetFloor、direction、insideCall[1..5]这类方便HMI变量表和监控表直接引用。TIA Portal支持中文变量名但触摸屏和程序交互时中文容易出现编码问题所以我还是用英文变量名HMI画面的标签用中文显示。3.2 呼梯登记与复位的梯形图方式呼梯信号本身是自复位按钮按下闭合松开断开。如果直接用这个信号去驱动电梯运行电梯还没启动信号就没了所以必须把每一次按钮按下“记忆”下来这就是呼梯登记。在梯形图里我用一个自锁网络实现按钮按下对应BOOL位置ON电梯到达该楼层并平层停稳后再把这个BOOL位复位。比如内呼5层的逻辑I2.1是5层内呼按钮DB1.insideCall[5]是记忆位。按钮按下时如果电梯还没到5层置位记忆位电梯平层停在5层、开门到位后复位记忆位。外呼的上下行按钮逻辑同理分成两个数组分别记忆。这里有个细节容易出错如果5层是轿厢内呼目标同时5层候梯厅有人按下行外呼这两个信号在程序里都需要登记但复位时不能互相误清。我的做法是到站后先延迟两秒再统一复位该楼层的所有呼梯信号给程序一个稳定窗口。实际调试时发现这个延迟窗口很有必要能避免开门瞬间呼梯灯闪烁。3.3 方向判断与顺向截梯的算法逻辑有了呼梯登记接下来就轮到方向判断。教学模型我用的是集选控制逻辑核心思路就一句话电梯在一个方向上运行只响应该方向上所有顺路的呼梯当前方向没有呼梯后再判断是否存在反向呼梯存在则换向。具体到程序实现我建了一个“方向判断”的FC2输入是DB1里的内呼、外呼数组和当前楼层输出是上行方向、下行方向两个BOOL。电梯静止时先看有没有目标楼层高于当前楼层有就置位上行全部低于当前楼层就置位下行如果两个方向都有我按“先进先出”的思路记录第一次呼梯的时间这个流程在教学项目里可以简化成固定优先级我在模型里是优先响应上行呼梯。运行过程中FC2持续扫描当前方向上的呼梯信号如果目标楼层在当前楼层的运行前方就继续维持该方向否则准备换向。顺向截梯的意思也在这里电梯从1层向上行驶途中2层有人按下行外呼按集选逻辑只要上行方向还没执行完2层下行呼梯不会立刻被响应电梯继续向上完成上面的呼梯等最后一次下行时再停2层。这个逻辑在梯形图里需要认真处理“方向互锁”和“同方向响应”的优先级我用了两个中间BOOL来锁存方向确保任何时候不会出现上行和下行同时输出的状态。3.4 平层停车与开关门控制电梯怎么知道“到站了”模型里依靠每层的平层感应器。程序里我维护一个“当前楼层”变量平时靠运行方向和强迫换速开关来校正。比如电梯上行经过3层平层感应器接通当前楼层更新为3之后继续上行到达3层与4层之间的上强迫换速开关时程序判断目标楼层不是4层开始减速然后等待4层平层感应器一接通立刻停止上行输出完成停车。这套逻辑听起来简单实际有一个非常烦的问题平层感应器在物理上有一定宽度电梯低速经过时信号会保持一小段时间。如果程序只做“感应器接通就更新当前楼层”运行速度快一点就会因为扫描周期错过信号导致层楼错乱。我采用的方案是记录平层感应信号的前沿用上升沿触发楼层更新同时对感应信号做一段50毫秒左右的软件滤波消除金属抖动带来的误触发。这样楼层计数在反复上下运行几百次后也能保持稳定。开关门控制相对直白电梯停稳且门锁反馈断开时可以输出开门继电器乘客按下关门按钮或者开门延时时间到就输出关门继电器关门到位后门锁反馈闭合电梯才允许响应下一次运行。这里重点提醒一点关门继电器和开门继电器在程序里必须互锁不能同时输出我见过有人直接拿一个BOOL反相控制两路输出结果继电器切换瞬间由于机械滞后两个接触器瞬时都吸合了直接把24V电源干跳闸。正确做法是程序中分别输出两个BOOL位并且在输出侧做软件互锁Q0.2和Q0.3之间还要记得在PLC程序里互相禁止。3.5 安全信号的联锁处理安全链逻辑我放在FC5里集中处理。急停、上限位、下限位、门锁反馈、超载等信号全部参与联锁计算任何一个触发输出一个“安全允许”BOOL位作为FC2方向判断和Q0.0、Q0.1输出回路的前置条件。这里有个编程习惯非常关键安全类开关一般用常闭触点。常闭触点在正常状态下是闭合的一旦断线或者被按下信号电平变低程序判定为不安全。这样“断线”和“动作”都能被检测出来电梯会进入保护状态。我之前有一次把上限位接成常开结果限位开关接线松动后系统毫无察觉直到电梯冲顶才暴露问题。所以常闭编程逻辑真的要贯彻到底。4. KTP1200触摸屏的画面设计与数据联动4.1 画面结构规划不是画几个按钮那么简单KTP1200这块屏面对五层电梯模型足够用。我规划了四个画面主运行画面、呼梯面板画面、状态监控画面、报警画面。主运行画面放了楼层数字显示、上下行方向箭头、当前运行状态文本以及开门关门两个大按钮呼梯面板画面模拟轿内和候梯厅的呼梯按钮用带指示灯的按钮原件亮表示呼梯已登记状态监控画面显示所有I/O点的实时状态报警画面留给PLC报警消息。画面规划的核心原则是操作人员做日常操作时眼睛只需要盯住主画面信息一目了然排查问题时才进入状态监控画面看细节。按钮原件在KTP里默认按下时变量置1松开置0这正好对应自复位按钮的特性。如果你把按钮属性设成“切换”按下之后变量一直保持1那呼梯登记逻辑就全乱了这个细节我后面调试时会提到。4.2 HMI变量连接方式与优化块访问问题KTP1200和S7-1200同在TIA Portal工程中组态后HMI变量可以之间关联PLC变量不需要组态专门的通信连接。我建了一个专门的HMI变量表把DB1里的currentFloor、direction、insideCall数组等逐一关联进去。这里必须提醒一个非常常见的坑S7-1200的DB块默认开启“优化块访问”这种模式下DB变量没有固定的绝对地址HMI在下载时可能无法正常访问表现为触摸屏上所有数据都是“#####”或者“###”。解决方法是选中DB1右键属性把“优化块访问”关掉然后重新编译下载HMI才能稳定读写。我第一次做的时候没注意到这个选项折腾了大半天最后发现就是这里的问题。编译下载顺序也有讲究先编译PLC再编译HMI然后先下载PLC程序再下载HMI画面。如果顺序反了HMI下载时可能因为找不到关联的PLC符号而报错。4.3 按钮交互设计里的“上升沿”陷阱触摸屏上那些呼梯按钮直接关联DB1里的呼梯记忆位按下一次置位。但KTP上按钮按下时也会遇到信号保持的问题如果操作员按住按钮不放PLC侧的呼梯记忆位一直被置位是没问题的因为自锁逻辑会保持。但开门、关门按钮如果设计不好就会出现“按住关门门一直关松开就开门”的奇怪现象。我的处理思路是触摸屏按钮对应的PLC侧逻辑只取按钮信号的上升沿。比如关门按钮按下瞬间置位一个“关门请求”这个请求在门完全关闭后自动复位。触摸屏上按钮的变量虽然按着不动但程序侧的“关门请求”已经转为内部状态不会因为触摸屏变量一直为1导致反复触发。对于门口外呼这类信号更要在FC1里用上升沿做登记否则按钮抖动一次程序可能登记两次。4.4 报警消息与权限管理KTP1200支持在PLC程序里触发报警消息我就把急停、上限位、下限位、门锁反馈这几个安全信号各配了一条报警文本触发条件用常闭逻辑反相正常为0异常为1。报警出现时显示在主画面的报警条上同时记录到报警历史中方便查故障时间线。权限管理这块容易被初学者跳过。KTP1200支持用户组和权限等级我设置了操作员和管理员两个等级操作员只能操作呼梯按钮和开关门管理员还能进入状态监控画面和报警复位页面。这个功能在演示项目中看着可有可无但一旦将来项目越做越大有权限管理能避免很多误操作。5. PROFINET通讯配置与联动调试5.1 网络组态与IP地址规划在TIA Portal里组态S7-1200和KTP1200的网络是标准操作。设备列表里把两个设备都拖进去切换到网络视图在PLC的PROFINET接口上添加一个子网然后把HMI也连接到同一个子网。IP地址我习惯固定分配S7-1200是192.168.0.1KTP1200是192.168.0.2子网掩码都是255.255.255.0。这里要特别确认PC在下载时IP也在同一网段比如192.168.0.10否则下载设备时TIA Portal根本找不到目标设备。实际现场有人喜欢用网口自动获取IPPLC还是可以设置固定IP的。HMI如果设成自动获取有时会分配到其他网段导致PLC和HMI互相找不到。我的建议是在项目里就明确把两个设备的IP固定下来并且做进文档里避免后续维护时糊涂。5.2 下载顺序与在线诊断的完整流程项目调试中最常见的问题其实是“下载失败”。TIA Portal下载PLC时如果PG/PC接口选择错误或者子网里有多台设备下载时就会报错。我惯用的流程是先给PC固定一个和PLC同网段的IP然后在线访问里搜索节点确认能搜索到设备后再执行下载。HMI画面下载也有讲究KTP1200下载时设备会进入传输模式屏幕变黑并且显示几行文字下载结束后自动跳回用户画面。如果下载过程中USB线意外断开HMI可能卡在启动界面需要重新上电。KTP1200与S7-1200二者都支持直接通过以太网口下载不需要额外编程电缆现在只带一根网线就能搞定整套联调。5.3 联动不上的常见原因排查我总结过几次联动失败的经历最常见的原因无非四类IP不在同一网段、HMI变量关联了不支持的数据类型、优化块访问未关闭、编译后没有重新下载全部设备。IP问题用在线诊断视图就能查清楚数据类型问题多半出现在数组和结构体变量上KTP对数组变量的读取需要PLC侧先做好变量表映射我直接将数组元素逐个关联不直接关联数组整体优化块访问问题前面已经讲过最后一种重新编译下载就能解决。另外还有一些隐蔽的小问题HMI画面引用的变量名和PLC侧不一致时编译会报黄感叹号整个变量会变成无效值。遇到画面数据全是“####”的时候别急着怀疑硬件先把变量连接检查一遍多半是这里出了问题。6. 调试阶段最容易踩的坑从层楼错乱到误触发6.1 层楼错乱问题的完整复盘层楼错乱是我这个项目调试时耗费时间最长的问题。现象是电梯连续运行几次后当前楼层显示变成错误值该在4层停的结果在3层就停了。复盘下来根源在两个方面。第一平层感应器信号没有做滤波金属接近开关在感应瞬间会有多次抖动程序如果只采集一次状态有可能把抖动当成真实楼层信号更新了几次当前楼层。第二扫描周期的影响电梯低速运行经过平层感应区时非常短一个扫描周期内信号从0变1再变0梯形图如果只用状态判断而不是上升沿就会直接错过这个楼层。解决办法我在前面也提过所有平层感应信号都经过一个50毫秒延时的滤波器再进入楼层更新逻辑楼层更新用上升沿触发同时强迫换速开关也用来辅助校正楼层。这样改完以后我让电梯在五层之间连续跑了上百个往返楼层显示始终没有跳过。6.2 按钮粘连与信号抖动问题另一个频繁出现的问题是呼梯按钮触发不稳定。模型上用的是机械自复位按钮按下时触点会有几毫秒到几十毫秒的抖动PLC扫描很快可能在同一段扫描时间内多次检测到按钮通断。程序如果不处理一次按下可能登记两次呼梯或者门还没完全打开就开始关门。处理方式就是在FC1里对所有按钮信号统一加上上升沿检测并且做小型延时滤波。上升沿保证了同一个物理动作只登记一次延时滤波滤掉触点抖动。这个思路在很多工业按钮场景都通用。KTP触摸屏上的虚拟按钮虽然不存在机械抖动但触摸屏变量刷新周期和PLC扫描周期不同步也可能出现同一个操作被识别两次所以上升沿逻辑同样必要。6.3 常闭信号与断电保护逻辑我前面反复提过常闭信号在调试现场真的栽过跟头。当时梯形图里急停触点用的是常开写法程序里判断急停信号为1时触发保护。问题出现在急停按钮的线意外断开时PLC得到的信号是0程序认为一切正常继续允许运行。这个隐患非常危险如果发生在真实电梯上断线会导致安全功能静默失效。改成常闭逻辑之后断开或按下都是信号变0程序里统一判断0触发保护整个系统的诊断能力上了一个台阶。后来我把上限位、下限位、门锁反馈也全部改成常闭逻辑接线松动时触摸屏报警画面立刻弹出来。6.4 HMI数据保持与断电重启调试尾声我还遇到一个HMI上的小问题电梯断电重启后触摸屏上的当前楼层显示为0但实际上电梯停在4层。原因是DB1里currentFloor变量没有配置保持属性PLC断电后变量被初始化为0。S7-1200的DB变量可以单独设置保持也可以设置保持区域。我把currentFloor、目标楼层还有几个状态BOOL设成保持断电重启后电梯还能记住自己在哪里。这一点看起来不起眼但演示现场断电再上电、如果楼层显示乱跳非常影响观感。如果要做更严谨的处理可以在PLC上电初始化时强制让电梯先低速运行查找平层位置用强迫换速开关和限位开关重新确立物理楼层再同步到HMI。这个问题是很多入门项目都不会考虑到的但实际运行中挺重要。就我个人调试这个五层电梯模型的经验来说最大的感受是S7-1200和KTP1200的联动真正难的不是建变量、连画面而是把“电梯知道自己在哪、知道要去哪、知道怎么安全停下来”这套逻辑理清楚。每一层呼梯登记、方向互锁、平层滤波、安全常闭这些细节单独拿出来都是常规操作组合在一起却极度考验程序架构和调试耐心。如果你也正在做类似的项目我建议先把安全链和楼层定位做扎实再折腾触摸屏美化底层逻辑稳了后面的工作基本就是水到渠成的事。