用心理模型改进PLC和DCS编程

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

通过丹尼斯Brandl 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(可扩展样式表语言转换)中,用于创建网页并将数据转换为可打印或可显示的格式。函数式语言的关键在于它们是由规则而不是由过程控制组织起来的。函数式程序由一组规则和相关代码组成。

为每个输入评估规则;通常,这是一个布尔或正则表达式,计算结果为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编程很容易。SFCs是一种petri网的形式,petri网是逐步过程的图形符号。它们提供了选择、迭代和并发执行的功能。可以将sfc看作允许并行分支的可执行流程图。SFC中的每个步骤都包含一组命令,这些命令可以启动其他SFC(分解),或者向控制模块发送命令(封装)。较高级的对象通常表示机器或单元,它们是设备(控制模块)和用于控制它们的过程的集合。

避免设计糟糕的程序

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

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

- Dennis Brandl是北卡罗来纳州Cary BR&L咨询公司的总裁。他的公司专注于IT制造业。由内容经理马克·霍斯克编辑,控制工程mhoske@cfemedia.com