前阵子给客户把一个3x4堆垛式书架自动化立体仓库的控制系统从头到尾重做了一遍,用的就是西门子S7-200 PLC加MCGS组态触摸屏,梯形图程序完全自己写,一帧一帧调出来的。项目本身不算大,但该有的东西一点不少:堆垛机水平行走、垂直升降、货叉伸缩、限位保护、触摸屏通讯、货位状态监控全都要做。这篇文章我就把这个小项目彻底拆开,从I/O接线到梯形图逻辑,再到MCGS组态画面,按我实际调试的顺序说一遍,顺便把现场踩过的坑和解决思路都交代清楚。想入门立体仓库控制,或者正在做类似课程设计、小规模仓储项目的朋友,可以直接按这篇文章的思路往下走。
先交代一下设备对象:所谓的“3x4堆垛式书架式自动化立体仓库”,就是货架有3列4层,一共12个货位,长得跟图书馆的书架差不多。堆垛机在货架前面的轨道上水平移动,升降台负责垂直方向寻层,货叉负责把货物推进推出货位。这一套动作拆开看只有三个轴,但组合起来就是一套完整的立体仓库取放货流程。我在这篇文章里默认电气方案是:PLC负责底层逻辑和运动控制,MCGS触摸屏负责操作画面和货位状态显示,双方通过PPI协议走串口通信。下面按项目实施顺序逐块讲。
1. 先搞懂3x4堆垛式立体仓库到底要控制什么
1.1 机械结构和动作流程
很多人在拿到“立体仓库”这种题目时第一反应是上多复杂的调度算法,实际上3列4层的小库位根本不需要那么多花活,先把机械动作吃透才是关键。
整个设备大概由三部分组成:
- 货架本体:3列4层,12个货位,每个货位有独立的托板或导轨,货物由货叉托着进出。
- 堆垛机:底部有行走轮,沿着X方向(列方向)的地轨移动,这是水平轴。
- 升降平台:装在堆垛机上,沿Y方向(层方向)上下移动,这是垂直轴。
- 货叉机构:安装在升降平台上,伸缩方向为Z方向,负责把货物从货位里取出或推进去。
书架式立体仓库和传统重型立体仓库的区别在于,它的货叉更像“抽书”的手,伸进去、托着货物、抽出来,所以货叉行程不需要太长,负载也轻。这也是为什么很多教学设备、小型装配线缓存库都选这种结构——便宜、直观、动作全。
取货和放货的标准动作可以按下面几步拆:
- 堆垛机从原点出发,水平移动到目标列。
- 升降平台移动到目标层。
- 水平、垂直都到位后,货叉伸出。
- 货叉伸出到位后,升降台微抬(或者货叉上的检测确认托到货),然后货叉缩回。
- 货物跟着货叉回到堆垛机上,堆垛机再运行到出库口。
放货则反过来:先定位到目标列和层,伸叉,货物放进货位后缩叉。
这串动作里最核心的问题有三个:怎么知道走没走到位、怎么防止轴之间打架、怎么让触摸屏和PLC默契配合。后面所有程序结构都是围绕这三个问题展开的。
1.2 控制需求明细表
我习惯在写程序之前先把需求列成一张表,跟客户确认完再动手。这张表既是编程依据,也是后面调试时的验收清单。
| 功能 | 说明 | 备注 |
|---|---|---|
| 手动模式 | 单轴点动:行走/升降/货叉分别手动控制 | 用于调试和维修 |
| 自动定位 | 输入目标列和目标层,自动走到位 | 触摸屏写入目标数据 |
| 取货流程 | 自动执行伸叉、取货、缩叉 | 配合载货检测 |
| 放货流程 | 自动执行伸叉、放货、缩叉 | 确认目标位空/有货 |
| 原点回归 | 上电或异常后一键回原点 | 所有自动流程的前提 |
| 货位监控 | 12个货位有货/无货状态显示 | 由触摸屏采集显示 |
| 安全保护 | 急停、软限位、超时报警、轴互锁 | 机械死限位之外的第二道防线 |
这个需求表看着简单,但每一行后面都有对应的梯形图逻辑和组态配置。我见过很多半途而废的项目,就是没在需求阶段把“取货”和“放货”这两个流程区分清楚,最后程序写成一锅粥。做3x4这种小系统时,把动作拆成流程步进,比用一堆散落的置位复位指令要清爽得多。
2. 硬件选型与接线设计:S7-200的I/O分配和实际接线要点
2.1 选型逻辑
S7-200系列里有CPU221、222、224、226几个常见型号。这个项目我选的是CPU226 AC/DC/RLY,原因很简单:输入输出点数要够,还要带继电器输出。CPU226有24点输入、16点输出,就算做完整套3x4仓库控制加安全信号,IO也不会太紧张。继电器输出版本可以直接驱动接触器线圈和指示灯,对现场维护来说比晶体管输出皮实,即使输出短路也不容易马上烧掉,当然前提是负载容量别超。
传感器我统一选用NPN常开型三线制接近开关和光电开关,这也是S7-200输入电路最常见的配置。为什么用NPN?因为S7-200的输入公共端可以接24V电源正极,NPN传感器输出低电平有效,信号端和公共端之间形成回路,PLC输入端能稳定识别。如果你手头只有PNP传感器也能用,但公共端接法要反过来,采购时最好一次统一,免得现场混着用把自己绕晕。
执行机构端,行走电机和升降电机都是小功率,我用两个交流接触器分别控制正反转,货叉电机功率更小,用一个正反转接触器就够。输出端到接触器线圈之间我加了RC吸收器,防止线圈断电瞬间的反向电动势干扰PLC内部电路。继电器输出型PLC虽然内部有隔离,但感性负载的反电动势长时间冲击还是会让触点寿命变短,这个小钱不能省。
2.2 I/O分配表
下面是我在这个项目里实际使用的I/O分配,你可以直接参考着接线。注意,不同厂家的传感器、按钮数量可能有差异,自己排地址时务必按实际点位重新核对。
| PLC地址 | 信号名称 | 类型 | 说明 |
|---|---|---|---|
| I0.0 | 启动 | 按钮 | 启动自动流程 |
| I0.1 | 停止 | 按钮 | 停止当前动作 |
| I0.2 | 急停 | 常闭输入 | 硬急停,程序也读取 |
| I0.3 | 手动/自动切换 | 旋钮 | ON为手动 |
| I0.4 | 水平原点 | 接近开关 | 堆垛机位于0列 |
| I0.5 | 列1到位 | 接近开关 | 1列位置检测 |
| I0.6 | 列2到位 | 接近开关 | 2列位置检测 |
| I0.7 | 列3到位 | 接近开关 | 3列位置检测 |
| I1.0 | 层1到位 | 接近开关 | 1层位置检测 |
| I1.1 | 层2到位 | 接近开关 | 2层位置检测 |
| I1.2 | 层3到位 | 接近开关 | 3层位置检测 |
| I1.3 | 层4到位 | 接近开关 | 4层位置检测 |
| I1.4 | 货叉伸出到位 | 限位开关 | 伸叉极限 |
| I1.5 | 货叉缩回到位 | 限位开关 | 缩叉极限 |
| I1.6 | 货叉载货检测 | 光电开关 | 伸出后是否托住货 |
| I1.7 | 回原点按钮 | 按钮 | 强制回原点流程 |
| Q0.0 | 行走正转 | 接触器 | 向列号增大方向 |
| Q0.1 | 行走反转 | 接触器 | 向列号减小方向 |
| Q0.2 | 升降上升 | 接触器 | 向层号增大方向 |
| Q0.3 | 升降下降 | 接触器 | 向层号减小方向 |
| Q0.4 | 货叉伸出 | 接触器 | Z轴正向 |
| Q0.5 | 货叉缩回 | 接触器 | Z轴反向 |
| Q0.6 | 报警输出 | 声光报警 | 超时或故障 |
| Q0.7 | 运行指示 | 指示灯 | 自动状态显示 |
这个分配表要是画成接线图,就是四块区域:按钮区、传感器区、接触器输出区、限位保护区。实际接线时要注意S7-200的输入公共端有分组,I0.0-I0.7共用一个1M或者2M端,I1.0-I1.7也用同一个公共端。NPN传感器的信号线直接进PLC输入端子,电源正极接PLC输入的公共端,传感器电源接24V开关电源,负极统一接0V。
2.3 接线里最容易出问题的几个细节
第一,急停按钮一定要用常闭触点。也就是说正常状态下急停回路是导通的,按下后才断开。这样一来,急停线断了、接触器松了、电源掉了,PLC都能感知到异常,而不是等设备真出事才发现急停根本没生效。我在输出回路上还串了一个硬接线的急停接触器,就算PLC程序抽风,也能从电气上把电机电源切断。软件急停和硬件急停双保险,这是安全底线。
第二,每个接近开关的感应面到检测铁块的距离要留余量。水平行走的堆垛机有惯性,到位置后如果感应距离太近,会哐地撞上传感器,轻则检测失灵,重则把传感器支架撞歪。我一般把传感器支架做成可调节的长孔,先在机械上把当量调好,再让程序配合减速。
第三,PLC的地线和传感器电源的0V要分开走,最后在电源端单点汇接。现场大电机一启动,地线上的干扰如果不处理,传感器信号很容易乱跳。我这次调试初期就遇到行走刚启动时列1传感器偶尔闪断,排查半天发现是屏蔽层两端都接地形成地环路,改成单端接地后问题消失。
3. 定位与存取动作的控制思路:堆垛机怎么知道该往哪走
3.1 用到位传感器做定位,而不是编码器
3x4仓库一共就3列4层,列与列、层与层之间是固定间距,我用每个位置的到位接近开关来做定位。这种做法成本低、逻辑直接,适合这种小尺寸货架。每个列传感器安装在该列正对的位置,当堆垛机带着感应挡块经过时,对应传感器导通,PLC通过这个信号刷新“当前列”寄存器。
很多刚接触的人会问:为什么不用编码器或者步进电机做精确位置控制?答案是没必要。书架式小仓库的定位精度要求通常在几个毫米内,接近开关加机械挡块的重复精度足够,而且编码器方案要研究高速计数器、电子齿轮、原点中断一堆东西,对一台只需要在12个位置之间往返的设备来说属于杀鸡用牛刀。当然如果你做的是几十列几十层的大型立库,那编码器闭环就必不可少,那是另一个话题。
3.2 当前位置的刷新逻辑
我在PLC里用两个字节寄存器记录堆垛机当前的位置:
- VB202:当前列,数值范围0-3,0代表不在任何列位上(比如正在行走或停在原点)。
- VB203:当前层,数值范围0-4,0代表不在任何层位上。
程序里用一组网络不断检测到位传感器。比如I0.5导通,就把1传送到VB202;I0.6导通,就把2传送到VB202;I0.7导通,把3传送到VB202。层传感器同理。这样无论堆垛机停在哪个位置,PLC都能第一时间知道当前的列和层。
这个设计的巧妙之处在于,不需要专门算“走了多少距离”,只需要关注“现在在哪”。尤其适合没有编码器的简易定位方案。缺点是当堆垛机停在两个传感器之间时,两个传感器都不导通,VB202会被写成0。所以自动运行前必须有一个回原点动作,确保位置数据可靠。
3.3 方向判断和到位停止
目标列和目标层由触摸屏写入两个寄存器:
- VB200:目标列
- VB201:目标层
自动模式启动后,PLC把当前列VB202和目标列VB200做比较:
- 当前列小于目标列:行走电机正转,往列号增大的方向走。
- 当前列大于目标列:行走电机反转,往列号减小的方向走。
- 当前列等于目标列:水平轴不动作,直接置位水平到位标志。
升降轴逻辑完全一样,只是比较对象换成VB203和VB201。列和层两轴理论上可以同时走,这样能缩短定位时间。但要注意,货叉动作必须在水平、垂直都到位之后才能开始,否则就会出现货叉伸到一半撞上货架横梁的严重事故。
3.4 取货放货的动作时序
定位完成后就是货叉动作。我用一组内部继电器M20.x做流程步进,把取货和放货拆成几个明确的阶段:
取货流程:
- M20.1:伸出货叉。
- 等待货叉伸出到位信号I1.4,并且载货光电I1.6确认托住货物。
- M20.2:延时0.5秒,让货叉稳定。
- M20.3:缩回货叉。
- 等待货叉缩回到位信号I1.5。
- M20.4:流程完成,置位取货完成标志。
放货流程:
- M20.1:伸出货叉。
- 等待伸到位I1.4,同时光电I1.6应该因为货物进入货位而失去遮挡,说明货物已经放到位。
- M20.2:延时0.5秒。
- M20.3:缩回货叉。
- 等待缩到位I1.5。
- M20.4:流程完成,置位放货完成标志。
这里有一条很重要的经验:货叉伸缩动作之间不能无缝切换,中间加一个0.3到0.5秒的延时很有必要。机械结构再顺滑,也有换向间隙,不给它一点缓冲时间,货叉机构容易产生冲击,传感器也可能误判。我见过有同行为了赶节拍把延时砍到0.1秒,结果货叉到位信号抖个不停,反而更慢。
3.5 安全互锁和超时保护
轴互锁是梯形图里必须有的一层逻辑。我的原则很简单:只要货叉没有完全缩回到位,行走电机和升降电机一律禁止启动。也就是说货叉伸出来的时候,堆垛机绝对不允许跑。反过来,行走和升降动作进行中,货叉不允许动作。这种互锁用两个网络就能实现,但它是整个运动控制里最不能省的部分。
另外还要做动作超时保护。每个动作都有正常完成的时限,比如行走从一列到另一列大约5秒,升降从一层到另一层大约4秒,货叉伸收大约3秒。如果输出已经触发超过5秒还没等到对应的到位信号,就判定机械卡死或者传感器故障,立刻断开所有运动输出,置位报警,并把报警代码写到触摸屏能读的寄存器里。这个超时功能曾经帮我当场抓过一次升降电机抱闸松不开的故障,不然光看着堆垛机在那干吼,根本不知道问题出在哪。
4. 梯形图程序分段解读:把控制逻辑一行一行讲清楚
4.1 寄存器与中间继电器规划
写程序前先把“账本”理清楚。S7-200编程软件是STEP 7-Micro/WIN,我习惯把变量规划放在程序开头用注释写清楚,方便以后维护。这个项目的内部资源分配如下:
- VB200:目标列(触摸屏写入)。
- VB201:目标层(触摸屏写入)。
- VB202:当前列(程序刷新)。
- VB203:当前层(程序刷新)。
- M10.0:自动运行总标志。
- M10.1:水平定位完成。
- M10.2:垂直定位完成。
- M20.1-M20.4:货叉流程步序号。
- M40.0:报警标志。
- V100.0-V100.11:12个货位的有货状态位,1为有货,0为空位。
货位位的编号规则定为:V100.0对应列1层1,V100.1对应列1层2,V100.2对应列1层3,V100.3对应列1层4,V100.4对应列2层1,依此类推。这个编号规则要和MCGS触摸屏里的显示一一对应,千万别看混。
4.2 启动停止与回原点逻辑
下面几段梯形图是核心逻辑的骨架,我按实际程序风格写出,并在后面给出行解释。先看启停和回原点:
网络1 自动运行总标志 LD I0.0 O M10.0 AN I0.1 AN I0.2 // 急停常闭输入,按下则断开 AN M40.0 // 报警状态下不允许自动运行 = M10.0这段就是经典的自锁电路。启动按钮按下后M10.0得电并自保持,停止按钮或急停按钮断开时M10.0掉电,报警状态下也不允许自动运行。注意急停是常闭输入,正常状态下I0.2始终为1,程序里用AN指令,也就是当I0.2从1变成0时才触发停。这样做的好处前面接线部分已经讲过。
网络2 上电初始化 LD SM0.1 MOVB 0, VB200 MOVB 0, VB201 MOVB 0, VB202 MOVB 0, VB203 R M10.0, 1 R M20.1, 4 R V100.0, 12SM0.1是S7-200的上电脉冲,只在PLC从STOP切换到RUN的那一刻导通一个扫描周期。这个网络的作用是上电时把所有位置和目标值清零,并把所有输出标志复位。货位状态位也一并清零,意味着系统启动时默认所有货位为空。如果希望保留上次断电前的数据,这些位需要放到断电保持区,S7-200默认V区有部分断电保持范围,但为了逻辑清晰,我选择上电全清、运行中由触摸屏维护状态,反正这个项目是人机交互主导。
回原点逻辑为什么必须单独拉出来讲?因为堆垛机只要在运行中被急停、停电打断,很可能停在两个传感器中间,VB202被刷新成0,此时不能盲目执行自动定位,否则它会朝错误方向跑。回原点流程分两步:水平方向和垂直方向都先向负方向走到原点位置,原点到位后把当前列层清0,同时清除水平垂直到位标志。
网络3 手动回原点 LD I1.7 AN I0.3 // 只能在自动模式下操作 S M10.0, 1 MOVB 0, VB200 // 目标列设为0,让定位逻辑驱动回原点 MOVB 0, VB201这里的巧妙之处在于,我并没有单独写一套回原点专用运动逻辑,而是把目标列和目标层都设成0,直接复用后面的定位运动逻辑。堆垛机会自动判断“当前列>0就反转,当前层>0就下降”,直到原点传感器I0.4和层传感器都为零位条件满足。前提是0号位对应原点,程序里用I0.4作为原点标志,层原点我采用层1传感器持续导通时往下找机械零位,或者根据设备结构单独设原点位。实际项目要按你的机械原点传感器位置来调整。
4.3 当前列和当前层刷新网络
这一组网络负责把到位传感器信号转成位置数值:
网络4 刷新当前列 LD I0.5 MOVB 1, VB202 LD I0.6 MOVB 2, VB202 LD I0.7 MOVB 3, VB202同样的写法刷新当前层:
网络5 刷新当前层 LD I1.0 MOVB 1, VB203 LD I1.1 MOVB 2, VB203 LD I1.2 MOVB 3, VB203 LD I1.3 MOVB 4, VB203这几个网络看起来平淡无奇,但有一个隐含问题:如果两个或多个到位传感器同时导通,程序会依次执行传送,最终VB202等于最后一个被检测到的传感器编号。正常情况下两个传感器不会同时导通,一旦出现,说明传感器安装位置有问题或者机械错位,应当在程序里加一个异常判断网络,比如检测到两个列传感器同时为1时置报警。我在实际项目里加了这个检测,因为现场有一台堆垛机发生过轮子打滑、车架歪斜,两个传感器同时被触发,如果没有检测,它会以为自己在两个位置上,后果不堪设想。
4.4 水平与垂直运动输出网络
下面是水平运动的方向判断和输出控制:
网络6 水平行走正转 LD M10.0 AN M10.1 // 水平还没到位 AN M40.0 // 无报警 AN Q0.4 // 货叉禁止伸出 LDB< VB202, VB200 // 当前列小于目标列 = Q0.0网络7 水平行走反转 LD M10.0 AN M10.1 AN M40.0 AN Q0.4 LDB> VB202, VB200 = Q0.1之所以在输出里加AN M10.1,是为了防止已经到位后电机还继续动作。一旦到位,我们会把M10.1置1,Q0.0和Q0.1就都断开了。LDB<和LDB>是字节比较指令,S7-200里字节比较的写法就是LDB,我见过有人把S7-1200的写法带到S7-200里,结果编译报错,这里要特别注意。
当当前列等于目标列时,正转反转都不满足条件,输出自然断开。但为了把“水平到位”这个标志明确置起来,还需要单独一个网络:
网络8 水平到位判断 LD M10.0 LDB= VB202, VB200 = M10.1有人会问:如果目标列是0呢?前面回原点时我们已经把目标列设成0,而VB202只有在原点传感器I0.4导通时才会在后续网络中清0。所以回原点时,堆垛机走到原点后VB202变成0,LDB=条件满足,M10.1置位。为了让这个逻辑成立,我必须保证原点传感器对应的列位就是0,且层位同理。每台设备的机械原点定义都可能不同,编程前要在纸上把坐标画清楚。
垂直运动输出网络跟水平几乎一样,把VB202换成VB203、Q0.0换成Q0.2、Q0.1换成Q0.3、M10.1换成M10.2即可。布局如下:
网络9 升降上升 LD M10.0 AN M10.2 AN M40.0 AN Q0.4 LDB< VB203, VB201 = Q0.24.5 货叉流程步进梯形图
货叉部分我用流程步进方式来写,每一步都带到位确认。看这段核心流程:
网络10 水平垂直都到位后,进入伸叉流程 LD M10.0 A M10.1 A M10.2 AN M20.1 AN M20.3 S M20.1, 1M20.1置位后,输出货叉伸出:
网络11 货叉伸出 LD M20.1 AN M40.0 = Q0.4伸到位后进入延时阶段。这里用定时器T37:
网络12 伸叉到位确认 LD M20.1 A I1.4 // 伸出到位限位 TON T37, 5 // 0.5秒延时(T37时基100ms) LD T37 S M20.2, 1 R M20.1, 1为什么伸出到位后还要延时?因为货叉机构从“碰到到位开关”到“完全停稳”还有一段惯性缓冲。延时0.5秒后再进入下一阶段,能避免机械震颤导致传感器信号抖动。T37的定时器编号、时基要注意,S7-200的TON定时器有1ms、10ms、100ms三种时基,T37是100ms时基,所以定时值5代表0.5秒。
接下来的取货/放货分支逻辑稍有不同:
- 取货模式(触摸屏置位M30.0):在M20.2阶段,如果载货光电I1.6为1,说明货叉托到货了,进入缩叉阶段。
网络13 取货模式下确认载货 LD M20.2 A M30.0 // 取货模式标志 A I1.6 // 载货光电检测到货 S M20.3, 1 R M20.2, 1- 放货模式(M30.0为0):进入M20.2后,不需要等载货检测,延时结束后直接进入缩叉。
缩叉阶段:
网络14 缩叉输出 LD M20.3 AN M40.0 = Q0.5缩回到位后流程完成:
网络15 缩回到位,置位完成标志 LD M20.3 A I1.5 // 缩回到位限位 TON T38, 5 LD T38 S M20.4, 1 R M20.3, 1M20.4是流程完成标志,触摸屏读到它之后会去刷新货位状态,并把M30.0和自动运行标志复位。这样12个货位的“账”就交给MCGS去记,PLC只负责机械动作,分工明确。
4.6 超时报警和复位网络
最后是超时报警保护。我写一个总的动作超时判断,正常流程下,所有相关动作都会在30秒内完成(定位加货叉)。如果自动运行状态下M10.0为1,超过30秒M20.4还没置位,就说明流程卡住了:
网络16 流程超时报警 LD M10.0 AN M20.4 TON T39, 300 // 30秒时基(100ms*300) LD T39 S M40.0, 1 R M10.0, 1报警置位后,所有运动输出网络里都有AN M40.0,所以输出被强行切断。触摸屏上做一个报警复位按钮,按下时用R M40.0复位报警,并且强制回一次原点再继续工作。这个设计虽然简单,但能避免机器带着不确定位置继续跑。
梯形图的模块化设计到这一步就完整了。每段网络都短小、单一,监控时用状态表同时看VB200、VB202、VB203和M20.1-M20.4,一眼就能判断流程停在哪个阶段,这是现场排障效率最高的做法。
5. MCGS组态界面搭建与PPI通讯:触摸屏和PLC怎么联动
5.1 组态软件和工程配置
MCGS组态软件在官网下载中心就能拿到,分嵌入版和通用版,触摸屏TPC系列用嵌入版。装好之后新建工程,第一个要干的事是选对触摸屏型号,型号选错强行下载会直接提示不匹配。工程建好后进入设备窗口,这里要做的事就是添加两个设备:先是“通用串口父设备”,再在它下面挂一个“西门子S7-200 PPI”子设备。
父设备参数按触摸屏实际串口设置,通常这样配:COM口选触摸屏的RS485接口,波特率9600,8位数据位,1位停止位,偶校验。子设备参数里最关键是PLC站号,S7-200的PPI默认站号是2,MCGS触摸屏默认站号是0。站号不对,通信寄存器里读到的全是问号,忙活半天都连不上。
接线方面,S7-200 PLC的编程口是RS485,触摸屏的COM口也是RS485。PLC编程口引脚定义:3号针为RS485+,8号针为RS485-。触摸屏这边按说明书找到A/B端子,通常A接RS485+,B接RS485-,不要接反。两芯双绞屏蔽线拉到PLC端,屏蔽层单端接地。
5.2 建立设备通道与变量连接
MCGS靠“设备通道”和PLC的寄存器地址对应起来。在S7-200 PPI子设备的设备编辑窗口里,把PLC变量一个个添加进去。通道类型有开关型和数值型,对应关系如下:
| MCGS通道类型 | PLC地址 | 含义 |
|---|---|---|
| 开关型 | M10.0 | 自动运行标志 |
| 开关型 | I0.0 | 启动按钮 |
| 开关型 | I0.1 | 停止按钮 |
| 开关型 | M40.0 | 报警标志 |
| 数值型 | VB200 | 目标列 |
| 数值型 | VB201 | 目标层 |
| 数值型 | VB202 | 当前列 |
| 数值型 | VB203 | 当前层 |
| 开关型 | V100.0 | 列1层1 有货 |
| 开关型 | V100.1 | 列1层2 有货 |
| 开关型 | V100.2 | 列1层3 有货 |
| ... | ... | 依此类推 |
| 开关型 | V100.11 | 列3层4 有货 |
设备通道加完之后,在MCGS的实时数据库里新建对应变量,变量名建议和PLC寄存器保持一致,比如叫PLC_VB200、PLC_M10_0。然后在用户窗口的图元属性或者脚本里引用这些变量。MCGS的变量类型是分开关型、数值型的,误配的话显示数值永远是0,这也是新手常遇到的问题。
5.3 用户界面设计
主画面我做了三块区域:
左侧是立体仓库剖面示意图,用矩形方块按3列4层排列,每个方块代表一个货位。把方块的填充颜色连接到对应的V100.x变量:0时灰色(空位),1时红色(有货)。这样运行时整个仓库的占用情况一眼就能看清楚,客户最喜欢看这种画面。
中间是控制区,放启动、停止、急停、回原点四个按钮,以及手动/自动切换旋钮。手动模式下,再放六个点动按钮:行走正转、行走反转、升降上升、升降下降、货叉伸出、货叉缩回,每个按钮按下时把PLC里对应的点动寄存器置位。
右侧是目标货位设定区。放两个数值输入框,分别连接VB200和VB201,操作员直接输入1到3、1到4的数字,PLC收到目标值后自动执行定位。再放一个“入库”和一个“出库”按钮,入库按钮执行的脚本是把M30.0清零(放货模式),出库按钮则把M30.0置1(取货模式)。都设置好之后,按下启动按钮触发自动运行。
脚本也用不上太复杂的逻辑。以出库为例,按钮脚本大致长这样:
PLC_VB200 = 目标列输入框数值 PLC_VB201 = 目标层输入框数值 PLC_M30_0 = 1 ! 取货模式 PLC_M10_0 = 1 ! 启动自动流程然后用一个循环策略,每200毫秒扫描一次PLC的流程完成标志M20.4。一旦发现M20.4为1,就根据最后使用的VB200、VB201去修改对应的货位状态位,然后复位M20.4和M10.0。这相当于把“记账”的工作放到了触摸屏,PLC只负责动作。这样做的好处是梯形图不用写一堆繁琐的位操作,组态脚本处理起来反而更灵活。
5.4 通讯故障排查
调试中最烦的就是PPI通讯不稳定。我总结过一份自查表,给做这个项目的人参考:
- 触摸屏上所有数值都变成“?”,先检查站号:PLC站号是否为2,触摸屏站号是否为0。
- 通讯偶发断开,检查A/B线有没有接反,双绞线是否带屏蔽。
- 波特率不一致:PPI默认9600,但有些人把触摸屏波特率调成19200甚至更高,两边对不上就只能偶尔连上一次。
- 用了USB转RS485线时,注意驱动要装好,转换头质量差会频繁丢包,我吃过一次亏,后来换了一线品牌才稳定。
- 用太长的通讯线:RS485理论传输距离能到1000米,但作为触摸屏和PLC之间的短连接,超过50米就该考虑加终端电阻和提升线径。
很多人在S7-200和MCGS通讯时习惯性去选“以太网驱动”,因为现在S7-1200/1500都是走网口的,但S7-200大部分CPU不带网口,只能走PPI串口。如果驱动选错,设备窗口会报“在线连接所组态访问节点的接口不可用”之类的错误,其实不是电缆坏了,而是通讯方式从头就不对。做S7-200项目时第一反应必须是PPI,别被别的PLC的使用经验带偏。
上载和下载触摸屏工程也有讲究。调试时建议用U盘下载,把工程文件拷到U盘根目录,插到触摸屏USB口后上电,在系统菜单里选择下载。如果触摸屏里的程序被锁了,要先用系统设置里的上传功能备份,再覆盖新工程。现场改程序时,我习惯每次下载前先点编译,MCGS会把语法错误和变量类型错误一次列出来,千万别跳过编译直接下载。
6. 联调过程中的故障处理与经验总结
6.1 上电就乱跑:位置数据丢失的坑
第一次联调时,我犯过一个典型的错误。堆垛机通电后没有回原点,我直接给了一个目标列3的目标值,结果机器不是朝3列走,而是朝反方向冲,差点把货架撞了。原因前面分析过:断电再上电后,SM0.1把VB202清成0,0小于3,程序判断要正转,但堆垛机实际停在列2的位置,它以为自己在原点,所以朝错误方向移动。
从那以后我规定:所有自动流程必须从回原点开始。不管客户觉得多麻烦,这个动作不能省。回原点完成后,触摸屏上显示“原点就绪”,这时才允许输入目标货位。在梯形图里也做了硬约束,回原点没完成时,即使收到目标列,运动输出也不会导通。想省事的人也许会觉得这很啰嗦,但做过现场的人都知道,一次撞机损失的时间和维修成本,远超回原点那几秒钟。
6.2 定位冲过头:低速爬行比硬刹车更靠谱
第二个问题是水平行走定位冲过头。堆垛机全速前进时,经过列1传感器,等PLC反应过来断开输出,机械惯性已经让它在列1和列2之间停下来了。传感器装得再准,机械惯性不讲情面。
解决思路是给定位过程分两段:先是快速接近,离目标还有一段距离时切到低速爬行,到位后立即停车。最简单的做法是利用传感器信号做减速判断:在目标列前一个位置装一个减速传感器,或者在梯形图里判断当列号等于目标列减1时,断开快速挡、接通低速挡。S7-200的晶体管输出可以做PWM调速,但继电器输出只能通断,没法调占空比,所以我用“双速电机”的电气方案:给行走电机准备两个接触器,一台主速一台副速,副速串电阻或绕组抽头实现降速。到位前200毫秒切到副速,堆垛机低速爬过目标传感器,停车位置就稳多了。书架式小仓库负载轻,这个方案完全够用。
6.3 货叉卡货:超时报警帮了大忙
还有一次故障让我印象很深。客户说货叉偶尔会停在一半不动,也没有报警,就卡在那。我到现场观察发现,货物太靠里,货叉伸出后托货的那一下有点歪,光电开关没检测到,程序就在M20.2阶段一直等。以前没做超时报警时,这个状态会一直挂着,操作员只能在触摸屏上按急停。
加了T39超时之后,30秒没完成流程就直接报警停机,操作员能立刻知道出问题了,而不是对着一个静止的机器发呆。所以我特别建议,凡是动作类控制,一定要给每个动作配上超时监控,这个习惯能帮你省掉大量现场排障时间。
6.4 传感器干扰:屏蔽和滤波一个都不能少
传感器误动作也是立体仓库的常见毛病。我遇到过一次升降平台运行到层2时,层1传感器突然闪了一下,导致当前层数据在层1和层2之间抖动,程序误判位置。排查了一圈,问题出在两条动力线和传感器信号线走在了同一个线槽里。大电机启动时,感性负载的浪涌通过空间耦合串进信号线,直接把传感器信号干扰了。
后来我把动力线和信号线分开走金属线槽,传感器屏蔽层单端接地,并在PLC输入回路里把输入滤波时间稍微调大了一点。S7-200的输入滤波可以在系统块里设置,默认是6.4ms,我调成12.8ms,小幅干扰信号直接被滤掉了。这三招下来,传感器误触发基本消失。如果还不行,那就得考虑给传感器电源加隔离电源或者滤波电容了。
6.5 这个项目还能怎么扩展
3x4立体仓库做完以后,其实可以顺理成章地往两个方向扩展。
一个方向是增加货位数。把3列4层改成6列8层,或者更多,传感器定位的方案依然有效,只需要把IO点数和寄存器范围扩大。但当列数一多,传感器的安装、调试成本就会快速上升,到那个规模就该考虑编码器或绝对位置开关了。
另一个方向是引入上位机调度。现在触摸屏充当了操作界面和货位账本,如果再加一层上位机组态软件,通过OPC或者数据库和MES对接,就可以实现自动分配货位、记录出入库日志、统计库存这类功能。S7-200的PPI协议被上位机读取比较费劲,通常用转换器转成Modbus TCP或者OPC,到那一步硬件选型就得重新考量了。
按我个人经验,这种小型立体仓库项目的价值不在于货位有多多,而在于它把“定位、互锁、流程步进、人机交互”这几个工业控制的底层逻辑完完整整练了一遍。把这套程序的思路吃透,以后去碰更大规模的输送线、AGV调度,很多套路都是相通的。真到了现场,接线、调试、排障这些手上功夫,反而比背多少理论知识都管用。