
做过码垛设备的朋友应该都有体会堆垛码垛这个活看着不难真正做主来了定位精度、节拍、安全互锁、报警恢复哪一样都能让你在现场熬到半夜。去年做的一套三菱FX5U四轴码垛程序松下一台A6伺服带X轴和Z轴步进电机带R轴和P轴从原点回归、定位到报警处理整套逻辑跑下来踩了不少坑也沉淀了一套可以直接复用的方案。这篇文章就把这个项目的设计思路、程序框架、参数计算和现场调试经验完整拆开讲一遍。不管你是刚接触PLC定位控制还是已经做过几个码垛项目想找点可参考的细节这篇内容都能提供一些实操层面的东西。尤其是我在电子齿轮比换算、原点回归时序、报警锁存机制上花过不少时间这些恰恰是手册里不会明说、但现场一定会碰到的坎。1. 项目整体设计与思路拆解1.1 设备构成与四轴架构这套设备是一条包装线的末端自动堆垛机产品是规格固定的纸箱要求把纸箱按预设的码型逐层码到托盘上。设备整体是龙门式结构核心动作可以概括为取料、移载、放料、整形、循环。四轴是这样分配的X轴水平行走轴负责把抓手从取料位运送到托盘上方由松下伺服驱动行程大概1800mm。Z轴垂直升降轴负责抓手的抬起和落下同样用松下伺服带抱闸行程600mm。R轴抓手旋转轴负责调整纸箱的朝向实现交错堆叠的码型用步进电机加减速机驱动。P轴推料整形轴负责在放料后把纸箱推齐防止堆垛偏斜用一台小功率步进电机带动。这个四轴配置在中小型码垛设备里非常典型。X、Z两个轴是设备的“主力”对速度和精度要求高所以用伺服R、P两个轴动作简单、负载小对绝对精度要求不高所以用步进电机来控制成本。1.2 为什么用三菱FX5U而不是其他PLC选择FX5U主要有三个原因。第一FX5U本体自带高速脉冲输出晶体管输出的CPU型号最多可以支持4轴脉冲控制刚好覆盖这个项目的四轴需求不用额外加定位模块控制柜体积和成本都能压下来。第二GX Works3编程软件支持结构化工程可以用标签编程变量名直接定义成“X轴速度”“Z轴目标位置”这种可读性强的名字程序维护起来比纯软元件注释的传统写法舒服得多。第三FX5U在定位控制上有现成的指令体系DDRVI、DDRVA、DSZR这一套足够覆盖码垛设备的需求同时中断处理和浮点运算能力也不弱后面想加视觉或者称重功能也有余量。1.3 伺服与步进电机的选型逻辑这部分我多说两句因为“为什么这么选”比“选了什么”更重要。X轴和Z轴用松下伺服考虑的是闭环控制和动态响应。码垛设备有节拍要求X轴要在保证不抖动的前提下尽量跑得快Z轴则要频繁启停而且带着负载这些场合开环的步进电机很容易丢步。伺服还有一个好处是有报警输出过载、过流、编码器异常这些状态能直接反馈给PLC方便程序做保护。R轴用步进电机是因为旋转轴通常只做90度或者180度定位负载惯性小步进电机本身有保持力矩就算断电后位置丢了回一次原点就解决。P轴同理推料整形动作不参与精度堆叠用步进足够了。核心思路是主轴给足性能余量辅助轴控制成本把每一分钱花在真正影响节拍和稳定性的地方。2. 系统硬件配置与参数换算2.1 IO分配与轴定义表项目用的PLC是三菱FX5U-80MT/ES晶体管输出。先看IO分配这个表我建议做任何定位项目之前都先画出来避免后面接线和编程各想各的。地址信号名称说明X0X轴原点近点狗信号X1Z轴上极限硬限位X2Z轴下极限硬限位X3R轴原点近点狗信号X4P轴原点近点狗信号X5急停常闭输入X6自动启动按钮上升沿有效X7自动停止按钮上升沿有效X10报警复位按钮上升沿有效X11手自动切换旋钮开关Y0X轴脉冲松下伺服PULSEY1X轴方向松下伺服SIGNY2Z轴脉冲松下伺服PULSEY3Z轴方向松下伺服SIGNY4R轴脉冲步进驱动器PULSEY5R轴方向步进驱动器DIRY6P轴脉冲步进驱动器PULSEY7P轴方向步进驱动器DIRY10伺服使能控制驱动器的SON信号Y11Z轴抱闸控制抱闸继电器这里有个细节Z轴是垂直轴一定不能用普通伺服电机要选带抱闸的。抱闸控制不要跟伺服使能直接并联需要按时序分开处理这个后面在程序部分详细说。2.2 松下A6伺服的接线与电子齿轮比计算松下A6伺服在脉冲定位模式下需要设置的控制模式是位置控制指令脉冲方式我习惯设为“脉冲方向”对应驱动器的PULSE1、PULSE2和SIGN1、SIGN2端子。FX5U的高速脉冲输出端子和驱动器端子之间要接限流电阻具体阻值按驱动器手册来不能直接硬接。电子齿轮比是整个定位精度的核心一定要算清楚。以X轴为例假设丝杆导程是10mm要求定位精度0.01mm。也就是说PLC每发出1000个脉冲X轴要移动1mm或者说丝杆转一圈需要10000个脉冲。松下A6伺服电机编码器分辨率是23位也就是每转8388608个脉冲。电子齿轮比的计算公式是电子齿轮比 编码器分辨率 / 电机每转所需指令脉冲数代入数值电子齿轮比 8388608 / 10000这个分数可以直接约分成1048576比1250。所以在驱动器参数里把电子齿轮比分子Pr0.08设为1048576分母Pr0.09设为1250。算完之后一定要在面板或者软件里确认一下实际参数生效了我碰到过现场维修人员误改齿轮比导致定位距离突然变成两倍的案例。Z轴如果也是同样的丝杆导程和精度要求参数可以一致。R轴和P轴是步进驱动不需要电子齿轮比这个概念但需要设细分后面单独说。2.3 步进电机驱动器参数与细分设置R轴步进电机用的是57步进驱动器细分我设成了2000脉冲每转。电机本身是200步每转配合10细分后的效果就是2000个脉冲转一圈。加上减速机速比1比10输出轴转一圈需要20000个脉冲。这样算下来R轴每转1度需要的脉冲数是20000 / 360 ≈ 55.56 脉冲每度实际程序里不需要用浮点数累加我直接把目标角度换算成脉冲数存在数据表里比如90度就是5000个脉冲180度就是10000个脉冲。P轴推料轴更简单行程就300mm同步带传动我用驱动器细分800脉冲每转匹配减速比实际调试时用卷尺手动校了一下单位换算值标定一次后面就不用动了。步进驱动器的电流参数要按电机铭牌设定设大了电机会烫设小了扭矩不够容易丢步。57步进电机我一般按相电流的80%到90%设定既能保证扭矩又能控制温升。3. 程序实现从原点回归到自动堆码3.1 原点回归的设计与参数码垛设备每次上电后四轴位置都是未知的尤其步进电机没有位置反馈所以原点回归是整套程序的地基。FX5U做原点回归可以用DSZR带近点狗的方式也可以用ZRN不带狗的方式。我选了DSZR因为设备有近点狗传感器这种方式回零精度更高重复性也更好。原点回归参数在GX Works3的定位参数里设置以X轴为例原点回归方向负方向原点回归速度60mm/s爬行速度5mm/s近点狗信号X0原点回归完成后坐标值0这里有个容易踩的坑高速接近近点狗的时候第一下降沿只是“粗定位”必须继续爬行到离开狗挡块的位置才算是真正的原点DSZR指令会自动处理这个过程但前提是近点狗信号的常开常闭类型要设置正确。我一开始把X0设成常开实际上接近开关是常闭输出结果回零方向反了报警查了半天。四轴回原点的顺序也有讲究。我先回X轴和Z轴再回R轴和P轴。原因是X轴和Z轴是主运动轴回零过程中可能带动抓手移动如果R轴先回零抓手上的旋转定位销可能还没到位会影响X轴极限位信号。Z轴做原点回归之前必须先给抱闸上电打开否则Z轴带着负载强行回零电机会堵转。这个时序要在梯形图里专门写一个“抱闸控制”程序段和回原点指令做联锁。3.2 定位指令与码型数据表四轴都回完原点后设备进入待机状态。自动循环里的定位动作我用的是DDRVA绝对定位指令和DDRVI相对定位指令的组合。拿一个标准的码垛周期来说取料点位置是固定的所以从取料点移动到托盘上某个放料位置时用DDRVA按绝对坐标定位。而R轴旋转角度往往是在上一个箱子的基础上累加的比如交错堆叠时每层旋转90度这时用DDRVI相对定位更直观。码型数据表是整个自动程序的灵魂。我用了从D400开始的连续数据区每个箱子占4个数据寄存器分别存X目标、Z目标、R目标、P目标。程序运行时通过变址寄存器去读取当前箱号对应的数据。D400: 托盘层数 D401: 每层箱数 D410: 第1箱X目标(单位0.01mm) D411: 第1箱Z目标(单位0.01mm) D412: 第1箱R目标(单位脉冲) D413: 第1箱P目标(单位脉冲) D414: 第2箱X目标 D415: 第2箱Z目标 D416: 第2箱R目标 D417: 第2箱P目标 ……读取当前码型的逻辑可以这样写我习惯用结构化文本ST来做数据表读取比梯形图简洁// 假设当前箱号存放在D500从1开始 Z0 : (D500 - 1) * 4; D520 : D410 Z0; // X目标 D522 : D420 Z0; // Z目标 D524 : D430 Z0; // R目标 D526 : D440 Z0; // P目标这种方法的好处是换产品换码型时只需要在HMI上改数据表的内容不用改PLC程序。我把数据表做成可以在触摸屏上写入的模式现场换型时操作员直接在屏上填数值就行。3.3 自动循环流程的状态机写法自动程序我没有用一堆M中间继电器硬堆逻辑而是用了状态机的思路用一个数据寄存器D0作为当前状态号每个状态处理固定的动作这个做法在码垛这类流程固定的项目里特别好用。状态定义如下D00空闲待机D010自动启动前检查D020取料动作D030移动到放料点D040放料与整形D050返回取料点D060码型计数更新D0255报警锁定停机每个状态之间有明确的转移条件。比如D030移动到放料点这个状态它的完成条件是四个轴都到位也就是X轴到位标志、Z轴到位标志、R轴到位标志、P轴到位标志同时为ON。我在每个轴启动定位后会把对应的到位标志复位定位指令执行完毕且当前位置和目标位置差在容差范围内再置位到位标志。这个“到位标志”一定要自己做不能光靠定位指令的完成标志。定位指令完成只代表脉冲发完了机械上可能还有残量我在程序里比较实际位置和目标位置允许偏差0.5mm以内才算真正到位。状态机的写法还有一个好处手动单步调试非常方便。HMI上可以做一个“单步”按钮每次按下只允许状态前进一步调试时哪个环节有问题一目了然。3.4 报警处理与安全机制报警处理是码垛设备程序里最容易被低估的部分。设备在客户现场是连续运行的没有完善的报警处理一个小故障可能就变成大事故。我按照故障等级把报警分成了三类一是提示性报警不影响运行比如“堆垛数量达到设定值”提醒操作员准备更换托盘。二是一般报警暂停当前动作比如“X轴定位超时”程序会暂停自动循环等待人工确认。三是严重报警立即停机比如急停按下、伺服报警、Z轴超限位。这类报警会同时触发硬件回路切断伺服使能和步进驱动器的使能不依赖PLC程序软件处理。伺服报警的输出信号直接接到PLC的输入点只要伺服驱动器报故障ALM信号就会断开PLC立刻进入报警锁定流程。Z轴的超限位必须用硬限位开关不能光靠软件限位。报警锁定之后操作员需要先排除故障原因再按复位按钮。复位不是简单地把M继电器复位就完事我的复位逻辑是先清除报警锁存标志把状态机D0切回0然后要求操作员重新执行原点回归全部回零成功后才允许再次启动自动模式。这套逻辑看起来繁琐但实际帮我在现场避免了很多次“报警后直接自动继续”导致的二次故障。4. 现场调试与常见问题排查实录4.1 伺服不动作和定位偏差的排查顺序这种设备调试时遇到最多的问题第一个就是接完线发脉冲伺服不动。我的排查顺序是固定的按这个来基本半小时内能定位问题第一步看驱动器有没有使能。伺服驱动器在未使能状态下就算收到脉冲也不会转动。上位机软件或者PLC输出的SON信号有没有到达驱动器用万用表量一下。第二步看驱动器有没有报警。松下A6有7段数码管显示报警代码如果驱动器报警信号会锁住。常见的像过载、过流、编码器异常现场至少能根据报警代码缩小范围。第三步看PLC有没有实际发出脉冲。GX Works3的监视模式下看Y0、Y2的当前值变化如果程序已经触发定位指令但脉冲输出点没有变化问题在程序侧或者输出回路。第四步确认接线极性。脉冲和方向的接线特别是差分信号的正负极接反了是收不到指令的。定位偏差的问题我会先测量实际位移和理论位移的比值如果稳定偏大或偏小基本确定是电子齿轮比算错了。如果是时有时无地偏差优先检查机械间隙其次是丝杆或传动机构有没有打滑。4.2 步进电机失步与线序问题R轴和P轴用的是步进电机调试中遇到最多的问题是失步。有一次现场试机R轴旋转90度后总是偏一点点而且是同一个方向稳定偏差后来定位到是加速时间太短。步进电机没有反馈丢步了程序不知道。它的启停特性跟伺服不一样启动频率不能太高加速度也不能太猛。我把R轴的加速时间从默认的80ms改成300ms后偏差就消失了。后来又在程序里加了一个“到位窗口定时器”如果启动定位后2秒内到位标志没有置位就报“R轴定位超时”这样即使机械异常也能及时发现。关于步进电机UVW三相线序要说明一下对于三相步进电机交换任意两相线序可以改变电机旋转方向。比如原本正转为CW把U和V两根线对调就会变成CCW。这个特性在调试时很实用不需要改驱动器参数就能换方向但接线端子和驱动器端子之间要确保对应关系不要接错。P轴用的是两相四线混合式步进电机A、A-、B、B-四根线和三相线序的问题不同。两相电机如果同相的两根线接反电机也能转但方向会反同时电流噪声会变大。遇到P轴方向反了优先检查A相或B相是否对调不要急着改程序。4.3 现场报警恢复流程的优化设备在客户现场跑的时候报警恢复流程一开始做得过于严格每次报警都要人工回原点操作员意见很大。后来我调整了恢复逻辑区分了两种情况如果报警时Z轴在安全高度以上也就是抓手没有伸进托盘区域就允许操作员手动“慢速回原位”回到原位后直接重新定位不需要完整回零。如果报警时Z轴在安全高度以下或者报警原因是原点信号丢失那就强制完整回零。这个区分看起来很细但对客户来说体验差别很大。完整的四轴回原点一次大概要40秒而慢速回原位只要10秒。设备每天报警几次的话节省的时间就很可观了。不过有个底线我一直没放开R轴和P轴是步进电机断电后位置信息会丢所以只要发生过急停或者伺服报警切断动力电源这两个轴必须重新回原点这个不能妥协。4.4 几个值得注意的硬件细节调试中还碰到过几个硬件层面的坑顺带一起记录在这。第一个是Z轴抱闸继电器的触点容量。抱闸线圈有电感断电瞬间会产生反向电动势如果继电器触点容量不够触点很容易拉弧烧蚀。我后来用了带灭弧功能的直流继电器并且在抱闸线圈两端并联续流二极管问题就没再出现。第二个是脉冲线和动力线不能走同一个线槽。X轴伺服电机动力线电流大如果和编码器线、脉冲控制线长时间并行走线脉冲信号很容易被干扰轻则定位偶尔偏一个脉冲重则直接报警停机。现场的强电和弱电分开走这属于基本常识但真的经常被人忽视。第三个是急停回路的接线方式。急停按钮一定要用常闭触点串联进伺服使能回路和步进驱动器使能回路这样急停被按下时是硬件层面切断使能不依赖PLC扫描周期。PLC扫描周期一般在几毫秒到几十毫秒看起来短但对于高速运动的轴来说这些时间足够造成危险了。5. 关于程序结构的一点个人建议这套设备做下来我个人对码垛类PLC程序的结构设计有一个很深的体会先把“怎么停下来”想清楚再写“怎么动起来”。很多新手做码垛程序一上来就写自动流程取料、移动、放料写得很顺但遇到报警恢复、手动干预、断电再上电这些场景时程序就乱了。原因就是没有把状态机、报警机制和回零逻辑作为骨架先搭好。我建议的顺序是先写原点回归和报警锁定再写手动点动和单步运行最后才填自动循环的各个状态。这样自动流程不管怎么改底层的手动和报警逻辑都能兜住底。码型数据表的设计也尽量做到“程序通用、数据可配”。哪怕短期只做一种产品的堆垛也建议把码型数据整理成数据表的形式。客户的需求永远是变化的今天码12箱明天可能就改成16箱如果码型写在梯形图的常量里每次改型都要改程序如果写成数据表只需要在触摸屏上把数据填对就行。最后分享一个调试时的小技巧每台轴的电机会在驱动器和PLC里都有对应的“电子齿轮比”参数如果现场定位距离突然变成某个固定倍数比如两倍、一半基本都是有人改过齿轮比或者细分参数先查这个别急着动程序。码垛设备本质上是“反复做一件简单的事”但它对可靠性、可维护性和报警可恢复性的要求一点也不低。希望这篇文章里的设计思路和现场经验能让你在做类似项目的时候少走几步弯路。