西门子GRAPH编程:摩尔机模式

文章摘要

探索适用于S7-1500可编程逻辑控制器的西门子GRAPH编程。本文重点介绍具有摩尔式输出和缓冲错误文本报告的编程结构。

Link_00 本文是 DigiKey 西门子 PLC 与自动化资源中心的一部分。访问该中心获取更多关于西门子组件、应用及编程的技术简报。

延伸阅读

本工程简报演示了西门子S7-1500 PLC的GRAPH语言。这是之前文章的延续,所有文章都描述了一个用于控制和监控电机启动器的用户自定义功能块(UDFB)。这个常见应用为您提供了一种清晰的方式来比较PLC编程语言。

电机启动器 GRAPH UDFB 简介

GRAPH是西门子对IEC 61131-3顺序功能图(GRAFCET)编程语言的实现。它使用一系列状态和转换门,如图1所示。每个状态由一个块表示,例如活动状态(绿色高亮显示的)stClosed。转换门显示为水平条。例如,激活T5将使机器返回到stOpening(S2),而激活T9将使机器进入stFault(S99)。

1 :显示所有状态和转换的电机启动器顺序器图形代码。

技术提示 :SFC可被描述为基于令牌的系统。单个令牌在初始步骤中诞生。这个特殊状态由S1周围的双轮廓表示。该令牌通过一个门从一个状态传递到另一个状态。例如,在图1中,令牌位于S5。它可以分别通过门T5或T9传递到S2或S99。

状态描述

这些状态在之前的文章中已经介绍过。为方便起见,此处进行说明:

  1. stOpen :电机启动器处于非活动状态,接触器线圈未通电。若电机启动器意外闭合超过timDebounce时长,UDFB将进入故障状态。这用于检测技术人员强制操作电机启动器衔铁的不安全行为。此操作极其危险,它将使机器的所有安全功能失效(切勿尝试)。

  2. stClosing :电机启动器的接触器正从断开状态过渡到物理闭合状态。若触点未在timTransition时限内完成闭合,UDFB将进入故障状态。

  3. stClosed :电机启动器正在运行。若传感器信号丢失时间超过timDebounce,UDFB将进入故障状态。该故障可能由连接电机启动器的驱动线松动或反馈线路引起。也可能是过载事件导致,此时热过载保护模块会触发启动器脱扣。

  4. stOpening :电机启动器的接触器正从闭合状态过渡到断开状态。若触点未在timTransition时限内完成断开,则触发故障——这表明主继电器或中间继电器触点已熔焊粘连。

  5. stFault :电机启动器处于故障状态。当使能信号禁用且复位按钮按下时,该状态将解除。

摩尔机模式

为简化编写流程,采用摩尔机模式可将输出逻辑与顺序控制器分离。此处"摩尔"指输出完全取决于机器状态。

注意每个功能块包含如图2所示的若干部分。包括前指令、序列和后指令。可将其视为三个顺序执行的指令集,每个扫描周期按序执行。

2 :GRAPH功能块导航。

延续之前的电机启动器示例,共有四个布尔输出。可在序列段或后指令段自由驱动这些输出。在条件相同的情况下,结果一致。但即使在这个简单程序中,从顺序控制器内驱动输出会导致需在六个不同位置维护变量(每个状态一个赋值),这会产生问题。出错概率很高。

替代方案是采用摩尔模式(图3),根据机器状态定义输出。本例中可见xValid和xCoilDrive被设置。

3 :摩尔机输出在后指令段设置。

技术提示 :根据经验,如果发现需要从多个位置驱动同一个标签,请思考是否存在更优方案。本示例中,xValid等内存地址仅由单一位置驱动。这能显著降低遗漏或错误设置输出的可能性。

故障字符串处理

如之前章节所示,进入故障状态时我们将生成错误信息。例如,若接触器未能打开,我们进入故障状态并在strFault上发送"开启失败,触点粘连?"。

从定义上说,我们描述的是状态转换时发生的事件序列。这种类米利操作与我们基于摩尔模型的输出存在冲突。

可行但笨拙的解决方案

我的第一步是在通往stFault(S99)的路径上添加额外状态。在每个状态中,我将故障条件写入strFault。该方法有效,但导致顺序器增加了四个状态和四个转换,显得杂乱。

使用缓冲区的简化方案

更高效的解决方案是添加临时缓冲区:

  • 如图4所示,进入stClosed等状态时,故障条件文本会写入strFaultBuff。

  • 通常这个缓冲区不会被使用。

  • 但若进入故障状态,缓冲区内容会如图5所示传输至strFault输出。

注意这种预故障赋值通过消除四个状态和四个转换,使代码更简洁。如图1所示的结果流程简洁且易于理解。

4 :故障字符串被预先移入缓冲区

5 :图形化代码显示strFaultBuff传输至strFault

技术提示 :信任但需验证。我们需要strFault在xFault上升沿时即刻可用。通过正边沿触发启动的简单S_MOVE函数已验证此功能。xFault和strFault似乎可在同一扫描周期内同时生效。

后记

我们在数字逻辑课上学过的摩尔与米利型有限状态机模型至今仍具现实意义它们提供了宝贵框架,能让我们快速描述赋值发生的时机

也让我们得以洞察示例代码中的矛盾点通过声明基于摩尔模型的输出,我们牺牲了西门子顺序器的部分灵活性但同时我认为,我们通过博采众长获得了更清晰的程序结构顺序器的绿色调试标记易于追踪,指令后梯形图赋值也同样直观

这样的取舍是否合理?您会如何实现这个有限状态机?

相关文章

若您喜欢本文,这些相关文章或许也能助益: