ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

西门子S7-200 PLC八层电梯控制系统梯形图逻辑详解

西门子S7-200 PLC八层电梯控制系统梯形图逻辑详解

做电梯控制这行当久了,你会慢慢发现一个道理:楼有多高、层有多少其实都是表象,真正决定项目难度的,永远是控制逻辑怎么组织。尤其是八层电梯,不上不下、尴尬得很——比六层多了两个外呼按钮,比十几层的高楼又少了一堆群控算法,恰好卡在“逻辑开始变复杂但还没复杂到需要专门上轿厢控制器”的档位上。最近我刚完成一套基于西门子S7-200 PLC加组态王上位机的八层电梯控制系统,今天就把梯形图里那些真正起作用的控制逻辑掰开揉碎讲一讲,从IO分配、方向判定、平层停车到组态王的通信配置,都按实际项目的顺序来。


1. 八层电梯的系统构成与控制需求拆解

1.1 电梯的本质:一个不断做“决策”的状态机

很多人第一次接触电梯程序,容易把它想复杂了,觉得电梯应该像机器人一样“智能”。其实电梯PLC程序本质上就是一个带优先级的状态机:轿厢当前在哪、要往哪去、路上有没有顺路的呼梯信号、到了目标层能不能开门,这些条件每扫描一个周期都在刷新。

为什么说八层电梯特别适合拿来做控制逻辑的教材案例?因为它的状态切换足够典型:楼层多了,呼梯信号的排列组合就多,方向判定和顺向截梯这些核心逻辑才能真正展露身手。我习惯把电梯逻辑拆成几大块:呼梯登记与保持、方向判定与换向、楼层跟踪与显示、平层停车与开关门、安全联锁。每一块单独拿出来都不算难,但合在一起,扫描顺序和互锁关系就容易打架。

八层电梯的输入信号大致分三类:呼梯信号(八层内选按钮、一到七层上外呼、二到八层下外呼)、位置信号(每层一个平层感应器、轿厢内的旋转编码器脉冲)、安全信号(急停、门锁、超载、上下极限)。输出信号则包括变频器控制(正转、反转、多段速)、开关门控制、楼层显示、运行方向指示、蜂鸣器等。

1.2 为什么控制逻辑难度集中在“方向判定”和“顺向截梯”

说句实话,八层电梯里纯动作逻辑(比如按了按钮灯亮、到了楼层灯灭)非常简单,真正的难点就两个:一是电梯在多目标请求下怎么决定当前往哪走,二是在运行途中怎么响应顺路的新呼梯。这就是大家常说的“电梯调度”问题在单体梯里的形态。

举个最典型的场景:电梯在3楼正在上行,此时5楼有人按了上行外呼,同时1楼有人按了上行外呼,而4楼有人按了内选去8楼。这时候电梯应该继续上行到5楼接人,再前往8楼,最后下行去1楼。这个“顺向优先、最远反向”的调度规则,就是靠梯形图里一组比较指令和方向标志位实现的。

还有更绕的情况:电梯在6楼准备下行,7楼突然来了个下行外呼,这时候电梯要不要掉头回去接?答案是看“换向条件”——只有当电梯在当前方向上已经没有目标了,才允许改变方向标志。这个逻辑写不好,电梯就会在该去的楼层停不下来,或者在没人的楼层反复开关门。


2. 硬件选型和IO分配:画梯形图之前的准备

2.1 S7-200的选型思路和IO点数估算

S7-200系列虽然已经停产多年,但存量项目和技术生态实在太庞大了,而且不少职业院校、小型楼宇改造项目依然在用它做控制核心。以八层电梯为例,我用的CPU是CPU226,理由是它的DI/DO点数刚好卡在项目需求附近,预留扩展空间足够,而且支持两路高速计数器——电梯的旋转编码器信号可以直接接进来做位置计算。

先算一下输入点数:内选按钮8个、外呼按钮14个(1层只有上、8层只有下,中间层上下各一)、平层/换速感应器8套(我习惯每层装接近开关做位置确认)、开关门限位4个(开门到位、关门到位各两个常闭逻辑)、安全回路信号5-6个(急停、门锁、超载、安全钳、上下极限)。加起来已经接近40个DI。输出侧:变频器控制点3个(正转、反转、多段速选择)、开关门输出2个、楼层显示用BCD码需要4个输出点、方向指示2个、蜂鸣器1个,合计也在15个以上。

这样一看CPU226本体自带24DI/16DO就有点紧张了,所以我加了一块EM223数字量扩展模块。这里有个小经验:IO分配表一定要在写梯形图之前做,而且要给每个信号起一个看得懂的符号名。比如I0.0叫“一层内选”,M0.0叫“一层内选登记”,Q0.0叫“上行接触器”。等到画梯形图的时候你就知道,这些名字比地址本身重要得多,它能帮你少烧几百个脑细胞。

2.2 变频器接口和编码器的接法

电梯的拖动部分我用的是带多段速功能的通用变频器,电机采用双速或变频调速。PLC输出端直接接变频器的数字输入端子:正转、反转、低速、高速,我还会再加一个“使能”信号,确保PLC没有明确给出运行命令时变频器处于封锁状态。

编码器接法上,旋转编码器A、B两相脉冲分别接到CPU226的高速计数器输入端(如I0.0和I0.1),用HSC0进行四倍频计数。这个脉冲信号用来精确计算轿厢位置,比如每米对应多少个脉冲,然后用脉冲差和楼层基准位置做比较。这里要注意编码器安装同心度的问题,否则脉冲计数会漂移,导致电梯停层不准。我在项目里就是吃了这个亏,编码器联轴器松了半圈,电梯每跑一趟平层误差就大一点,折腾了半天才发现是机械问题。

2.3 组态王通信怎么搭

组态王作为上位机软件,和S7-200之间通过PC/PPI电缆走PPI协议通信。组态王的设备配置向导里选S7-200系列,设置好COM口号、波特率(通常19200),然后建立数据词典变量,把PLC里的I、Q、M、V区地址映射到上位机变量上。比如“电梯当前楼层”对应VD100,“运行方向”对应M10.0。

实际操作中有个重点:组态王的变量刷新速度和PPI通信周期直接相关,数据量越大刷新越慢。所以上位机只需要读状态、写少量命令,千万别把中间变量全部往上传——既占带宽又容易把PLC扫描周期拖慢。我习惯只上传必须看的:当前楼层、运行方向、呼梯状态、故障信号,其余逻辑都留在PLC里自己消化。


3. 梯形图核心:呼梯登记、方向判定与顺向截梯

3.1 呼梯登记与保持:置位/复位为什么比线圈好用

呼梯登记的逻辑看起来简单——有人按按钮,登记灯亮;电梯到达该层,登记灯灭。但如果直接用按钮触点驱动一个输出线圈,问题马上就来了:按钮是瞬动信号,手一松开触点就断开,线圈断电,登记信号就消失了。

所以这里必须用置位/复位指令。S7-200里有S(置位)和R(复位)指令,比如一层内选按钮I0.0按下的瞬间,执行“S M0.0, 1”,把“一层内选登记”标志位置1并保持;当电梯到达一层且满足开门条件时,再执行“R M0.0, 1”把它复位。这样呼叫信号就能稳稳保持到电梯响应。

外呼信号也一样,但要注意区分上行外呼和下行外呼。比如二层外呼上行是I0.3,外呼下行是I0.4,它们在M区里分别对应“二层外呼上登记”和“二层外呼下登记”。这个区分非常重要,因为方向判定逻辑要依据这些标志位判断电梯在某一层到底该不该停。

还有一个细节:内选登记和外呼登记的复位时机不一样。内选按钮的复位条件是“电梯到达目标层且开门”,外呼的复位条件可以是“电梯到达该层且开门”或者“电梯到达该层且开始开关门动作的高速脉冲到来”,取决于你想要的电梯响应手感。我建议统一在开门动作真正发生的那一刻复位,这样乘客还没走进轿厢时,外呼按钮灯不会提前灭,避免误会。

3.2 方向判定逻辑:优先级和比较指令的组合

方向判定是整段梯形图的灵魂。S7-200的比较指令(比如>=、<=、==)在这里大显身手。我通常定义一个VD区存当前楼层值(比如VD200),再定义两个标志位:上行标志M10.0、下行标志M10.1。

判定逻辑的思路是这样:

  • 如果电梯当前处于停止状态(无上行、无下行标志),查一下有没有任何登记信号。

    • 若存在某个目标楼层高于当前楼层,则置位上行标志;
    • 若所有目标楼层都低于当前楼层,则置位下行标志。
  • 如果电梯正在上行,且存在目标楼层高于当前楼层,保持上行标志;

    • 如果上行方向上没有目标了,再检查下行方向有没有目标,如果有则切换为下行标志。

这里最核心的就是“在当前方向有没有目标”这个判断。我会专门写一个子程序,扫描所有登记标志位,结合当前楼层值,算出一个“最高目标楼层”和一个“最低目标楼层”——上行时看最高目标楼层是否大于当前楼层,下行时看最低目标楼层是否小于当前楼层。

听起来简单,但当年我第一次写的时候漏了一个关键点:电梯在运行过程中,当前楼层值不断变化,如果我用实时楼层值去比较,电梯可能在经过某一层但不该停的时候,方向标志瞬间跳变。所以正确做法是:方向标志一旦确定,就要保持到电梯完成当前方向的全部任务后才能翻转,不能每个扫描周期都重新判定。换句话说,方向判定的结果要“锁存”,而不是“实时刷新”。我在梯形图里用一个M位做“方向锁定使能”,只有电梯处于停止状态时才允许重新计算方向,这在工程上最稳。

3.3 顺向截梯:运行途中如何响应途经呼梯

八层电梯最提体验的地方在顺向截梯:电梯正在上行去7楼,经过5楼时刚好有人按了上行外呼,电梯应该顺路停一下接人。

实现逻辑其实不复杂:电梯上行过程中,每一层都检查“当前楼层的外呼上行登记”是否为1。如果为1,就把这一层纳入“待停目标”。更严谨一点,要加上“当前运行方向 == 上行”这个条件,确保只有同向呼梯才会被响应。

梯形图里怎么写的?我通常在每层写一个“顺向停车请求”中间变量,比如“五层顺向请求M20.5”,它的置位条件是“当前楼层等于5、当前方向为上行、(五层外呼上登记为1或内选登记为1)”。这个变量再送给停车判断逻辑:当电梯进入该层的换速区段时,若顺向停车请求为1,则执行减速停车。

但这里有个老生常谈的坑:如果电梯经过5楼时5楼的外呼是下行按钮,电梯正在上行,这时候不能停!一旦停了,乘客上去要去的是下行方向,电梯还得掉头,既不安全也浪费时间。很多初写电梯程序的人在这里翻车,原因就是“只要该层有外呼就停”这种粗暴逻辑。

3.4 反向截梯和反向最远原则

还有一种情况:电梯正在上行,此时8楼有人按了下行外呼,这属于“反向呼梯”。电梯到8楼后会停,然后改成下行——这就是典型的“反向截梯”。实现逻辑是:虽然电梯当前上行,但8楼的外呼下行登记信号存在,所以把8楼也作为一个目标楼层。这里的判定要注意:反向呼梯只有在它是当前方向上最后一个目标时才触发换向,或者按工程上常用的“反向最远原则”,把反向目标当成电梯在当前方向任务全部完成之后的下一个目标。

我在实际项目里做过一个折中:电梯上行过程中,反向呼梯只响应“该层是当前楼层的上方且是反向呼梯”中的最高层。写出来就是上行时只登记“大于当前楼层的下行外呼”的最远值。这种做法的好处是电梯不会因为中途不断有新反向呼梯而频繁换向,乘客等待时间更稳定。


4. 平层停车与开关门联锁的实现细节

4.1 平层检测与换速-爬行-平层的时序

电梯能不能稳稳停在楼层地面上,靠的不是刹车那一瞬间,而是提前换速+低速爬行+平层信号触发停车这一整套时序。八层电梯的井道里,每一层我都会装两个感应器:一个叫“换速感应器”,离楼层地面大概80厘米的位置;一个叫“平层感应器”,精确对应楼层地面高度。

运行逻辑是这样的:电梯高速运行接近目标层时,先压到换速感应器,PLC立刻切掉高速输出,发给变频器低速运行信号,电梯以低速继续爬行;接着轿厢上的平层隔磁板插入平层感应器,PLC收到平层信号后,延时几十毫秒,发出停车指令和抱闸指令。这个“平层信号→停车”的延时不能省,否则轿厢会冲过头或者停不准。

梯形图里我习惯这样组织:每个楼层有一个“楼层平层信号”输入点,比如I1.0到I1.7对应一到八层。当目标楼层和当前楼层匹配时,把当前层的平层信号送入一个统一的“停车触发”中间变量。停车触发接通后,先复位上行/下行标志,再复位该层的内选/外呼登记,最后输出停止信号给变频器。

这里有一个小知识点:为什么电梯换速后不要直接停?因为高速停车时的惯性大,即使是变频器带制动电阻,也很难保证每次都停在同一精度。低速爬行的目的就是让轿厢在即将平层时速度足够低,好让平层感应器工作在一个很小的速度区间内,停层精度才有保障。

4.2 开关门逻辑:不是“开了门就完事”那么简单

自动门的控制逻辑看着不起眼,实际上坑不少。开关门输出是两个:开门继电器Q0.2、关门继电器Q0.3。开门动作的条件要同时满足:电梯处于停止状态、平层信号为1、门锁回路接通。这几个条件缺一个都不能开门。

关门条件则复杂一些:没有内选和外呼登记时自动延时关门,或者关门按钮按下强制关门。但无论哪种关门方式,都必须检查光幕/安全触板信号,如果光幕被挡住,立即停止关门动作并重新开门。这个互锁在梯形图里一定要“硬接”,不能只靠上位机控制,否则一旦出事故就是大事。

超载信号也要接进开关门逻辑:超载时不允许关门,同时轿厢内蜂鸣器响,直到超载信号消失。

还有一个容易被忽略的点:开关门动作和运行方向标志的互锁。电梯在运行中(上行或下行标志为1),任何情况下都不允许输出开门信号。这个互锁必须放在最前面,哪怕井道平层感应器误动作给了平层信号,只要方向标志还亮着,门就不能开。

4.3 安全回路要怎么接进梯形图

现代电梯的安全回路通常是一长串串联的常闭触点:急停开关、门锁触点、安全钳开关、限速器开关、上下极限开关等。任何一个断开,安全回路就断电,对应的PLC输入点信号消失,电梯立即禁止运行。

梯形图里的处理方式是:用这些安全信号串联成一个“运行允许”中间变量,比如M50.0。只有M50.0为1,方向标志的置位、变频器使能输出、开关门动作才被允许。这里要说一个关键细节:安全回路信号断开时,要同时禁止上行和下行输出,但不要直接切断PLC电源或者断开变频器主回路,否则容易造成轿厢急停顿挫。正确做法是先让变频器减速停车,再判断故障类型。

故障复位按钮我一般也用PLC输入点,比如I2.0,复位条件是人手按住超过1秒,避免误触。复位后如果安全回路恢复,系统重新进入待机状态。


5. 组态王上位机:从梯形图到可视化监控

5.1 通信配置和变量映射的注意事项

组态王做八层电梯监控是我这套系统里的标配,毕竟物业和巡检人员要能直观看到电梯在哪层、什么状态。组态王和S7-200走PPI通信,在组态王开发环境里“设备配置向导”选西门子→S7-200系列,填好COM口号和波特率,一般就能建立起通信链路。

数据词典是组态王的核心,每个要监控的量都要在这里定义。我给每个量起的名字和PLC里的符号名保持一致,比如“当前楼层”“上行标志”“五层外呼上登记”,这样建画面的时候不容易搞混。变量类型上,开关量选“离散”,楼层值选“整型”,地址按PLC里的实际地址填写,比如当前楼层对应VD200。

这里有个经验:组态王读S7-200的V区数据时,地址映射要特别注意存储区的单位。比如VD200实际占据VW200和VW202两个字,你在组态王里建一个INT型变量,地址写VD200,数据会完整读出来,没问题;但如果你访问VW200,就只能读到低16位。这类错误很隐蔽,一旦楼层显示异常,先检查这里。

5.2 画面组态:轿厢动画、呼梯状态和运行方向

组态王画面我一般做三个区域:左侧是井道侧视图,从1层到8层画一栋楼的剖面,轿厢用一个矩形条表示,通过垂直位置变量控制它在画面里的坐标。组态王里可以用“垂直移动”动画连接,把“当前楼层”变量换算成像素偏移量,楼层变化时轿厢就跟着动。

右侧放各楼层的呼梯状态指示灯,每个按钮对应PLC里的登记标志位。比如“五层外呼上登记”为1时,屏幕上5楼的上箭头图标变绿。下方再放一个运行方向指示:上行时“上行中”图标闪烁,下行时“下行中”图标闪烁。

5.3 历史数据和报警事件怎么接

组态王的实时数据库可以记录电梯运行数据,但我建议别记太密——PPI通信带宽有限,每秒刷个2到3次就够了。我把当前楼层、开关门次数、故障信号这几个量存入历史库,方便事后回溯。

报警事件主要接急停、超载、门锁断开这几类。组态王报警窗口里配置好“变量报警”,当对应离散量变为1时触发报警记录。注意报警变量的采集频率要高于普通数据变量,否则紧急情况报警会延迟几秒才弹出来,这在工程验收时是扣分项。


6. 现场调试时会遇到的坑(每个我都真实踩过)

6.1 井道感应器抖动导致误停

我第一次调试的时候,电梯运行到某些楼层时偶尔会莫名其妙地顿一下,像是被什么绊住了。排查半天发现是平层感应器的安装支架偏软,电梯高速通过时产生的震动让感应器瞬间反复导通断开,PLC收到了瞬间平层信号,把运行中电梯触发了减速逻辑。

解决办法有两个:一是机械上把支架换成硬质角钢并加防松垫片;二是在梯形图里给平层信号加一个“去抖延时”,比如用定时器让平层信号稳定接通50毫秒以上才确认有效。后者更通用,也更容易在调试时验证。

6.2 呼梯信号被意外复位

还有一次,电梯响应完某一层的外呼后,其他楼层的呼梯灯也跟着灭了。找来找去,发现问题出在复位指令的范围参数上。S7-200的复位指令格式是“R 位地址, 数量”,如果数量写大了,比如我本来只想复位M0.0,写成了“R M0.0, 8”,那M0.0到M0.7全被清了——正好把相邻七层的内选登记全部干掉。

这种低级错误几乎每个PLC调试者都犯过,排查方法也简单:先把所有复位指令的数位参数抄出来核对一遍,再做呼梯保持测试。

6.3 组态王和PLC通信偶尔掉线

组态王运行一段时间后画面上的数据全部变“####”的情况,我也遇到过。PPI通信本身比较脆弱,跟通信线缆质量、长度、干扰都有关系。后来我把PC/PPI电缆换成带隔离的型号,通信速率从19200降到9600,同时把组态王的数据刷新周期从100毫秒改成500毫秒,问题基本就不再出现了。

另外一定要提醒的是:组态王在线修改PLC数据时,如果通信中断,不要急着拔线重启,先检查PLC的RUN/STOP状态和通信指示灯,很多时候是线路松动或者COM口被其他程序占用。

6.4 变频器多段速和PLC输出时序配合

最后说一个调试中最容易忽略的时序问题。我的程序里,上行/下行标志置位之后,立即输出正转/反转信号给变频器,紧接着输出高速段速信号。但变频器从收到正转命令到真正建立输出电流,是需要时间的,如果PLC这边的换速逻辑按PLC扫描周期去判断速度反馈,就会出现在极短时间窗口内反复换速的“抖动”现象。

解决办法是加一个“换速确认延时”,比如电梯进入换速区后,先让低速信号保持300毫秒,再判断是否平层停车。这样给变频器留足了加减速时间,电梯运行起来就稳多了。


写到最后再说一句实际的体会:八层电梯控制这套东西,真正难的不是某一个指令用不好,而是所有逻辑合在一起之后,如何在各种呼梯组合下都保证方向判定和顺向截梯不出错。建议你自己搭一个小型实验台,把每层呼梯按钮、平层感应器、变频器全接上,然后一个场景一个场景地测:中途来反向呼梯、运行中加同向呼梯、多楼层同时内选,把边界情况都过一遍。踩过的坑记在本子上,下次再做六层、十二层电梯的时候,这些经验就是你最快的排错工具。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进