
简介面向工业自动化工程师与PLC编程人员这份FX5U轴控制模板程序包以ST结构化文本语言编写封装原点复归、点动、定位运动三类核心轴控制功能。FB块支持一次编写、多轴重复实例化适合三菱FX5U平台下伺服或步进系统的快速开发能明显减少多轴项目中的重复编程与调试时间。压缩包共8个文件含6张JPG配置示例截图、1个TXT源码文件、1个HTML使用说明文档整体约990KB目录清晰方便对照学习。目前已有1064人学习下载。配合截图与说明文档可以快速理解FB块的调用方式、参数设置及原点复归逻辑源码中预留的轴控制框架稍作调整即可复用到生产线、机械臂或精密装配等场景对正在搭建多轴控制系统或希望规范PLC程序结构的工程师有直接参考价值。 做设备的人应该都有过这种经历一台机器上七八个轴每个轴都要回零、点动、定位程序一段一段复制粘贴轴多了不但程序体积膨胀改起来更是头大一个轴改了逻辑其他轴忘了同步调试现场直接翻车。三菱FX5U的轴FB块就是这么个东西——用ST语言把原点复归、点动、定位运动这几个最常用的轴动作封装成一个功能块每个轴调用一个实例逻辑统一、参数独立多个轴随便复用一个FB搞定。整个过程在GX Works3里完成不涉及额外硬件适合正在做多轴设备、又不想重复劳动的电气工程师和PLC程序员。1. 轴控制程序的痛点为什么我建议用FB块封装1.1 多轴设备程序里的重复劳动做非标设备、专用机的同行最有共鸣一个项目下来机械手三个轴、转盘一个轴、压装一个轴、送料一个轴少说五六轴多则十几轴。每根轴的动作其实就那么几种——开机回原点、手动点动、按配方定长定位、碰到极限报警。但就是这几个动作每根轴都得写一遍回零要写DSZR或者ZRN点动要写PLSY或者脉冲指令定位要写DRVI或者DRVA。轴再多一点还要处理每根轴的正负限位、原点信号、伺服报警、忙信号程序量成倍往上翻。最早我也是这么干的一个三轴机械手程序光定位和回零逻辑就写了快两千步。后来有一次客户要改成四轴我把第三轴的整套逻辑复制了一份改轴号结果漏改了一个软元件调试时第四轴动不动就飞到限位查了整整一天。从那天起我就下定决心轴控制必须做成标准功能块谁再让我复制粘贴我跟谁急。1.2 FB块和ST语言到底解决了什么FB块Function Block功能块的核心价值是“一次编写多次实例化”。你把轴控制的逻辑在黑盒子里写一遍定义好输入输出接口然后在程序里给每个轴生成一个独立的实例每个实例有自己独立的内存和状态。注意这里的“多次实例化”不是复制粘贴而是同一个代码模板生成了多个逻辑上完全独立的对象。用一个轴就调用一个实例用十个轴就调用十个实例程序代码量几乎不增加变的只是接口上的参数。那为什么用ST语言而不是梯形图最主要的原因是轴控制的逻辑天然适合结构化文本。回零、点动、定位几种模式之间是互斥的状态切换用IF、CASE比梯形图的一堆触点线圈清晰得多加减速时间、目标位置、速度这些参数用变量传参比在梯形图上一个个填软元件也要直观得多。再一个ST里可以写注释、写复杂的判断条件维护起来比满地SET/RST舒服。FX5U全系支持ST语言用GX Works3新建程序时选择ST程序即可门槛并不高。2. FB块接口怎么设计一上来就定清楚2.1 输入输出变量定义接口就是合同写FB块之前我建议你先画一张接口表。接口设计得不好后面改起来非常痛苦。我这个轴FB块基本分四类接口类别变量名数据类型说明使能bEnableBOOL总使能FB所有动作均需使能为ON命令bHomeBOOL原点复归请求上升沿有效命令bJogP / bJogNBOOL正/反向点动命令bMoveBOOL定位启动指令上升沿有效参数rSpeed / rAcc / rDecREAL速度、加减速mm/s或Hz参数rTargetPosREAL目标位置单位随你的轴配置反馈bBusy / bDoneBOOL忙信号、定位完成反馈bHomeDoneBOOL原点复归完成反馈bErrorBOOL / WORD报警标志和代码这里有一个容易被忽略的点命令信号尽量用“上升沿”触发而不是电平触发。比如bHome如果用ON电平触发FB内部一直执行回零外部一不留神没把它复位轴就会一直接着回零。我用的是内部R_TRIG上升沿检测把电平信号转换成脉冲信号命令只执行一次外部即使忘了复位也不会反复触发。还有一点参数接口建议全部用“值传递”而不是“软元件地址传递”。什么意思呢就是FB内部需要用到目标位置、速度时直接把外部变量读进来使用而不是在FB里去操作外部软元件的地址。这样实例化之后每个轴只需要在调用处把对应的轴参数填进去程序可读性高得多也方便以后换成配方数据。2.2 内部私有变量和状态管理FB块的内部变量相当于这个类的私有成员外部看不到。我的轴FB里固定放这几个内部变量eState枚举型状态IDLE、HOMING、JOG_FWD、JOG_REV、POSITIONING、ERRORrCmdSpeed / rCmdAcc / rCmdDec命令执行时锁存的参数rStartPos / rEndPos用于判断实际位移和计算剩余距离t_Home_Timer / t_Jog_Timer各种超时、监视定时器rTrig_Home / rTrig_Move几个上升沿检测用于内部互锁。为什么状态要单独管理因为轴控制的本质是一个典型的状态机。你在FB外部给它发了一个“定位”命令但是轴还在回零途中这时候应该怎么办最安全的做法是FB内部忽略这个命令或者等回零完成后再处理。用状态机的方式管理代码里就是几个CASE分支逻辑一目了然不会出现在梯形图里那种互相打架的怪现象。3. 核心功能原点复归、点动、定位的ST实现3.1 原点复归的实现含零点信号数设0的含义原点复归我用的是DSZR带DOG搜索的原点回归指令在ST里直接调用。FX5U和QD系列不太一样它的定位指令可以直接在ST程序里写但要注意脉冲输出轴号必须在指令里指定。我的FB在实例化时会传入一个轴号iAxisFB内部用变量拼接对应的指令操作数。原点回归的典型流程是这样收到回零请求后先确认使能ON、无报警、轴不在忙状态然后执行DSZR。这里插一句热搜里那个“fx5u回零设置中零点信号数设成0”很多人问是什么意思。在FX5U的定位参数里“零点信号数”指的是回零过程中捕捉零点信号通常是伺服电机的Z相的次数设成0并不是“不回零”而是在某些控制模式下不使用零点信号作为回零参考完全依靠DOG近点狗信号和硬件限位来确定原点。在我实际验证过的设备上如果伺服驱动器把Z相脉冲返回给了PLC建议把零点信号数设成1回零精度能到1个脉冲以内如果现场干扰大或者Z相线没接那就设成0靠DOG信号加定位完成的“DOG式回零”也能把重复精度控制在几十个脉冲内大多数设备够用了。这个参数不是越大越好设得太大反而容易在DOG区域里转好几圈才停下来回零时间成倍增加。FB里回零完成的条件我用两个信号同时判断DSZR对应的完成标志位为ON并且轴实际速度已经降为零。只等完成标志位有时候会提前因为DSZR的完成标志在定位指令结束时就已经ON了但机械上可能还在惯性滑行。加上“速度为零”的判断虽然只差个几十毫秒但对后续紧接着做定位的精度有实质影响。3.2 点动实现的几个细节点动看似简单实际上坑也不少。我早期的写法是bJogP为ON就给PLSY脉冲为OFF就停。结果试机时发现一个问题按下点动按钮后轴要过个几百毫秒才动松开后又要过一下才停操作手感非常差。问题出在FX5U的定位指令启动需要扫描周期而PLSY这一类指令在ST里每次扫描都会重新执行如果外部按钮信号有接触抖动会导致脉冲输出一会儿有、一会儿没有。后来我改成这样点动信号进来后先用R_TRIG锁定一个“点动使能”内部标志同时启动一个10ms的滤波定时器确认信号稳定后再启动PLSY松开按钮后也不是立即停而是让PLSY继续输出几十毫秒保证机械走完惯性行程。点动方向互锁是必须的。正转和反转同时为ON时FB直接置为ERROR状态并输出报警这时候不应该继续输出脉冲。我在代码里用了最笨也最有效的逻辑bJogP和bJogN同时为ON直接禁止脉冲输出并置一个报警字。有些老工程师觉得多此一举但现场接线偶尔会有人把常开常闭搞反这个保护能拦住不少事故。实际操作中互锁不仅是程序层面的保护我还在FB里留了一个报警输出方便触摸屏直接显示“正反点动冲突”这个信息现场处理起来能省不少沟通成本。3.3 定位运动绝对/相对和加减速处理定位运动我封装了两个入口绝对定位DRVA和相对定位DRVI。FB接口里用一个枚举参数eMode供外部选择也可以拆成两个BOOL命令。我倾向拆成两个BOOL——因为设备程序里有时候你并不想给操作工看到“绝对还是相对”这种选择直接给一个“到位置1”的按钮更不容易误操作。定位执行前FB里会先做一次“预检查”目标位置是否在软限位范围内、轴是否使能、是否正在回零、是否有报警。任何一项不满足命令直接不启动bDone也不置位只把bError置ON并输出错误代码。这一步看着简单能省很多现场电话——现在客户那边的电工经常不看状态就乱点屏幕预检查能拦下一大半“为什么没动”的咨询。加减速处理方面FX5U的定位指令本身支持设置加减速时间FB里我直接把rAcc、rDec传给指令。要注意的是加减速不是越快越好。伺服系统的惯量匹配不对加速时间设置过短第一个脉冲周期就开始追误差报警。我一般的经验是水平轴加减速150~300ms垂直轴带负载的加到400ms以上如果现场有抖动或者过冲优先拉长减速时间而不是降低速度这样节拍损失最小。4. 多轴复用把FB块变成模板4.1 实例化多个轴FB如果前面接口和逻辑都跑通了把FB变成模板就是几分钟的事。在GX Works3里先右键“功能块”→新建FB语言选ST把写好的代码粘进去编译通过后这个FB就出现在部件列表里。然后在全局标签里声明FB类型的变量例如gAxis1 : FB_Axis; // X轴 gAxis2 : FB_Axis; // Y轴 gAxis3 : FB_Axis; // Z轴每个变量都是一个独立的实例。梯形图里直接拖拽调用这个FB把刚才的接口变量一一对应填上ST程序里更简单直接在代码里写gAxis1(bEnable : m_Enable1, bHome : m_Home1, ...);。这里要强调一点实例化之后每个轴调用的是同一套代码但它们各自的原点位置、当前位置、状态标志是完全独立的不会互相影响。如果你做的是标准化设备我建议把FB和触摸屏的画面也配套起来。触摸屏上每个轴做一个手轮/点动操作页PLC侧用同一个FB画面参数和PLC变量一一对应。后续换机型时只要轴数不变程序基本不用改改改配方参数就能开机。这就是FB复用省下的最大一笔钱——不是写代码的时间是以后每个项目调试和售后维护的时间。4.2 GX Works3里的编译、转换、写入三步很多人第一次用GX Works3写ST程序都卡在“写完了但PLC里不执行”。这里必须说清楚三菱的软件机制你在GX Works3里看到的程序不管是梯形图还是ST都只是“编辑缓冲区”里的内容必须经过“转换编译”把它变成PLC能识别的指令数据再“写入”到PLC的CPU里程序才会真正生效。日常修改时如果你用的是在线模式改完ST代码后工具栏上的“转换全部程序”按钮会亮点一下再点“写入PLC”选择“在线”写入如果你在离线状态下改完需要先“编译转换”再“写入”。这也是热搜里“三菱plc写入需要转换编译写入三步吗”这句话的来源——确实就是三步改程序→转换编译→写入。少一步都有可能造成程序不更新或者在PLC断电重启后恢复旧版本现场电工往往容易被这个坑到。另外有个细节FB块如果被多个程序引用修改FB内部代码后所有引用它的实例都会一起更新这是FB的固有特性。但这也意味着你在测试平台上一改FB逻辑整个项目里所有轴的行为都会变化所以FB的修改一定要走完整的测试流程不能在产线上直接改完就上线。4.3 与驱动器/伺服的配合参数FB里的DSZR、DRVA指令最终输出的是高速脉冲脉冲要送到伺服驱动器才能控制电机动作。因此FB写好后还有一堆参数要对齐。首当其冲的是电子齿轮比。FX5U定位指令里的速度单位是“Hz脉冲频率”位置单位是“脉冲数”而设备工艺上大家习惯用mm/s和mm这中间的换算靠的就是电子齿轮比和丝杠导程。举个例子伺服驱动器电子齿轮设为CMX/CDV1/1丝杠导程10mm那么电机转一圈需要10000个脉冲假设编码器2500线×4倍频10000PLC发10000个脉冲轴走10mm。所以把目标位置单位换算成脉冲数就在FB的外面统一乘一个系数脉冲数 位置mm × 10000 / 10。这个换算系数我习惯做成设备级的全局常量换丝杠、换减速机时只改一处不牵动FB内部。还有接线和参数FX5U晶体管输出型的脉冲输出点一般是固定的如Y0~Y3对应轴1~4伺服驱动器的SON伺服使能信号由PLC普通输出点控制这在FB里我是放在bEnable里的——使能ON的时候同时把SON输出点置ON伺服进入受控状态。报警信号ALM接到PLC输入点FB里作为急停之外的软件保护一旦ALM为ON所有轴动作立即停止。5. 实际调试中我踩过的坑5.1 回零参数设置不对轴直接冲行程有一次调试一台四轴设备Z轴回零时直接往上冲碰到机械限位才停下来。查了半天发现是定位参数里的“回零方向”设反了。FX5U的DSZR指令执行回零时一开始输出脉冲的运行方向是由参数决定的如果参数里设的方向和DOG信号的物理位置不匹配轴就会先往远离原点的方向找DOG直到撞限位。后来我在FB里加了一个“回零方向”接口参数并在触摸屏上让操作工可以单独调整这个坑才算彻底堵死。再提醒一次零点信号数这个参数如果你是DOG回零方式又把零点信号数设成0回零完成后PLC并不知道电机Z相在哪重复定位精度只能靠机械DOG的重复性撑着。对大多数气缸夹具类应用来说没问题但如果是需要高精度重复定位的场合务必把Z相信号接进来零点信号数设1。这条经验是从一场三个星期搞不定的精度问题里换来的。5.2 FB块调用后不执行多半是使能没给对FB调用不执行是新手问得最多的问题。你代码写得再正确如果使能信号没有置ONFB内部所有逻辑都是死的。很多人的习惯是把 bEnable 直接接在“M0”这种常开软元件上结果在线监控时发现M0一直是OFFFB当然不动。我的建议是把 bEnable 接到一个设备级的“总使能”变量上由主程序统一控制比如急停复位后置ON、报警时置OFF。这样既保证安全又不容易出现“单轴忘了使能”的情况。另外一个容易犯的错是调试时在GX Works3里强制ON了bHome命令但上升沿检测器已经在之前的扫描周期消费过这个信号了所以强制后看不到任何反应。这不是FB的问题是上升沿信号的特性决定的。你只要把信号OFF一下再ON或者重启一下PLC就正常了。知道这个特性后调试效率能提升不少。5.3 软元件冲突和标签表的坑最后说一个很隐蔽的问题GX Works3支持标签编程也可以直接使用软元件M、D、Y等。如果你在FB内部直接用绝对软元件地址比如M100而项目里其他程序也用了M100两台设备之间会出现莫名其妙的联锁问题查起来极度崩溃。我的习惯是FB内部统一用局部标签VAR不直接使用绝对软元件。输入输出接口用全局标签关联并且把每个轴用到的软元件做一张地址分配表和电气原理图对应存档。看似多了一步但等到设备交付后维护时你会发现这一步值回所有的票价。软件版本方面GX Works3不同版本对ST的语法支持略有差异有些老版本不支持某些数据类型。如果你发现FB编译一直报错先查一下软件版本和PLC固件版本是否匹配很多时候不是代码问题是工具链问题。其实我把这整套FB块做完之后最大的感受是它解决的不仅是“少写代码”这个表层问题更重要的是让轴控制的逻辑变得可测试、可复用、可传承。后来团队里来了新同事我不需要再一遍遍跟他解释回零逻辑怎么写、点动互锁怎么加直接把FB模板交给他再留一份接口说明文档他照着实例化和填参数就能上手。等到你们把第一个轴FB调通再回头看以前复制粘贴满天飞的程序大概率会和我一样再也不想回去了。最后说一个实际操作的小建议FB模板里的ST代码注释一定要写到位尤其是接口变量和状态机每个分支的含义。三菱的程序注释跟着工程走将来换人维护、或者你自己三个月后再看都会感谢当初那个认真写注释的自己。这个习惯比任何技巧都值钱。本文还有配套的精品资源点击获取