一个FOR循环完成多个伺服轴的实例化方法

描述

来源:博途之友;作者:张浩杰

阶段“优秀工程师之路

 编者说:一次博途之友的群交流时,我问大家:轴控应用库,大家用的多吗?工程师作者说:最近刚刚使用上,很方便。使用官方的库,二次封装成多重背景数据块,一个循环完成所有轴的实例化调用。

马上请他分享一下应用经验。

运动控制

在最近的项目中,我遇到了多轴协同控制的需求。由于现场工艺要求,单机设备可能需要根据实际情况动态增减轴数量。如果采用逐个调用独立指令的方式,不仅后期调试会变得异常繁琐,而且若不符合PLCopen规范,还容易导致轴控异常报警,故障排查将十分困难——这种方案显然不具备可行性。

虽然考虑过自行封装轴控功能块,但考虑到需要投入大量时间进行验证测试,短期内难以保证稳定性,这个想法只能暂时搁置。

经过一番调研,我欣喜地发现了官方提供的标准化轴控库解决方案。官方库文件几乎涵盖了轴控的所有常见应用场景,主要提供两种类型的控制库:LAxisCtrl_PosAxis和LAxisCtrl_DBAnyBased。通过查阅技术手册发现,这两种库在接口类型和资源占用方面存在明显差异,后者对系统资源的消耗更大。有了官方认证的标准化轴控库,不仅完全符合PLCopen规范,还免去了自行开发的诸多风险,这让我对轴控封装成标准化充满信心!

按照常规思路,本打算创建一个FB功能块,直接调用官方库中的"LAxisCtrl_PosAxis"模块。要么将其定义为数组类型,要么自定义包含轴控接口的数据结构再进行数组化(就像处理气缸实例化那样简单直接)。标准化和模块化是提升开发效率和维护便利性的关键。以气缸控制为例,引入"最大气缸数"这一全局常量,实现了气缸实例化的标准化管理。当设备配置变更需要调整气缸数量时,仅需修改该常量值即可自动适配所有相关控制逻辑,这种设计理念极大地简化了系统配置和维护工作。

所有气缸实例化

运动控制

主程序调用

运动控制

然而,实际情况比预期要复杂许多,经过多次试验验证,系统在输入接口管脚处存在以下关键限制:

1、不支持对TO_PositioningAxis类型的数组引用,仅允许单个TO_PositioningAxis数据类型;

2、静态参数引用功能缺失;

3、无法直接对官方提供的控制库进行数组化引用。

如果不能循环引用的话,达不到我的标准化需求,那么做这个块的意义就不大了。于是我又测试一个LAxisCtrl_DBAnyBased的库,结果还是一样不支持。但发现了一种新的数据类型DB_ANY,一查原来是万能的数据类型。那么能不能指向TO_PositioningAxis呢?答案是可以的,但是不能直接使用,需要转换一下。

运动控制

运动控制

经过测验发现"LAxisCtrl_PosAxis"库只能创建为静态参数,那么新思路:先封装一个单轴带参数引脚的FB块>>再创建一个FB轴实例块对其单轴FB块循环调用>>最后主程序调用FB轴实例块。

基础层:封装单轴控制FB块,集成所有运动控制、状态监控和参数配置功能

管理层:开发轴管理FB块,通过循环调用机制管理多个单轴实例,提供统一接口

应用层:主程序只需调用管理块,通过修改’gi_AxisMAXNo’常量即可调整轴数

一、基础层:单轴FB块的封装

运动控制

二、管理层:FB轴实例化

运动控制

三、应用层:

1、Main调用

运动控制

2、轴限位

值得注意的是,若是想开放软限位值,只能通过Axis DB块下PositionLimits_SW结构体实现。

运动控制

运动控制

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分