西门子TIA运动控制_FOR循环轴功能块

#关于运动控制指令FOR循环的应用案例#

应用背景:

       在几年前,我了解过汇川的指针在运动控制方面的应用,仅仅使用几行代码就实现了多个轴的控制,极大方便了编程效率,后来逐步接触到欧姆龙等编程软件也可以做到。由于工作的特殊性,长时间未接触博途,想把现有程序移值到博途内,发现博途的轴引脚并不支持指针引用(当时应该是V16前版本),使用DB绝对地址访问也出现错误,于是寻求官方技术支持,接电话的是一位言语中饱含沧桑的大哥,我把我的需求和疑问跟他描述之后,他经过尝试也未能实现,不过在后续的版本中可能会添加这项需求。

       直到博途V18版本的发布,我看到了新版本功能的介绍,有关DB_ANY数据类型的讲解,我非常激动,这不是妥妥的“指针”吗,但苦于工作没有时间去详细研究,现在西门子又发布了博途V19版本,我觉得要好好研究一下了,不然时间太长,很多知识就会遗忘。废话到此为止,开始展示👇

实现方法如下:

       系统架构上,①在主程序里面调用一个自己创建的总的轴控制FB块(这里可以自己随便命名,如AxisControl),完成自己的控制逻辑,比如轴赋值,循环之类的,相关的变量调用在下面介绍。②再单独创建轴控制相关功能块(也可以把这些功能全部放一个功能块里面,但有的轴用不到的功能块会占用扫描时间,故单独创建更加灵活),比如轴使能,点动之类的。③分别在各自的功能块里面调用相关的运动指令,也可以根据实际情况再二次处理。

17eb8c4647ea463f8cc252294217c2d3.jpeg

 实现过程如下:

         准备事项:创建一个PLC项目,已添加两个TO_PositioningAxis(其它类型原理一样)工艺轴对象,可以新增一个组,把运动控制相关都放进去,接下来我们讲解运动控制程序部分:

        ①先添加一个名为“AxisPower”的功能块(建议FB编号自定义,后面好管理),如下Enable为Input类型,由外部配置使用,其余信号结合实际需要引用,其它功能块同理;

         特别的,Axis数据类型为TO_PositioningAxis,这个跟你的工艺轴对象类型保持一致。调用的功能块指令静态参数实例化即可。

500202663ccd4ffda8d490016a446378.png

//轴使能指令调用,此处配置信号仅举例(Input型)。
#MC_POWER_Instance(Axis:=#Axis,
                   Enable:=#Enable);
(*//功能块全引脚说明
#MC_POWER_Instance(Axis:=_param_fb_in_,
                     Enable:=_bool_in_,
                     StartMode:=_dint_in_,
                     StopMode:=_int_in_,
                     Status=>_bool_out_,
                     Busy=>_bool_out_,
                     Error=>_bool_out_,
                     ErrorId=>_word_out_);
*)

        ②再添加一个名为“AxisJog”的功能块(同上),注意:此处的点动信号,我配置的是Static类型,这个根据你项目的需要,如果认为他是必要的,就配置成Input或InOut,如果非必要,使用静态变量即可,或在外部调功能块引脚也不是不行。

b743ce48d92e46e4b88dd0824f5b889e.png

//轴点动指令调用,此处配置信号仅举例(Static型)。
#MC_MOVEJOG_Instance(Axis:=#Axis,
                       JogForward:=#JogBwd,
                       JogBackward:=#JogFwd,
                       Velocity:=100,
                       Acceleration:=1000,
                       Deceleration:=1000);

        ③创建一个名为“AxisVar”的DB数据块,用来监控运动控制的引脚相关变量等。

6dbc55e9699c45519e45f85d6fff33f9.png

        ④接着添加一个名为“AxisCallFB”的功能块,作用就是在这个功能块里面循环调用刚刚创建的运动指令的功能块;在这里我们分别添加三个静态变量:“AxisNo”(数据类型:DB_ANY)、“AxisJog”(数据类型:AxisJog)、“AxisPower”(数据类型:AxisPower)。关于这几个变量的数据名称及类型说明如下:

  • AxisNo(DB_ANY):用来标识任意数据块(可以参考手册),可以理解为“指针”,但它不是指针,西门子有专门的指针指令,这个我们后面会提到详细用法。
  • AxisPower/AxisJog(AxisPower/AxisJog):刚刚创建的单独的运动控制的功能块;
  • i(Int):此处用来循环调用轴功能块。
  • MaxAxis:用户常量,不同的设备的轴数可能不同,使用此常量形式,在开发程序的时候仅需修改此常量的数值即可,不用在每一行变量中修改数值。

1a786d0c89e544419a15a9ac09ef3f25.png

(*
轴运动控制循环编程示例:
作者:WEI
日期:2024年9月29日
*)
//轴赋值
#AxisNo[0] := %DB1;//X(1号)轴
#AxisNo[1] := %DB2;//Y(2号)轴
//轴循环(默认最大轴数量)
FOR #i := 0 TO "MaxAxis" DO
    (*
    选择分支说明:
    为了节省资源,有些轴的功能不必参与循环,可以采用选择分支,或统一循环,使用点位来启用亦可;
    *)   
    //轴选择处理
    CASE #i OF
        0..1://1~2轴
            "AxisVar".PowerEnable[#i] := "AxisVar".FirstOn[#i];//初始化使能
            #AxisPower[#i](Axis := #AxisNo[#i],Enable := "AxisVar".PowerEnable[#i]);//轴使能块调用
    END_CASE;
    //轴选择处理
    CASE #i OF
        0..0://1~2轴             
            #AxisJog[#i].JogFwd := "AxisVar".JogFwd[#i];//轴正转点动
            #AxisJog[#i].JogBwd := "AxisVar".JogBwd[#i];//轴反转点动
            #AxisJog[#i](#AxisNo[#i]);//轴点动块调用
    END_CASE;
END_FOR; 

通过上面这个程序案例,大家最关注的应该有两个地方:

  1. 如将%DB1赋值于#AxisNo[1],%DB1是工艺对象名称X_Axis的背景DB块(被优化),故将X_Axis赋值于#AxisNo[1]也是可以的;
  2. 另外#AxisPower[#i](Axis := #AxisNo[#i],Enable := "AxisVar".PowerEnable[#i]),这个是属于调用功能块用法,由于上面已经将#AxisNo[#i]赋值,因为此处的#AxisNo[#i]的数据类型与功能块引脚的Aixs的数据类型相匹配了

此处需要说明的是,只要FOR循环DB_ANY这种变量类型,在初始化时必须要进行赋值(或者选择分支等亦可),否则会编译报错,类似于空指针形式的错误。

       ④然后将“AxisCallFB”添加到Main程序中即可完成本次示例程序的全部内容。

83e48b162f104127baf856e051e9b058.png

//调用轴控制功能
"AxisCallFB_DB"();

仿真结果如下:

       在监控表内添加相应的控制变量:

7fdbac1a1e7c4aa485a3ce84a48bb0d5.png

        将X轴和Y轴使能信号开启:

cf4eaa4215214efd998b1278abec33e4.png

       将X轴和Y轴点动信号开启,仅有X轴实际位置发生变化,这是由于我们在CASE语句选择分支未调用Y轴的点动功能块,可以根据此写法完善自己的程序架构。

61b8db11abd940e898a750055e4f334c.png #写在最后#

       通过以上的案例,我们不难发现使用FOR循环做运动控制,的确能有效的提升编程效率,但在实际的使用中也要优化程序,避免扫描周期过长的问题。如果你有任何疑问,可以关注我的博客,我们一起交流学习,后面我会将案例程序额外附上去。这次我的第一次创作,希望得到大家的支持和关注,谢谢!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值