c语言面向对象实战(浅谈TIA中的面向对象编程)
c语言面向对象实战(浅谈TIA中的面向对象编程)最后是多态特性,在软件工程中多态需要配合虚函数来实现,但是目前没有任何一家PLC品牌可以支持虚函数,即便是基于PC架构的倍福PLC也无法支持。由此我们可以换个角度来看,如果嵌入了Motor模型的SINAMICS S120和ABB ACS800模型它们三者同样的Start方法可以分别启动不同的对象(仅仅可以这样理解,实际差的远)。因此综合以上,PLC是无法全部支持面向对象编程特性的,但是这并不妨碍我们用面向对象的编程方法来实现工业自动化中的PLC编程。再来看看继承,目前FB还不支持真正的继承,只能采用嵌入的方式。比如如果我们要开发一个变频器的控制模型就完全可以调用前面的马达模型,然后我们再为之添加调速功能及相关接口即可。下图演示了这一特性。综上所述,对于组件的编写建议使用FB而不是FC,FB高度类似面向对象中的类。而对于一些简单的函数,则最好使用FC编写,例如选择器、比较器及限幅器等等。如何
面向对象编程(OOP: Object-Oriented Programming)来自于软件工程,属于计算机编程领域中的一种理念。所谓的对象是从众多同类事物中抽象出来的模型,比如对文本的操作、用户的登录管理等等。封装、继承和多态是面向对象编程的三大特性。这里无意过多的介绍面向对象编程的基本概念,感兴趣的朋友可以找一本计算机编程的书籍去多了解。本章我们将尝试从自控的角度来诠释这种编程方法。
对象是算法和数据的有机结合,是对某种特定事物的算法和数据的一种封装。在PLC编程中,如果我们按照工艺要求将对某种设备或操作的控制逻辑写在一个功能块(Function Block,后面简称FB)中,此功能块同时也保存了该设备或者操作的相关数据,且该FB对外部程序只暴露接口,那么该FB就是相当于一个类。类是对对象的抽象,类本身并不能运行,类需要被实例化后才能运行。同样的道理,PLC程序中的FB在被调用之前也不能运行,尽管它一直驻留在PLC的工作内存里。当此FB被拖放到程序编辑器里并赋予背景数据块(其实是实例数据块)的过程就是对FB的实例化过程。从背景数据块的英文名称Instance Data Block就能看出。下图演示了这一过程。
图1 对FB的实例化
在上图中,左边的HwValve和HwValve*都是封装好的阀门控制模型。从软件工程的角度来看,这里我们可以理解为类。这些类在未被调用之前是不会运行的,只有当它们被拖到OB或者FC中并赋予实例数据块(Instance Data Block,类似于软件工程中类的实例化)后才能运行,这一步骤和类的实例化过程完全相同!上图中的XV-1001就是一个阀门的实例,我们完全可以通过访问实例XV-1001的属性来实现对这个阀门的操作控制和状态采集,比如XV-1001.QOped表示阀门XV-1001是否已打开。 这里顺便说一下,FC可以理解为函数(Function),它和类不同,原因在于它不能保存数据,不需要被实例化。另外,虽然通过建立UDT(User Data Type 下面简称UDT)再通过DB来存储数据提高了其易用性,但还是存在以下缺点:
- 一旦修改了FC的接口,则必须重新修改UDT,那么以该UDT创建的所有数据必须要更新,名称或地址可能重新排列,需要手工重新连接数据至更新后的FC,工作量大、效率低下;
- 在调用FC时,所有的参数引脚都需要连接变量,而对于FB,需要赋值的引脚才连接变量,不需要的赋值的则可以空在那儿,因为它们有属于自己的数据存储空间,从而节省编程工作量;
- FB有自己的背景DB,支持static变量,也支持更复杂的参数类型,便于可以实现一些更高级的功能;
- 在FB中可以直接嵌套另一个FB,实现功能的扩展及升级;有点类似前面提到的面向对象中的继承(实际上不是继承),比如我们在编写变频器控制模块时可以从马达控制模块继承。
- 因为FC自身不能存储数据,必然要依赖全局DB。这就导致了逻辑和数据分离,对于程序的复用性有一定的影响。
综上所述,对于组件的编写建议使用FB而不是FC,FB高度类似面向对象中的类。而对于一些简单的函数,则最好使用FC编写,例如选择器、比较器及限幅器等等。如何判断是选择还是FC来实现?这取决于我们所要解决的问题可否抽象为一个对象,如果可以那么就使用FB,反之使用FC。
有人说PLC中实现不了面向对象编程。那么到底PLC能否实现或者能实现到什么程度的面向对象编程?下面根据封装、继承和多态这三大特性来一一阐述。首先我们来看封装,这个无需多言,FB中是允许定义接口(此接口其实是指的属性或者成员变量,并非interface这种接口)和保存数据的。但是TIA Step7中的FB没有提供类似Private的关键字对私有变量进行保护,也就是说外部程序可以通过XV-1001.xxx来访问实例中的内部变量。从这点来说,TIA Step7中的封装机制还不够完善。下图是一个已经实例化的马达控制模型(类),我们可以将它的相关I/O点直接写在对应的参数引脚上,这个过程其实就是对类进行实例化时对属性的赋值。
图2 一个已经实例化的马达对象
再来看看继承,目前FB还不支持真正的继承,只能采用嵌入的方式。比如如果我们要开发一个变频器的控制模型就完全可以调用前面的马达模型,然后我们再为之添加调速功能及相关接口即可。下图演示了这一特性。
最后是多态特性,在软件工程中多态需要配合虚函数来实现,但是目前没有任何一家PLC品牌可以支持虚函数,即便是基于PC架构的倍福PLC也无法支持。由此我们可以换个角度来看,如果嵌入了Motor模型的SINAMICS S120和ABB ACS800模型它们三者同样的Start方法可以分别启动不同的对象(仅仅可以这样理解,实际差的远)。因此综合以上,PLC是无法全部支持面向对象编程特性的,但是这并不妨碍我们用面向对象的编程方法来实现工业自动化中的PLC编程。
本文摘自《TIA Portal高级编程》