☰
六部十层电梯PLC初始化上行策略:一次到位防状态不明
2026/10/19 13:24:30 网站建设 项目流程

简介:面向可编程控制器与自动化竞赛选手的电梯控制工程包,聚焦六部十层电梯的上行初始化流程,涉及电梯控制中的启动、换向与平层等逻辑。工程文件为比赛用工程2的备份,整体采用一体化编程软件项目结构,包含项目源文件、配置数据、日志、图标以及人机界面相关文件;压缩包共84个文件,大小约9.91MB,从内容预览可见工程数据、转换日志、程序段、交叉引用等典型模块,符合完整可编程控制器加人机界面项目备份的特征。分类上,日志文件多为运行与转换记录,配置和数据文件用于保存参数,图标文件供人机界面显示,设备描述文件则属于外设通讯信息;通过阅读目录与关键文件,可快速理解比赛时初始化上行至10层的控制思路,并迁移到其他楼层或电梯数量场景中。目前已有1247人浏览学习,对正在准备电梯或可编程控制器方向竞赛的读者而言,这套工程包既是复盘参考,也是扩展改造的起点。

1. “比赛工程2”电梯PLC初始化上行:六部十层群控的一次到位策略

做电梯PLC比赛项目的人,十有八九会在初始化这一步翻车。这个所谓的“比赛工程2”我拆过一版类似方案:六部电梯、十层楼,启动后不是让轿厢就近停靠,而是统一上行至10层再进入待命。第一眼看上去很反直觉——底层没人呼梯,为什么非要先跑到顶?但真正上手跑一遍你会发现,这个初始化策略能把比赛里最头疼的“电梯到底在哪一层”这个状态不明问题直接消灭掉。适合谁看:准备参加电梯PLC赛项的学生、刚接手群控调试的开发者,以及想把六部十层调度逻辑落成一版稳定代码的人。这篇只讲初始化上行到10层这件事,怎么让六部电梯在启动后快速归位,并且不打架。

2. 系统架构与选型:为什么六部十层要统一上行归位

2.1 六部电梯十层楼的基本控制模型

六部电梯和十层楼组合在一起,控制难度不是简单相加,而是乘法级增长。单梯单层只要管好一个电机、两个极限开关、一组楼层感应;到了六部十层,就要同时面对轿厢呼叫、厅门呼叫、多梯竞争、消防返回、初始化归位这些事件,还得保证六部轿厢不会同时扑向同一个楼层然后把门堵死。

我在处理这类系统时,第一步是先把电梯状态拆成几个可以枚举的阶段:检修、初始化上行、正常运行、消防返回、平层开门。比赛工程2这种场景里,初始化上行是一个独立状态,不能和正常运行混在一起写。六部电梯共用一套楼层感应信号,但是各自有独立的运行接触器、方向接触器、开关门接触器和变频器给定信号。用PLC开发时,我先按轿厢编号建了六个功能块,每个功能块内部再细分状态,而不是把所有电梯逻辑堆在一个大程序里,否则后期查一个“六号梯在五层不动”的问题能查到你怀疑人生。

对于十层楼的高度,感应器的安装位置决定了平层精度。比赛用的模拟竖井通常每层有一个平层感应点,10层就是10个点,加上顶层和底层的极限保护点,总共12个传感器信号。初始化上行时,电梯要从任意位置出发,越过所有中间楼层感应点,直到最高层平层信号到位,然后停住,这中间任何一个感应点信号抖动或者漏掉,电梯就会一路冲顶。所以我在程序里专门加了一个“上行越层计数”,每经过一个平层感应点计数加一,如果计数结果和实际楼层对不上,立刻停止高速运行并转入低速爬行,避免直接撞上限位开关。

2.2 初始化上行至10层的设计动机

为什么比赛方通常要求“初始化上行至10层”,而不是让电梯停在最近层或者回到底层?我拆过几个模拟工程,比较合理的解释是:十层作为最顶层,平层信号的物理位置最明确,顶层极限开关和强迫减速开关都在附近,程序可以拿顶层作为一个“绝对基准点”。初始化时所有电梯先从任意随机位置统一跑到顶层,就等于给六部电梯建立了一个共同的坐标系——所有轿厢的楼层计数从这一刻起全部从10开始倒推,后面无论怎么调度,都不会出现“我在这层它在那层”的计数漂移。

从实际运行效果看,这个策略还有一个工程上的好处:清空底层与中间层的呼叫响应。初始化阶段如果程序不屏蔽呼梯信号,第一部走到三层的电梯可能突然被三层的厅门召唤截停,整个初始化链条就断了。我在调试时发现,必须把“初始化上行中”作为最高优先级的锁存信号,期间屏蔽一切厅门呼叫和轿厢呼叫,只有急停、消防、极限开关可以打断这个流程。等到六部电梯全部到达10层并且依次完成平层、开门、关门之后,才把调度使能位打开,呼梯信号才被允许参与响应。

2.3 I/O分配和关键变量初始化表

我整理了一份比较通用的I/O分配思路,基于一个中型PLC,数字量输入输出各预留30个点以上。

信号类型用途数量接线说明
输入点每层平层感应10顶层和底层同时做极限复核
输入点轿厢呼叫按钮10每层一个,接入PLC输入模块
输入点厅门呼叫上行按钮91至9层各一个
输入点厅门呼叫下行按钮92至10层各一个
输出点轿厢运行方向接触器12六部电梯每部两个方向
输出点开关门接触器12六部电梯共用开关门逻辑
输出点变频器多段速度选择6高速、中速、低速三段给定

变量初始化部分是另一个容易忽略的坑。PLC上电之后,掉电保持区里的楼层计数器、方向状态、开关门状态都是上一次运行留下的旧值,不做清零直接进入初始化上行,电梯可能拿着上一次的楼层计数往上走,走了两层就认为到了十层。我的习惯是上电后先做一次全局复位,把所有轿厢的当前楼层寄存器强制写成“未知”值,电梯的实际楼层全部以顶层基准点重新标定。也就是说,初始化上行不只是把电梯开上去,还要在到达顶层后执行一次楼层计数器重写,这是整段程序里最不能省的操作。

3. 初始化上行程序实现:状态机、楼层计数与磁感应信号处理

3.1 状态机设计:从启动到10层平层的完整切换流程

我把六部电梯的初始化上行逻辑统一写成一个可执行的状态机,每个轿厢实例内部维护四个状态:等待启动、上行运行、平层停靠、待命就绪。启动条件只有一个:PLC由停止模式切换为运行模式。以下是单个轿厢的状态机核心代码,用在支持结构文本的PLC里,逻辑同样可以翻译成梯形图。

CASE state OF WAIT_START: IF init_cmd THEN current_floor := 0; direction := UP; high_speed := TRUE; state := RUNNING_UP; END_IF; RUNNING_UP: init_block_call := TRUE; // 屏蔽呼梯信号 IF top_floor_sensor THEN high_speed := FALSE; low_speed := TRUE; state := LEVELING; END_IF; LEVELING: low_speed := TRUE; IF level_sensor_10 AND elevator_speed < 5 THEN direction := STOP; open_door_cmd := TRUE; state := WAIT_DOOR_CLOSE; END_IF; WAIT_DOOR_CLOSE: IF door_closed THEN current_floor := 10; // 强制写入基准楼层 init_block_call := FALSE; ready_flag := TRUE; state := IDLE; END_IF; END_CASE;

这段逻辑说明几个处理点:init_block_call这个bool变量就是我在前面提到的初始化屏蔽位,它在电梯进入上行运行之后就置位,直到关门完成才释放。current_floor在启动时被清零,而不是保持旧值,这是强制清零原则。最后到达十层平层后,电流楼层的写入发生在关门之后,不是平层瞬间,因为我需要确保门完全关闭再释放调度权,防止六部电梯同时开门时产生逻辑矛盾。

参数方面需要留意低速爬行的时间。我一般把低速段设定为10Hz以下,让电梯在接近十层时缓慢爬行,直到平层感应器信号稳定持续0.5秒才停车。如果低速段速度太快,机械惯性会让轿厢越过平层区,感应器信号一闪而过,程序根本来不及捕捉。

3.2 楼层计数与越层保护的梯形图等效写法

如果比赛要求用梯形图编写,楼层计数部分可以用一个移位寄存器思路实现,每经过一层就触发一次计数上升沿。这个计数器的使能条件必须加上“当前处于初始化上行状态”和“未到达十层”两个前提,否则电梯在正常运行响应呼梯时也会被这个计数器干扰。

// 网络1:楼层计数 |----[ RUNNING_UP ]----[ NOT top_sensor ]----[ 上升沿: floor_counter ]----( 计数加1 )----| // 网络2:计数校验 |----[ floor_counter <> expected_count ]----[ RUNNING_UP ]----( 强制转低速 )----| // 网络3:初始化完成 |----[ top_sensor ]----[ door_closed ]----( ready_flag )----|

计数校验这个网络是防冲顶的关键。初始化上行的预期计数值,是当前楼层到十层之间的层数差;楼层计数器每变化一次就和预期值比对一次,差值大于2就说明中间漏了一个感应点,这时候强制切断高速输出,让电梯降速到爬行状态,同时给上位机或触摸屏报“计数异常”。

我在第一次调试这段梯形图时踩过一次:计数器的复位条件写在顶层开关的常开触点之后,结果电梯到达顶层后计数器瞬间被复位,紧接着因为扫描周期的关系,又触发了一次计数加一,最终楼层显示从10跳到了11。后来我把复位和计数分开写在两个网络,并且给计数加一动作套了一个扫描周期的延时,从源头上消掉了这个竞争。

3.3 变频器多段速度配合初始化上行

六部十层的电梯系统,变频器通常使用多段速控制,三段或四段就够了。初始化上行时我只用高速和低速两段,接近十层时切换。以下是变频器参数设置的常见做法,具体数值根据实际电机功率调整。

参数功能设定值说明
高速频率40-45Hz初始化上行时使用
中速频率20-25Hz正常运行响应呼叫时使用
低速频率5-8Hz平层前爬行
加速时间1.5秒用于消除启动时的机械冲击
减速时间1.0秒用于短距离平层时精确停靠

初始化上行时,速度切换的触发依据是顶层强迫减速开关,而不是楼层计数器。强迫减速开关安装在顶层前两层的位置,电梯到达八层时金属挡板就会触发这个开关,程序收到信号后把高速给定切换成低速给定。这样做的好处是:即使楼层计数器因为感应器信号抖动已经失准,物理上的减速开关仍然能强制电梯降到安全爬行速度,给平层感应器留出捕捉窗口。

4. 六部电梯协同调度:初始化阶段如何避免互锁冲突

4.1 呼梯请求的写入与仲裁逻辑

六部电梯共用一个呼梯请求池,这个请求池我用数组或者PLC的寄存器块实现,每个楼层有上行请求位和下行请求位,只要某个厅门按钮被按下,对应位置位,直到某个电梯响应并且开门后才复位。初始化上行期间,这个请求池被整体冻结,即所有写入无效,已经写入的请求也不参与分配。冻结逻辑放在调度段的最前端:

IF NOT any_elevator_initializing THEN scan_hall_calls(); // 扫一层到十层的厅门呼叫 assign_elevator(); // 按最近距离优先原则分配 END_IF;

冻结条件用的是any_elevator_initializing,也就是说六部电梯只要还有一部没完成初始化上行,整个调度系统就继续挂起。有人可能会问为什么不用“所有电梯初始化完成”作为条件——这两个逻辑等效,但前者在梯形图里更直观,出现故障时排查点更少。

4.2 同时到达10层的互锁处理

六部电梯同时初始化上行,意味着它们很可能几乎同时到达10层,如果没有互锁,六台轿厢会同时向开门接触器输出开门指令,这在物理上会造成继电器竞争,在比赛评分系统里也可能被判定为逻辑冲突。我的处理办法是给六部电梯设定一个错峰到达的控制常量:

// 每部电梯启动时加入错峰延时 elevator_run_delay[1] := 0; elevator_run_delay[2] := 2000; // 2秒后启动 elevator_run_delay[3] := 4000; elevator_run_delay[4] := 6000; elevator_run_delay[5] := 8000; elevator_run_delay[6] := 10000; IF init_cmd AND current_time >= start_time + elevator_run_delay[i] THEN start_initialize(i); END_IF;

错峰延时的起点是PLC启动那一刻,不是每部电梯收到启动指令的时刻,因为所有轿厢的启动指令是同时发出的,如果不加延时,错峰就失效了。延时的时间长度按两秒一个梯度分配,六部电梯全部完成初始化上行大约需要三十秒左右,这个时间在比赛规则里通常是可以接受的。如果你用的是更老实的做法,也可以让第二部电梯等到第一部电梯关门完成之后再启动,只是那样总时长会拉长不少。

4.3 平层开门与关门完成的信号确认

初始化上行到10层后,电梯开门放人(比赛场景里通常是空载测试),关门完成后才置位就绪标志。这里有个很隐蔽的点:关门完成的信号不是门完全关紧,而是门到达锁闭位置的感应信号。比赛中好几次出现电梯门还没关完程序就认为关门完成,接着调度系统提前放行呼梯,导致门在运行中被拉开。我在程序里给关门完成信号加了一个0.3秒的滤波,确认信号持续稳定后才认为关门完成。

5. 常见问题与调试排查:初始化上行失败这个“幽灵”现象

5.1 现象:电梯停在1层不动,程序无报警

原因:初始化上行的启动条件被init_cmd卡住,而这个信号在上电后没有自动置位,需要操作员按一次启动按钮才发出。

解决:查启动信号的保持逻辑。我一般把init_cmd做成上升沿触发加自保持,自保持的复位条件是六部电梯全部就绪,或者急停信号到来。这样即使操作员没按住按钮,信号也能维持住。如果确认信号没问题,再查init_block_call是否被其他逻辑误置位,这个信号也可能在启动时被残留状态锁住。

5.2 现象:电梯冲过10层顶到极限开关

原因:顶层平层感应器的信号被程序判定为“无效抖动”而忽略,或者低速切换逻辑中使用的是楼层计数器而不是强迫减速开关。

解决:检查顶层感应器信号的滤波时间常数。PLC的输入滤波默认可能在10毫秒左右,但平层感应器在电梯低速运行时信号持续时间较长,高速经过时信号可能只有几十毫秒,滤波系数过大就会漏掉。我习惯把顶层平层感应器的输入滤波设为2到5毫秒,其他楼层的感应器保持默认。同时确认低速切换的触发源必须是强迫减速开关,不能只依赖计数器。

5.3 现象:六部电梯初始化完成后,部分电梯楼层显示错误

原因:楼层计数器在初始化上行过程中被复位和加一操作竞争改写,最终写入的基准楼层不是10。

解决:把楼层计数器复位和自加一分别放到两个独立网络,并且复位条件只允许出现一次——就是启动瞬间。到达10层后的楼层强制写入放在关门完成之后,用state = WAIT_DOOR_CLOSE作为写入前提。这个问题的本质是扫描周期内同一变量被多次赋值,最后一个赋值赢了,所以要从程序结构上消除多次赋值。

5.4 现象:10层平层后开门动作正常,但关门后电梯再次上行

原因:调度请求池中有10层的轿厢呼叫或者下行厅门呼叫没有被初始化屏蔽逻辑清掉,就绪标志置位后立刻分配了同一层的呼叫。

解决:初始化完成释放调度权之前,必须把当前楼层内所有呼梯请求清除一次。特别是轿厢呼叫按钮在调试时可能被误按,清除操作不能用简单的置零,而要用RST指令单独处理每一个呼叫位,防止请求池中残留的旧值在电梯就绪后立刻触发重新运行。

5.5 现象:比赛判分项目显示初始化超时扣分

原因:错峰延时设置过长,或者六部电梯中有一部因为机械摩擦力差异导致低速爬行时间过长,整体初始化时间超出规则允许范围。

解决:错峰延时从两秒梯度缩短到一秒,同时把低速运行时间上限做钳制,超过10秒还没平层就报故障,提示检查该轿厢的抱闸或导轨润滑。比赛场景里机械差异是常有的事,快速暴露出来比慢慢熬过去要好。钳制时间参数我一开始设的30秒,后来通过实测数据调整到10秒,六部电梯初始化总体时间缩短了将近一半。

6. 验证与进阶用法:把初始化上行做成可反复用的测试脚本

初始化上行逻辑写完之后,别急着跑正式比赛流程。我的验证动作分三步走:第一步,单梯测试。只把第一部电梯的错峰延时设成0,其余五部全部禁用,让这单部电梯从任意楼层启动,观察它能否准确到达10层。第二步,六部同时测试,分别在1层、3层、5层、7层、8层、10层放六部电梯,启动后观察是否有任何一部越过10层或者提前停靠。第三步,在初始化上行中途手动触发一次急停,恢复后确认电梯能重新进入初始化流程而不是跳到正常运行。

这套测试做完,如果还存在楼层计数漂移,问题基本就锁定在感应器信号处理或者变量竞争上,不用再去怀疑调度算法。我一般还会顺手把六部电梯的平层误差记录成一个表格,每部对应一个误差值,误差超过2毫米的轿厢单独调抱闸和变频器停车斜坡时间。这段调参经验后来被我沉淀成了一个可复用的测试习惯:每轮改动PLC程序之前,先跑一次初始化上行,确认六部电梯都在10层待命,然后再动其他逻辑。从那以后我每次修改程序都强制走一遍这个验证流程,至少能挡掉一半的“莫名其妙跑飞”问题。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询