RSLogix 5000 数组 FIFO 逻辑编程示例 滚动平均值
介绍
要求实现一个简单的逻辑结构,例如电机启动器、堆栈灯系统或基本的 FIFO 梯级组。通过练习实现这种结构,您将积累有关 PLC 和您选择的软件包的知识,并且您将成为一名更加熟练的程序员。
今天,我们正在研究一个涉及 FIFO 实现的示例,并产生一种基于短期存储数据的方式,以便计算此类数据的滚动平均值。换句话说,该逻辑可用于报告过去一小时内生产的产品数量的滚动平均值。乍一看,这样的系统似乎已经存在,但根据我们的经验,大多数系统都会报告每小时的生产数量。这里的细微差别是,当您在早上 7:43 走到生产线时,您应该能够看到从早上 6:43 到早上 7:43 生产了多少箱。传统系统会为您提供从上午 6 点到上午 7 点的案件数量,有时还会提供从上午 7 点开始的滚动数字。
RSLogix 5000 PLC 编程中的 FIFO 逻辑
由于我们的逻辑需要时间戳,因此我们需要利用 PLC 系统的内部时钟。这是通过我们例程中的第一级实现的,如下所示。
在“Rung 0”中,我们使用了之前见过的两个基本指令(SUB 指令、MOD 指令)。SUB 指令应用于 FIFO,允许我们扫描前 11 个值。这将在未来的梯级中变得重要。MOD 指令对于将一分钟分解为 6 个 10 秒的块至关重要。这是通过将秒时钟除以 10 并取余数来实现的。换句话说,我们截断秒计时器以始终为我们提供最低有效数字。这使我们能够为每 10 秒的块设置一个计数器。
在“Rung 1”中,我们有一个CTU 指令,它将计算某个传感器标记的盒子的数量。该计数器将随着盒子的经过而增加,并将由每个周期下面的逻辑重置。请注意,该应用程序可以重新用于许多不同的应用程序,并且计数器可以转换为计时器。
FIFO 依赖于两个关键指令:FFL 和FFU。FFL 会将一个元素传输到数组中,同时按指定的步长移动其他所有元素。FFU会将数组末尾的一个元素移除到指定的标签中。上面的梯级有很多说明;让我们详细研究一下它们。EQU 指令用于在时间等于 0 时执行逻辑。换句话说,我们希望每 10 秒记录一次情况数,因为“SecTime”寄存器会从 0 到 9 循环并重复。
ONS 指令将执行指令的单个周期。这意味着当时间为零时我们只会移动数组一次。FFL 会将计数器计算出的元素加载到数组中。在本例中,我们将加载到第 12 个元素,因为指定的长度为 13。我们还需要指定 FFL 和 FFU 指令之间通用的控制结构。
FFL 之后有一些有趣的指令:RES、CLR、FOR 和 DIV。RES 将重置我们的计数器。FOR 指令用于计算滚动总和。最后,DIV 指令将我们计算的总和除以时隙数得出平均值,从而得出滚动平均值。
最后一个梯级包含 FIFO 卸载或 FFU 指令。正如上面简要提到的,该指令将从指定数组中删除单个元素并将其传输到指定寄存器中。FFU 是实现 FIFO 实现“滚动”效果所必需的。
了解 FIFO 的逻辑
上面的逻辑包含很少的指令,但对于新程序员来说可能并不明显。目标是使用传感器计算盒子的数量,每十秒将该值传输到一个数组中,并计算最后 10 个值的总和。通过使用 FIFO,系统会自动将新的计数器写入数组并删除最旧的值,从而达到所需的结果。
尽管我们使用 FIFO 实现来解决特定问题,但它的用途极其广泛,可以解决许多挑战。这是具有索引运动的系统的常见应用。换句话说,您一次生产一种产品,系统需要跟踪所述生产的位置。没有经验的程序员可能会在这种情况下使用计时器,但随着系统启动、停止、更改等,计时器通常会失败。
结论
通过一个通过 FFL 和 FFU 指令利用 FIFO 实现的示例,是成为一名更好的程序员的绝佳步骤。这段简短的逻辑中概述的概念很简单,但经常被许多程序员误解。当您实现自己的 FIFO 时,请确保尝试不同的范围、值和存储数据的方式。