本来系列文档到探秘9就结束了。但是我觉得应该把语法中非法与和合法讲清楚,也要讲清楚一个我认为在编写代码中很重要的概念,我称之为”逻辑可行,但不合法“。本文档更偏向编程理论探讨。很多读者也可以忽视本篇内容。
一,有逻辑但不合法
我们重温一下探秘3的图2。也是本文档的图1。
,图1
在探秘3中,我们知道:“在对象外部,普通变量和输出变量只能读取,不能写入。”
如果在外部写入普通变量或者输出变量,那么系统会报错。也就是CODESYS编译系统会报错。这是一个典型的有逻辑但不合法的例子。其实,只要更改编译系统,使得不让编译系统在这种情况下报错,是完全办得到的。但是为什么CODESYS编译系统要报错呢?因为CODESYS编译系统要维护对象的封装性。我们知道OOP编程的3个特点之一就是封装性。把一些内容封装起来,使得外部不容易更改内部的内容。这很重要。如果不维护封装性的话,那么对象内部可能受外部代码的随意更改,从而失去了对象原本的功能。
二,没有逻辑
下图是探秘4中的图6
,图2
在探秘4中,我们知道类的方法中不能声明临时变量。因为图2中除了stat变量外所有变量都是临时的,所以不必再单独声明临时变量。图2声明了临时变量,这就是典型的不符合逻辑的错误。这种没有逻辑的错误,自然也不合法。编译系统也是人编写的程序。不符合逻辑的自然无法实现,也就无法编写编译程序。所以图2中的错误与图1中的错误性质是完全不同的。
再举个例子,是探秘5图6的例子。
,图 2
在这个例子中,我们知道如果子类访问父类的临时变量,编译系统报错。这是因为临时变量是依附于函数的。如果没有函数,自然无法访问临时变量。所以这个例子中的错误也属于逻辑错误,为此编译系统报错。
我们再举个例子,探秘8的图11中,我们探讨过。一个FB可以实现2个接口,并且2个接口中的方法可以重名。但是要求是2个方法的签名必须一致。这是符合逻辑的,否则编译器无所适从,不知道该按照哪一个签名去实现方法。
三,有逻辑
在探秘8中讨论了接口。这个接口看上去非常的难以理解。但是了解C语言的就知道接口本身就是函数指针。函数指针也有些抽象。我们讲得再本质一些:函数指针就是汇编语言中函数所占用内存的起始地址。在汇编语言中是没有函数指针这个概念的。到C语言才有指针这个概念。在高级语言中,如果用函数指针,实际上就是把函数起始地址数据放到数据总线中供CPU读取,或者把函数首址放到一个变量中(这个变量就对应C语言的指针变量),在需要的时候,CPU可以读取到函数起始地址,下一步CPU就可以把这个地址放到地址总线上,从而运行这个函数。
我们再简练的回顾一下接口。OOP编译器如何处理接口?这里只抓主要的探讨:编译器先把接口转换为结构化语言的函数指针。这是第一步,然后编译器再把函数指针转换为汇编语言的2个指令(1,读取函数首址指令;2,跳转到这个地址上运行函数)。以上就是接口赋值语句的实现过程。
通过接口我们了解到,无论看上去多复杂的OOP内容,其实内核都符合逻辑,最终都可以转换为若干条的汇编指令,使得CPU可以运行。
本篇结束语
本篇内容浅浅的讨论了一下编译系统。在OOP编程中,一定要了解一些编译系统的机制和行为,才能写出更优雅的OOP代码。也要了解哪些是为了OOP才对语言做了限制,就象围墙,把不符合OOP的代码挡在围墙外,认定其不合法,从而保护OOP的完整性。
在本篇中,我们还知道了无论OOP多么复杂,在计算机中,执行代码是也是一句一句的线性执行。从这个角度讲,OOP可以认为是结构化编程中的一种框架,一种规范。按照这个规范编程,就能带来OOP本来的优势。如何理解框架呢?在探秘9中,我们讲到接口的方法变量声明中只能声明输入输出类型的,其他类型都不可以声明。这就是逻辑上没问题,但是语法上非法。这种语法约束就是框架,把编程者的思维框在OOP中,使之不偏离OOP。
本系列结束语
PLC的OOP编程的内容与高级语言的OOP还是有些差异,比如PLC的OOP到目前还没有构造函数。相对来讲,PLC的OOP比高级语言OOP要简单。
本系列文档对PLC的OOP主干内容已经探讨完毕,还有一些末节内容没有探讨。各位读者朋友们遇到时可以自己尝试摸索。
SIMATIC AX可以为SIEMENS的1500系列PLC编程序。这也是一个OOP的IDE。不过它与本系列使用的CODESYS关于OOP这方面有些差异。比如SIMATIC AX允许类声明PUBLIC变量,而CODESYS到目前的版本还不允许。还有就是SIMATIC AX中把FB块与CLASS区分开了,而在CODESYS中类就用了FB。当然还有些差异,但这些差异不影响大局。如果条件允许,未来我会出一个系列的文档,专门讲解SIMATIC AX与CODESYS在OOP方面的差异。
亲爱的读者朋友们。PLC的OOP编程探秘系列到这里就告一段落了。虽然和你素未平生,不过我希望这个系列的文档能够帮助你,尤其是那些自动化工程师在未来很大概率会使用OOP的方式编写代码。本系列就是为你们准备的。希望在未来的工作中,当你编写代码遇到困惑时,可以到此翻阅系列文档,在这里找到你的答案,找到你的灵感。
最后我要说的是,我在这里对读者朋友们的帮助,希望可以点燃更多的帮助。
1543

被折叠的 条评论
为什么被折叠?



