干过包装机项目的工控人应该都有同感这类设备看着不复杂真正写起程序来却特别容易翻车。节拍要求快、工位多、轴和轴之间要配合再加上现场调试时手自动来回切一个不留神就是撞机、飞车、丢脉冲。我这套基于三菱FX3U的自动检测包装机多轴运动控制模板就是从实际项目里沉淀出来的。它覆盖了三根伺服轴的定位控制、原点回归、手自动切换的完整逻辑核心是把“怎么才能安全、稳定地跑起来”这件事讲透。适合正在做包装、检测、组装类设备的电气工程师也适合刚接触FX3U定位控制、想找一套能直接抄作业的框架的人参考。这个模板解决的不只是“让轴动起来”而是“让三个轴在自动检测的节拍下准确配合同时让操作工能安全地手动调整”。硬件上用了FX3U本体脉冲输出控制三个MR-JE系列伺服软件上用了梯形图加步进梯形图混合编程全部逻辑按模块划分地址统一规划。下面我按实际做项目的顺序把从需求梳理、硬件配置到程序结构、调试踩坑的完整过程都过一遍。1. 检测包装机的运动控制需求为什么一个模板要管三根轴1.1 设备典型工艺与轴分工自动检测包装机的机型很多常见的有转盘式、直线式、皮带式但不管哪种结构运动控制的骨架基本都一个路子。我以一套三轴直线型机器为例来说明上游来料经过送料轴定长进给到达检测工位后由检测传感器或视觉系统完成外观、重量、尺寸判断结果合格进入包装工位不合格则由剔除机构在下一工位动作。整个过程中送料轴负责把物料按固定节拍送到位分度定位轴负责把物料在检测工位准确地停住、转位切刀轴或封口轴负责在同步状态下完成裁切或压合。这三个轴如果全用气缸做精度和节拍都上不去尤其当检测要求物料停在精确位置拍摄或测量时必须上伺服。这个模板里把三个轴按角色分成三类主轴送料负责连续节拍的定位移动从轴分度/转位负责精确停在检测位辅助轴切刀/推料负责在主轴运动过程中的特定位置完成动作。这样分工的好处是程序逻辑清楚每个轴的定位参数、加减速时间、原点位置都可以独立调整不会因为改一个轴的速度影响到其他轴。1.2 控制难点节拍、定位精度、模式切换这类设备真正难的不是单轴定位而是三件事。第一是节拍配合。检测包装机的生产节拍一般要求在每分钟20到60件之间也就是每件物料的处理时间只有1到3秒。在这个时间内送料轴要从停止状态加速到移动速度移动到位后减速停止然后检测机构动作接着进入下一循环。如果程序里每个动作是串行等待完成的节拍必然跟不上。所以模板里定位指令不采用“发完脉冲等定位完成”的傻瓜式写法而是利用定位完成信号加超时监视的双重判断正常时打到定位完成就往下走万一没到位也能快速报警而不是死等。第二是定位精度。伺服本身有编码器反馈定位精度理论上很高但如果电子齿轮比算错、加减速时间设置不合理、或者原点回归方法不对末端执行器照样会偏。模板里所有轴的移动量都用毫米或度为单位进行计算再通过电子齿轮比换算成脉冲数避免在梯形图里直接写一大串脉冲数值。第三是手自动切换。这是整个程序安全性的核心。手动模式下操作工会点动各轴去调整工装、对位、排故障自动模式下程序按节拍连续运行。如果切换瞬间状态处理不好可能出现手动点动还没停下来就切到自动轴按自动目标位置猛地冲过去的情况。这个模板对模式切换做了严格的状态机约束后面我单独用一节详细讲。2. FX3U硬件选型与伺服接线输出点、脉冲上限与电子齿轮2.1 为什么选FX3U而不是FX5U或专用定位模块很多工程师一提到多轴控制就想到加定位模块本体的脉冲输出总觉得不够用。实际上对于三轴以内的包装设备FX3U本体足够而且性价比高。FX3U晶体管输出型本体的Y0、Y1最高可输出100kHz脉冲Y2最高10kHz三轴同时输出没有问题。我常用的配置是送料轴用Y0分度轴用Y1切刀轴用Y2。送料和分度对速度要求高走100kHz切刀轴动作频率低10kHz完全够。相比加FX3U-20SSC-H定位模块或者换FX5U本体的优势有几个一是硬件成本低不用额外的模块和电池二是编程简单直接调用定位指令不需要学专门的定位模块配置软件三是对中小型设备来说三轴100kHz的脉冲频率已经能覆盖绝大多数丝杆和同步带传动方案。如果以后要扩到四轴以上再考虑加模块也不迟程序里模块化做好了换平台成本也不高。2.2 伺服驱动器接线SON、RD、CLR这三根线别省伺服驱动器的接线看起来简单但有几个点容易出问题。我用的驱动器和PLC之间关键是这三组信号脉冲信号驱动器CN1的PP/NP或PULSE/SIGN接PLC的Y0、Y1、Y2公共端接24V电源正极注意晶体管输出是漏型接法公共端S/S要接对。伺服使能SON这个信号我不用PLC的输出点直接给而是通过中间继电器切换。因为伺服使能必须满足“急停断开时伺服立即释放”的安全要求如果直接用PLC程序控制PLC死机或程序跑飞时伺服可能还在使能状态。中间继电器由急停回路和PLC输出串联控制急停一按硬件上就断使能不依赖程序。定位完成RD伺服定位完成后RD信号闭合接到PLC输入点程序里用它判断轴是否到位。清零信号CLR原点回归完成后PLC给驱动器发一个清零脉冲把伺服的位置计数器清零。FX3U的ZRN指令可以指定清零输出点例如Y0轴用Y3输出。很多初学者会把RD信号省掉靠延时或者固定等待时间来判断到位这在低速、轻载设备上勉强能跑但一旦负载变化、机械阻力变大固定等待时间就不可靠了。RD信号加上超时定时器才是稳妥的做法正常等RD超过设定时间还没到位就报警。2.3 电子齿轮比计算先算好这个后面定位全部用工程单位电子齿轮比是伺服调试里最容易出错的一个环节。我见过不少项目现场调试大部分时间都花在“为什么我发10000个脉冲轴只走了5毫米”这种问题上。计算其实不复杂核心公式是每脉冲移动量 丝杆导程 /编码器分辨率 ÷ 电子齿轮比反过来算电子齿轮比就是CMX/CDV 编码器分辨率 × 每脉冲移动量 ÷ 丝杆导程举个例子伺服电机编码器分辨率131072脉冲/转17位增量式丝杆导程10毫米我希望每个脉冲对应0.01毫米移动量那么CMX/CDV 131072 × 0.01 ÷ 10 131.072。取整比值为16384/125也就是CMX16384CDV125。算完电子齿轮比后程序里所有定位指令的脉冲数都写成“移动距离 ÷ 每脉冲移动量”这样梯形图里写的数值就是毫米数对应的脉冲数。这个换算可以在触摸屏上做也可以做一个初始化子程序在PLC里算好我更推荐在PLC里算因为触摸屏的算式容易被操作工误改。3. 伺服定位的程序核心原点回归、DRVA/DRVI与当前位置管理3.1 原点回归设计ZRN与DSZR怎么选包装机设备每次上电后伺服轴的实际位置和PLC记录的当前位置往往是不同的。如果上次停机时轴在300毫米位置这次上电PLC还认为是300毫米直接发绝对定位指令轴就会先跑回300毫米再跑去目标位置这在现场极容易造成撞机。所以定位程序的第一步必须是原点回归。FX3U提供两条原点回归指令ZRN和DSZR。ZRN是简单的原点回归伺服先以高速朝原点方向运动碰到原点近点狗DOG信号后减速到爬行速度再离开DOG后在第一个零点信号处停止同时输出清零信号。DSZR是带DOG搜索功能的原点回归在碰到DOG后继续前进搜索下一个零点适合机械原点不在DOG边沿的场合。我的模板里默认用ZRN因为结构简单、现场容易调。速度参数设置上有两个关键值原点回归速度和爬行速度。原点回归速度决定回原点的效率但不能太快太快了碰到DOG后机械冲击大而且可能冲过零点信号。爬行速度决定原点精度一般设在30到100脉冲/毫秒之间具体要看丝杆导程和需要的重复精度。爬行速度太快零点信号的分辨率会被机械惯量吃掉导致重复回原点位置不一致。原点回归完成后ZRN指令会自动把清零信号输出给伺服的CLR端伺服内部位置计数器归零同时PLC特殊寄存器D8340对应Y0轴也被清零。这时候轴的原点位置就确定了后续所有绝对定位都以这个点为参考。3.2 DRVA和DRVI的选择逻辑绝对定位为主相对定位为辅FX3U定位指令有DRVA绝对位置定位和DRVI相对位置定位两条。DRVA是以原点为参考点移动到指定绝对位置比如“移动到300.00毫米处”DRVI是相对于当前位置移动一段距离比如“再往前走50.00毫米”。模板里自动流程全部使用DRVA因为自动流程每个工位的位置是固定的用绝对定位写出来逻辑清晰而且某个轴中途偏移后再次执行定位能自动修正回目标位置。DRVI只在手动微调时使用比如操作工按下点动按钮轴以点动速度持续移动松开停止或者需要“再走一小段”进行位置补偿时用相对位移。使用DRVA时要特别注意一个问题如果当前位置已经和目标位置相同DRVA指令仍然会输出定位启动信号但轴不会动定位完成信号也会正常返回。这在自动流程里容易造成“看似执行了定位实际没有运动”的假象对某些必须保证轴有实际动作的工位比如涂胶、压合可能造成漏工序。我一般会在定位指令执行前先比较当前值和目标值差值小于一个极小阈值时跳过定位直接置位定位完成标志。3.3 当前位置寄存器的读取与触摸屏显示FX3U定位相关的特殊寄存器在编程时要记清楚。以Y0轴为例32位当前值存放在D8340低16位和D8341高16位中Y1轴对应D8350/D8351Y2轴对应D8360/D8361。触摸屏上显示的实际位置不能直接读D8340因为D8340是脉冲数要除以电子齿轮比对应的每脉冲移动量才是毫米值。这个换算我建议在PLC里做用浮点运算指令把脉冲数转换为毫米数存放在一个普通的D寄存器里触摸屏直接显示这个寄存器就行。这样做的好处是触摸屏画面简单而且就算以后换不同导程的丝杆只需要改初始化子程序里的换算参数画面不用动。还要注意D8340这类特殊寄存器在程序里只能用MOV读取不能写入否则会干扰定位控制。4. 手自动切换的状态机设计防飞车、防误动作的互锁体系4.1 模式划分手动、自动、回原点三种状态必须严格互斥手自动切换如果只做一个开关切换那整套程序早晚要出事。我的模板里把设备运行状态分成三个明确的模式手动模式、自动模式、回原点模式。这三个模式在程序里用两个状态标志位组合表示互相之间严格互斥不允许出现“半自动”或者“自动加手动”的模糊状态。手动模式下各轴的点动按钮有效自动启动按钮无效自动流程的状态继电器全部复位。自动模式下点动按钮无效自动启动、暂停、停止按钮有效定位指令按流程依次执行。回原点模式是上电后的初始状态也是自动模式启动前的必经状态——所有轴必须先完成原点回归才允许切换到自动模式。模式切换的操作界面我通常做成两个按钮加一个状态指示按压“手动模式”按钮只能在设备停止状态下切换按压“自动模式”按钮同样要满足停止条件而且所有轴已经回原点完成。这个约束放在硬件上用一个总停止中间继电器实现程序里再叠加模式标志判断双重保险。4.2 自动流程用步进梯形图状态清晰排查故障快自动流程我强烈推荐用FX3U的步进梯形图指令STL来实现而不是用一堆M中间继电器加SET/RST拼逻辑。STL的核心思想是用状态继电器S表示流程中的每个工步程序执行到哪个工步就激活对应的S工步完成后转移到下一个S。以检测包装机为例自动流程大致分为S10等待启动信号、S11送料轴定位到检测位、S12检测传感器采样并判断、S13分度轴转到下一工位、S14根据检测结果执行剔除或放行、S15计数并返回到S10。每一工步里放对应的动作和转移条件梯形图写出来就是从上往下一条一条的步进线路任何人看程序都能一眼看出设备当前停在哪个工序上。STL还有一个对调试特别友好的特点状态继电器S的当前激活值可以直接在GX Works2的监视画面里看也可以在触摸屏上做一个“当前工步号”显示。现场排查问题的时候看工步号就能知道流程卡在哪一步比查几十个M中间继电器快得多。设备报警停机后报警画面显示工步号加报警代码操作工报修时能直接说“机器在第四步报警是定位超时”维修效率完全不一样。4.3 切换时机与互锁细节这些地方最容易出安全事故手自动切换的程序细节是整套模板里我反复打磨的部分有几个具体的坑必须分享。第一个坑是切换瞬间轴还在动。手动模式下操作工正在点动调整位置突然有人切换自动模式程序如果立即执行自动定位轴会高速冲向自动目标点。解决办法是在模式切换判定里增加“所有轴停止”的条件只有三个轴的定位完成标志全部有效且没有脉冲正在输出时模式切换指令才被接受。脉冲正在输出可以用定位指令的BUSY标志判断。第二个坑是急停复位后的模式保持。急停按下时程序要立刻切断所有轴的运动指令伺服使能通过硬件回路断开同时自动流程的状态继电器全部复位到初始S0。急停复位后设备默认回到回原点模式不能直接恢复自动模式继续跑必须要求操作工重新建立自动模式、重新确认原点。这个设计看起来“麻烦”但对安全来说必须这么做因为急停之后的机械位置谁也没法保证还在原工艺位置上。第三个坑是报警状态下的手动操作。自动模式下如果发生定位超时报警伺服可能已经停在距离目标位置较远的地方这时要允许操作工切到手动模式把轴手动移到安全位置再让设备重新回原点。但有些报警比如伺服过载是不允许在报警未复位时直接点动电机的我在模板里做了报警分级一般报警允许手动模式操作严重报警必须断电重启后才能复位。分级用报警代码的百位来区分比如100以内是可复位的非致命报警200以上是需断电的严重报警程序里用一个报警等级寄存器统一管理。5. GX Works2下的模板化程序结构单轴模块化与地址规划5.1 地址规划表一开始就把软元件分区以后改设备不头疼程序写得多了才发现地址规划比写指令本身更影响维护效率。模板里把整个PLC的软元件做了统一分区原则是“按功能分区、留足余量、参数区和运行区严格分开”。我的规划思路大致如下软元件类型地址范围用途M0~M99操作按钮与状态标志启动、停止、手自动切换、急停状态等M100~M199报警标志各轴定位超时、伺服报警、检测异常等M200~M299流程状态标志自动流程各步骤的辅助标志D0~D49公共参数区节拍时间、检测判定阈值、延时时间D100~D199轴1送料参数区原点速度、爬行速度、目标位置、当前毫米位置D200~D299轴2分度参数区同上D300~D399轴3切刀参数区同上D500~D999运行数据区当前数量、不良数量、效率统计等S0~S9初始状态上电初始化、模式判定S10~S49自动流程状态各工步状态S50~S99回原点及手动调整状态各轴回原点流程这个表里的地址不是死的但核心思想值得参考每根轴的参数固定在一段连续区域内子程序通过指针去访问而不是每根轴各写一套独立的程序。比如轴1的目标位置存在D110轴2的目标位置存在D210轴3的目标位置存在D310编写子程序时定义一个变址寄存器调用子程序前把基准地址传给变址寄存器这样一套子程序三轴通用。5.2 子程序划分初始化、按钮处理、定位控制、工艺流程各管各程序框架我分成几个子程序块主程序里按顺序调用这样逻辑不乱初始化子程序首次扫描时执行把参数区的初始值写入包括电子齿轮比换算结果、各轴速度参数、计数清零等。用一个首次扫描标志M8002触发。按钮与模式处理子程序采集所有操作面板按钮经过互锁判断后置位或复位模式标志、启停标志。这部分相当于操作系统的“命令解析层”。三轴定位控制子程序通过调用通用定位子程序分别处理三根轴的原点回归、手动点动、自动定位。每条定位指令执行前都检查模式标志和暂停标志。检测与剔除子程序读检测传感器的结果结合当前工位状态判断是否剔除更新不良品计数。这部分逻辑相对独立改检测判据时不影响运动控制部分。报警处理子程序汇总各轴的定位完成信号、伺服报警信号、检测异常信号统一生成报警代码并联动声光报警输出。子程序之间的数据交互全部通过规划好的M和D地址进行不直接跨程序块访问对方的内部状态。比如定位控制子程序需要知道当前是否自动模式就读取M20这个公共标志检测子程序需要知道当前物料是否合格就读取D510这个数据寄存器。以后要加一个工位只需要在参数区增加一段地址新增的子程序尽量少改动原有程序这对设备后续升级维护特别重要。梯形图和STL混合使用时STL步进梯形图的每个状态里也要保持模块化的风格。不要在一个S状态里又写定位又写检测又写计数一个S状态只做一件事要么是定位动作要么是等待信号要么是输出结果。S状态之间用转移条件衔接转移条件尽量简单直接——一个触点、一个比较、或者一个定时器到点。6. 调试实录丢步、回零偏置、切换瞬间轴动这些坑我一个个填的6.1 脉冲丢失频率上限往往不是主因有一次在客户现场送料轴跑高速时偶尔出现位置偏差每次偏差都是固定几十个脉冲。开始怀疑是脉冲频率超过了FX3U的100kHz上限实际测量发现频率只有60kHz根本不到上限。后来用示波器看Y0输出波形发现脉冲信号在伺服驱动器输入端有严重的振铃原因是脉冲线走线时和电机动力线捆在同一个线槽里动力线里的高频干扰耦合到了脉冲信号上。排查过程是这样的先单独把脉冲线从线槽里抽出来远离动力线重新走线问题基本消失然后把伺服驱动器的脉冲输入方式从集电极开漏改成差动方式如果驱动器和PLC都支持抗干扰能力大幅提升。这个坑给我的教训是脉冲丢步不能一上来就怀疑PLC输出能力先从布线、接地、抗干扰这些硬件基础上排查否则换再好的PLC也没用。模板里我把脉冲输出方式的参数写进了调试基准表新项目首次调试时先按表检查一遍硬件。6.2 原点回归重复精度差爬行速度只是表象另一台设备切刀轴每次回原点位置都有0.1到0.3毫米的偏差。一开始调小爬行速度从100脉冲/毫秒降到50改善不明显。后来检查机械发现原点回归完成后伺服通过CLR信号清零位置但机械上丝杆和螺母之间有一定间隙电机停在零点位置时切刀的实际位置和上次会有差异。这个问题的根源在于零点信号是电机编码器的Z相脉冲它对应的是电机转子的电气角度位置和丝杆螺母的机械间隙没有直接关系。解决办法是在机械上增加一个硬限位挡块让轴每次回原点时都从同一条路径、同一个方向压到挡块上消除丝杆反向间隙的影响。模板里的回原点流程统一采用“先反向退出再正向回原点”的路径目的就是保证每次回原点的接近方向一致这个细节在手册里往往不会明说。6.3 手自动切换瞬间轴微微动了一下的玄机调试后期发生过一个特别隐蔽的问题自动转手动后本来已经停稳的分度轴偶尔会自己微动几个脉冲。用监视画面看切换瞬间没有任何定位指令在执行但轴就是动了。查了很久发现原因是触摸屏上手动模式下点动按钮使用的是不可保持的脉冲信号按下时有信号松手后消失但在自动转手动的一瞬间手动点动按钮被扫描到了一次误动作——操作工的拇指正好在切换按钮旁边碰到了点动按钮。程序里补了一个“已松开所有手动按钮才允许切换模式”的条件切换按钮生效前必须连续200毫秒检测到所有点动按钮和微调按钮均为松开状态才接受模式切换请求。这个逻辑加进去后切换瞬间的微动问题彻底消失。这类问题不好复现但处理思路值得借鉴所有模式切换都加一个防抖判定窗口不让切换动作和按钮操作同时发生。6.4 模板的扩展从三轴到多轴、从单机到联机当前模板固定管理三根轴但地址规划和子程序结构都是按“可扩展”思路设计的。如果设备要加一个第四轴只需要在D400~D499预留参数区里补充参数新增一个调用通用定位子程序的分支就行。通用定位子程序本身不关心轴号只通过变址寄存器访问参数区和特殊寄存器。如果是几条设备联机比如前道检测机和后道包装机要联动模板里预留了联机信号地址区用输入输出点传递“来料请求”“允许出料”“故障信号”几个核心信号。我建议联机信号单独接在一组专用的输入输出点上和机内传感器分开不要复用。因为联机信号是设备之间安全交互的通道接错一个点可能导致两条线一起停机这种风险不值得省几个输入点。写到最后再多说一句这套模板我从第一个版本到现在大概改了三轮每次改都来自现场的实际问题。它不是什么高深的技术但每个细节都是被现场“教育”过之后修正过来的。如果你正在写包装机或者类似的检测设备程序可以拿这套思路当底子把参数区、模块划分、手自动互锁这套框架先搭起来具体轴数和流程根据设备来填。后续等设备跑稳定了你大概率会发现真正节省时间的不是哪条指令用得巧妙而是程序结构是否让你在场外能快速判断现场设备的状态。
