首页 / 资讯中心 / 文章详情

FX5U轴控FB块:ST封装回零点动定位,多轴复用省代码

FX5U轴控FB块:ST封装回零点动定位,多轴复用省代码 ★ FEATURED ARTICLE
简介面向工业自动化领域的PLC工程师与设备调试人员三菱FX5U轴控制功能块模板使用结构化文本语言编写封装了原点复归、点动与定位运动三类核心功能支持多轴重复实例化有效减少重复编程工作量。模板适用于伺服或步进电机控制场景可帮助开发者快速搭建多轴运动控制程序也适合正在学习结构化文本编程的入门者参考。资源压缩包共8个文件其中6张图片为程序截图或界面预览便于对照学习1个文本文件提供示例代码1个网页文件为使用说明文档可边读边练。整个包仅990KB内容聚焦便于快速下载和查阅。目前已有1069人学习实用价值得到初步验证。通过研读示例和文档读者既能掌握FX5U轴功能块的编写思路也能将原点回归、点动和定位逻辑直接移植到实际项目中提升多轴控制系统的开发效率与可靠性。1. FX5U轴FB块用ST把回零、点动、定位一次封装多轴复制少写十屏某些设备现场FX5U做小型轴控几乎是标配。很多人习惯在梯形图里铺开写回零、点动、定位指令一根轴写一份三根轴就是三份改个速度要翻半天。这份模板的思路完全不同用ST这种结构化编程语言把原点复归、点动、定位运动收进同一个FB块轴号做成输入参数同一个FB块声明多个实例就能带不同的轴。核心价值一句话逻辑只写一遍轴数靠复制换型改参数不碰结构。适合刚把FX5U当定位器用的新手也适合想把项目里重复梯形图清理干净的老手。2. 接口与组态先行输入输出变量表、轴参数匹配和内部状态机2.1 输入输出变量先拉表格再落ST代码我习惯拿到轴控需求后第一件事不是打开GX Works3而是把每一根轴要用到的信号列成一张表。这样变量不会写着写着就缺。这份FB块的输入输出我按四类拆命令输入、参数输入、状态输出、内部私有变量。下面是实际在项目里能直接套用的变量表类别变量名数据类型说明轴号AxisNoINT取值1/2/3对应GX Works3组态里的轴号定位目标ToPosDINT绝对定位目标单位与组态最小设定单位一致定位速度RunSpeedDINT定位运行速度Hz或mm/s启动信号StartBOOL上升沿触发一次定位运动原点复归HomeReqBOOL上升沿触发原点复归正向点动JogFwdBOOL按下有效松开停止反向点动JogRevBOOL按下有效松开停止轴使能EnableBOOL总开关断开时所有动作输出禁止运行中BusyBOOL回零、定位、点动任一动作执行时ON定位完成DoneBOOL本次定位正常结束报警状态FaultBOOL轴或伺服异常时ON有了这张表FB外壳基本就定下来了。值得注意的是轴号为什么必须作为输入参数而不是在FB内部写死成K1、K2。如果轴号写死在FB内部第二个轴就要复制整个FB再改常量本质还是重复编码只是从“复制梯形图”变成“复制功能块”。把AxisNo从输入传进来三个轴共用一份代码调用端填不同轴号这才叫真正的复用。2.2 轴组态与伺服放大器参数程序正确之前先确认机械侧ST逻辑写得再漂亮组态不对也白搭。FX5U在GX Works3里要先配置轴参数确认输出模块的脉冲输出形式是“脉冲方向”还是“双脉冲”再去伺服放大器面板上核对电子齿轮比。电子齿轮比不匹配程序里设的100000脉冲到不了目标位置或是直接触发跟随误差报警。我一般建议先把单位统一机械精度要求不高就全部用脉冲数计算结构按毫米设计就在组态里开启单位换算FB输入的ToPos、RunSpeed直接传mm/s。模板本身不强制用哪种但同一套程序里绝对不能混用不然速度、位置全乱。组态按这五步走顺序不要跳打开轴组态确认是CPU内置定位还是高速脉冲输出。设定输出模式与逻辑极性检查接线是反相还是同相。填入伺服电子齿轮比分子分母与驱动器参数逐一核对。选择原点复归方式近点狗式、限位式或数据设定式指定输入端子。设置加减速时间无把握时先按100ms起步再根据机械惯性往下调。这五步里最容易看漏的是第4步。很多人程序写了半天回零方式还停在默认的“数据设定式”电机压根不知道要找机械原点触发回零只是空转。模板本身不替代组态它只负责把命令发出去组态必须提前配好。2.3 内部状态机一个FB块怎么同时管三种动作三个动作塞进同一个FB块最怕同时触发。模板内部用一个整型变量做状态机0空闲、10定位中、20回零中、30点动中。状态机的作用很直接——某一时刻只允许一个动作占用轴。回零还没完成就给定位启动脉冲FB要么忽略新命令要么直接报Fault两种处理我都见过模板里按“顺序执行”处理回零完成后状态回到0再接收定位命令。状态触发条件动作迁移0 空闲Start上升沿记录目标值切到1010 定位中定位完成标志置位Done切到020 回零中回零完成标志置位回零完成切到030 点动中JogFwd/JogRev释放撤销点动输出切到0内部状态机必须放在FB的局部变量里不能放到全局标签里。如果三个轴的实例共用同一个状态变量轴1在定位中轴2触发点动会直接把状态改掉轴1的运动就会异常结束。2.4 额外预留的辅助引脚报警复位、到位输出、当前值回读模板只给三个输出其实不够用。现场设备通常会要求FB块在定位过程中能随时修改目标位置比如套准修正时位置还没走完操作员就要改数值。所以ToPos应该设计成可变输入指令执行过程中也能更新轴会按新目标继续走。另外报警复位引脚、实时位置回读引脚最好预留出来。前者用于伺服报警后一键清除后者用于触摸屏显示当前位置。这部分不占状态机逻辑只是多了几个输入输出变量但现场调试时会省很多事。3. ST语言实现骨架状态机、点动与定位指令的触发关系3.1 先搭FB外壳再往CASE里填动作下面这段是模板的核心骨架基本可以照抄到GX Works3里。注意上升沿捕捉的写法很多第一次写的人会在这里翻车。FUNCTION_BLOCK FB_AXIS_CTRL VAR_INPUT AxisNo : INT; (* 轴号1/2/3 *) ToPos : DINT; (* 目标位置脉冲或mm *) RunSpeed : DINT; (* 定位速度Hz或mm/s *) Start : BOOL; (* 定位启动上升沿有效 *) HomeReq : BOOL; (* 回零启动上升沿有效 *) JogFwd : BOOL; (* 正向点动按下动松开停 *) JogRev : BOOL; (* 反向点动 *) Enable : BOOL; (* 轴使能 *) END_VAR VAR_OUTPUT Busy : BOOL; (* 运行中 *) Done : BOOL; (* 定位完成 *) Fault : BOOL; (* 轴故障 *) END_VAR VAR state : INT : 0; (* 内部状态0空闲 10定位 20回零 30点动 *) preStart : BOOL : FALSE; preHome : BOOL : FALSE; END_VAR IF Enable THEN (* 空闲状态捕捉上升沿进入对应动作 *) IF state 0 THEN IF Start AND NOT preStart THEN state : 10; END_IF; IF HomeReq AND NOT preHome THEN state : 20; END_IF; IF JogFwd AND NOT JogRev THEN state : 30; (* 正向点动优先 *) ELSIF JogRev AND NOT JogFwd THEN state : 30; (* 反向点动 *) END_IF; ELSIF state 10 THEN Busy : TRUE; (* 此处调用绝对/相对定位指令轴号用AxisNo变量 *) IF PositionDoneFlag THEN Done : TRUE; state : 0; END_IF; ELSIF state 20 THEN Busy : TRUE; (* 此处调用原点复归指令回零参数预先在组态配好 *) IF HomeDoneFlag THEN state : 0; END_IF; ELSIF state 30 THEN Busy : TRUE; (* 点动输出由JogFwd/JogRev直接控制 *) IF NOT JogFwd AND NOT JogRev THEN state : 0; END_IF; END_IF; (* 每轮扫描结束再更新沿捕捉值顺序不能反 *) preStart : Start; preHome : HomeReq; ELSE state : 0; Busy : FALSE; Done : FALSE; END_IF;上升沿捕捉为什么一定要放在控制逻辑后面ST程序是自上而下扫描的如果先把preStart赋成Start再去判断Start AND NOT preStart那个NOT preStart永远等于当前值取反条件永远不会成立。我最早写这个FB时就犯过这个错点动正常定位启动死活不触发查了半天才发现是沿捕捉顺序反了。先把判断做完一轮扫描结束前再更新pre变量这是ST沿处理的铁律。3.2 定位运动绝对定位、相对定位与速度下限保护定位运动是模板里最常用的动作。绝对定位需要一个明确的坐标系基准所以前面必须有原点复归相对定位则是在当前位置基础上走一段增量不依赖回零。两种指令的参数形式差别不大主要区别在于ToPos的语义。我在模板里默认按绝对定位设计原因很简单设备每次开机做一次回零后面所有位置的逻辑基准统一触摸屏上显示的目标数值也直观。如果你的项目里每根轴只是往复走固定步长把调用部分改成相对定位即可FB状态机不用动。速度参数要加下限保护。FX5U的定位指令速度参数填0时有的固件版本会直接报参数错误有的会当作指令无效处理。无论哪一种现场表现都是“点了启动没反应”。我一般会在调用定位指令之前加一段判断IF RunSpeed 100 THEN RunSpeed : 100; END_IF;这个100不是固定值按你现场的最小速度来定单位是Hz还是mm/s取决于组态。目的不是限制用户而是防止触摸屏上误操作把速度清零FB能自动兜底。3.3 原点复归FB只做触发参数全在组态原点复归在模板逻辑里其实最省事——它只需要一个启动条件、一个完成标志。复杂的部分全在GX Works3的组态里近点狗式回零要指定DOG输入端子还要确认DOG有效电平数据设定式回零要填好原点坐标限位式回零要区分正限位还是负限位。模板把HomeReq锁存为状态迁移条件避免一个扫描周期内重复触发回零指令。回零过程有个现场经验值得记住无论是哪一种回零方式第一次调试时把回零速度设低一点。等确认DOG信号和方向都没问题再把速度提上去。很多人第一次回零就把速度拉到50kHz以上结果DOG信号滤波没设好轴直接冲过机械原点撞到硬限位才停。4. 多轴复用与调用端接线声明实例、轴号参数和标签表映射4.1 在主程序里实例化三根轴一个FB块改名复用模板在多轴项目里的用法很简单声明三个FB实例分别填不同的轴号。GX Works3的ST环境里FB实例声明和调用如下VAR fbAxis1 : FB_AXIS_CTRL; fbAxis2 : FB_AXIS_CTRL; fbAxis3 : FB_AXIS_CTRL; END_VAR fbAxis1(AxisNo : 1, ToPos : D_INT_POS1, RunSpeed : D_INT_SPD1, Start : M_LOCAL_START1, HomeReq : M_LOCAL_HOME1, JogFwd : M_SW_FWD1, JogRev : M_SW_REV1, Enable : M_AXIS_EN1); fbAxis2(AxisNo : 2, ToPos : D_INT_POS2, RunSpeed : D_INT_SPD2, Start : M_LOCAL_START2, HomeReq : M_LOCAL_HOME2, JogFwd : M_SW_FWD2, JogRev : M_SW_REV2, Enable : M_AXIS_EN2);这一段代码最关键的认知点是FB的局部变量与实例一一对应。fbAxis1和fbAxis2虽然用的是同一份代码但各自的state、preStart、Busy都是独立的内存空间不会互相覆盖。三根轴并行动作不会因为实例复用而抢状态。这就是功能块复用和梯形图复制粘贴的本质区别——梯形图复制过来还得改地址FB实例只要改参数。调用时要注意Start信号的处理。触摸屏按钮或上位机输出的是电平信号如果直接用BOOL变量传给Start操作员按住按钮时FB会在每个扫描周期都检测到Start为TRUE但因为沿捕捉的存在只有第一次会触发定位。松开再按下才会再次触发。这个特性是刻意的目的是防止误重复触发。4.2 调用顺序与全局标签表的映射现场项目的常见做法是把每根轴的定位数据放在全局标签表里统一管理。触摸屏写参数时直接写这些标签FB块运行时读取对应数值。我给三轴设备做的地址分配通常像这样全局标签数据类型用途G_POS1DINT轴1目标位置G_SPD1DINT轴1定位速度G_POS2DINT轴2目标位置G_SPD2DINT轴2定位速度G_EN_ALLBOOL三轴总使能为什么用标签不用直接地址标签可以起有意义的名字触摸屏组态时不容易选错地址。另外GX Works3的标签表支持导入导出设备做第二台时直接复制标签表不必再逐个核对软元件地址。4.3 换型时只改数据不碰逻辑这套模板真正省时间的地方在这里。同一台设备要兼容三个产品规格每种规格的定位位置、速度都不一样。现场换型时操作员在触摸屏上改几个位置数值就够了FB块和组态参数一个都不用动。设备尺寸改了、丝杆导程变了才需要进组态调整电子齿轮比和原点位置。模板的定位就是“逻辑稳定、数据可变”把现场调试人员的精力从程序逻辑里解放出来。等哪天要加第四根轴复制一份实例声明AxisNo改成4再把对应的位置、速度标签补上其余结构不动。FB块的内部逻辑不需要理解也不应该去动它因为所有轴用的是同一套状态机改了就会影响其他轴。5. 高频踩坑实录现象、原因、解决模板逻辑本身不复杂但现场轴控的坑多数藏在程序之外的接线、组态和伺服参数里。下面几条是我在多个项目里实际踩过的写出来省得你再翻车。5.1 上电第一次点动没反应轴像“死”了一样现象程序下载完操作员在触摸屏上按正向点动电机纹丝不动FB块的Busy也没亮。原因FX5U的轴不是上电就自动进入伺服使能状态的。Enable输入如果没有人去置ON或者置ON的时机太早、伺服放大器还没准备好后续所有点动、定位指令都会被忽略。很多人以为“程序里写了Enable上电就会置ON”忽略了上位机启动时序。解决在PLC启动逻辑里做上电延时延时确认伺服放大器状态后再把Enable置ON。同时检查GX Works3的组态参数是否已经下载到CPU。组态没下载轴参数全是默认值指令发出去也不会动。现场调试第一步永远先看Enable和伺服状态灯。5.2 回零直接冲过机台原点撞到硬限位现象按下回零按钮轴以高速往负方向跑越过原点位置不停直到碰到机械硬限位才报错停机。原因回零方式选了近点狗式但DOG信号没有在组态里指定到实际输入端子或者DOG有效电平选反了。轴跑过去时根本没收到DOG触发回零搜索逻辑就一路找下去。解决先把DOG信号线接到PLC输入端子进组态把该输入指定为DOG信号源同时确认有效电平。第一次回零速度不要设太高比如先按10kHz试跑确认轴在DOG处准确换速或停止后再逐步提高速度。近点狗式回零还有直通型和反冲型的区别具体用哪种要看机械结构和原点方向组态选项里调一下就行。5.3 三个轴参数都对结果轴2跟着轴1走现象程序里明明填了不同的轴号轴1启动定位时轴2电机也跟着转了位置和轴1完全一样。原因FB调用时AxisNo没有真正传给定位指令。常见于从别人项目复制的模板内部调用定位指令时轴号栏引用了某个全局字地址而这个地址在所有实例里是共享的。改FB参数时只改了调用端的AxisNo模板内部的轴号变量没改过来。解决打开FB内部检查所有定位、回零、点动相关的指令和辅助继电器确认它们引用的都是输入变量AxisNo而不是某个全局常量或全局字地址。这个检查我每次复用模板都会做一遍因为模板被来回拷贝多次后污染点往往藏在最深处。5.4 定位完成信号已经亮了工件却没到位现象FB块输出Done已经为ON机台也停了但实际位置和目标位置差了十几个脉冲工件尺寸不合格。原因判断定位完成的条件写错了。有人图省事直接用“当前位置等于目标位置”做完成判断但带加减速的定位在接近目标时当前值可能被舍入或滤波延迟误判为相等还有人误用了“指令执行中”信号那条指令发出后轴还没走完执行中就先复位了。解决以定位指令自带的定位完成标志作为Done的依据不要自己做位置等于判断。如果组态里确实没有可靠完成标志可以做位置比较但必须加容差量比如当前值距目标值小于10个脉冲时判定完成。容差大小按机械精度取宁小勿大。5.5 松开点动按钮轴还会多走一段现象按JogFwd时电机正常转松开按钮电机不是立刻停而是再走一段才停下有时还滑行明显。原因点动停止逻辑没有在松开瞬间发出。FB里点动只处理了“按下”状态松开时只是把状态机切回0但脉冲输出通道没有在同一个扫描周期被撤销伺服就按原速度多跑了一阵。机械惯性大时这段滑行会被放大。解决在状态机切回0的同一个周期把点动启动信号和脉冲输出同时撤掉还要结合加减速时间。减速时间设得太长松开后会有明显滑行太短则伺服过载报警。我一般从默认加减速时间开始再根据现场停机距离微调。点动这个功能看着简单实际调试起来往往是最耗时的。6. 进阶五步验证法把FB块调稳再入模板库FB块写完不等于能用每次新项目我都会强制走一套五步验证顺序不能乱每步都看监控表里对应信号的变化。第一步轴组态检查。打开GX Works3轴组态页面核对脉冲输出模式、电子齿轮比、原点复归方式、加减速时间。这一步是后面所有验证的基础组态错一步后面全是白忙。第二步使能验证。PLC上电后监控Enable输入确认经过上电延时后变为TRUE同时伺服放大器面板上“伺服ON”指示灯亮起。这一步不通过就停在原地排查组态和接线不要往后走。第三步回零验证。给HomeReq一个上升沿观察轴从当前位置回零。监控FB内部状态从20回零中切回0空闲同时伺服当前位置显示变为原点值。第四步点动验证。JogFwd、JogRev两个方向分别按住两秒再松开确认启动和停止都跟随按钮动作松开后轴在半个脉冲当量内停稳。第五步定位验证。给ToPos写一个已知的位置值比如5000脉冲启动后看最终停止位置是不是5000。通过后把ToPos改成另一个值重复一次确认每次都能准确到位。五步做完FB块的状态机迁移、指令触发、完成判定基本就全部验证过了。之后我才会把它作为模板存档。GX Works3支持把FB块导出成模板文件下次建新工程时直接导入不用重新敲代码。模板归档时我会在FB块注释里写清楚轴号范围、单位要求和组态前置条件这样一个月后接手的同事不至于再走弯路。从那以后我每次写完轴FB块都强制自己走一遍“组态确认→使能→回零→点动→定位”这五步再进模板库。尤其是第一步组态十个轴控问题里至少有一半是从组态漏配开始的希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站