基于PLC的立体车库自动存取系统设计:从硬件选型到仿真调试

发布时间:2026/10/30 3:53:20
基于PLC的立体车库自动存取系统设计:从硬件选型到仿真调试

1. 项目缘起与整体方案拆解

1.1 为什么“立体车库”会成为自动化毕业设计的经典选题

做电气与自动化方向毕业设计的人,大概率都在选题清单里见过“立体车库”这四个字。它之所以年年被翻牌,核心原因就一个:它是一个把PLC控制逻辑、传感器检测、电机驱动、人机交互全部串起来的完整闭环系统,麻雀虽小五脏俱全。你不需要真的去建一个几十米高的钢结构车库,用一套缩比模型或者仿真环境,就能把工业现场最典型的“输入采集—逻辑判断—输出执行—状态反馈”这条链路跑通。

从需求侧看,城市停车位缺口是真实存在的痛点。传统平面停车场每辆车平均占地约25平方米,而一个两层升降横移式立体车库,同样的地面面积可以停2到3倍的车。这个空间利用率提升的背后,靠的就是PLC在毫秒级时间内完成车位调度、安全互锁和动作时序控制。所以这个选题不是“为了做而做”,它确实对应着一个可落地的工程场景。

这套“基于PLC的立体车库自动存取系统”,本质上要解决三个问题:车来了往哪放、怎么安全地放进去、取车时怎么最快地还回来。围绕这三个问题,整个设计会拆成机械结构选型、PLC硬件配置、I/O点位分配、梯形图程序编写、上位机监控组态、以及仿真调试几个大块。适合自动化、电气工程、机电一体化方向的本科生作为毕业设计参考,也适合刚接触PLC编程的工程师拿来练手。

1.2 系统总体架构:从按钮按下到载车板移动,中间发生了什么

先把整个系统的骨架说清楚。一个典型的升降横移式立体车库,假设做2层3列共5个车位(底层2个、上层3个,留一个空位用于横移),它的工作流程是这样的:

  1. 用户在操作面板上按下“存车”按钮,或者通过上位机下发存车指令;
  2. PLC读取当前车位占用状态表,判断哪个车位为空;
  3. 如果目标车位在上层,需要先判断下层对应位置是否有载车板阻挡,若有则先执行横移动作让出通道;
  4. PLC输出信号驱动升降电机和横移电机,按照预设时序完成动作;
  5. 光电传感器检测载车板到位、车辆停稳后,更新车位状态;
  6. 上位机SCADA界面同步刷新车位占用情况。

整个架构可以分成三层:现场设备层(电机、限位开关、光电传感器、急停按钮)、控制层(PLC主机+扩展I/O模块)、监控层(触摸屏或PC端组态软件)。这三层之间通过硬接线和通信协议连接,控制层是核心,所有逻辑判断都在这里完成。

注意:很多同学一开始就想上“全自动无人值守”,结果连基本的限位检测都没做扎实。建议先把手动模式跑通,再逐步加自动逻辑,这个顺序不能反。

1.3 方案选型:为什么选PLC而不是单片机

这是答辩时老师最爱问的问题之一。我见过不少同学用STM32或者Arduino做车库控制,最后在抗干扰和扩展性上吃了亏。PLC和单片机在这个场景下的差异,用一句话概括就是:PLC是工业现场为“稳定”和“可维护”付出的合理溢价。

具体对比看下面这张表:

对比维度PLC方案单片机方案
抗干扰能力工业级设计,光电隔离,适应恶劣环境需要额外做隔离电路,裸板易受干扰
编程方式梯形图/SCL,电气工程师易上手C语言,需要软件背景
扩展性模块化扩展I/O,加模块即可需要重新设计电路板
故障排查指示灯+编程软件在线监控,直观需要示波器/逻辑分析仪
成本较高(西门子S7-1200约千元级)较低(STM32核心板几十元)
适合场景工业现场、教学演示、可靠性要求高成本敏感、批量生产、功能简单

毕业设计选PLC,还有一个现实考量:梯形图的可读性极强。答辩老师看你的程序,一眼就能看出逻辑对不对。你要是交一堆C语言中断嵌套,老师可能先皱眉头。而且PLC的仿真环境(比如S7-1200配合PLCSIM)可以在没有实物的情况下完成大部分逻辑验证,这对经费有限的学生来说非常友好。

2. 硬件选型与I/O点位分配实操

2.1 PLC型号选择:西门子S7-1200为什么是首选

在毕业设计这个场景下,西门子S7-1200系列几乎是默认答案。原因不复杂:资料多、教程全、仿真方便、学校实验室大概率有实物。具体型号建议选CPU 1214C DC/DC/DC,自带14个数字量输入和10个数字量输出,对于2层3列的车库模型来说基本够用。如果车位再多一些,可以加一块SM 1223数字量扩展模块。

选DC/DC/DC而不是AC/DC/继电器型,是因为模型上的电机驱动通常用24V直流或者通过中间继电器转接,晶体管输出响应更快,寿命也更长。当然如果你实验室只有继电器输出型的PLC,也能用,只是动作频率不能太高。

I/O点位分配是整个设计里最需要“想清楚再动手”的环节。我建议在写程序之前,先在Excel里把点位表拉出来,反复核对三遍。下面是一个2层3列车库的典型点位分配:

地址符号名类型说明
I0.0SB_Store输入存车按钮
I0.1SB_Retrieve输入取车按钮
I0.2SB_Emergency输入急停按钮(常闭)
I0.3SQ_Up_Limit输入升降上限位
I0.4SQ_Down_Limit输入升降下限位
I0.5SQ_Left_Limit输入横移左限位
I0.6SQ_Right_Limit输入横移右限位
I0.7PE_Car_Detect输入车辆检测光电
I1.0PE_Plate_Detect输入载车板到位检测
Q0.0KM_Lift_Up输出升降电机正转(上升)
Q0.1KM_Lift_Down输出升降电机反转(下降)
Q0.2KM_Move_Left输出横移电机正转(左移)
Q0.3KM_Move_Right输出横移电机反转(右移)
Q0.4HL_Run输出运行指示灯
Q0.5HL_Fault输出故障指示灯
Q0.6BZ_Alarm输出蜂鸣器报警

这张表看着简单,但每个点位背后都有讲究。比如急停按钮用常闭触点接入,是因为常闭在断线时也会触发急停,符合故障安全原则。再比如限位开关,升降和横移各用两个,分别对应两个方向的极限位置,程序中必须做互锁,否则电机堵转烧掉是分分钟的事。

2.2 传感器与执行器的搭配逻辑

传感器选型直接决定了系统的可靠性。车库场景下最常用的三种传感器:

  • 限位开关:机械式,安装在升降立柱和横移轨道的两端,用于检测载车板是否到达指定位置。优点是便宜、可靠,缺点是机械触点有磨损寿命。建议选欧姆龙或施耐德的微动式限位开关。
  • 光电传感器:用于检测车辆是否停放在载车板上、载车板下方是否有障碍物。推荐用漫反射式红外光电,检测距离可调,安装方便。
  • 接近开关:如果预算允许,可以用电感式接近开关替代限位开关做位置检测,无触点磨损,响应频率高。但成本会上去一些。

执行器这边,模型上通常用24V直流减速电机模拟升降和横移动作。如果是真实车库,升降电机功率可能在2.2kW到5.5kW之间,需要配变频器做软启动和调速。毕业设计用模型的话,直流电机加L298N或者继电器模块驱动就够了。

实操心得:光电传感器的检测距离一定要留余量。我见过一个同学把光电装在载车板边缘,结果车辆稍微停偏一点就检测不到,反复调试了一整天。后来把传感器往内移了3厘米,问题立刻解决。

2.3 电气接线图与安全回路设计

接线图这部分,很多同学直接用软件画个示意图就交了,但答辩时老师会盯着安全回路问。安全回路的核心原则是:任何一路安全信号断开,所有运动输出必须立即停止。

具体做法是把急停按钮、限位开关的常闭触点串联在输出模块的公共回路上,或者通过安全继电器控制电机电源。这样即使PLC程序跑飞了,硬件层面也能切断动力。程序里当然也要做软件互锁,但硬件安全回路是最后一道防线,不能省。

接线时注意几点:强电和弱电分开走线,避免干扰;PLC的24V电源和电机电源分开供电,防止电机启动时电压跌落导致PLC复位;所有输入信号线尽量用屏蔽线,屏蔽层单端接地。

3. 梯形图程序设计与核心逻辑实现

3.1 主程序结构:手动、自动、急停三种模式怎么切

程序结构上,我习惯用主程序调用子程序的方式组织。OB1里只做模式判断和子程序调用,具体的动作逻辑放在FC或FB里。这样结构清晰,调试的时候也方便单独测试某一块。

三种模式的优先级是:急停 > 手动 > 自动。急停模式下所有输出强制复位,手动模式允许单独点动控制每个电机,自动模式才走完整的存取车流程。模式切换用一个字节的MB寄存器做状态字,比如MB10=0表示待机,MB10=1表示手动,MB10=2表示自动存车,MB10=3表示自动取车。

这种状态机写法比一堆置位复位指令要清晰得多。你可以把它想象成一个红绿灯控制器:同一时间只能处于一种状态,状态之间的切换有明确条件。

3.2 存车流程的梯形图逻辑拆解

存车流程是整个程序里最复杂的部分,因为它涉及到车位搜索、路径判断和动作时序。我用SCL和梯形图混合的方式来实现,核心逻辑分四步:

第一步:车位搜索。用一个数组M20.0到M20.4表示5个车位的占用状态,0为空,1为占用。存车时从第一个空位开始找,找到后把车位号存入MW30。

第二步:路径判断。如果目标车位在上层,需要检查它正下方的底层车位是否有载车板。如果有,先执行横移让位。这一步的逻辑用比较指令实现:如果目标车位号大于等于3(上层),则检查目标车位号减3对应的底层车位状态。

第三步:动作执行。升降和横移不能同时动作,必须互锁。程序里用定时器控制动作顺序:先横移到位,延时0.5秒,再升降到位,再延时0.5秒,最后更新车位状态。

第四步:状态更新。所有限位信号到位后,把对应车位状态置1,运行指示灯闪烁三次表示存车完成。

下面是一段简化的SCL代码示例,展示车位搜索的逻辑:

// 车位搜索功能块 FOR #i := 0 TO 4 DO IF #CarStatus[#i] = 0 THEN #TargetSlot := #i; EXIT; END_IF; END_FOR; // 判断是否需要横移让位 IF #TargetSlot >= 3 THEN #LowerSlot := #TargetSlot - 3; IF #CarStatus[#LowerSlot] = 1 THEN #NeedMove := TRUE; END_IF; END_IF;

这段代码看着简单,但实际写的时候要注意数组下标从0开始还是从1开始,西门子的数组默认从0开始,别搞混了。

3.3 取车流程与安全互锁的编程细节

取车流程比存车多了一个“确认车辆存在”的步骤。用户按下取车按钮后,系统先通过光电传感器确认目标车位确实有车,然后再执行与存车相反的动作序列。

安全互锁是取车流程里最需要小心的地方。我总结了三条必须做的互锁:

  1. 升降与横移互锁:升降电机和横移电机不能同时输出,否则机械结构可能卡死。程序里用常闭触点互相切断对方的使能条件。
  2. 上下限位互锁:上限位触发时,禁止继续上升;下限位触发时,禁止继续下降。这个用限位开关的常闭触点串联在输出线圈前实现。
  3. 急停全局互锁:急停按钮按下时,用一个M位(比如M0.0)切断所有输出。这个M位在所有输出线圈前都要串联。

常见坑:有同学把急停逻辑只写在主程序开头,结果子程序里的输出没受影响。正确做法是在每个输出线圈前都串上急停标志位,或者用跳转指令直接跳过所有输出子程序。

3.4 定时器与计数器在动作时序中的应用

动作时序控制离不开定时器。西门子S7-1200有四种定时器:TON(接通延时)、TOF(断开延时)、TP(脉冲)、TONR(保持型接通延时)。车库场景下最常用的是TON。

比如升降电机从启动到到位,需要设置一个超时保护:如果10秒内上限位或下限位没有触发,说明电机堵转或限位开关故障,程序自动切断输出并报警。这个逻辑用TON实现:

// 升降超时保护 #Timer_Lift(IN := #Lift_Start, PT := T#10S, Q => #Lift_Timeout); IF #Lift_Timeout THEN #Lift_Up := FALSE; #Lift_Down := FALSE; #Fault_Alarm := TRUE; END_IF;

计数器则用于统计存取车次数,可以在上位机上显示“本日已服务XX次”。这个数据对车库运营方来说是有价值的,虽然毕业设计里不一定要求,但加上去会让项目显得更完整。

4. 上位机监控与SCADA组态实现

4.1 组态软件选型:WinCC还是国产组态

上位机监控这块,如果学校实验室有西门子正版授权,直接用WinCC是最省事的,因为它和S7-1200的通信几乎零配置。但WinCC的授权费用不低,很多同学会选择国产组态软件,比如组态王、力控、或者开源的ScadaBR。

我的建议是:如果只是做毕业设计演示,用组态王或者力控的试用版就够了,功能完全能覆盖车位状态显示、按钮控制、报警记录这些需求。如果想让项目看起来更“现代”一些,可以用Python写一个简单的上位机,通过OPC UA或者Modbus TCP和PLC通信,用PyQt做界面。这种方式更灵活,但工作量也更大。

4.2 通信连接:PLC与上位机怎么“对上话”

通信是很多同学卡住的地方。S7-1200和上位机通信,最常用的两种方式:

  • S7通信:西门子私有协议,WinCC和组态王都原生支持。在TIA Portal里把PLC的“允许来自远程对象的PUT/GET通信访问”勾上,然后在组态软件里填PLC的IP地址和机架槽号就行。
  • Modbus TCP:通用协议,适合和第三方系统对接。S7-1200需要调用MB_SERVER指令块,把要交换的数据映射到DB块里。

通信调不通的时候,先别急着怀疑程序。按这个顺序排查:网线通不通(ping一下PLC的IP)、防火墙有没有拦、PLC的通信端口有没有使能、数据块是不是优化访问(Modbus TCP需要把DB块设为非优化访问)。

4.3 监控界面设计:让车位状态一目了然

监控界面的设计原则就一条:让不懂技术的人也能看懂。车位用绿色表示空闲,红色表示占用,灰色表示故障。每个车位上方显示车位编号,下方显示当前状态文字。存取车按钮放在显眼位置,急停按钮用大红色。

报警记录用表格显示,包含时间戳、报警类型、确认状态。历史趋势图可以显示电机电流或者动作次数,这个在答辩时是加分项。

实操技巧:界面上的动画效果不要做得太花哨。我见过一个同学把载车板移动做成了3D动画,结果组态软件卡得不行,答辩演示时直接死机。简单用颜色变化和文字提示就够了,稳定第一。

5. 仿真调试与常见问题排查实录

5.1 没有实物怎么调程序:PLCSIM Advanced的使用要点

大部分同学不可能真的搭一个车库模型,所以仿真调试是必经环节。西门子的PLCSIM Advanced可以模拟S7-1200/1500的运行,支持与WinCC和组态软件的通信仿真。

安装PLCSIM Advanced时最常见的两个坑:一是虚拟网卡没有正确安装,导致仿真PLC和上位机通信不上;二是PLCSIM Advanced和TIA Portal版本不匹配,比如TIA V16配PLCSIM Advanced V3.0就可能出问题。建议版本对应关系:TIA V15.1配PLCSIM Advanced V2.0,TIA V16配V3.0,TIA V17配V4.0。

启动仿真PLC时如果报Error 11或者启动不了又没有报错,先检查虚拟网卡是否启用,再检查Windows的Hyper-V功能有没有冲突。有时候重启一下电脑就能解决,别在这个问题上耗太久。

5.2 程序下载后没反应:输入输出排查清单

程序下载到PLC后没反应,按这个清单逐项排查:

现象可能原因排查方法
所有输入指示灯不亮24V电源未接通万用表测输入端子电压
某个输入常亮传感器常闭/常开接反对照点位表检查传感器类型
输出模块灯亮但电机不转中间继电器或接触器故障测继电器线圈和触点
程序在线但无输出程序段被跳过或条件不满足用监控表强制输出测试
通信连不上IP地址不在同一网段检查PC和PLC的IP配置

这张表是我自己调试时总结的,基本上覆盖了80%的“没反应”问题。剩下20%可能是程序逻辑写错了,那就需要在线监控,逐段排查。

5.3 限位开关抖动与信号防抖处理

机械式限位开关在触点闭合的瞬间会有抖动,PLC的扫描周期是毫秒级,很容易把抖动读成多次触发。解决方法有两种:硬件上在触点两端并联一个0.1μF的电容,软件上用TON定时器做防抖,比如信号持续50ms才认为是有效触发。

// 限位信号防抖 #Timer_Debounce(IN := #SQ_Up_Limit_Raw, PT := T#50MS, Q => #SQ_Up_Limit_Stable);

这个50ms不是随便定的。太小了防不住抖动,太大了响应变慢。根据我的经验,机械限位开关用30到50ms比较合适,光电传感器可以短一些,10到20ms就够了。

5.4 电机正反转互锁失效的典型场景

电机正反转互锁失效是调试中最危险的问题之一。我遇到过一种情况:程序里写了互锁,但实际运行时正转接触器和反转接触器还是同时吸合了。排查后发现是输出模块的两个通道在同一个扫描周期内同时被置位,互锁触点来不及切断。

解决办法是在输出前加一个扫描周期的延时,或者用中间继电器做硬件互锁。更稳妥的做法是:正转和反转的输出线圈前,除了串对方的常闭触点,还要串一个“换向延时定时器”,确保电机完全停止后再反向启动。

经验之谈:调试电机正反转时,第一次一定要空载测试,别直接带载。我见过有人直接带载测试,结果互锁失效导致接触器短路,砰的一声,整个实验室都跳闸了。

6. 毕业设计文档撰写与答辩准备

6.1 论文结构怎么搭:从摘要到附录的完整框架

毕业设计论文不是技术文档,它需要体现你的设计思路和工作量。建议的结构是:绪论(选题背景和意义)、总体方案设计(机械+电气+控制)、硬件设计(选型+接线)、软件设计(程序架构+核心逻辑)、仿真与调试(结果展示+问题分析)、总结与展望。

绪论部分不要抄网上的模板,用自己的话讲清楚“为什么做这个”和“别人做到什么程度了”。总体方案设计里多放几张框图,老师看图比看文字快。软件设计部分把核心梯形图截图放上去,配上文字说明,比贴一堆代码强。

6.2 源码和文档的整理规范

源码整理有个小技巧:按功能分文件夹,比如“01_PLC程序”“02_上位机工程”“03_电气图纸”“04_仿真文件”。每个文件夹里放一个README,说明文件用途和打开方式。这样答辩老师翻你的资料时,会觉得你做事有条理。

文档里的图表要编号,图注写在图下方,表注写在表上方。程序截图要清晰,关键逻辑用红框标出来。别放那种模糊的手机拍屏幕照片,用软件自带的截图工具或者Print Screen。

6.3 答辩时老师最可能问的五个问题

根据我帮人模拟答辩的经验,下面五个问题出现频率最高:

  1. “你的车位调度算法是什么?”答:顺序搜索第一个空位,上层车位需要判断下层是否阻挡。
  2. “安全互锁做了哪些?”答:硬件急停回路、软件输出互锁、限位开关双重保护。
  3. “如果两个按钮同时按下怎么办?”答:程序里做了优先级判断,急停最高,其次手动,最后自动。
  4. “通信协议用的什么?为什么选它?”答:S7通信,因为和西门子PLC原生兼容,配置简单。
  5. “这个系统还能怎么改进?”答:可以加车牌识别做自动计费,或者用触摸屏替代按钮做人机交互。

回答的时候别慌,会的就详细说,不会的就承认“这块我考虑得不够深入,后续可以这样改进”。老师更看重你的思路,不是标准答案。

6.4 从毕业设计到实际项目的延伸思路

这个项目做完,如果你还想继续深挖,有几个方向可以扩展:一是加入变频器做电机调速,让升降更平稳;二是用触摸屏替代物理按钮,做更友好的人机界面;三是接入云平台做远程监控,虽然毕业设计不一定需要,但作为个人技能提升很有价值。

我个人在实际操作中的体会是,PLC编程这件事,看十遍教程不如自己动手写一遍。尤其是互锁和时序逻辑,只有真正调试过,才知道哪里容易出问题。立体车库这个项目虽然经典,但每次重做都能发现新的优化点,这也是它适合作为毕业设计的原因——它足够简单让你能做完,又足够复杂让你能学到东西。