用思维模型改进PLC和DCS编程

工程和IT洞察力:开发一个心智模型来处理实时编程,这与web开发或经典编程不同。基于函数式编程、封装、层次分解和petri网模型,编写实时可编程逻辑控制器(PLC)和分布式控制系统(DCS)程序。不接受非结构化和设计不良的PLC和DCS代码。

文/丹尼斯·布兰德 2014.12.19

使用以下建议来改进可编程逻辑控制器(PLC)和分布式控制系统(DCS)的编程。实时控制系统编程是真正的编程,但它使用的语言和模型通常不会在编程课上教授。实时语言和模型也与现代编程语言(如c#、Java、PHP、Perl和Python)没有太多共同之处。在编写控制程序时,工程师和程序员通常必须重新学习如何在dcs工作时使用功能框图编程或在plc工作时使用IEC 61131-3语言来处理问题。

4种编程语言,1种结构元素

最新版本的IEC 61131-3, 2013-02版3.0,定义了四种控制语言和一个结构元素。控制语言是梯形图、功能块、指令列表和结构化文本。结构元素是顺序功能图。指令列表(IL)和结构化文本(ST)对于程序员来说应该很熟悉,但是功能块图(FBD)、功能块(FB)、梯形图(LD)和顺序函数图(SFC)与现代编程语言有很大的不同。

通常用于商业和消费者软件设计和开发的方法不容易转移到plc和dcs的实时编程环境中。经典程序具有明确的起点和终点,并且处理文件或数据库,因此不适合实时响应式编程模型。实时程序通常连续运行,不顺序处理文件或数据库表。用于web开发、数据库存储过程和智能手机/平板电脑开发的现代基于事件的编程模型也不适合用于实时控制。实时反应性控制通常不是基于事件,而是基于输入的重复扫描和输出的生成。

然而,不要绝望;有可应用于PLC和DCS实时编程的编程模型。这些模型包括问题的层次分解、petri网(位置/转换网络)、封装元素中的信息隐藏以及函数式编程方法。这些模式都不是新的;Petri网可以追溯到计算机发明之前,最初是用来描述化学过程的。层次分解是解决复杂问题的标准工程模型。

功能DCS和PLC编程

函数式编程是在LISP、AWK和XSLT语言中使用的编程模型。目前最常见的用法是XSLT(可扩展样式表语言转换),用于创建web页面并将数据转换为可打印或可显示的格式。函数式语言的关键方面是它们是由规则组织的,而不是由过程控制组织的。函数式程序由一组规则和相关代码组成。

规则对每个输入进行评估;通常,这是一个计算结果为TRUE或FALSE的布尔表达式或正则表达式。在AWK的情况下,对文件中的每一行文本计算规则。对于XSLT,规则是针对XML文档中的每个元素求值的。当规则求值为TRUE时,将执行相关代码。一旦执行了一条规则,就会跳过其余的规则,并对下一个输入重复执行该程序。

梯形图示例

梯形图可以看作是函数式编程的一种形式。ld最初是用来表示继电器和开关的垂直列格式。每一个由连接的继电器和开关组成的网络就像梯子上的一个横档,术语“横档”用来描述每一个网络。如果将梯级视为函数式程序中的规则集,那么LD编程可以被视为函数式编程的一种形式,但有一个特殊的区别:除非存在跳过或跳过以下规则的情况,否则每次都会评估每个规则。如果将LD程序视为规则和相关代码的集合,那么可以将函数式编程心智模型应用于问题。

将每个阶梯梯级视为指定一个评估规则。如果结果为TRUE,则执行以下代码;否则,跳到下一个规则级。例如,阀门V1的规则级将实现逻辑(automatic_mode=1)和(available_status=1)和(open_command=1)。如果求值为TRUE,那么下面的逻辑将实现打开阀门的代码。在LD中,这可能如图所示。

函数块编程

在规则的相关代码中,可以添加执行基于状态的控制所需的逻辑,而不必担心程序其他部分的副作用。功能块(FD)编程与LD编程相同,只是以水平格式布局,具有描述网络/梯级执行顺序的方法。功能框图(FBD)也可以看作是一个功能模型,其数学计算作为相关代码。在FBD编程中,规则集通常处理模式控制(自动或手动)、错误检查或备用控制策略。

下两个可应用于控制编程的编程模型是层次分解和使用封装元素的信息隐藏。这些概念是面向对象编程(OOP)的基础模型。OOP模型使用将大问题分解为较小的部分,每个部分封装或隐藏其局部信息和算法。对象只公开命令和数据,而隐藏其执行主要功能的方式。一个对象还可以包含执行主任务子集的其他较小的对象。这个问题被分解成一个封装对象的层次结构。

控制程序

控制程序可以遵循此模型,因为该模型与语言无关。最小的元件通常被称为控制模块,因为它们封装了基本的控制并提供对系统I/O的访问。它们通常控制一个物理设备,如电机、阀门或泵,或控制必须一起工作的设备的集合。每个控制模块实现一个相对简单的控制算法,控制算法执行的触发器是如上所述的功能程序规则。然后可以用LD、FB、IL或st对控制模块的算法进行编程。IL是汇编语言的一种形式,类似于编程课上通常教授的那些。ST是一种高级语言,类似于Pascal或c。IL或ST编程不需要新的软件设计心智模型。

然后,高级对象可以使用过程来命令控制模块对象,这些过程是控制模块的顺序或并行命令集。虽然使用LD或FB编程很难对程序进行编程,但使用sfc编程很容易。sfc是petri网的一种形式,而petri网是逐步过程的图形符号。它们提供了选择、迭代和并发执行的能力。将sfc视为允许并行分支的可执行流程图。SFC中的每个步骤都包含一组命令,这些命令可以启动其他SFC(分解),或者向控制模块发送命令(封装)。高级对象通常表示机器或单元,它们是设备(控制模块)和用于控制它们的过程的集合。

避免设计糟糕的程序

如果您只有web开发或经典编程经验,那么开发处理实时编程所需的心智模型是很困难的。但是,您可以将实时PLC和DCS程序建立在众所周知的函数式编程、封装、层次结构分解和petri网模型之上。

当您将新的工程师和程序员引入您的环境时,请鼓励他们使用这些开发良好的结构来解决他们的控制问题。没有理由仅仅因为编程语言不同于现代编程语言就接受非结构化和设计不良的PLC和DCS代码。

——Dennis Brandl是北卡罗来纳州卡里市BR&L咨询公司的总裁,他的公司专注于制造业IT。编辑:Mark T. Hoske,内容经理,控制工程mhoske@cfemedia.com