本文主要从方法论的视角讨论在PLC的编程过程中如何通过导出若干规则来改善当前的编程实践,提高编程的工作效率和编程的质量。
软件的结构化和模块化意味着软件是按照一定的规则将按结构划分/功能划分的单元(即模块)进行弱耦合,而这些单元或模块是完全遵循独立开发和独立测试的原则进行的。
构成软件结构化和模块化的主要前提条件是进行周密的设计和遵循相关的标准。所谓进行周密的设计就是要增加设计阶段在整个开发过程中的权重;只有在清晰定义控制程序的结构和定义模块之间的相互关系之后才着手开始程序的开发。所谓遵循相关标准的含义是,充分挖掘IEC 61131-3规范的编程语言的潜在能力,在设计和开发阶段加以利用,因为这些工控编程语言足足可以满足编程人员的绝大部分的需要。当然随着编程平台和集成开发环境的提升和进步,目前还引入了IT领域流行的语言如C、C++、JAVA、Python等作为加强及补充。
之所以特别强调设计的重要,是因为良好准确的软件设计规范强烈地影响所开发的软件的质量。一般而言,软件的设计规范书对每一个编程人员的影响可以用代码的正确性和执行效率来衡量。即使是没有经验和技巧的编程人员所造成的可能的缺陷,虽然会对系统的运行产生影响,但也可以在调试中予以消减甚至消除。然而一个设计得有问题的软件规范书交给有经验的编程人员,很难找到那些不完善或者错误的分析所造成的问题,并确定问题具体表现在哪些程序段,因而很难运用编程技巧来避免和消除。总之,在软件设计阶段所产生的后果将涉及以下各个方面:调试困难和耗费时间,很低的重复使用率,软件客制化的难度加大,以及阻碍软件进一步扩展等。另外,从软件开发的成本的角度看,如果消除代码的bug所耗费的时间和成本为1,那么消除一个设计不完善的问题其耗费的时间和成本将会是10倍,甚而要把这一问题隔离开来并找到解决方法可能会再高一个数量级,也就是100倍了。
至于为什么要遵循IEC 61131-3的就不必多言了。我们需要研究的是,在开发PLC的应用程序的整个过程中,这个标准所规范的编程语言应该如何分工,各司其职,才能收到良好的效果。
PLC的控制程序的开发一般可划分为三个阶段,即分析、设计和写代码。在IEC 61131-3标准中并没有规定在PLC软件开发生命周期的哪个阶段一定要使用哪种语言。我们必须自行去了解在这5种语言中哪一种适合于支持软件开发的初始关键阶段,而哪些语言适用于写程序代码的阶段。
从结构化的完整性和表达的能力这两个准则来观察,明显可见SFC处于高端的级别,可以用作设计系统控制软件的主要工具。SFC所表达的模块化是结构性的模块化,区别于功能块图语言FBD所表达的功能性的模块化。功能性的模块化虽然重要,但在PLC控制程序的开发过程中,难以从工艺控制的完整性的视角来分析如何通过结构化来实现模块化。因为在PLC软件开发生命周期的初始关键阶段,重要的是分析控制的构成结构,导出每个构成单元都是整个完整结构中的一个独立组成单位(也即是模块),每个独立的组成单元具有各自的功能性,但相互之间的关系却是弱耦合,而非强耦合。由此可见SFC适合于按软件工程的方法进行分析和设计,而其它4种语言,还有SFC语言本身,都可用于写程序代码的阶段。由于结构文本化语言ST类似于C语言和Pascal语言,结构化的表达能力远胜于FBD和LD,适于对各种算法特别是复杂算法进行编程。而梯形图语言LD因为历史的原因在电气自动化控制领域已经形成为一种技术文化传承,有着很深的应用基础,所以在以SFC为主线的程序结构中适合用于动作块和转移条件的编程。如何应用,则视具体情况而定。图1给出了5种语言在PLC软件设计个阶段中所处的级别和作用。
图1 5种语言在PLC软件设计中的作用
为什么推荐采用SFC作为设计系统控制的主要工具,而其他的语言则用在控制软件代码开发阶段,主要是因为SFC适用于多状态操作运行的场景,而且特别容易表达多状态操作运行的场景。而SFC所具有的独特优势在于它能够把大型复杂的过程分解为许多较小的易于了解、便于操作的过程。具体分析如下:
1)表达控制要求的超强能力;
2)图形表达的形式方法:
3)支持初步设计;
4)支持详细设计;
5)与其它编程语言的天然连接;
6)支持软件的分段执行
01
表达控制要求的超强能力
SFC顺序功能图语言有效继承了法国PLC编程语言标准Grafcet的精髓,在表达的潜力方面与状态图无异,而在针对并行或并发问题上又吸收了Petri网优势。正因为状态图和Petri网被认为在建模的动态过程方面是合适的工具,同时又被扩展到各个领域,因此SFC语言在本质上就具有对系统的行为建模的强大能力。
02
图形表达的形式方法
SFC不仅是IEC 61131-3标准规范的图形化的语言,而且在与同样是标准所规范的另外两种图形化语言LD和FBD相比,在描述和表达系统的动态过程的能力方面显然居于更高的级别。进一步说,SFC语言的图形化的语法容易学习掌握和使用,也是优势之一。实际使用的经验表明,对同一个工艺要求和控制过程,不同的编程人员编制出来程序具有高度的一致性,至少是大同小异,或者完全一样,这也表明用SFC语言编制的程序可读性很强
03
支持初步设计
在设计的初始阶段,当许多方面尚未清晰,或者设计人员还未深入了解之前,仍可以用SFC的图形方法进行系统行为的形式表达,因此可以说SFC在初步设计阶段就是一种有价值的工具。运用SFC能够避免在用自然语言描述系统规范时可能出现的模糊不清,这样就可以大大减少客户、设计者和编程人员之间的相互不理解的次数。
04
支持详细设计
在设计的早期阶段运用SFC得出的方案,可以在取得新的信息之后逐渐深化,由概略进一步细化,尤其是与状态步关联的动作块可进一步细化,使之成为新的嵌套的SFC方案。依此方法一步步地深入,直到得到所希望的详细深度。不论是在初步设计阶段还是在详细设计阶段,这种在语义和语法上的连贯性,对编程人员来讲,采用SFC语言是很顺手的。
05
与其它编程语言的天然连接
明显可见SFC非常适合于IEC 61131-3标准规范的其它编程语言组合使用,特别是在详细描述控制细节(如转移条件和基本的动作)时采用梯形图LD或ST语言,既可以收到提高整体的编程效率的效果,又可以提升可执行代码的性能。这就是所谓“在正确的时刻或正确的编程过程中视具体情况选择正确的编程语言”的结果。
06
支持软件的分段执行
运用SFC语言可以简便地处理按不同的扫描执行周期将整个控制软件分割为多个程序段,这为减少大的扫描时间提供了先决条件。应该指出,在运用SFC语言表达程序段的分割时均表现为显性,按执行条件是否满足来启动不同程序段的执行顺序,这些执行条件都是显性条件,不存在隐含条件。
IEC 61131-3标准中,顺序功能表图(SFC:Squence Function Chart)是作为编程语言的公用元素定义的。它是采用文字叙述和图形符号相结合的方法描述顺序控制系统的过程、功能和特性的一种编程方法。它既可作为文本类编程语言,也可作为图形类编程语言,但通常将它归为图形类编程语言。因此,通常讲IEC 61131-3有三种图形类编程语言。
顺序功能表图(法文为GRADCET:Graphe de CommandeEtape-Transistion)早由法国国家自动化促进会(ADEPA)提出。它针对顺序控制系统的控制条件和过程,提出的一套表示逻辑控制功能的方法。由于该方法jingque严密,简单易学,有利于设计人员和其他人员设计意图的沟通和交流,因此,该方法公布不久就被许多国家和国际电工委员会所接受,并制定了相应的国家标准和。IEC 60848《用于顺序功能表图的GRAFCET规范语言》以及中国国标GB/T 21654《顺序功能表图用GRAFCET规范语言》的颁布,为我国应用顺序功能表图编程语言提供了坚实理论基础。
绘制一个控制系统SFC表达的基础是要确定该控制系统的边界和顺序功能表图的范围。通常,把一个控制系统分为施控系统和被控系统两个相互依赖的部分。图2表示施控系统和被控系统之间的关系。
图2 控制系统的SFC表达举例
施控系统接受来自操作员、过程等信息,并向被控系统发出操作命令。
被控系统包括执行实际过程的操作设备,它接受来自施控系统的命令,并为施控系统提供反馈信息。图中表示了这些系统顺序功能表图的界限。
施控系统的输入是操作员和可能的前级施控系统的命令及被控系统的反馈信息,它的输出包括送到操作员的反馈信息,前级施控系统的输出命令和送到被控系统的命令。
被控系统的输入是施控系统的输出命令和输入过程流程的参数,它的输出包括反馈到施控系统的信息、过程流程中执行的动作,它使该流程具有所需的特性。
施控系统的顺序功能表图描述控制设备的功能,由设计人员根据其对过程的了解来绘制,并作为详细设计控制设备的基础。
被控系统的顺序功能表图描述操作设备的功能,由工程设计人员绘制,作为操作设备工程设计的基础,它也用于绘制施控系统顺序功能表图。
顺序功能表图只提供描述系统功能的原则和方法,不涉及系统所采用的具体技术,因此,用顺序功能表图可以描述控制系统的控制工程、功能和特性,可描述控制系统组成部分的技术特性而不必考虑具体的执行过程。它适用于绘制电气控制系统的顺序功能表图,也适用于绘制非电气控制系统(如气动、液动和机械的)的顺序功能表图。
图3显示了数控机床的被控系统和施控系统。图中,被控系统是机床,施控系统是数控装置。控制系统用于将材料进行加工成为零件。
图3 数控机床的被控系统和施控系统示例
SFC是一种按照自动控制的要求对Petre网方法加以适当简化和改进的程序设计法。它数学基础严格,严密jingque;但又简单易学。描述元素只有3种,即:步(step)、转换(transition)和有向连线(oriented line)。表1是顺序功能表图编程语言的有关术语。图4是SFC的典型的表述方式。由一系列顺序相连的状态描述顺序控制的过程,对应每一个状态有一个步序。由有向连线将前后各个状态(步序)连接,仅当前一个状态(活动步)执行完成其规定的动作,且由当前状态向排列在其后的状态转移的条件成立,才执行有当前状态向下一个状态转移,直到整个顺序过程完成后即停止。
表1 顺序功能表图编程语言的术语
术语 | 英文名称 | 说明 |
表图 | Chart | 用图形方式描述系统的行为,例如两个或更多变量、操作或状态之间的关系 |
步 | Step | 定义系统顺序部分状态的GRAFCT语言元素,步分为活动步和非活动步 |
转换 | Transition | GRAFCT语言元素,指示在两个步或多步之间活动的可能进展 |
有向连线 | Directed Link | 表示步之间进展的GRAFCT语言元素,将步连接到转换,并将转换连接到步 |
动作 | Action | 表示输出变量所进行活动与步有关的GRAFCT语言元素 |
状态 | Situation | 在给定时刻由GRAFCT描述,并由活动步表征的系统状态的名称 |
转换条件 | Transition Condition | 用布尔表达式结果表示的与转换有关的GRAFCT语言元素,转换条件是与每个转换有关的逻辑表达式 |
图4 SFC典型的表达方式
众所周知IEC 61131-3实现结构化分三个层次:
①通过软件模型表现了配置、资源、任务、程序组织单元的结构层次;
②创建了结构文本化语言ST,为程序组织单元的结构化程序实现,提供了文本化语言;
③顺序功能图语言既为程序组织单元的结构化程序实现,提供了图形化语言;又为整个程序设计的各个阶段提供了实现结构化设计的工具。
SFC可以表述单一的顺序过程,也可以表述各种复杂的顺序过程,如循环的顺序过程,具有可控终止的顺序循环过程,具有分支的循环顺序过程(见图5),并行分支的顺序过程,选择性的分支顺序过程,同步的并行分支顺序过程(见图6),在完成分支过程之后再行合并的顺序过程,等等。总之通过灵活的使用跳转(有向连线)和转移条件,可以将各种操作状态组成各种结构化的顺序控制过程。
图5 具有分支的循环顺序过程
图6 同步的并行分支顺序过程
SFC描述方法直观,十分便于程序设计人员和工艺人员在设计阶段进行沟通和交流。它特别便于用户直接按工艺流程编制控制程序,不同的编程人员编的程序极少差异,提高了编程的正确性和程序的可读性;用SFC表达控制内容时,实际工序与程序一一对应,一目了然;在控制工序发生异常时容易确认问题的所在,因而修改与维护均很方便。概括起来说,SFC具有结构化的属性:其自顶向下的设计方法,以及可将步用作宏步,十分便于在初步设计时作为结构化的工具。进入详细设计阶段,再根据已明确的控制步骤和要求细节,将宏步扩展为每个具体的步,列出转换条件和与每一步相关联的动作,控制程序就在这样有条不紊的氛围中完成。
如果遇到相当复杂的控制问题,我们可以借助于有限状态自动机的方法,画出状态图,只要掌握了状态图与SFC语义的异同,由状态图转换为SFC程序也是相当便捷的。
国际上SFC语言的使用已经比较普遍。已经在工业自动化领域获得成功的PackML(Packing Machine Language),不仅在包装行业获得广泛的认可和应用,而且还被作为集成架构的典型策略解决方案,为机械装备的集成系统提供了建模的参照标准。PackML为包装机械和生产线开发的编程语言,主要依据IEC 61131-3的顺序功能图语言SFC,并定义了许多适合包装工艺应用的功能块,可用于SFC编程中的动作块。2019年PLCopen国际组织和美国的automation.com网站联合进行了了PLC用户编程语言偏好的调查。用得多的是结构化文本语言(40%),其次是梯形图(38%),再次是功能块图(35%),第四是顺序功能图(28%)。各种编程语言运用的差距并不大,没有特别多的,即使居的结构化文本也不过比居于第五的其它语言多的有限。
国内至今还没有正式进行过这方面的调查,但从平时的了解来看,截至目前为止在编制PLC程序时,国内的编程人员如果用到SFC,也只不过把它仅仅作为一种编制顺控程序的工具,只有极少数的先知先觉者才认识到并在实践中把SFC当作系统设计的工具。正是考虑到这一现实,我们有必要对SFC的结构化功能、它在描述控制系统的行为特性的作用,以及在系统设计中作为初步设计的整体结构化的工具等重新认识,把它的潜力充分发挥出来。