☰
3×3立体仓库双PLC组态系统设计与调试实践
2026/10/5 8:04:01 网站建设 项目流程

上个月刚交付了一套3×3立体仓库的组态控制系统,PLC这边同时用了西门子S7-200 SMART和三菱FX3U两块,上位监控用的是MCGS触摸屏。这类项目我前后做过几套,但这套稍微特殊——客户希望两个主流品牌在同一套设备里协同工作,西门子负责流程调度和外部通讯,三菱专职管步进定位。整个项目从电气选型、控制逻辑到组态画面、现场调试,踩了不少坑,也积累了一些新经验,趁着最近项目结算完,把整套思路和排障过程整理一下。

3×3立体仓库虽然只有9个货位,但麻雀虽小五脏俱全:三轴机械结构、步进电机定位、限位与原点检测、手动自动切换、仓位状态管理、触摸屏监控,PLC编程、组态交互、多机通讯全都要过一遍。无论你是刚入门PLC想做项目练手,还是正在做同类设备调试,这篇内容应该都能用得上。我按照实际开发顺序来讲,从需求拆解一路讲到现场排障。

1. 先搞清楚3×3立体仓库究竟在控制什么

立体仓库的控制本质就三句话:把货物放到指定格子,把货物从指定格子取出来,过程中不能撞车。3×3仓库是9个货位,排成3行3列,对应一台三自由度堆垛机。

1.1 三轴动作与坐标关系

我习惯把立体仓库的三个轴定义成:

  • X轴:堆垛机在货架前列方向上的行走,决定去第几列
  • Y轴:货叉托盘的升降,决定去第几层
  • Z轴:货叉的伸出和缩回,负责把货物送进货位或从货位里取出来

所以一个货位坐标其实就是(X列, Y层)的组合加一个Z轴的动作。比如“2号列、3层货位”,X轴走到2号列,Y轴升到3层,Z轴伸进去放货或取货,动作完成后Z轴缩回,Y轴可以降到原位,X轴归位等待下一条指令。

这套系统里X轴和Y轴用了步进电机加丝杠,Z轴用一个小型电机推动货叉,加上行程限位保护。步进电机的好处是定位精度可控,项目里要求货叉对准货位误差不超过2毫米,用脉冲数来定位比单纯靠气缸限位稳得多。

1.2 手动、自动两个模式是必须的

我不管做哪套设备,手动模式一定优先写。原因很简单:自动跑飞了你总得有手段把设备摇回原点,而且现场调试阶段,手动点动是查接线、查传感器最基本的手段。

这套系统的手动模式下,MCGS触摸屏上给三个轴各做两个点动按钮,正转、反转,按住动、松开停,同时画面上实时显示三个轴的当前位置。自动模式则分成“自动入库”和“自动出库”两条流程。另外还有一个回原点操作,因为步进电机断过电之后位置是靠脉冲数记忆的,不回归原点就可能跑飞,所以上电第一步必须先回原点。

1.3 为什么这项目用PLC加MCGS而不是其他方案

客户之前也问过,能不能直接用一块屏幕加几个继电器搞定。答案是不行,因为自动流程需要根据仓位状态、限位信号、运行步骤做判断,纯继电器逻辑体积大、改起来麻烦。PLC做逻辑控制既有可靠性又有灵活性,MCGS组态屏负责显示和操作,开发速度快,后期改动画面也不用动PLC程序。这套组合对于中小规模设备来说,性价比和可维护性都是最合适的选择。

2. PLC选型与I/O分配:西门子和三菱各管一摊

这套系统双PLC的架构不是拍脑袋定的。客户手里有多条产线,一部分设备用西门子,一部分用三菱,希望以后这套立体仓库既能和现有西门子产线通讯,也能独立扩展成三菱体系。所以我干脆让两块PLC各自发挥长处。

2.1 主从分工的思路

西门子S7-200 SMART选的是ST30晶体管输出型,三菱选的是FX3U-32MT。分工是这样:

  • 西门子S7-200 SMART做主控:负责自动流程调度、手动/自动切换、Z轴电机控制、报警汇总、与MCGS触摸屏以太网通讯、与三菱FX3U走Modbus RTU通讯
  • 三菱FX3U做定位控制器:X轴和Y轴步进电机的脉冲输出、方向控制、原点回归、限位处理。FX3U的高速脉冲输出性能很稳,三轴以内用它做定位是小菜一碟

为什么不让西门子直接发脉冲?ST30也支持高速脉冲输出,但从项目扩展角度看,把定位功能独立到三菱,以后如果加第四轴、加大行程,改定位程序不影响主流程。而且客户现场有工程师熟悉三菱,后期维护他们自己能上手。

2.2 输入输出分配表

先说三菱FX3U这一侧,主要接X轴和Y轴相关的输入输出:

地址用途说明
X0X轴原点接近开关,回零定位用
X1X轴左限位硬限位保护
X2X轴右限位硬限位保护
X3Y轴原点升降回零定位用
X4Y轴上限位防止货叉抬过头
X5Y轴下限位防止托盘砸底
Y0X轴步进脉冲发一个脉冲走一步
Y1X轴方向信号决定前进还是后退
Y2Y轴步进脉冲升降脉冲
Y3Y轴方向信号决定上升还是下降

西门子S7-200 SMART这一侧,接的是系统级别的信号:

地址用途说明
I0.0急停按钮常闭触点,直接进PLC
I0.1启动按钮自动流程启动
I0.2停止按钮暂停当前动作
I0.3手动/自动切换旋钮开关
I0.4Z轴伸出到位货叉伸到位信号
I0.5Z轴缩回到位货叉缩回信号
Q0.0Z轴电机伸出正转
Q0.1Z轴电机缩回反转
Q0.2三色灯/蜂鸣器报警指示输出

输入输出分配看着简单,但实际上有一个特别容易踩的坑:传感器电源和PLC输入电源必须分开做好隔离。我这套设备的Z轴伸出到位接近开关一开始和步进驱动器用了同一个开关电源,步进电机一启动,电压波动直接把接近开关信号打飞了,货叉都伸到最外面了还报“未到位”,后来单独拉了一路DC24V给传感器才消停。

2.3 电气接线上的几个细节

  • 步进驱动器一定要单独接地,不要和PLC的0V混在一起,否则脉冲容易受干扰丢步
  • 步进脉冲线用双绞屏蔽线,屏蔽层单端接地。我现场用的是拖链电缆,屏蔽层如果两端都接反而会形成地环路
  • 所有限位开关都接常闭逻辑,断线时能直接暴露故障。有的同事图省事接常开,结果线松了设备还在疯跑,这是要出事故的

3. 货位管理、流程调度与互锁保护的程序设计思路

这一部分是整个项目里最需要静下心来想的环节。PLC程序从来不是一上来就写梯形图,我习惯先在纸上把数据结构和流程画清楚,再落到程序里。

3.1 货位编号与状态存储

9个货位,我用的编号规则是“行号列号”,比如第一层第二列就是“12”,第三层第一列就是“31”。

每个货位定义一个状态位:1表示有货,0表示空位。这9个状态位放在西门子SMART的V存储区里,VW1000到VW1008对应9个货位。为什么要放在西门子这边?因为MCGS触摸屏直接通过以太网访问西门子的V区最方便,画面上的9个格子颜色变化直接绑定这9个位的状态,不需要中间转发。

流程里有一个必须做的判断:自动入库时,目标仓位必须是空位;自动出库时,目标仓位必须有货。如果不做这个校验,入库放到已经有货的格子里就会撞上原有货物,货叉直接别弯。我在画面上做了文字提示“该仓位已有货物,请重新选择”。

3.2 目标位置的换算逻辑

X轴走第几列、Y轴升到第几层,对应多少脉冲,这个换算要提前在程序里写好映射表。

比如现场X轴丝杠导程是5毫米,步进驱动器细分设为8细分,步进电机步距角1.8度,那么:

  • 每转需要的脉冲数:360 / 1.8 × 8 = 1600脉冲
  • 电机每转一圈走5毫米,每个脉冲对应位移:5 / 1600 = 0.003125毫米

假设货架每列间距是100毫米,那么1号列到2号列要走100毫米,对应脉冲数100 / 0.003125 = 32000。这个数值大得吓人?不对,我实际用的是减速步进电机配减速箱,这些参数每个项目都不一样。这块我不建议在程序里做实时计算,直接把每种货位的脉冲数用MOV指令提前存到寄存器表里,程序按货位号查表取数。查表逻辑简单、运行速度快,现场改参数也方便。

西门子主控里有一张表,例如:

货位X轴目标脉冲Y轴目标脉冲
1100
12320000
13640000
21024000
223200024000
236400024000
31048000
323200048000
336400048000

实际开发时,我是在现场用点动把货叉对准每个货位后,记录下此时三菱侧显示的当前脉冲数,再填回这张表的。这种“现场示教填表”比任何理论计算都靠谱,因为你没法保证机械装配、丝杠间隙这些误差完全符合理论值。

3.3 自动流程分步骤执行

自动入库的流程我用状态步编号来实现,这是PLC程序里最基础也最实用的套路:

  • 步0:等待启动信号
  • 步10:校验仓位状态,失败则跳回步0并报警
  • 步20:通过Modbus把X轴目标脉冲写入三菱FX3U的D200寄存器,把Y轴目标脉冲写入D202
  • 步30:通过Modbus置位三菱的M100,触发三菱执行X轴定位
  • 步40:等待三菱返回X轴到位信号M110
  • 步50:置位三菱的M101,触发三菱执行Y轴定位
  • 步60:等待三菱返回Y轴到位信号M111
  • 步70:Z轴电机正转伸出
  • 步80:等待Z轴伸出到位信号
  • 步90:延时0.5秒,确认货物已经放下
  • 步100:Z轴电机反转缩回
  • 步110:等待缩回到位信号
  • 步120:把对应货位状态位置1
  • 步130:回原点,流程结束

出库流程类似,区别是Z轴伸出到位后先往后退一点把货物勾出来再缩回,最后步把货位状态位清零。

步进程序的写法有个好处:调试时卡在哪个动作,直接看当前步号就知道问题出在哪一步,不用到处翻梯形图。我在MCGS画面上专门放了一个“当前步骤号”的显示框,现场调试效率提高不是一点半点。

3.4 互锁保护:宁可动作慢,不可动作乱

立体仓库最怕的就是几个轴同时动作导致机械碰撞。我在程序里做了三层保护:

  • 第一层,程序互锁:自动流程中,X轴和Y轴绝对不并行,一个轴的运动完成后才会触发下一个轴。有人可能会说这样效率低,但堆垛机这种设备稳定性优先,少跑几秒钟比撞机大修划算得多
  • 第二层,限位硬保护:三菱侧程序里,X轴正转方向如果X2右限位触发,立即切断脉冲输出。这里脉冲输出要用PLSY停止指令或者DRVA指令的中断停止,不能只靠梯形图断开输出点,否则脉冲队列里残留的脉冲还会继续走
  • 第三层,急停回路:急停按钮串在硬件回路里,同时进PLC输入。按下急停后,三菱侧用M120作为急停标志,定位程序里每个指令都检查这个标志,一触发立即停止脉冲输出并清空脉冲指令的当前值

老实说,第三层保护我在仿真阶段没发现太大问题,真正上电调试时才发现,急停触发后三菱FX3U即使停止了脉冲输出,机械结构也会有惯性滑行。后来我在Z轴和Y轴都加了机械刹车,才彻底解决。

4. MCGS组态画面:让操作工一眼看懂仓库状态

MCGS组态软件这东西,上手快但做到好用需要花心思。我做的这套画面分四个:主监控画面、手动操作画面、自动运行画面、报警与记录画面。

4.1 主监控画面的设计思路

主画面是整个系统的门面,操作工90%的时间盯的就是这个画面。我在主画面中间画了一个3×3的仓库俯视图,9个格子按照现场货架的相对位置排列。每个格子关联一个西门子V区的状态位:

  • 状态位为0:格子填充灰色,文字显示“空位”
  • 状态位为1:格子填充绿色,文字显示“有货”
  • 自动运行过程中选中的目标格子:边框闪烁提示

这个效果的实现方式很朴素:MCGS里给每个格子创建两个填充色不同的图形,用“可见度”动画关联对应的V区状态位变量,值为0时显示灰色图形,值为1时显示绿色图形。画面右侧放“当前X坐标”、“当前Y坐标”、“当前步骤号”、“运行模式”四个数值显示框,底下是启动、停止、急停三个按钮。

我强烈建议在画面上把急停按钮做大而显眼,位置固定在右下角,触摸尺寸不低于60×60像素。别小看这个设计,真出问题的时候操作工的手指是带着惯性戳过来的,按钮太小按不到是要背锅的。

4.2 变量连接的坑:地址偏移别搞错

MCGS连接西门子S7-200 SMART时,设备驱动选“西门子S7-200 SMART(以太网)”,通道类型对应PLC的V区地址时有个坑:MCGS里V区的偏移地址和实际V区地址可能相差一个固定数值。比如我程序中货位状态位放在VW1000,在MCGS里填写的通道地址可能是VW994,通道类型是“V区字”。这是驱动规定的偏移,不同版本MCGS的偏移量不一样,需要看帮助文档或者先用一个变量写数测试。

我在测试时遇到的现象是:画面上的格子状态全部反相,该绿的显示灰,该灰的显示绿。查了半天发现是MCGS读回来的是另一个V区的数据,而程序里那个V区恰好初始化为0,所以画面永远显示空位。后来用MCGS的调试窗口,强制写入VW1000一个值再读回,才确认偏移量,重新配置后一切正常。

4.3 报警画面:出了什么问题要有记录

报警信息这块,我在MCGS里做了三类:

  • 系统报警:PLC通讯断开、触摸屏与PLC连接失败
  • 设备报警:限位触发、三菱定位超时、Z轴动作超时
  • 流程报警:入库时仓位已有货物、出库时仓位为空

MCGS的报警组态中有“变量报警”功能,给各个报警变量设置报警阈值和文字描述,触发后自动记录到报警窗口。我特别加了报警持续时间显示,方便判断是瞬时干扰还是持续故障。有一回现场反映“三菱定位超时报警”,看报警记录发现每次都是几百毫秒就恢复,典型的干扰误报,后来给三菱的通讯线加了磁环,报警频率大幅下降。

数据记录方面,我在MCGS里做了一个简单的出入库记录表,用组态软件自带的存盘功能把出入库时间、货位号、操作员记录到U盘或SD卡目录。这套功能好用的地方在于不需要额外写程序,组态库里配置一下就行,客户定期拷贝记录做追溯,省了不少事。

5. 双PLC通讯与MCGS对接:Modbus RTU和以太网两条链路

这套系统的通讯配置是整个项目里最容易被忽略又最容易出问题的环节。通讯链路一共两条:西门子与三菱之间走RS485 Modbus RTU,西门子与MCGS触摸屏之间走以太网。

5.1 西门子主站读写三菱从站的配置

三菱FX3U做Modbus RTU从站,需要在GX Works里做两项设置:

  • D8120设置通讯格式:波特率9600bps、8数据位、无校验、1停止位。注意三菱的D8120低字节每一位有对应含义,我直接把数值01000100转成HEX是0x0400,写进D8120
  • D8121设置从站站号:我设为1

串口接线是最容易翻车的部分。FX3U的圆口RS485不是标准DB9接口,到时候需要接SDA、SDB、RDA、RDB四个端子,注意西门子侧485接口的A接三菱的SDB还是SDA要看具体定义,不能想当然。我在现场第一次接线时就是A和B接反,Modbus通讯完全没反应,后来用万用表量到两个口定义后才换过来。

西门子S7-200 SMART作为主站,用库指令MBUS_CTRL和MBUS_MSG来实现读写。程序里每秒执行一次:

// 初始化主站通讯 // 在SMART程序中调用MBUS_CTRL,模式=1使能Modbus主站 CALL MBUS_CTRL MODE := 1 Baud := 9600 Parity := 0 Timeout := 1000

读写三菱的D寄存器时,西门子侧Modbus地址要加4开头,例如三菱D200对应Modbus地址400201。写入目标X轴脉冲数:

// 把西门子VD100的X轴目标脉冲写到三菱D200 CALL MBUS_MSG SLAVE := 1 RW := 1 ADDR := 400201 COUNT := 2 DATA_PTR := &VB100

5.2 三菱侧定位程序的输入输出映射

三菱FX3U程序里,我用D200作为X轴脉冲目标值,D202作为Y轴脉冲目标值,M100是X轴启动触发,M110是X轴完成标志。为了让流程清晰,我把定位程序分成两段子程序。

X轴定位用DRVA指令实现:

// 三菱FX3U定位程序 // D200为目标脉冲数(绝对定位),Y0为脉冲输出,Y1为方向 LD M100 SET M100_内部保持 RST M110 LD M100_内部保持 ANI X1 ANI X2 ANI M120 // 急停互锁 DRVA D200 K1600 Y0 Y1 // done PLSY 停止条件自行处理

这里有个实际经验:三菱FX3U的DRVA绝对定位指令执行时,如果目标位置就等于当前位置,指令不会产生脉冲输出,完成标志可能不会触发。调试时发现Y轴有时候到了目标层但不返回完成信号,把流程卡死。解决办法是在程序里先比较D202与当前坐标寄存器D204,如果相等就直接置位完成标志,跳过定位指令。

5.3 MCGS触摸屏连接西门子的网络配置

MCGS与S7-200 SMART之间我用以太网连接,参数如下:

  • PLC的IP地址:192.168.0.2,子网掩码255.255.255.0
  • MCGS触摸屏的IP:192.168.0.40,子网掩码255.255.255.0
  • 通讯协议:西门子S7-200 SMART以太网驱动,默认端口102

这里有一个经常被问到的场景:触摸屏和PLC不在同一个网段怎么办。比如PLC挂在设备网192.168.0.x,触摸屏被客户要求挂在办公网192.168.1.x。MCGS触摸屏如果没有设置网关和路由,跨网段直接不通,现象就是画面上的变量全部“设备通讯失败”。

解决思路有两种:

  • 最简单的方法:把触摸屏IP改成和PLC同一网段,然后用一根网线直连。很多现场这么干,前提是不需要和其他上位系统通讯
  • 如果业务上必须跨网段,就需要在中间加一个支持静态路由的网关或者带路由功能的管理型交换机,配置一条192.168.0.0/24通过网关转发的路由。我看到有人问MCGS触摸屏和西门子1500跨网段通讯的问题,原理一样,如果1500那边设置了跨网段通讯并在PLC里配置了路由表,触摸屏侧也要指同一条网关才能通

我这套设备最终是触摸屏和PLC直连同一个非网管交换机,都在192.168.0.x网段,最省心。

5.4 MCGS同时想监视三菱数据怎么处理

因为三菱是Modbus从站,MCGS触摸屏本身支持三菱FX系列协议,也可以直接通过串口去读三菱的数据。但我在设计时没有让MCGS直接连三菱,因为设备上串口已经给了Modbus通讯。MCGS要看的三菱侧数据(当前坐标、轴报警等)是通过西门子PLC中转的:西门子每100毫秒用MBUS_MSG读一次三菱D204(当前X坐标)和D206(当前Y坐标),存到自己的V区,MCGS再从V区读取显示。

中转方案多花了几个梯级程序,但换来的是MCGS只有一条以太网链路,稳定性好得多。组态屏双通道同时连两个PLC不是不行,但一旦量起来刷新率和通讯时序很难调,问题定位也麻烦。给后来的朋友一个建议:组态系统能保持单链路就不要搞双链路。

6. 调试阶段的三次硬仗:断电保持、网段错配与限位误触发

项目的最后阶段永远是调试,而这个项目的调试过程可以说是在反复踩坑和填坑中走完的。

6.1 三菱FX3U寄存器断电不保持

有一天现场做断电重启测试,结果发现满仓库的“货物”全消失了:9个货位状态全部变成空位。查了程序,发现我把货位状态临时放在三菱的D0比赛了蠢。

这里必须科普一个三菱FX3U的基础知识:D0到D8属于普通寄存器,默认断电不保持。也就是说PLC一断电,这9个字全部归零。当初为什么放在三菱这边?因为我觉得“货位状态是设备侧的数据,应该放在负责运行的PLC里”。后来才意识到,这种长期存储的状态变量,应该放在断电保持区,或者直接放在上位能访问的西门子V区。

解决方案有两个方向:

  • 在三菱PLC参数里把D0-D8设置为锁存区,这样断电后数据可以保持。具体路径是GX Works软件里的“PLC参数”→“软元件”→“锁存”选项卡,把D0-D8起始范围设置好,写完后要“PLC存储器初始化”里的对应区域去掉再下载程序,否则旧值还是会被清掉
  • 把货位状态搬到西门子V区存储,三菱只保留临时变量

我最终两个方案都做了:货位状态迁移到西门子V区,三菱侧D0-D8设置为锁存,作为设备位置数据的短期备份。这样即使通讯断了,三菱自身还有一份位置记录,恢复通讯后可以比对。

这里要提醒一句:设置锁存区域后,锁存区的内容在程序下载时不会被清空,如果调试期想重置所有状态,要把PLC存储器初始化选项里的对应区域打勾后再下载,这坑我掉过一次,排查了半天以为程序坏了。

6.2 触摸屏跨网段连不上的现场处置

现场调MCGS画面时,我把触摸屏的IP配成了192.168.1.10,PLC是192.168.0.2,结果触摸屏画面上的状态全部显示“通信失败”,变量数值全是0。

一开始我一度怀疑是驱动配置不对,折腾了驱动版本、通道类型,跑了半天没效果。后来静下心来用一根网线直连触摸屏和PLC,手动设置触摸屏面板上的IP为192.168.0.40,PLC不用动,画面马上活了。

这事的教训是:遇到以太网通讯问题,先把IP网段问题排除掉再怀疑驱动。很多MCGS触摸屏默认出厂是192.168.1.x,而S7-200 SMART默认也在192.168.1.x,看似没问题;但一改PLC IP就容易和触摸屏错开。建议在触摸屏上贴一张标签,写上当前IP,现场改IP时先看标签,能省掉一上午的排查时间。

6.3 接近开关误触发导致的假到位信号

Z轴伸出到位信号用的是电感式接近开关,调试自动出库时发现:货叉明明才伸出去一半,程序已经收到“Z轴伸出到位”的信号,开始执行下降动作,差点把货物捅歪。

排查过程是这样的:

  • 先用万用表量接近开关的输出端,手动挡看信号是否正常,结果正常的很:接近铁块亮,离开铁块灭
  • 怀疑接线是不是和别的线串了,把Z轴到位信号线单独飞线,故障依旧
  • 最后用示波器挂上去观察波形,发现步进电机Y轴启动升降时,Z轴到位信号的线上会出现尖峰脉冲,宽度几十毫秒,恰好程序扫描周期内捕捉到了

这是典型的电磁干扰导致误触发。现场处理方法是:

  1. 接近开关改用了带屏蔽的三芯电缆,屏蔽层接PLC侧的COM端
  2. 接近开关的供电单独从DC24V开关电源拉一路,不再和步进驱动器共电源
  3. PLC输入端对DC24V之间并联了一个0.1微法电容,滤掉高频尖峰

改完后再跑自动流程,误触发再没出现过。

6.4 关于限位信号的编程建议

限位信号我统一做了滤波处理。S7-200 SMART的输入点可以配置输入滤波时间,我把Z轴相关输入设置成6.4毫秒滤波,三菱FX3U则可以用时间继电器延时确认的方式。

别小看这个操作。之前在某条产线上见过因为没做滤波,限位信号受干扰误触发,设备急停乱响,操作工都不敢靠近。立体仓库虽然是小设备,但小设备更经不起误动作。稳定压倒一切,这话在调试现场永远是真理。

最后再分享一个小经验,这套系统交付后,我在西门子程序里留了一个“统计信息区域”,把每个货位的出入库次数、总动作次数、急停触发次数都做了累加。客户每次做设备点检时,通过MCGS画面就能看到这些数据,提前判断丝杠是否该保养、接近开关是否该更换。这种做法投入几乎为零,但客户对项目的满意度提升非常明显。如果你们也在做类似仓储设备,不妨也留一段这样的统计逻辑,后期维护阶段特别好用。

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

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

立即咨询