☰
PLC自动门控制系统设计:从I/O点表到状态机调试
2026/10/28 12:07:53 网站建设 项目流程

简介:围绕 PLC 自动门控制系统展开的毕业设计文档,面向电气自动化、机电一体化专业的在校生及刚接触 PLC 控制的工程人员,用于解决自动门硬件选型、梯形图编程与联机调试缺少完整范例的问题。压缩包共 1 个 doc 文件,约 528KB,为完整论文正文,按章节组织:先做功能需求与控制要求分析,再依次给出 PLC、驱动装置、红外与微波感应器件、直流电动机调速、传动机构及限位开关的选型依据,并附 I/O 地址分配表、主电路原理图与 PLC 外围接线图;随后是工作过程分析、梯形图设计、程序调试与硬件接线、联机调试记录,末尾收录参考文献与附录,可直接对照撰写课程设计或毕业设计。目前已有 2358 人学习下载,适合需要参照现成方案梳理设计流程、补齐图纸与程序细节的读者。

1. 自动门为什么要用PLC来控:从一台感应门的三类误动作说起

商场入口那扇感应门,人还在两米外它就开了,人刚站到门中间它又开始合——这类误动作十次里有八次不是感应器坏了,而是控制逻辑没把「谁说了算」排清楚。基于PLC自动门控制系统的设计,说到底是把这件事做严谨:用一台小型PLC采集移动感应器、安全光幕、限位开关和编码器的信号,按状态机输出开门、关门、高低速切换和报警指令,让门在 0.5 秒内响应、在夹到人之前回退、在停电恢复后不乱开。它适合做门体设备、楼宇自控、机电一体化的从业者,也适合拿它当PLC入门项目的人:点位不多、逻辑闭环完整,从点表到调试一个人能走完;但要做到现场不返工,传感器选型、时间参数和安全回路的优先级,一个都不能含糊。

2. 把一扇自动门拆成I/O点表:PLC选型与信号分配的实操清单

自动门项目的返工,七成发生在画梯形图之前。点表没排清楚,程序写到一半发现少一路安全信号,只能改端子、重新布线;执行机构选错,后面所有时间参数都只能靠凑。这一章先把硬件侧拆干净。

2.1 自动门的四个动作和六类传感器,分别对应哪些输入点

自动门的动作序列只有四段:开门、开门保持、关门、遇阻回退,外加一个故障锁定态。每一段都要有明确的进入条件和退出条件,落到PLC上就是输入到输出的映射。常见做法是先画一张时序草图:横轴是时间,纵轴是各路信号,把「人来了—门开—人走—门关—中途有人—门回退」这条主线画出来,再往PLC地址上套。

开门触发源一般有四路:门外移动感应器、门内移动感应器、手操盒开门按钮、门禁或楼控给出的干接点。这四路在程序里是「或」的关系,任意一路有效就进开门流程。这里有个容易忽略的细节:门禁给出的开门信号往往是 0.5~1 秒的脉冲,必须先在PLC里做自锁(置位一个中间变量,开门到位后再复位),否则信号一消失状态机就掉回待机,门刚起来又停住。

安全类信号按失效安全原则接常闭触点:光幕被遮挡时输出断开,断线时同样断开,两种情况都能被程序识别成「门区有人」。急停不建议只走PLC软件逻辑,硬线串进安全继电器回路直接切驱动器使能,PLC这边只取一个辅助触点做状态显示。这是行业里比较通用的做法,软件写得再漂亮,也替代不了硬件回路。

限位开关两种选型各有取舍:滚轮式行程开关便宜、抗干扰,但长期高频动作后触点会氧化,出现「偶发不到位」;磁感应接近开关无机械磨损、响应快,安装时要注意与金属门体的感应距离,一般在 2~8mm 之间,装太远会漏检,装太近会撞。门体是铝型材的话,感应片要单独固定在门机上,不要贴在大面积铝板上。

编码器用增量式 A/B 两相,接PLC的高速计数口。它的价值在于把「减速点」从时间估算改成位置触发——时间估算在电压波动、导轨积灰、季节温差下会漂,位置触发不会。后面第 5 章会展开讲怎么用它做行程自学习。

信号类别典型器件触点形式接入方式备注
开门触发微波/红外移动感应器继电器干接点普通DI两路内外分开,便于分时屏蔽
防夹安全光幕、红外对射常闭(NC)DI + 硬线串安全继电器必须失效安全
防夹门体压力感应条常闭DI作为光幕的补充,装在门边胶条内
位置开门限位、关门限位常开或常闭DI建议用NC,断线可诊断
位置增量编码器A/B 推挽或集电极开路高速计数口分辨率 100~500 线足够
操作手操盒开/关/停、钥匙开关干接点DI维护模式用
联动门禁、消防、楼控干接点DI消防信号优先级最高
状态驱动器故障反馈继电器DI用于故障锁定

2.2 输出点与执行机构:接触器方案和变频器方案的取舍

输出侧第一个决策是执行机构,这直接决定PLC用继电器输出还是晶体管输出。

最便宜的是双速电机加正反转接触器:两个接触器做互锁,PLC输出两路开关量,靠机械限位和热继电器保护。这套方案成本低,但启动冲击大、门体抖动明显、接触器触点寿命在高频场合撑不过一年,只在人流量很小的场合还能见到。

主流做法是三相异步电机加减速变频器。PLC给出「开门/关门」两个方向信号,加一路「高速/低速」切换,变频器内部设定加减速曲线。门体运行平滑,减速段可以做成爬行,夹人风险明显下降。缺点是变频器需要调参数,加减速时间设短了会报过流,设长了门反应迟钝,这部分在第 4 章会详细说。

第三种是直流无刷电机加专用驱动器,静音、体积小,常见于对噪声敏感的场景。控制接口一般是方向加PWM调速,PLC侧需要一路模拟量输出或通讯给定,成本最高。

输出类型上,驱动接触器线圈或变频器数字输入端子,继电器输出可以直接带(注意触点寿命,频繁动作建议加中间继电器隔离);晶体管输出响应快但只能带直流小电流,必须经中间继电器。如果门体动作频率高(比如商场主入口),我一般会按「晶体管输出 + 中间继电器」配,把PLC输出点的寿命问题转移给几十块钱的继电器。

2.3 一个12入8出的点表模板,以及该留多少余量

下面这张表是一个单开门、变频驱动、带光幕和压力条项目的点表模板,地址按IEC风格给,实际项目按所选PLC的编址规则换算即可。

地址信号名类型说明
I0.0外侧移动感应DI开门触发
I0.1内侧移动感应DI开门触发
I0.2安全光幕DI(NC)门区有人
I0.3门体压力条DI(NC)接触防夹
I0.4开门限位DI(NC)开门到位
I0.5关门限位DI(NC)关门到位
I0.6手操盒开DI维护用
I0.7手操盒关DI维护用
I0.8急停辅助触点DI(NC)仅做状态显示
I0.9驱动器故障DI故障锁定触发
I1.0门禁/楼控开门DI脉冲信号,需自锁
I1.1编码器A相HSC高速计数
I1.2编码器B相HSC高速计数
Q0.0开门指令DO至变频器正转端子
Q0.1关门指令DO至变频器反转端子
Q0.2高速/低速切换DO多段速端子
Q0.3运行使能DO至变频器使能
Q0.4门状态指示DO绿色,门开到位
Q0.5故障指示DO红色
Q0.6关门预警蜂鸣DO关门前置提示
Q0.7门开到位反馈DO至楼控/门禁

选型时DI/DO点数建议留 20% 余量。上面这张表用了 12 入 8 出,实际选 16 入 12 出的机型比较稳妥——后面加一路门禁读头、一路消防联动、一路维护按钮是很常见的需求,临时换PLC的代价远高于一开始多花的那点钱。PLC本体建议带以太网口,调试时能直接连电脑看变量,后期接楼控也方便;高速计数口至少一路,100kHz 以上。

3. 梯形图与ST怎么写:自动门开门、保持、关门、遇阻回退的状态机实现

3.1 为什么不用一堆互锁,而要用步进状态机

很多入门写法是把开门、关门、回退分别写成独立的条件网络,靠中间变量互相串互锁。小逻辑还能转,一旦加上「遇阻回退后两秒内禁止关门」「开门保持期间再触发要重新计时」「故障锁定必须手动复位」这些条件,互锁网络会迅速膨胀成一团,现场改一个参数要翻五屏程序,谁都看不懂。

步进状态机把这件事变简单:任意时刻门只处于一个状态,每个状态里只做三件事——输出什么、什么时候退出、退出后去哪。安全信号不参与状态跳转的判断,而是做成全局的最高优先级覆盖:只要光幕被遮挡且当前处于关门类状态,无条件跳到回退态。这样逻辑是单向的,测试也能按状态逐个验证。

状态划分建议不要超过 10 个:待机、开门加速、开门匀速、开门减速、开门保持、关门预警、关门加速、关门匀速、关门减速、回退、故障锁定。多一个状态就多一份调试成本,能用参数表达的(比如减速点位置)就不要拆成状态。

3.2 状态机主体的ST代码与逐段说明

下面这段用结构化文本写,逻辑与梯形图一一对应,用梯形图实现的场合按同样顺序拆Network即可。

(* ===== 自动门主状态机:放在 10ms 循环任务里调用 ===== *) (* 变量:iStep 当前步号;bOpenCmd/bCloseCmd 方向输出;bFast 高速标志 *) CASE iStep OF 0: (* 待机:门在关门位,等待触发 *) bOpenCmd := FALSE; bCloseCmd := FALSE; bFast := FALSE; IF (bSensorOut OR bSensorIn OR bManualOpen OR bDoorAccess) AND NOT bSafetyBlock AND NOT bFault THEN iStep := 10; END_IF 10: (* 开门加速段 *) bOpenCmd := TRUE; bFast := TRUE; IF bOpenLimit THEN iStep := 40; ELSIF tonFast.Q THEN (* 加速时间到,转匀速 *) iStep := 20; END_IF 20: (* 开门匀速段:到达减速点转爬行 *) bOpenCmd := TRUE; bFast := TRUE; IF bOpenLimit THEN iStep := 40; ELSIF bSlowPointOpen THEN iStep := 30; END_IF 30: (* 开门减速爬行段:靠限位收尾 *) bOpenCmd := TRUE; bFast := FALSE; IF bOpenLimit THEN iStep := 40; ELSIF tonCrawl.Q THEN (* 爬行超时 = 堵转或限位失效 *) iStep := 90; END_IF 40: (* 开门保持:有人或持续触发则重新计时 *) bOpenCmd := FALSE; bFast := FALSE; IF bSensorOut OR bSensorIn OR bSafetyBlock THEN tonHold(IN := FALSE); (* 复位保持计时 *) ELSIF tonHold.Q THEN iStep := 50; END_IF 50: (* 关门预警:蜂鸣器响,不动作 *) bBuzz := TRUE; IF tonBuzz.Q THEN bBuzz := FALSE; iStep := 55; END_IF 55: (* 关门加速段 *) bCloseCmd := TRUE; bFast := TRUE; IF bSafetyBlock OR bAntiPinch THEN iStep := 70; (* 安全信号最高优先级 *) ELSIF bCloseLimit THEN iStep := 0; ELSIF tonFast.Q THEN iStep := 60; END_IF 60: (* 关门匀速段 *) bCloseCmd := TRUE; bFast := TRUE; IF bSafetyBlock OR bAntiPinch THEN iStep := 70; ELSIF bCloseLimit THEN iStep := 0; ELSIF bSlowPointClose THEN iStep := 65; END_IF 65: (* 关门减速段:末端速度最低,减小夹持力 *) bCloseCmd := TRUE; bFast := FALSE; IF bSafetyBlock OR bAntiPinch THEN iStep := 70; ELSIF bCloseLimit THEN iStep := 0; ELSIF tonCrawl.Q THEN iStep := 90; END_IF 70: (* 遇阻:先断开输出停 200ms,避免反向瞬间冲击 *) bCloseCmd := FALSE; bFast := FALSE; IF tonStop.Q THEN iStep := 75; END_IF 75: (* 低速反向开门到上位 *) bOpenCmd := TRUE; bFast := FALSE; IF bOpenLimit THEN iStep := 40; ELSIF tonCrawl.Q THEN iStep := 90; END_IF 90: (* 故障锁定:所有输出断开,红灯亮,必须手动复位 *) bOpenCmd := FALSE; bCloseCmd := FALSE; bFast := FALSE; bFaultLamp := TRUE; IF bReset AND NOT bSafetyBlock AND NOT bFault THEN bFaultLamp := FALSE; iStep := 0; END_IF END_CASE;

逻辑上有三处值得单独说。第一,回退态没有直接从关门切到开门,而是插了一个 200ms 的停止步,因为变频器从正转切反转时如果中间不留死区,直流母线会因反电动势冲击报过压,这是血泪经验。第二,开门保持态里只要感应器还有信号就把保持定时器复位,人站在门口不走门就不会关,这比「保持 5 秒后强制关门」安全得多。第三,故障锁定必须要求 bFault 已经消失才能复位,否则现场按一下复位按钮,门起来又撞上同一个故障点。

定时器的刷新建议统一放在状态机前面,一个扫描周期刷一次:

(* 定时器统一刷新:IN 条件带步号判断,状态切换时自动复位 *) tonFast (IN := (iStep = 10) OR (iStep = 55), PT := T#2S); tonCrawl(IN := (iStep = 30) OR (iStep = 65) OR (iStep = 75), PT := T#3S); tonHold (IN := (iStep = 40), PT := T#5S); tonBuzz (IN := (iStep = 50), PT := T#1S500MS); tonStop (IN := (iStep = 70), PT := T#200MS);

把 IN 条件和步号绑定的好处是:状态一退出,定时器自动复位,不需要在每个分支里手写清零,少写一行就少一个漏复位的坑。

3.3 五个必须现场标定的时间参数

同样一套程序,参数设错,用户体验能差出一个档次。下面这几个值我一般会记录在调试记录里,换项目时按门体重量和人流量微调。

参数典型值调整依据设错的后果
开门加速时间1.5~2.5s门体重量、变频器容量太短报过流,太长门反应迟钝
开门减速点行程 80%~85%编码器脉冲或减速限位太早门爬行时间长,太晚撞限位
开门保持时间3~8s人流量、门宽太短人没走完就关,太长冬季进冷风
关门预警时间1~2s现场噪声环境太短起不到提示作用
遇阻停止时间150~250ms变频器减速特性太短反向冲击报过压,太长门停着不动

关门速度本身也建议分两段:匀速段 0.3~0.5 m/s,末端爬行降到 0.1~0.15 m/s。末端速度是夹人风险的关键,压力条和光幕都是兜底手段,真正降低动能的是把最后 10cm 的速度压下来。

3.4 把ST翻译成现场维护工看得懂的梯形图

如果交付方要求梯形图,不必推翻重写,按状态一段一个Network拆即可。关键是Network的命名和注释要让值班电工一眼看懂,而不是给程序员看。

Network内容注释写法
NW1安全信号汇总「光幕或压力条动作 → 置位 M10.0 门区有人」
NW2故障汇总「驱动器故障或急停 → 置位 M10.1 系统故障」
NW3~NW13各状态步每个Network首行注释「步10 开门加速:高速输出,2秒后转步20」
NW14输出映射「方向、高速、蜂鸣、指示灯统一在此输出」
NW15故障记录「上升沿触发,把故障码写入保持寄存器」

输出统一放在最后一两个Network里做映射,中间状态步只操作中间变量。这样现场要临时屏蔽某个指示灯或者改蜂鸣逻辑,只改最后一段就行,不会碰坏状态机。

4. 自动门调试避坑:现场最容易翻车的五个问题

4.1 门关到一半又弹开:安全光幕接了但优先级写反了

现象:门正常关闭,走到行程中段突然反向开门,光幕指示灯并没有亮,重复触发没有规律。

原因:光幕信号被当成普通输入参与条件判断,程序里写的是「关门中且光幕未遮挡才继续关门」,但光幕的扫描是周期性的,两个扫描周期间有几十毫秒的空档,加上输入滤波设成了 0,瞬时抖动被当成有效遮挡;另一种情况是光幕继电器输出抖动,程序每个周期重新判断一次,状态机在步 60 和步 70 之间来回跳。

解决:安全信号单独做 20~30ms 的输入滤波,并且在程序开头一次性锁存成 bSafetyBlock,整个扫描周期内不再重新读取;状态跳转只在上升沿触发一次,回退后必须走完 200ms 停止步才允许再次判断。另外把光幕的常闭触点在硬件上串进安全继电器,软件只做逻辑,不做唯一防线。

4.2 变频器报过流:加减速时间和PLC输出时序打架

现象:门启动瞬间变频器报 OC,复位后能跑,连续几次又报;或者反向回退时必定报一次。

原因:加减速时间设成了 0.5 秒,门体惯量大,启动电流直接冲到额定值的 2 倍以上;更常见的是 PLC 在切换方向时,开门指令还没完全撤掉就给了关门指令,变频器两个方向端子同时有效,或者从正转直接切反转没有留死区。

解决:加速时间按门体重量放到 1.5~3 秒,减速时间不低于 1 秒;程序里在开门输出和关门输出之间加硬互锁(bOpenCmd 和 bCloseCmd 不可能同时为真,写在同一行赋值里保证),方向切换前强制插入 150~250ms 的停止步。变频器的过流保护值不要为了提高响应而调高,那是掩盖问题。

4.3 停电再来电门自己开了:保持型变量和非保持型混用

现象:现场断电再上电,门在没人经过的情况下自己打开,或者直接进入故障态不复位。

原因:状态变量 iStep 用了保持型(Retain)存储区,断电前的步号被完整恢复;来电瞬间感应器初始化有几百毫秒的无效输出,恰好被恢复后的状态机当成触发条件。另一种情况是输出映射用了置位指令,断电前置位的输出点来电后保持为 1。

解决:状态机的步号、方向输出、故障标志必须用非保持型变量,上电统一初始化到步 0;只有行程脉冲数、故障记录、参数设定值这类需要掉电保存的才放保持区。上电后加一个 2 秒的初始化延时,期间屏蔽所有触发输入、强制输出为 0,等传感器稳定后再投入运行。

4.4 白天正常晚上乱开:感应器灵敏度与电磁干扰

现象:同一扇门,白天运行正常,傍晚以后频繁自己开门,雨天更明显。

原因:微波感应器对温湿度和背景热源敏感,安装在玻璃门附近时,室外地面的热量反射会被误判为移动目标;另一种情况是感应器灵敏度调到最高,附近灯具启停的电磁干扰被当成信号,而PLC输入端没做共模抑制,屏蔽线单端接地也没做。

解决:微波感应器灵敏度降到中档,安装角度避开玻璃和室外地面,探测区域往里收 30cm;信号线用双绞屏蔽线,屏蔽层在PLC柜侧单端接地;输入端加 20ms 滤波;如果门内是餐饮区,感应器还要避开热风幕的出风口。简单验证办法是晚上关灯后用示波器或PLC的高速采集看输入抖动情况,抖一次跳一次的那个点就是干扰源。

4.5 限位信号抖动导致状态机卡死:输入滤波与消抖

现象:门开到顶了,状态机停在步 30 出不来,最后超时进故障;或者关门到位后状态机在步 0 和步 55 之间反复跳。

原因:滚轮行程开关在门体到位时有机械回弹,触点在几毫秒内通断多次,PLC扫描周期 10ms,正好每次都采到不同状态;编码器脉冲和限位信号同时变化时,减速点判断也可能在边界上反复触发。

解决:限位输入做 30~50ms 的滤波或程序内消抖(连续 3 个周期同状态才确认);状态机在临界步加一次性的「已到位」锁存标志,进入下个状态时清除;能换成接近开关的就换掉机械行程开关。另外关门到位后的待机态不要每次扫描都重新判断一次,锁存到下一次开门触发再解除。

5. 让门自己记住行程:编码器自学习与故障自诊断的加法

固定减速点在门体磨损、导轨积灰、皮带拉伸之后就会失准,表现是门末端撞得越来越响。我的做法是加一段行程自学习:维护模式下让门全程低速走一遍,用高速计数记录从关门位到开门位的总脉冲数,把减速点从固定值改成总行程的百分比。门体老化后重新学一次,参数跟着门走,不用现场试凑。

(* ---- 行程自学习:仅在维护模式、低速状态下允许 ---- *) IF bLearnMode AND NOT bFault THEN bFast := FALSE; (* 全程低速,避免学习时冲击 *) diPulse := HSC0_GetCount(); (* 高速计数通道 0 当前值 *) bOpenCmd := bLearnPhase = 1; bCloseCmd := bLearnPhase = 2; CASE bLearnPhase OF 1: (* 从关门位走到开门位 *) IF bOpenLimit THEN diOpenSpan := diPulse; (* 记录全程脉冲数 *) bLearnPhase := 2; tonPause(IN := TRUE, PT := T#1S); END_IF 2: (* 返回关门位,清零计数 *) IF bCloseLimit THEN HSC0_Reset(); bLearnPhase := 0; bLearnMode := FALSE; bLearnDone := TRUE; (* 减速点按行程百分比重算,默认开门 85%、关门 80% *) diSlowOpen := DINT_TO_DINT(diOpenSpan * 85 / 100); diSlowClose := DINT_TO_DINT(diOpenSpan * 20 / 100); END_IF END_CASE; END_IF; (* ---- 运行态:位置触发减速,替代定时估算 ---- *) bSlowPointOpen := (diPulse >= diSlowOpen); bSlowPointClose := (diPulse <= diSlowClose);

这段代码有两个参数需要按门体实测调整:diSlowOpen 的 85% 和 diSlowClose 的 20%。开门减速点太早,门会在最后三分之一行程里一直爬,用户觉得慢;太晚,2 秒的减速时间不够,末端还是会撞。关门侧反过来,减速点越靠后、爬行段越短越好,但要保证最后 10cm 速度已经降下来。我一般会在门体上贴一条胶带做标记,第一次调完记下脉冲数,后面同型号项目直接套,误差不会太大。

故障自诊断则是另一件值得花半天做的事。把驱动器故障、爬行超时、限位超时、安全信号长时间有效这四类事件各编一个码,每次触发时把码、时间戳、当时的脉冲值、状态步号写进一个 10 条的环形缓冲区,用保持寄存器存着。现场出问题时不用守着等复现,翻一次「黑匣子」记录就能看出是门体卡在哪个位置、当时在哪个状态。这个后悔药很便宜,一条数组加一个指针就能实现,但能省下大量往返现场的时间。

最后说个我自己的习惯:不管项目多小,调试记录一定要落在纸上,不是记在脑子里。开门加速时间、减速点脉冲数、保持时间、现场光幕型号、安装高度,全部写进一张表贴在电控箱门内侧。三个月后再来调,不用重新猜;换个人接手,也不用从零开始摸。这套东西看起来笨,但比任何注释都可靠。希望帮到你。

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

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

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

立即咨询