西门子S7-200 PLC立体车库控制实战:从点位规划到调度逻辑
立体车库控制说穿了就是十几台电机、几十个开关、几个光电传感器再加上一个会按逻辑跑流程的PLC。听上去不难可真到现场升降不到位、横移错位、位置检测失灵、两个动作同时抢运行……这些坑我在某立体车库改造项目里一个不落全踩了一遍。如果你正打算用西门子S7-200PLC写一套立体车库控制或者单纯想把这种设备的控制逻辑彻底理清这篇实战篇应该能帮你少走不少弯路。我会从需求拆解讲起一路讲到IO点位规划、梯形图程序结构和现场调试全是这套系统里真正绕不开的部分。1. 立体车库控制到底在控什么先刷新一下需求认识很多初学者上来就问“立体车库PLC程序怎么写”这个思路其实反了。程序是需求的映射需求没捋清楚写出来的梯形图就是一团乱麻。立体车库不是一台机床它是一套需要和人交互、和车打交道、还要保证不出人命的设备控制逻辑的重心压根不在“怎么让电机转”而在“怎么让一组电机按正确顺序转”。1.1 车库结构的选型升降横移式为什么最常见市面上的机械式立体车库形态不少垂直升降式、平面移动式、巷道堆垛式都有但最常见、最典型、也最适合拿来做控制逻辑教学的就是两层升降横移式。我手头做的这套结构是这样的底层3个车位可以横向移动上层3个车位只能做升降动作。底层3个车位里必须留出1个空位当周转位所以底层实际能停2辆车上层能停3辆整套系统一共5个有效车位加1个空载车板。取上层某个车位时得先把对应位置下方的底下车板横移开腾出垂直通道上层车板才能降下来。这个结构为什么流行因为它用最少的电机和限位开关换来了最多的停车位。底层只需要三套横移驱动上层只需要三套升降驱动不用搞什么旋转台、堆垛机控制逻辑也在小型PLC能处理的范围内。用华容道来理解最贴切——你想挪哪个方块就得一步步把其他方块先移开而且一次只能动一块绝对不允许两块同时推。1.2 控制系统的三个核心职责调度、定位、安全把“控制”这两个字拆开看立体车库PLC实际只干三件事。第一是调度。车辆进来了要判断哪个车位能用车辆要走了要判断当前车位在哪个位置、周转位在哪、至少需要几步动作才能把目标车板送到出入口。这个调度逻辑是整套系统的灵魂也是最容易写乱的部分。第二是定位。每个车板是横移还是升降、往哪个方向动、什么时候停全部依赖限位开关和接近开关。定位信号一旦不可靠车板就会冲出轨道或者撞到钢结构程序写得再花哨也没用。第三是安全。运行范围内有人、车辆没停到位、某个电机过载、急停被拍下任何一条异常都必须让系统停下来而且是按优先级、按顺序停。安全不是功能安全是底线。一提到安全现场往往会加一堆硬件保护比如热继电器、机械限位、防坠挂钩。但我说句实话硬件保护是最后一道墙PLC程序里的互锁和超时判断才是日常真正发挥作用的那道防线。很多故障在硬件动作之前程序就该先把它拦下来。2. 为什么选S7-200一台小型PLC撑起整个车库有人会问这年头S7-200不是已经停产了吗怎么还拿它做新项目这里要澄清一下S7-200在工业现场存量非常大很多立体车库、组合机床、包装设备至今还在用备件渠道和参考资料都很成熟。而且对学习者和设备维护人员来说S7-200的价格、体积、指令集恰好卡在“够用”和“好懂”之间。2.1 先算账IO点数、存储空间、扩展能力选PLC之前一定要先算IO。我当时是按这套两层升降横移车库算的账各位可以参考信号类型数量用途说明开关量输入DI约20点限位开关、车辆检测、按钮、急停开关量输出DO约14点电机正反转、指示灯、蜂鸣器通信接口1路预留PPI/自由口接刷卡器或上位机S7-200的CPU226自带24点输入和16点输出也就是说这个项目一块CPU勉强够用但我建议还是留裕量。实际项目里我给CPU226挂了一块EM223数字量扩展模块输入输出各多出16点用来接后续增加的检测光电和对射开关。多出来的点数不是浪费调试阶段你就知道IO冗余多香了。存储空间方面S7-200的程序存储区按块划分梯形图、STL语句表、数据块分开存放。一套立体车库逻辑写下来主程序加六七个子程序大概占用不到3KB。剩下的空间还能放不少注释和中间变量这个容量对车库控制来说非常宽裕。2.2 编程方式梯形图为主STL兜底S7-200的编程软件是STEP 7-Micro/WIN支持梯形图LAD和语句表STL两种表达方式。我个人的习惯是整体逻辑用梯形图搭这样后续维护的人看着舒服但遇到复杂的位运算、置位复位组合、数据比较直接切STL代码量能少一半。梯形图最大的优势是直观一个网络就是一条供电回路线圈在右触点在左任何人看着都能脑补出电流走向。S7-200还有个很有用的特色指令叫顺序控制继电器SCR能把状态机写得分段清晰。不过我用下来觉得在S7-200这种小型PLC上用辅助继电器M加置位复位指令做状态机反而更灵活逻辑跳转不受SCR分段的限制出问题时也好强制。2.3 通信接口与掉电保持这些细节别忽略立体车库通常要在门口挂一块剩余车位显示屏或者在操作面板上做刷卡取车。S7-200的通信接口支持PPI协议也支持自由口模式。PPI主要用来和触摸屏、组态软件通信如果接刷卡控制器或者上位机一般就走自由口Modbus RTU。这里要提醒一个很实际的坑S7-200的编程口和将来要用的PPI通信口是同一个物理口。你调试时用它下载程序设备运行时可能还要用它连触摸屏两者不能同时占用。所以项目里我一般会在控制柜里把PPI口引出一个分线盒编程时插编程线运行时插HMI线谁用谁插。还有掉电保持。车库控制系统断电重启后必须知道每个车板当前停在哪、当前有没有正在执行的动作。S7-200的V区默认保持特性可以在系统块里配置断电后变量值能保留。我项目里把“空位编号”“当前流程状态”“各车位有无车标志”全部放在V区重启后系统能恢复到一个相对安全的状态而不是让所有电机重新乱动。3. 点位规划与接线这一步省事后面少哭IO点位规划我放在第三章是因为它直接决定后面程序好不好写。很多项目都是先让电工把线接了再让程序员对着图纸猜点结果程序逻辑写得像迷宫。3.1 从车库平面图到IO点表怎么一步步数出来拿到立体车库的机械图纸先别急着写程序拿张纸把每个执行机构和每个检测元件都列出来。我按这套两层升降横移车库来举例底层3个横移车板每个车板需要两个限位开关一个左限位一个右限位所以是6个输入点。上层3个升降车板每个需要上限位和下限位又是6个输入点。再加上人车安全光幕、车辆到位检测、急停按钮、运行模式选择开关、热继电器信号输入点差不多20个。输出点也好数底层3个横移电机各需要正转、反转两个输出点共6点上层3个升降电机也是正反各一共6点再加一个运行指示灯、一个故障报警蜂鸣器一共14点。如果你还需要点亮数码管显示剩余车位那输出就要多算7个段码不过这种方案现在已经少见大部分都用显示屏或上位机做了。把这些点编成一张表存在程序注释里是后面排查故障时最快的信息来源。我自己是这么表的地址信号名称常态说明I0.0急停按钮闭合断开立即停车I0.1A1车板左限位断开横移左侧到位I0.2A1车板右限位断开横移右侧到位I1.0B1车板上限位闭合升降居上位Q0.0A1横移电机正转断开向左移动Q0.1A1横移电机反转断开向右移动建议把“常态”这一列也写上这样查线时拿到万用表就能快速判断是传感器坏了还是信号反了。3.2 电机正反转的硬互锁和软件互锁横移电机和升降电机都是单相或者三相异步电机要实现正反转一般通过两个接触器切换相序。正转接触器和反转接触器绝对不允许同时吸合否则相间短路轻则跳闸重则烧接触器。PLC程序里正转和反转输出必须互相置位复位这叫软件互锁。但软件是跑在芯片里的万一PLC跑飞或者输出卡死只靠软件互锁根本兜不住。所以接触器回路里还要串对方的常闭辅助触点这叫硬件互锁。我项目里这套接触器选了带机械联锁的型号机械上本身就推不动同时闭合等于上了双保险。接输出线的时候还有个小细节接触器线圈是感性负载断开瞬间会产生反向电动势容易把PLC输出继电器触点打毛。线圈两端一定要并联RC吸收回路交流接触器用阻容吸收直流继电器用续流二极管。很多设备运行一两年后输出点无故烧坏八成就是没加这个。3.3 传感器选型与现场接线注意事项限位开关是立体车库最关键的传感器。横移车板需要检测左右到位一般用机械式行程开关就够升降车板需要检测上下极限位我用的是接近开关加机械限位双重方案。接近开关响应快、寿命长但容易被钢结构和铁屑干扰误触发所以安装位置和灵敏度都要现场调。这里有个典型的接线坑PLC的输入模块分漏型和源型也就是常说的PNP和NPN接线方式。如果买的是NPN常开接近开关接法和PNP就完全不一样。我在现场见过好几次传感器明明是好的但PLC输入灯不亮就是因为没搞清楚NPN输出低电平还是高电平。接线之前一定先看传感器铭牌再看PLC手册里输入公共端的接法。还有安全光幕装在出入口位置用于检测车辆出入时有没有人站在车道上。光幕的常开/常闭触点该进哪个点程序里该用常开还是常闭这个必须在点表里标清楚。我的原则是安全类信号一律接成“断线报警型”也就是正常时触点闭合、断线或故障时触点断开程序里按常开逻辑扫描一旦信号丢失系统立刻判定异常。4. 核心调度逻辑存取车是控制系统的最小闭环调度逻辑是立体车库程序的主心骨。前面点位规划做得再好调度写乱了照样不会跑。我建议不要直接闷头写梯形图先在草稿纸上画状态转换图把每一步想清楚再动手。4.1 空位管理立体车库的“华容道”核心前面说过底层3个车位里有1个空位。这个空位不是随机的上层任何一块车板要降下来正下方的底层车位必须是空位。所以整个存车取车过程本质就是通过各种横移操作把这个空位搬运到需要的位置。我在程序里用一个V区字节MB0存空位编号比如MB0等于1代表A1是空位。每次横移动作完成后MB0的值要和车板位置一起更新。这个变量是整个调度算法的起点。举个例子用户要取上层B2车位的车。B2正下方是A2车位。如果A2不是空位系统第一步要判断A2能不能横移能往哪移假设A2左侧A1为空位那A2就向左横移到A1位置此时空位变到A2。然后B2下降用户把车开走。取完后B2回上位系统恢复空闲。这个例子看着简单但把它推广到任意车位就变成一串条件判断和动作序列的组合。4.2 取车流程拆解用状态机想清楚每一步我习惯用“状态-动作”的方式来设计这个流程。整个取车流程可分为几个状态空闲、移位准备、横移执行、升降执行、取车完成、复位。每个状态里只允许一个动作动作必须满足前置条件才能转移。比如从“横移执行”转到“升降执行”必须检测到目标车板下方的空位已经到位也就是空位号MB0等于目标正下方编号同时所有横移电机都停止运行。程序上我用M区标志位表示状态主程序里只做一件事根据当前状态调用对应子程序。比如M0.0是空闲态M0.1是横移态M0.2是下降态。横移子程序里面再判断方向、启动电机、等待限位、停止电机。状态转移用置位复位指令完成把旧状态复位把新状态置位。这套写法的好处是任何时刻系统的动作意图一目了然现场出问题看M区标志位就知道卡在哪一步。调试时用手持编程器或者软件状态表一监控马上能看到流程停在哪。4.3 存车与倒库互斥管理怎么落地存车流程相对简单。车辆开到出入口检测器触发PLC判断有无空位。有空位就直接引导车辆驶入底层空位或者调度上层空位下来没有空位就显示车位已满。比较麻烦的是倒库。举个例子底层A1停了车A2是空位现在又来一辆车要停按道理应该停到A2。但A2在中间车要开进去必须先经过A1前的通道或者需要把A1横移开、把A2摆到出入口通道前。这就是倒库逻辑——通过横移把空位挪到出入口正对的位置。倒库逻辑本质上还是基于空位号MB0的搬运动作。程序里我设计了一个通用子程序“横移调度”输入参数是“当前空位编号”和“目标空位编号”输出是一串横移动作序列。当到位条件满足后自动返回成功信号。这样存车、取车、倒库都能复用它代码量一下子降了下来。还有一个互斥原则必须强调同一时刻全局只允许一个动作电动机运行。我设了一个运行中标志M10.0任何流程只要开始了就先置位M10.0所有电机的启动条件第一行就是AN M10.0。新请求到来时如果M10.0为1直接拒绝。这个标志是防误操作的第一道闸。5. 梯形图落地S7-200里的程序结构关键段调度逻辑捋明白后写梯形图就变成体力活了。但S7-200毕竟是老产品程序结构和现在的主流PLC不太一样有几个点值得单独拿出来说。5.1 程序框架主循环、子程序、状态标志S7-200的程序结构是主程序OB1加若干子程序SBR没有S7-300那种OB组织块的概念。主程序每一扫描周期从头到尾刷一遍子程序需要手动调用。立体车库这种逻辑并不复杂我建议主循环里做三件事读按钮和模式开关、调用调度子程序、刷新指示灯输出。中间变量尽量放在M区。M区有掉电不保持和保持两种可以通过系统块配置。我在实际项目里把“状态标志”放M区因为状态本来就不需要断电保持上电就恢复到空闲态更安全把“空位编号”“有无车记忆”放V区这些断电后必须记住下次开机才知道往哪动。关于子程序我写了四个横移控制、升降控制、流程调度、故障处理。子程序之间不直接嵌套调用全部由主程序统一调度。这样方便单步调试也能避免子程序循环调用把自己绕晕。5.2 到位判定与超时保护最容易出错的网络段到位判定是立体车库程序里最常见的逻辑段也是最容易出问题的段。横移车板启动电机后必须等待对应限位开关动作。但限位开关可能坏可能被铁屑卡住也可能线头松掉。电机如果一直转车板就会冲出轨道。所以我给每个动作都加了软件超时。S7-200的TON定时器很好用例如设定横移超时10秒正常横移只要3秒一旦超过10秒还没到位程序强制切断输出并置位故障。梯形图可以这么写假设M3.0是横移运行标志T101用100ms时基设定值150就是15秒Network 1 超时计时 LD M3.0 TON T101, 150 Network 2 超时故障 LD T101 S M10.5, 1 R Q0.0, 1这套做法必须做成标准件每个电机都要加别偷懒。很多立体车库事故最后查下来都是“限位开关失效后电机一直运行”。有了超时保护至少能把损坏范围控制在轨道范围内而不是整台设备报废。5.3 安全联锁硬保护之外PLC还要做哪些安全联锁分好几层。第一层是急停。急停常闭触点进PLC输入程序里所有电机的启动线圈前面都串一个急停输入常开触点。急停一旦断开所有输出立即失电。同时急停回路还要直接切断接触器控制电源做到PLC失效时也能物理停车这是双回路。第二层是光幕联锁。出入口光幕被遮断时禁止任何横移和升降动作。这个联锁必须放在每个电机的启动条件里而不是只放在流程开始前。因为人可能在动作过程中走进来流程开始时的检测挡不住动作过程中的闯入。第三层是运行中的互锁。横移进行时升降电机不能启动升降进行时横移电机不能启动。这个用运行中标志M10.0来实现。但要注意S7-200是循环扫描的输出刷新有延迟。所以除了程序里的软件互锁接触器硬件互锁仍然是必须的程序只负责对的动作硬件负责兜错的动作。6. 调试与故障排查现场才是真正的老师程序写完只完成了一半剩下的一半在现场。立体车库控制系统的调试我总结成三步走手动、半自动、自动。每一步都有明确的验证目标跳步是大忌。6.1 三步调试法手动、半自动、自动第一步行手动。把模式开关拨到手动用面板按钮逐个操作每台电机。这一步的目的是验证接线、验证限位信号、验证硬件互锁。每个电机至少来回跑三趟看启动是否利索、停止是否干脆、限位被撞后电机是否立即断电。第二步半自动。把调度流程拆成单步每按一次启动就执行一步动作。比如先横移A2到空位停下再横移A3到新空位停下最后才允许降车板。每一步都人工确认到位后再进行下一步。这一步能发现调度逻辑里的漏洞比如方向判断反了、限位选错了、动作顺序不对。第三步自动。连续执行完整的存车、取车流程包含倒库。这里重点观察两个东西一是动作节奏电机频繁启停时接触器是否过热二是异常处理人为触发一个光电信号或者拍下急停看系统能否准确停车并报出对应故障。6.2 高频故障现象与根因分析调试阶段碰到的问题翻来覆去就那么几类我把常见的列了个表方便现场对照。故障现象常见根因处理建议电机启动两秒就停限位开关提前动作或逻辑判断反了查输入状态表确认车板实际位置和限位信号是否对应车板冲过限位才停限位信号丢失、接近开关灵敏度太高发跳变先查接线再调传感器最后看程序超时有没有动作按钮没反应模式开关在自动档、运行中标志没复位监控M10.0状态看是不是流程没走完重启后车板位置混乱V区保持设置不对、空位号没保存在系统块里把V区设为掉电保持并检查更新空位号的时机接触器频繁烧毁阻容吸收没接、正反转切换太快加RC吸收程序里保证正转停止后延时300ms再允许反转这些故障里最有迷惑性的是第二种。接近开关对钢结构特别敏感安装位置离轨道腹板太近车板还没到位它就误触发。我调这个项目时最后把接近开关灵敏度从2mm调到5mm才稳定。所以现场不能只信传感器信号要结合机械动作轨迹来判断。6.3 排查流程与备件思维排查现场故障我的建议永远是一条路走到底先看输入再看输出最后才动程序。拿“上层车板降不下去”举例。先把PLC切到运行模式打开软件状态监控看下降按钮对应的输入位有没有置位。没有置位查按钮接线置位了看下降允许条件有没有满足是不是光幕遮断、是不是下方空位标志错误都满足看输出继电器有没有吸合。输出吸合但电机不转那就是接触器或电机回路的问题跟PLC没关系了。备件上接触器、限位开关、接近开关、PLC电源模块各备一个基本能覆盖九成故障。S7-200虽然停产了但二手市场、库存渠道非常多CPU模块几百元就能买到所以完全不用担心维护问题。比起硬件真正容易断档的是会写这套逻辑的人。所以我建议程序里多写注释点表画清楚留给维护人员的最大资产不是设备是可读的图纸和逻辑。这套系统调到后期我最大的体会是PLC程序只占这个项目三成的功夫点位规划和安全冗余才是另外七成。之前总觉得程序写得漂亮才是水平后来发现现场能让人放心睡觉的是那些“看起来笨但绝对可靠”的硬保护和超时判断。每次运行前多想一层“如果这个传感器坏了会怎样”比多写一百行代码都管用。做立体车库控制慢就是快稳就是赢。