PLC的面向对象编程(OOP)探秘9-接口的应用与原理揭秘

        上一篇我们讨论了接口的基本知识,这一篇我们探讨接口的应用。将从代码的实际开发流程入手,这样更易理解接口。

一,创建一个接口

        我们创建一个执行机构的接口,该执行接口的功能是从A点运行到B点停止,也可以从B点返回A点。但是此时,我还没有想好这个执行机构如何实现。是简单的电机+接近开关实现这个功能,还是用带有绝对值编码器的伺服机构实现这个功能。不知道读者朋友们注意到没有,在这段文字中我用了3次“实现”这个词。这就和上一篇接口的实现挂上钩了。

        创建接口的具体步骤如下。先创建1个接口和2个方法

,图 1        

        图1中创建了ITF_AB接口,该接口的功能是执行AB之间的运行动作。

,图 2

        图2是Meth_EXE方法。该方法的功能是控制执行机构在AB两点运行。该方法包括2个输入和2个输出。其中输入是2个命令,是A到B命令或者B到A命令。输出是完成命令。当然还可以增加输出,比如执行动作过程中出现错误。但是本篇为了简化问题,就不增加这个输出了。

,图 3

        图3是接口的另一个方法,该方法返回执行机构当前的状态。比如运行,停止,错误,报警等等状态。该状态值是WORD类型。为了简化思路,本方法在本篇中不做重点讨论。

二,用接触器实现接口

       

        我们首先创建一个用接触器实现上述接口的类,FB_C。

,图 4

        如图4,这个类中,包括2个接近开关的输入点和控制接触器的2个输出点。

        继续编写Meth_EXE的实现方法

  ,图 5

        在图5中,就实现了接触器控制的A点B点之间移动的业务代码。在途6中完成了从A到B的控制。

,图 6

        图6是一种固定写法,我们要记住的。如何理解图6中的一些代码,是本篇靠后部分的内容,这里先搁置。

        图6的代码就实现了机构从A到B的移动。从B到A也类似,只要更改i_ab.METH_EXE中输入变量取值即可。

        到这里还没有完。因为,我觉得好麻烦,接口编程既复杂又不好理解。不如直接用结构化的语言编写更容易,干嘛还要费劲用OOP中的接口实现AB之间移动的功能?有1个非常重要的原因需要这么做-“解耦”。解耦的好处是尽量把程序的2部分分开,使2部分的关联非常少。哪2部分?用接口的部分和实现接口的部分。本例子中,实现接口的代码部分在FB_C中。而使用代码的部分在PLC_PRG。你发现没有?在PLC_PRG中,只有2句话与实现的代码有关,其余都无关。一句话是声明c;另一句话是接口赋值。

三,解耦的优势

        解耦的一个好处是用功能的人和实现功能的人可以是2个人。这2个人可以并行开发程序,提高了程序的开发效率。

        解耦的另外一个好处是:当用功能的人在开始可能并不知道到底用接触器实现还是用其他什么方法实现机构的AB两点之间的移动。但是这并不影响用功能的人继续使用除去那2行代码以外的所有代码。

        还有,也许用代码的人员是IT人员,他本人不了解什么是接触器,更不晓得什么是伺服。而实现接口的人员是自动化人员,他了解接触器,伺服,知道如何编写接触器和伺服的实现业务代码。

        解耦还有一个好处是,也许项目进行一半,领导决定不用接触器,而改用伺服实现AB两点之间的移动。好,那么神奇的事情发生了。

四,第2种实现

        当领导决定用伺服实现AB两点移动的功能时。不用慌,PLC_PRG中的代码大部分不用改。我们创建类FB_S也让它实现ITF_AB。当然还有更简单方法:比如,如果之前有控制伺服的类,那么FB_S可以继承这个伺服类。当然本例子中为了不使得架构看上去太复杂,这里就不用继承类的办法了。如图7,创建类FB_S

,图 7

        图7中变量cmd_Move, done_Move,spPos,pvPos 都是与伺服的接口变量,可以监控伺服。其中sp是设定值,pv是实际值,Pos是位置。

        我们为FB_S编写实现ITF_AB接口的METH_EXE方法。

,图8

在使用接口的程序(PLC_PRG)中编程

,图 9

        在图6的基础上,我们只改动了图9中红框中2行内容。其余代码都未更改。

        到这里,我们就可以体会接口的益处了。可以讲,有接口后,很多功能都想着往接口上靠。因为太方便更改了;思路也变得清晰了;编程也变得容易了,这也是OOP的魅力所在。到底爽不爽,大家用起来就知道了。

五,接口的原理

        

        上一篇,我们留个尾巴。探讨接口的原理。有以上这些知识和体会,现在可以探讨接口的原理了。因为C语言几乎和汇编语言是硬连接,而CPU最终执行的是汇编机器码,所以我们用C语言来解释接口更贴近根本。

        图9的语句

                        i_ab : ITF_AB;

        的C语言解释是:创建一个结构体,该结构体名称是i_ab,结构体中有2个函数指针,名称分别为METH_EXE,METH_getStatus。换句话说,OOP中的接口就是函数指针的集合。当执行

                        i_ab := is;

        这意味着有2个赋值语句,分别将FB_S中的两个方法的起始地址赋值给了i_ab中的2个函数指针。当我们运行

                        i_ab.METH_EXE();

        这意味着运行

                        FB_S.METH_EXE();

        探讨到这里,熟悉C语言的读者朋友们就已经心中有数了。

        这里我再一次发了在探秘1中所发的感慨:在OOP中,简单的一个语句可以被编译系统在后台解释为若干语句的组合。而作为好的OOP编程人员,对此应该大致心里有数。

五,上一篇遗留的尾巴

        

        在上一篇中,我们说了如果一个类实现了2个接口,而2个接口的方法名称相同,探秘8的图11。这带来极大的好处。

        在上一篇中,我们说要在本篇中探讨什么极大的好处。但是这一篇的篇幅又太长了,在本篇不再探讨这个问题了。如果有兴趣的朋友们我们可以一起探讨。

六,再上一点难度

        

        有了上面的基础,我们可以再上一点难度。之前例子我们有这样一些要素:接口、接触器实现类、伺服实现类、总调用PLC_PRG。现在我们在这些要素基础上增加一个要素:传输带。我们假设AB两点移动的机构就是传送带conveyor。创建传送带类FB_Conveyor

,图 10

        在这个类中有i_ab变量,这是一个类型为ITF_AB的接口变量。记住这个口诀:在类中声明一个接口变量,那就是说我要在这个类中做这个接口类型能完成的功能。

        图10中还有2个命令变量用于给传送带命令以及2个位置到达的输出变量。我们给这个类编写一个方法。

, 图 11

        这个方法的名称是METH_RunCyc。从名字我们知晓,这个方法未来要循环不断的执行的。在这个方法中,我们执行AB两点间运行的指令。这就是上一段黑体字的含义。

        这里特别注意:代码写到这里,编写传送带的程序员尚不知道如何实现METH_EXE方法。这个程序员仅仅凭借着程序员的信念相信,一定有程序员能编写出实现METH_EXE方法的代码。我没有说废话,我这里就是要强调OOP中接口的思维方法。

        这里再强调一点:上图对Meth_exe的调用只是固定了Meth_exe方法所使用的参数,而这个方法所使用的代码到底是什么,这里并未固定

        继续编程

                                                                                图 12

        图12的代码中,如果领导用伺服电机,那么就令变量use_ServerMotor=true,如果领导用接触器,那么就令变量use_ServerMotor=false。程序只需要改这么一点,就能满足领导的善变性格。这就是接口的妙用。

        用之前探讨的“接口的原理”去理解图10到图12的代码是不难的。这里就不再多讨论了。本例子中,包括了接口要素、2个实现接口的要素、包含接口的类及对象、还有总调度PLC_PRG。这个例子算是比较有难度的了。未来工作中大概也就是这个难度了,所以请读者朋友们,收藏这篇文档备查。在图13中,对这个项目的一些要素做个总览。

 ,图 13

结束语

       接口的运用很灵活,有关接口的更多妙用,还请各位读者朋友在自己工作中摸索。不过,不管接口怎样灵活,万变不离其宗,我对接口有一句总结:接口可以把要干什么和怎么干完全解耦。图5和图8的代码以及接口赋值指令做的工作都是怎么干。图6、图9和图11配合图2的代码描述的是要干什么。

        大家注意没有,在本篇创建的2个类中,都没有向FB类本身写代码,而是在方法中写代码。原因在探秘4中已经给出了。

        到此,我们对PLC中的OOP大致有了一个印象。好处有什么,注意点是什么,我们都大致在心里有个印象了。

        接口是很好用的工具。我们可以常用它。用接口还有一个好处:可以锻炼我们的OOP编程思维。

        

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值