在第一篇教学中我们举了一个电机控制的例子,3个按钮控制电机正反转和停止。
单个电机控制
只是一台电机程序看上去挺简洁的,那如果是5台电机呢?10台呢?如果直接复制程序的话先不说程序篇幅,单就建立变量就够费事的了吧。而且实际项目中电机的自动控制程序很可能很复杂,复制程序修改变量名称也是一项庞大的工作量,再加上变量与设备地址的对应和赋值。。。不敢想象。
这时如果把单个电机的控制程序封装成块,按照电机的数量去调用就可以极大的减轻我们的工作量,而这个块就是今天要讲的内容功能块(FB).
三菱的软件在左侧的导航栏有专门建立功能块的空间:
与建立程序段一样右键后新建数据,也会出现一个标签声明窗口和程序编辑窗口,这里要注意的是,功能块只能使用局部标签,不能使用全局标签和地址,毕竟功能块是要重复调用且互相不发生干涉的,符合这个特性的只能是局部标签。
声明标签
与普通程序的局部标签相比,功能块标签的类多了几个选项,分别是输入变量(input)、输出变量(output)和输入输出变量(in_out),而这几个变量类型也是功能块与外界程序的接口。
例如这个程序的按钮变量需要与外界的按钮地址进行连接,而且按钮对于这段程序来说属于控制者,因此把按钮变量声明为input类型;而正反转变量要传递给电机是执行者,因此把正反转声明为output类型;in_out类型即可输入也可输出,本人用的也不多,以后找找资料为大家分享。
其他类型的变量在这里只用来服务功能块内部程序,例如使用for或者case,需要一个数字型的中间变量(var)来让程序执行,调用后不会在外部程序中显示。
然后在程序编辑窗口将最上面的程序复制到这里,功能块建立完成。
功能块有了,在ST下如何使用功能块呢?三菱的拖拽法是比较方便的:
点击部件选择窗口按钮,可以在右侧出现部件列表:
部件列表
找到刚刚建立的功能块,用鼠标左键拖拽至程序编辑窗口中:
拖动FB
这时出现标签登录/选择窗口,这是由于功能块想要使用是需要声明标签的,就像普通的变量一样,改好标签名称,点击应用即可自动声明完成。如果生成的FB标签需要更改,也可以在标签表里编辑。
功能块想要使用,需要对他的接口引脚进行赋值,上图可以看出,拖动过来的功能块会自动将所有接口引脚列出,我们只需要将引脚后面赋值就可以。为了便于观看,稍微整理下格式:
实际上三菱的引脚赋值符号与标准的ST语言是由差异的,标准的输入引脚赋值用':=',而输出引脚使用'=>'符号,三菱的ST并没有进行区分。
如果一个功能块有一些引脚用不到,比如一个电机只要正转也停止就行了,用这个功能块也没有问题,只要将用不到的引脚删掉就好了:
模拟运行,验证一下功能块是否可用:
将第一个电机正转,第二台电机并没有影响。
习惯梯形图的人可能会觉得ST对于功能块的展现并不直观,我们可以使用FBD(结构化梯形图)来调用功能块:
FBD
左侧为输入引脚,右侧为输出引脚,相对ST来说清晰一点,你们更喜欢哪种方式呢?
除了自建的功能块,三菱提供了很多直接可用的功能块,常用的比如上升沿(R_TRIG),下降沿(F_TRIG),延时启动(TON),延时关闭(TOF)等。与自建的功能块相比,这些功能块功能比较单一,需要与其他程序配合,所以用FBD就不是很方便了。我们修改一下上面电机控制的例子,来感受这些常用块的用法。按钮的输入检测下降沿执行,正反转启动要延时1秒执行:
在这里可以看到,功能块的输入端口采用括号的形式引出,而输出端口即可以用括号,也可以用类似结构体调用元素的方式,在FB标签后面加符号点'.'引出,并且可以直接使用。
当然后加的这些功能完全可以写进我们封装好的功能块内部程序中,这样外面的程序就不用变化了:
在这里可以还可以看到,功能块的所有引脚不一定非要在同一个括号内赋值,可以在需要的单独赋值某一个引脚。调用的系统功能块的标签也可以根据实现的功能起名,文章里是为了体现功能块本身选择的自动生成。
联系客服