登录
首页 PLC论坛 施耐德电气PLC
回帖 发帖
正文

主题:施耐德PLC和西门子PLC面向对象编程详解

点击:3466 回复:9

面向对象编程是计算机高级语言的一种先进的编程模式,在工业控制系统的plc程序中也可以采用这种设计思想,虽然我们无法实现面向对象的很多优秀特点如“继承”,甚至于它根本就不具备面向对象编程语言的特点,但面向对象编程的基本概念就是类和类的实例(即对象),我们只需要使用这种概念就可以了。在计算机编程中我们需要把一些事物抽象和归纳,才能编写类,而在工业控制系统中,控制对象如:电机,阀等等是很明显的控制类别,不需要抽象就可以很明显的针对它们编写类,以下将会用到西门子的Step7编程语言和施奈德的Unity编程语言来讲解PLC的面向对象编程。
一、实现方式
面向对象编程在Step7中使用功能块(即FB)编程,一谈到此大家就会想到西门子提出的模块化编程,不错,就是这个模块化编程,但西门子提出的模块化、背景数据块、多重背景等名词并不能让大家很明白的理解和使用这种优秀的设计理念。如果大家从面向对象编程的角度去理解,则可以很好的理解这种设计模式。“FB块”被看成“类”,它可以被看成是对相似的控制对象的代码归纳,如对MM440的变频器可以编写FB块:MtrMM440,这在面向对象编程中称为“类”,当需要编程控制具体的电机时,可以给它分配一个背景DB块,在面向对象编程中称为类的实现(即创建类的实例:对象),当需要控制多个电机时,可以分配不同的背景DB到这个FB块,即创建类的多个实例。Step7中有另外一种程序块,即FC块,以FC块为主的编程在西门子中称为结构化编程,这也可以类比于计算机编程中的面向过程编程,即纯粹以函数为主体的编程。
施耐德电气的Unity软件编程可以更好的理解面向对象编程。它的DFB定义中包含输入/输出参数,私有/共有变量,以及代码实现,而这正是计算机的面向对象编程中“类”的基本元素,而创建类的实例(对象)就像创建普通的“布尔”变量一样,只需在“FunctionBlocks”中定义这种“类”的变量即可。
Step7和Unity都可以采用面向过程和面向对象编程方式,这两种编程方式的区别类似于计算机高级语言中的C语言和C++语言编程的区别。
以下的讲解将会把Step7中的FB和Unity中的DFB称为“类”,Step7中的FB+背景DB以及Unity中DFB的实例称为“对象”。
二、面向对象编程架构
以上讲解的是实现细节,而编程思想是建立在程序架构上的,不是某个局部使用了面向对象方式,则可以称之为这种编程就是面向对象编程。这种编程需要从以下方面着手:
1、电路设计的结构化。
这里主要以自动线为主介绍,对于单机机床可以是它的简化结构,
自动线层:这是最高层次,它拥有一个主PLC,对属于它下面的各区域控制
工程层:拥有独立的配送电系统,但没有PLC,只有分布式模块,由自动线控制。顾名思义,它有着较大的独立性,可以作为一个单独的工程项目设计和制造,当自动线比较小时,可以省略该层次。
功能组层:根据工艺划分,将实现某一个工艺功能的区段设备划分为一个功能组,它隶属于工程层,当工程层被省略时,隶属于自动线层。
面向对象编程并不一定要求使用以上的结构,但好的电气结构更利于面向对象编程。
2、任何控制对象逻辑都在“类”中实现。
为了做到这点,必须分析与控制对象相关的信息,譬如,对于一个电机,有以下相关的信息需要考虑:
输入信息:
电路保护信息,如电机的空气开关,热继电器等。
功能保护信息,如运动电机的限位开关,风机的风压开关,油泵的油位开关等。
启动和终止条件,以上的电路保护和功能保护都可能导致电机运转终止,复位也可能导致重启动,但这里的条件指的是正常运行的启动和终止条件,譬如顺序控制的流程步。
控制模式:如手动和自动等。
故障复位:通过复位信息,重新启动。
输出信息:
控制输出,如控制电机的主接触器。
状态信息输出
故障输出
.........
状态储存信息:
用于代码实现的中间变量以及可以被电路图设计中我们早已经在使用针对控制对象的绘图方式,即把基本的主配送电路和PLC配置完成后,我们会针对每一个现场控制对象如:电机、阀、气缸等控制对象绘制电路图,他们的电源来自主配送电路,控制和反馈与PLC建立连接,硬件连锁根据实际情况调整,一个个控制对象就象搭建积木一样有组织的堆积起来,同样的,编程也是针对一个个控制对象使用相应的标准控制块实现就可以,把程序控制细节实现了有效的封装,使程序看起来简洁和易于维护,而好的设计可以把原理图和程序进行很好的关联,甚至于做到一对一的关系,如原理图中的一个控制对象可以在程序中找到相应的FB调用与之对应,真正做到面向控制对象编程。
可能有人疑虑,PLC编程大部分是步进编程,这一个个标准块都是针对控制对象的,那控制顺序如何实现呢?这就要求编写专门的顺序控制FB块,或者使用Siemens现成的Graph7来实现,这点与一般编程没什么差别。
结束语:现在的工业控制领域有很多程序高手,他们很精通算法,也有着自己的编程理念,当我和一些人探讨标准化时,他们认识到标准化的高效性,但认为这样无法体现自己的编程水准,是的,如上所述作为应用层面的程序设计是不要很高的编程水平,但要想想,一个人难道能一辈子去搞现场调试吗?若想体现自己的价值,可以从事标准编程。我更希望他们能花一点时间研究程序架构,各行各业,真正的大师是系统架构设计者,编程小技巧只不过是为好的架构锦上添花。
最后修改:2020/7/13 16:17:12
20-04-27 14:06
应该使用Somachine来说,那有些面向对象的雏形了,通过接口可以实现多态了,西门子的Step7充其量还是面向过程的编程,或许用博图16来解释更好一点。
文章中的FB也就是子程序还不能称为类,这篇文章大概在10年前发布的,那个时候如果买点房子的话现在都不需要讨论面向什么编程这种话题了。
Good Luck~
20-04-27 14:44
朋友,讨论还是要讨论的,就是我们都没买错过时机了表情
20-04-27 15:06

引用 fangjianwen 在 2020/4/27 15:06:49 发言【内容省略】

10年前的内容已经不值得讨论了,特别是这种作者自己都没有理解透的内容。
Good Luck~
20-04-27 15:22
路过不懂看看表情
20-04-27 15:45
HMI软件面向对象编程的程度高一些,什么超级精灵,就是这样的概念,不过在各种现场的情况下,好多时候并没有时间仔细的整理,还是粘贴拷贝来的使用。PLC编程更是这样,更多的时间是花在调试的过程中,这时候大家就不去追究程序的精巧了。。。
20-04-29 11:22
楼主说的太好了,要是有个实例那就更好了!
如楼主说的,电机 阀  气缸 归为类  即所谓的对象
而配置实际的电机,气缸对应相应的硬口
而编写这一些类的行为,譬如气缸前出,退回  电机的自动前进,手动后退,回零等行为
   加入 互锁条件, 位置状态,状态输出,故障报警等  即行为的编程
一个行为的结束启动另一个或多个行为的状态转移编程。
最后修改:2020/4/29 19:41:53
20-04-29 18:51
这不是精巧,而是结构分明,逻辑性强,不易出错的一种架构思路
最后修改:2020/4/29 19:10:36
20-04-29 19:04
这根本就是面向过程的编程思想。
20-04-29 23:12
对于学习过高级语言的很容易理解,他们一直是这么干的。对于我机器能动就行了。
20-05-09 18:32

工控新闻

更多新闻资讯