前阵子给客户把一个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-30代表不在任何列位上比如正在行走或停在原点。VB203当前层数值范围0-40代表不在任何层位上。程序里用一组网络不断检测到位传感器。比如I0.5导通就把1传送到VB202I0.6导通就把2传送到VB202I0.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.1112个货位的有货状态位1为有货0为空位。货位位的编号规则定为V100.0对应列1层1V100.1对应列1层2V100.2对应列1层3V100.3对应列1层4V100.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置1Q0.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变成0LDB条件满足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接口波特率96008位数据位1位停止位偶校验。子设备参数里最关键是PLC站号S7-200的PPI默认站号是2MCGS触摸屏默认站号是0。站号不对通信寄存器里读到的全是问号忙活半天都连不上。接线方面S7-200 PLC的编程口是RS485触摸屏的COM口也是RS485。PLC编程口引脚定义3号针为RS4858号针为RS485-。触摸屏这边按说明书找到A/B端子通常A接RS485B接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清成00小于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调度很多套路都是相通的。真到了现场接线、调试、排障这些手上功夫反而比背多少理论知识都管用。