news 2026/9/1 10:36:32

三菱FX5U ST语言封装轴控制功能块:原点回归、点动与定位实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
三菱FX5U ST语言封装轴控制功能块:原点回归、点动与定位实现

简介:面向三菱FX5U系列PLC开发者,这套以ST语言编写的轴控制功能块(FB)把原点回归、手动点动、单段/多段定位等核心动作封装成可复用模块,参数通过接口引脚灵活配置,同一功能块实例可被多个伺服或步进轴直接调用,适合装配线定位、简易机械手、送料机构等中小型多轴项目快速搭建。压缩包共10个文件,约994KB,包含6张实操截图和1份HTML说明文档,从调用示例、引脚定义、参数设置到运行效果均有直观展示;源码存放于sorce目录,txt文件中附有关键注释与使用提示,便于工程师理解逻辑并二次开发。当前已有29人学习,对于希望减少重复编程、缩短调试周期的设备开发者来说,这套模板可直接套用到实际项目中,有效降低多轴控制系统的开发门槛,尤其适合处于方案验证阶段或需要快速交付的自动化项目。 做自动化设备的工程师,应该都体会过一种尴尬:同一个轴控制逻辑,换个项目就要重新写一遍。早期我在FX3U上习惯用梯形图,一个定位动作要拉出一长串指令,中间还要穿插一堆M和D的状态,看着就头疼。后来接触FX5U系列PLC,发现ST语言的编程体验完全不同,特别是把原点回归、点动、定位这三个轴基本动作封装成一个可复用功能块之后,新项目里只要把功能块拖进去,填上轴号、速度和行程参数,就能直接跑起来。

这篇算是我个人做这个功能块的一个完整记录。它的核心价值在于:功能块不只是把三段程序合并在一起,而是把轴动作的启停、完成、错误处理都统一成一个带状态机的接口,上层逻辑只需要给一个“我要做什么模式”的信号,剩下的交给功能块自动处理。适合正在用三菱FX5U做定位控制的工程师,也适合想从梯形图转ST的朋友参考。

1. 为什么要把轴控制做成可复用功能块

1.1 从梯形图到ST的痛点

三菱FX5U自带ST语言支持,但在很多老工程师习惯里,定位控制还是梯形图的天下。梯形图对单个动作确实直观,比如按一下启动按钮,线圈输出,伺服转起来。可一旦动作多起来,梯形图就变成意大利面:原点回归一个程序块,点动一个程序块,定位一个程序块,三块之间的互锁和状态标志全靠M软元件手动管理。项目小的时候还能应付,设备一多、轴数一多,光查干扰和误触发就能耗掉半天。

ST语言解决的是“逻辑结构化”问题。它更像高级语言,可以把原点回归、点动、定位作为一个整体设计成状态机,把底层细节封装在功能块内部。设备程序里看到的只是几个接口:模式选择、启动信号、目标位置、输出状态。这样无论后来谁维护,都不需要去翻几十行M判断,只要看接口定义就行。

1.2 功能块要管的“三件事”

可复用轴控制功能块,核心动作就是标题里那三件:原点回归、点动、定位。

原点回归是所有绝对定位的基础。设备每次上电,伺服的实际机械位置和PLC内部当前位置没有对应关系,必须让轴先找到一个确定的机械参考点,把这个位置定义为原点,后面的绝对定位才有意义。点动是调试和手动操作时最常用的动作,操作员按下正转按钮,轴按设定速度运行,松手就停。定位分绝对和相对,绝对定位是去某个固定位置,相对定位是在当前位置基础上移动一段距离。这三个动作看起来简单,但放在一个功能块里,要处理的问题就多了:怎么避免动作冲突,怎么判断动作完成,怎么处理超时和异常。

2. 功能块整体设计与接口定义

2.1 功能块接口怎么定

功能块的第一件事是把接口定清楚。接口定得不好,复用的时候就会到处别扭。我建议外部接口尽量做成“输入命令、输出状态”的模式,不要直接把伺服使能、脉冲方向这些底层信号全部暴露给上层逻辑。这样上层流程代码只需要关心“轴在干什么”“轴有没有到位”,不用关心脉冲怎么发、方向怎么给。

我常用的接口定义如下:

接口名类型方向说明
bRunBOOL输入上升沿触发一次动作
eModeINT输入0-原点回归,1-正点动,2-负点动,3-定位
bJogFBOOL输入点动正转使能
bJogRBOOL输入点动反转使能
siTargetPosDINT输入定位目标位置,单位脉冲
siSpeedDINT输入定位运行速度,单位Hz
siHomeSpeedDINT输入原点回归搜索速度
bBusyBOOL输出功能块运行中
bDoneBOOL输出当前动作完成
bErrorBOOL输出功能块报错
uiErrCodeWORD输出错误代码
siCurrentPosDINT输出当前实际位置

接口背后还有一个轴参数结构体,负责把轴号、脉冲输出地址、方向输出地址、正负限位地址、加减速时间、原点输入地址全部打包。这样同一个功能块实例可以对应不同物理轴,只要传入不同的参数块。

2.2 内部状态机避免动作打架

功能块内部我最先设计的就是状态机。没有状态机的时候,点动和定位同时给信号,脉冲输出就会乱。状态机相当于给所有动作排了一个队:

  • IDLE:空闲状态,等待命令
  • HOMING:原点回归中
  • JOG_POS:正转点动中
  • JOG_NEG:反转点动中
  • POSITIONING:定位中
  • DONE:动作完成保持一拍
  • ERROR:异常状态

每次扫描周期先判断当前状态,再决定是否接受新的输入。比如在原点回归中间,如果上层给了定位指令,功能块应该忽略,除非先执行停止。点动信号则要做成电平保持与脉冲兼容:按下时进入JOG状态,松开且没有其他命令时回到IDLE。通过这个简单的状态机,外部逻辑永远不需要担心三个动作同时触发导致的冲突。

3. ST核心实现:原点回归、点动与定位

3.1 轴参数与运动指令选型

FX5U内置定位输出,高速脉冲输出口可以分配为脉冲加方向模式、CW/CCW模式、A/B相模式。功能块里我倾向于用脉冲加方向模式,也就是PLC的Y点输出脉冲串,另一个Y点输出方向信号。对普通伺服应用来说,这种方式最直观,接线也少。

ST实现时,功能块内部调用FX5U内置定位指令。GX Works3的ST语法和纯IEC 61131-3有一点差异,实际调用指令时,需要按三菱ST指令的格式写。比如绝对定位用DDRVA指令,点动用PLSV指令,原点回归用DSZR指令。这些指令在ST中的操作数可以填功能块内的变量,也可以直接填轴号和输出口地址。我习惯把轴号和输出口地址作为功能块的内部参数,而不是硬编码。

一个简化版的功能块主体结构如下:

CASE eState OF IDLE: IF bStart AND (eMode = 0) THEN eState := HOMING; ELSIF bJogF THEN eState := JOG_POS; ELSIF bJogR THEN eState := JOG_NEG; ELSIF bStart AND (eMode = 3) THEN eState := POSITIONING; END_IF; HOMING: // 调用FX5U原点回归指令 // DSZR 原点搜索,完成后清零当前值 IF bHomeDone THEN eState := DONE; END_IF; JOG_POS: // 调用PLSV输出正转脉冲 // 方向输出口置ON IF NOT bJogF THEN // 停止脉冲输出 eState := IDLE; END_IF; END_CASE;

上面是逻辑骨架,实际项目还要处理“DONE状态保持一个扫描周期”“错误状态返回IDLE”等细节。别小看这些细节,功能块能不能稳定复用,最关键的就是状态切换边界够不够清楚。

3.2 原点回归的实现要点

原点回归看起来只是“碰到原点开关就停”,但实际上要考虑机械误差。FX5U的DSZR指令支持“后端原点回归”方式:先以设定的原点回归速度往原点方向搜索,碰到DOG信号后减速停止,再反向低速离开DOG,最后停在Z相信号位置。这样做的好处是重复精度高,因为最终停靠点不是靠开关信号的跳变沿,而是靠电机编码器Z相脉冲。

ST功能块里处理原点回归,不能只发一条指令就完了。要设置原点回归超时时间,比如30秒内没完成就报错。原因很实际:如果原点开关损坏或线掉了,轴会一直往一个方向跑,直到撞上硬限位。我在现场见过多次这种“飞车”情况,所以功能块里必须有超时和限位保护。

原点回归完成后,PLC当前位置要统一清零或设置为机械原点偏移量。如果设备安装原点开关的位置和机械原点不重合,需要在功能块里加一个“原点偏移量”参数,回归完成后直接写入偏移值。这样后续绝对定位的坐标值就是相对于实际机械原点,而不是传感器位置。

3.3 点动和定位的实现与联动

点动用可变速脉冲输出指令,正转方向和反转方向设置不同的方向信号。点动逻辑上要防止正转和反转同时接通。我在功能块里做成互锁:如果bJogF和bJogR同时为ON,功能块不动作,并且报一个“方向冲突”的错误码。点动停止时不要直接切断脉冲输出,最好走一次减速停止,否则机械冲击很大,尤其是带负载较重的时候。

定位功能是功能块里参数最多的部分。绝对定位用DDRVA指令,相对定位用DDRVI指令。功能块里我通过eMode输入区分,内部选择一个调用。定位前要检查原点是否已经建立,没有原点就强制先回原点,或者在程序里报“未回原点”错误。很多设备启动后第一次定位不准,原因就是有人跳过原点回归直接给了绝对位置,导致所有坐标都偏了。

定位的加减速时间我放在轴参数结构体里,而不是写死在功能块内部。例如加速时间默认200ms,减速时间默认200ms,具体根据负载惯量和伺服增益调整。加减速时间设太短,伺服会过流报警或机械抖动;设太长,节拍跟不上。功能块里我把加减速时间单位统一为毫秒,上位机或触摸屏输入时乘以系数,避免格式混乱。

4. 实操过程:从接线到跑通程序

4.1 伺服接线与NPN/PNP匹配

接线是定位控制翻车概率最高的环节之一。FX5U晶体管输出模块,根据型号不同,有漏型输出和源型输出两种接法。常见的是源型输出,PLC输出端的Y信号为高电平有效,也就是输出信号接伺服驱动器的脉冲输入,公共端接0V。伺服驱动器的脉冲输入接口通常有一个“脉冲模式”参数,常见的有脉冲加方向、CW/CCW。要和PLC侧Y点实际接线保持一致。

还有一种情况是不同品牌PLC混接,比如设备里既有三菱也有西门子PLC,项目又要求西门子侧也要发脉冲。这时候很容易出现“PLC公共端接的电源正极”这种NPN接法。NPN输出是低电平有效,输出点导通时内部管拉到0V,公共端接电源正。如果用PNP输出去接NPN输入的驱动器,脉冲永远发不过去。所以接之前一定先确认:PLC输出类型、驱动器输入类型、公共端极性。三者必须匹配。

我在现场的经验是,接完第一台伺服后,不要直接跑程序,先用万用表量一下Y点与公共端之间的电压,按下点动按钮时看是否有脉冲跳变。用PLC内置的高速计数器或示波器看脉冲最直接,但万用表频率档也能大概判断。

4.2 伺服驱动器和PLC参数配合

伺服驱动器的电子齿轮比,是很多新人最容易算错的地方。PLC发10000个脉冲,电机转一圈,丝杠导程如果是10mm,那一个脉冲对应的位移就是0.001mm。如果伺服驱动器的电子齿轮比没设对,同样的脉冲数,实际走的距离可能差很多。

功能块里我建议把位置单位全部用“脉冲数”作为最底层单位,触摸屏上用mm或度显示,换算关系放在一个单独的计算块中。这样当伺服驱动器电子齿轮比变化时,只需要改那个计算块里的比例系数,不需要改动轴功能块内部逻辑。

伺服驱动器还需要设好“脉冲输入模式”“方向逻辑”“伺服使能信号逻辑”。FX5U控制伺服时,通常PLC通过一个中间断电器或直接输出信号给伺服驱动器的SON(伺服使能)端子。功能块里可以让“功能块使能”同时控制伺服使能,功能块不工作时伺服也可以保持使能,看设备需求。我习惯是只要设备主电源上电并且报警清除,伺服就一直使能,功能块只管发脉冲。这样调试时少一个“为什么电机没力”的问题。

4.3 在GX Works3里建ST工程和仿真

在GX Works3里新建工程时选择FX5U系列的CPU型号,然后创建功能块,语言选择ST。功能块内部定义的变量就是内部局部变量,外部通过接口变量访问。写好后编译,如果语法有错会直接在下方窗口提示。不建议一次写一大段再编译,最好每加一个分支就编译一次,否则ST语法错误定位起来很费劲。

GX Works3的仿真器能验证ST逻辑基本流程,比如状态切换、错误码输出,但仿真器不模拟真实伺服定位完成信号。所以仿真时我一般用一个内部定时器模拟定位完成,确保功能块的状态机能跑通。真正测试定位精度,必须把程序下到PLC里接实际伺服,或者用FX5U输出监控功能观察脉冲输出。仿真替代不了实机,但能帮你提前筛掉一半低级逻辑错误。

5. 常见问题与排查实录

5.1 实际调试遇到的问题速查

这套功能块我用了几个项目之后,总结了一些高频问题,整理成一张表:

现象可能原因处理办法
原点回归直接跑飞原点开关信号没进PLC,或DOG信号地址错用监控表看输入点状态,确认开关动作
回原后每次停的位置偏差大只靠DOG开关停止,没有使用Z相信号改用DSZR带Z相停靠,或改后端回归方式
定位走不到设定位置,偏差固定电子齿轮比不对重新计算PLC脉冲数与机械位移换算关系
点动方向反了方向信号逻辑和驱动器参数不一致切换驱动器方向取反参数,不要改程序
连续定位几次后位置误差累积有丢脉冲,可能是接线干扰或公共端未共地检查屏蔽层接地,确认驱动器输入模式
功能块一直处于busy定位完成信号没触发,或状态机跳转条件缺失在状态机里加超时强制退出
按下启动没反应没有给伺服使能,或bStart上升沿没抓到确认伺服SON信号,确认bStart信号

这张表是我现场排查时最常用的。每个问题背后都可能牵扯好几个因素,但多数情况是“接线—参数—逻辑”三者里的一个没对齐。

5.2 几条独家避坑经验

第一,原点回归完成之后,不要立刻在同一个扫描周期里执行定位。伺服机械位置虽然停了,但伺服内部位置整定还要一段时间,这里至少要延时50到100毫秒,否则容易丢第一步脉冲。我是在状态机里增加了一个“HOME_DONE_WAIT”状态,延时到位后才进入IDLE,这样定位指令一定是在机械机构稳定后才发出。

第二,功能块里所有外部输出,建议通过局部变量中转,不要直接改外部设备软元件。比如bBusy信号输出,先用内部变量置位,末尾统一复制给输出接口。这样可以避免功能块在复杂跳转时因为输出刷新的时序问题产生毛刺,也能让代码更好维护。

第三,如果用位置跟随或总线伺服,可能用不上内置脉冲指令。FX5U总线上通讯伺服的话,比如CC-Link IE TSN或者通过定位模块控制,轴控制指令要换成总线协议支持的定位命令,但功能块的接口可以保持完全一致。这也是我把功能块设计成“外部接口不变,内部实现可换”的原因。真遇到总线控制项目,只需要替换底层运动指令封装,上层流程代码完全不用动。

6. 后面还能怎么扩展

6.1 从单轴功能块到多轴管理

当前功能块是一个轴一个实例。设备轴多了以后,比如一台贴标机有4个伺服轴,每个轴都拖一个功能块实例,初始化代码和状态监控代码会重复很多。我后来做的是把功能块再包一层“轴管理块”,内部用数组保存多个轴参数,按轴号索引。这样触摸屏或HMI只需要读写一个统一的结构体数组,程序里调用某个轴也只需要给轴号。

多轴管理要注意轴间互锁。比如两个轴不能在定位过程中同时启动,或者需要按固定顺序回原点。这些逻辑最好放在外层轴管理块里,不要放到单个轴功能块内部,否则会破坏功能块的复用性。

6.2 与触摸屏和上位机集成的一点体会

功能块接口定好之后,触摸屏开发会轻松很多。MCGS、昆仑通态、威纶通这些屏都一样,只需要定义几个地址对应功能块的输入输出变量:模式、启动、停止、目标位置、当前值、报警码。触摸屏本身不关心PLC内部是ST还是梯形图,它只认软元件地址。

我个人体会最深的是:把轴控制封装成ST功能块,最大的收获不是代码量少,而是调试时关注点被收敛了。以前排查定位问题,要在几十行梯形图里找M和D的关系;现在只需要盯住功能块的输入输出和轴参数表,问题基本能定位到接线错了、电子齿轮比错了、还是状态机没跳转。这个“把复杂度装进盒子”的做法,比省下几百行代码更有价值。如果你也在用FX5U,建议自己动手写一个这样的轴控制功能块,哪怕是最简单的版本,跑通一遍之后,你对ST语言和定位控制的理解都会不一样。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 10:35:44

本地AI翻唱工具实战:改词、自动混音与API批量处理指南

AI翻唱工具现在不少,但很多在线版喜欢把流程封死在网页里:上传歌曲、选音色、点生成、拿结果。想做改词、换伴奏、批量处理,或者把翻唱能力接进自己的脚本里,就很被动。这次我们来看一类本地 AI 翻唱工具,核心卖点是改…

作者头像 李华
网站建设 2026/9/1 10:34:20

《易学・中孚䷼|道影子新解 061》

摘要中孚卦(䷼)承接节卦 "节制守正、适度有分寸" 之后,揭示当系统节制约束、适度有分寸、需要内心诚信、忠信、真诚、守信时,便进入 "泽上有风、中孚" 的诚信力场。其本质是泽上有风、中孚、诚信、忠信、真诚…

作者头像 李华
网站建设 2026/9/1 10:33:47

电商AI客服软件选型与落地:从自动回复到分层处理关键

做电商客服这件事,我见过最多的焦虑不是“今天又遇到一个难缠买家”,而是“后台消息根本回不过来”。尤其是大促那几天,几百个会话同时冒出来,每条都在催发货、问尺寸、要发票,人工客服手指再快也跟不上。于是AI客服软…

作者头像 李华