用户定义功能块(UDFB)之于可编程逻辑控制器()就像功能之于微控制器一样。两者都是用于简化代码的结构,使其更容易编写,故障排除和维护。它们也是允许代码在将来被重用的基本结构。
本文引用地址:本文概述了在 Opta 1中使用的简单UDFB的构造。该UDFB采用 集成开发环境 1(IDE) 1.0.3.0版本开发。本文提出的广义UDFB思想和程序适用于大多数s。
什么是UDFB?
UDFB是一种类型的程序组织单元(POU),用于组织IEC 61131-3标准中描述的PLC代码。从C编程的角度来看,UDFB就像一个具有多个输入和输出的函数,其中包括所有变量的static关键字。换句话说,UDFB具有跨函数调用存在的内存。
为了清楚起见,我们应该提到另一种POU,简称为“函数”。与UDFB不同,POU函数不具有静态内存的特性。另一种进行比较的方法是使用数字逻辑语言,UDFB是一个顺序电路,而函数是一个组合(无内存)操作。
为了简单起见,我们有意将该函数与UDFB合并。从编程的角度来看,函数的操作可以由UDFB执行,而不是反过来。如果可以构造UDFB,那么构造更简单的函数就没有问题了。
小贴士 :一名机械技师和一名电气技师正在修理一台柴油发动机。工作进行得不是特别顺利,因为两人都认为问题出在对方的技术人员的驾驶室里。UDFB也是如此。即使是构造和文档最好的UDFB 也会受到一定程度的怀疑,特别是在故障排除事件发生几个小时后。构造一个好的微控制器函数的相同规则适用于UDFB。让它们简单,让它们把一件事做得很好。不要太聪明。相反,要简洁明了。
如何构建UDFB
最困难的任务之一是定义UDFB的行为。我们必须理解UDFB要执行的输入参数、输出和任务。我们还必须了解顶层程序将如何实例化(使用或调用)UDFB。在我看来,这是整个过程中最难的部分,因为编写UDFB的机制相对简单。
小贴士 :弗雷德·布鲁克斯在他的经典著作《 The Mythical Man-Month》中有一句老话。转述一下,它说我们需要计划一个迭代的设计过程,“因此计划扔掉一个;无论如何,你都会这么做。”我希望它不是那样的,但是我们经常需要构建并实例化UDFB作为学习经验的一部分。只有通过构建第一个原型,我们才能了解它是如何运作的,以及它对更大的软件项目的影响。
作为示例,我们将构建如图1中突出显示的UDFB。这个块被用作状态机的一部分。它的作用是充当看门人。如果机器的uiState状态变量等于1,并且启用了该块,则执行该行的其余部分。从C编程的角度来看,这就像一个以uiState为索引的开关语句。请注意,前缀ui是匈牙利语的无符号整数表示法。
这种特殊的构造导致了一个相对干净的阶梯逻辑。梯级3的英文描述是这样的:
如果UDFB FBuiEqual被启用并且机器状态(uiState)继续
另外,如果主开关是打开的
同样,如果瞬时选择开关处于前进位置,则切换到状态2
否则,如果瞬间选择开关处于反向位置,则切换到状态4
我们将在此结束,因为状态对于我们的UDFB讨论并不重要。也许我们可以在以后的文章中探讨状态机。相反,关注UDFB和它正在寻找的两个条件:是否启用和值是否匹配。
“设置输出线”功能的实用程序
注意,横档(rung )从xEqual行而不是ENO行继续从UDFB开始。这是一个方便的 PLC IDE功能,称为“Set Output Line.”。如果我们没有使用这个选项,就需要一个中间变量来保存eEqual的值,同时还需要第二个梯级来执行状态改变操作。这将使梯级的数量增加一倍,从而降低代码的可读性。
图 1 :突出显示的UDFB在第3行上实例化,其操作类似于C程序中的switch语句。
定义输入和输出接口
构造UDFB的第一步是确定输入/输出接口以及所需的变量。这是使用图2上半部分所示的局部变量表完成的。观察有两个标记为uiA和uiB的无符号整数(ui)输入。还有一个布尔(x)输出名为xEqual。没有显示隐含的“rung hanging”EN和ENO I/O。这些元素在图1中很明显,它显示了实例化的UDFB。
小贴士 :正如您所知,PLC可以用几种不同的IEC 61131-3语言编程。当我们在语言之间切换时,事情就变得有趣了。例如,将块挂在阶梯逻辑梯级上的默认EN和ENO行在所有语言中都不是通用的。很明显,像结构化文本这样的语言并没有图形化的梯级。因此,“rung hanging”的I/O没有直接的目的,或者至少我们应该说,目的和实现是可以解释的。Arduino设计团队似乎忽略了这些行,例如在结构化文本中调用EQ函数:OUT:= EQ(TRUE, FALSE);如您所见,EN和ENO行不存在,因为该函数只分析要比较的两个值。
对了,还记得我说过的“搭上去就扔了”吗?UDFB中有一个bug。你永远不会在阶梯逻辑实现中看到它,但它可能是结构化文本的问题。我把问题留给你自己去发现。提示:我们的UDFB需要多少输入参数(隐式和显式)。
定义UDFB操作
图2所示的表包含两个局部变量,包括eEN和xisEqual。在第一级,我们有一个equal函数的实例化。在第2行,我们询问是否启用了UDFB,以及两个值是否相等。请注意,UDFB的操作与原来的相等函数之间存在细微的差别。根据Arduino文档,EQ块的EN行不涉及操作。对于UDFB,我们放置了一个额外的约束,该约束要求启用块以及UDFB求值为true的值相等。
图 2 :通过定义I/O接口、变量和代码来构造UDFB。
最后
UDFB是PLC编程的一个强大的、必须具备的技术。UDFB可以简化代码,并提供预构建和测试模块的有价值的库。与此同时,我要再次提醒您为了清晰而编程。不要太聪明!难以理解的UDFB可能会给故障排除过程增加混乱和延迟。这是非常不可取的,因为当我们考虑到生产损失,商誉损失,浪费材料,闲置劳动力以及恢复目标的高加班成本时,PLC的停机是非常昂贵的。