文章摘要
继续探索基于状态机的UDFB用于控制电机启动器。本期探讨功能块图(FBD)实现方案,可与之前的梯形图和结构化文本示例进行对比。文章通过并列对比梯形逻辑,展示逻辑流程的相似性与实现细节的微妙差异。本文面向中级PLC程序员,旨在提升程序可读性的同时优化工作流程效率。
预计阅读时间:6分钟
电机启动器功能块图 (FBD)UDFB 简介
用户自定义功能块(UDFB)是可编程逻辑控制器(PLC)代码的基础构建模块。它用于封装具有明确定义输入/输出接口的独立PLC代码段。经过严格测试的UDFB集合可组装成库。这些程序组织单元(POU)能显著节省时间,程序员可在项目中实例化多个UDFB,或在多项目中复用库。
UDFB可采用IEC 61131-3标准语言构建。但并非所有PLC都支持全部语言。例如西门子TIA portal支持以下UDFB编程语言:
- 梯形图(LD)
- 结构化文本(ST)
- 功能块图(FBD - 本文主题)
- 因果矩阵(CEM - 非IEC 61131-3标准语言)
本工程简报延续西门子TIA Portal UDFB话题,基于图1所示西门子S7-1200 CPU 1215 FC进行开发测试。往期文章包括:
请注意,相同的UDFB功能在三个示例中均有实现。这使得我们可以对生成代码的规模和复杂度做出评估。虽然我们不会宣布哪种方法胜出,但每种方法都有不可否认的优势。
假定读者已具备梯形图和功能块图的使用经验。假定读者能够流畅地在不同语言间转换组合逻辑电路,并会使用MOVE等功能指令。
功能块图代码的PDF说明可在此下载:
UDFB_FBD.pdf (97.7 KB)
图 1 :用于开发和测试UDFB嵌入式状态机代码的西门子S7-1200设备图
作者心得(经验分享) :
作为讲师,我曾主持过一系列PLC探索课程。我们自然从梯形图开始,以此衔接PLC程序与物理现场设备。随后我们深入研究了结构化文本和功能块图。在最终项目中,学生需完成既定要求,但可自由组合使用IEC 61131-3标准中的编程语言。多数学生在处理数字和方程式时更倾向使用功能块图。这种偏好表明,对于特定编程应用而言,功能块图更快速且易于理解。
技术提示 :切勿将UDFB与功能块(FB)混淆。虽然实例化形式可能相似,但UDFB与FB的运行机制不同。主要区别在于UDFB具有存储功能,而FB不具备存储能力。UDFB拥有在函数调用间保持的静态存储器。这种区别类似于C语言中的构造程序。UDFB使用static关键字声明变量,而FB的变量存放在栈中,每次迭代都会丢失。
同样不要将FBD与UDFB或FB混淆。FBD是编程语言,而UDFB和FB属于程序组织单元(POU)。
电机启动器 UDFB 的状态逻辑回顾
点击向下箭头展开摘要
在上一篇文章中,我们以状态形式描述了电机启动器的控制逻辑。为方便起见,此处再次列出各状态及故障触发条件:
电机启动器状态
用户自定义功能块(UDFB)包含五种状态。通过监测电机启动器辅助触点的反馈信号,可检测到与各状态相关的基础故障。
-
断开状态 :电机启动器处于非激活状态,接触器线圈未通电。若电机启动器意外闭合超过timGlitch设定时长,UDFB将进入故障状态。这种情况可能发生在技术人员使用绝缘螺丝刀强制操作启动器衔铁时。
-
闭合中状态 :电机启动器接触器正从断开状态向物理闭合状态过渡。若触点未在timTransition时限内完成闭合,UDFB将进入故障状态。图1展示了由此状态触发故障的UDFB。
-
闭合状态 :关联电机上的启动器正在运行。若传感器信号丢失超过timGlitch设定时长,UDFB将进入故障状态。该故障可能由连接电机启动器的驱动线松动或反馈线路引起。也可能是过载事件导致,此时热过载保护模块会触发启动器脱扣。
-
断开中状态 :电机启动器接触器正从闭合状态向断开状态过渡。若触点未在timTransition时限内完成断开,则触发故障——这表明主继电器或中间继电器触点已熔焊粘连。
-
故障状态 :电机启动器处于故障状态。当使能信号禁用且复位按钮按下时,该状态将解除。
功能块图中的状态机编码
功能块图状态机与前一篇文章描述的梯形图逻辑机几乎完全相同。两者采用相同的通用结构实现相同的状态逻辑。
图2包含功能块图表示法,为方便对比,图3提供了等效的梯形逻辑图。对比两张图可发现:
-
梯形图中的常闭触点在功能块图中以取反气泡表示。例如,当NOT xEnable时,功能块将转移到uiStOpening状态。
-
梯形图逻辑中AND运算体现为梯级连续性,而功能块图则使用显式功能块表示。举例说明:若当前处于关闭状态且使能信号丢失,则切换至开启状态。该逻辑编码在功能块图的第二分支和梯形图逻辑的第三分支中。
-
置位/复位线圈(内存赋值)用于UDFB布尔量输出。虽然表现形式略有差异,但底层功能完全一致。
-
功能块图具有从左上到右下的自然瀑布式流向。
-
本例中功能块占用了较大屏幕区域。相比之下,梯形图表示更为紧凑。我们倾向于认为功能块图存在冗余。但这种情况取决于具体程序。事实上,若根据功能块图的优势进行编程,情况很可能逆转。例如摄氏转华氏程序或储罐容积计算程序在功能块图中会非常紧凑。换言之,应充分发挥各编程语言优势,同时兼顾程序规模与可读性。
-
本状态机中每个网络使用独立定时器。如PDF所示,共配置四个独立定时器。对比结构化文本示例中通过附加逻辑实现单定时器的复杂方案。虽然单定时器实例可减少内存占用和执行时间,但会降低程序可读性和可维护性。
图 2 :电机启动器关闭状态的功能块图表示
技术提示 :功能块图使用反相气泡替代常闭触点。图2中可见两处反相操作。学习过数字逻辑的开发者对此应感到熟悉。
图 3 :电机启动器关闭状态的梯形图表示
功能块图程序中状态机程序流的考量
需注意PLC通常按从左到右、从上到下的顺序执行功能块图程序。因此该程序具有水流般的特性。该程序还会读取所有网络,无论其状态如何。如PDF所示,存在五个与各状态对应的此类网络。
梯形图和功能块图示例都在网络起始处使用了一个"门控"来判断是否应执行右侧逻辑。在这些示例中,门控通过相等性检查实现,用于判断当前状态是否等于"正在关闭"。
末行优先原则同样适用于功能块图
这没有问题,但我们必须考虑状态改变时的程序流。我们意识到经典的"末行优先"困境。当程序依次访问每个状态时。假设当前处于uiStClosing状态,而状态变为uiStClosed。鉴于关闭状态先于闭合状态,在单个程序扫描周期内两个状态都会判定为真。
熟悉C语言编程的人会知道,这是switch-case结构中省略case break语句引发的典型问题。我们可以添加无条件跳转或锁定变量来确保每次程序扫描只执行一个case。
本特色程序不存在末行优先(末网络)问题。它采用置位和复位线圈来处理布尔输出。还使用了定时器,使得继电器触点抖动等干扰在状态转换前趋于稳定。
PLC 编程中的实用状态机定义
让我们用几个独特定义强化这个主题:
-
状态锁定门 :用于检查状态条件的相等运算符。若条件为真则评估右侧逻辑,否则跳过该状态网络。
-
PLC 梯级穿透 :当两个状态条件在单次程序扫描中被评估时出现的状态机风险。我们会从一个状态跌落到另一个状态,就像C语言switch case中缺少break语句那样。问题在于后续梯级可能覆盖前一个梯级的变量或动作。这是描述末行优先论的另一种方式。如先前结构化文本文章所示,当我们尝试在状态转换时改变变量(单次触发式)时,情况会变得复杂。另一种方法是使用无条件跳转,但这可能导致代码混乱(面条式代码)。
-
状态转换稳定器 :一种防止立即状态改变的计时器。典型例子是用于消除触点弹跳的毛刺计时器。
技术提示 :当考虑触点弹跳的实际影响时,情况会变得复杂。当闭合状态预期传感器保持闭合时,这一点尤为明显。为解决此问题,我们设置了毛刺计时器,其PT值大于预期的触点弹跳时间。
功能块图程序故障排查
结束前,我想简要谈谈功能块图调试。在我看来,这与梯形图逻辑调试几乎完全相同。图4中可见绿色高亮部分。以下是几点观察:
-
取反气泡标识很细微,容易忽略。本例中,xEnable和xSensor输入(经取反后)均为TRUE。但AND(&)块判定为false,因为xReset未激活。
-
串联的置位和复位操作符(线圈)可能引起混淆。本例中,"导线"连接器为绿色,但方框为蓝色(关闭状态)。这意味着变量xCoilDrive和xValid为FALSE。
-
AND(&)功能块左下角有个黄色小星标。这表示该块可扩展。可用于扩展该块以容纳额外输入。这与PLC运行状态无关。
图 4 :绿色高亮显示S7-1200 PLC变量的实时状态。
功能块图是否优于梯形图和结构化文本?
人们对此话题常有强烈观点。或许最常被引用的说法是:技术人员更偏爱梯形图逻辑。这意味着我们应尽可能使用梯形图。
很公平。
然而本文表明,功能块图与梯形逻辑几乎完全相同——至少对于基于状态的电机控制器逻辑而言如此。从程序结构或故障排除的角度推荐某一种语言而贬低另一种,都是不诚实的。
同时我们必须认识到,并非所有程序都是封装在UDFB中的状态机。有时刻意选择某种语言而非另一种,反而能提升程序清晰度。
或许这正是IEC 61131-3包含五种语言的原因。
各取所长。
最终思考
至此,我们已评估了包含梯形图、结构化文本和功能块图的UDFB。三者功能相同,输入输出映射也一致。这让我们能进行公平比较。
接下来该往何处去?
您是否有特定应用场景会改变语言偏好?我愿聆听您的高见。
相关文章
若您喜欢本文,这些相关文章或许也能助益:
总结
- 封装在UDFB中的状态机为比较IEC 61131-3语言提供了绝佳案例。
- 梯形图与功能块图在展示状态机时具有相似布局。两者都便于故障排查。这一事实削弱了长期以来的梯形图编程建议。
- 采用瀑布式组织的功能块图可能显得比等效梯形图更臃肿。然而,这并非普遍规律,因为模拟或数字程序可能更为紧凑。
- 需警惕阶梯逻辑的贯穿现象,即连续状态在单次程序扫描中被执行。



