0

我有一个 AB PLC,我试图读取模拟值以查看值是否在 5 分钟内变化超过 1V?我需要阅读 10 组值。实现这一点的最简单方法是什么?我可以考虑创建数组以在每次读取它们时保存值,但我遇到的问题是,如何保持值的运行平均值并在每次读取它们时进行比较。

对此的任何帮助将不胜感激!

4

3 回答 3

0

如果我理解正确,您要做的就是查看您的模拟输入与您的设定值相比是否大于或小于 1V?只需检查您的值是否大于(设定值 + 1V)或小于(设定值 - 1V)每次 plc 扫描,然后将布尔值设置为 true。应该是这样的。

我认为找到模拟输入的平均值并不是解决这个问题的方法。但是,如果您确实想随着时间的推移找到模拟输入的平均值,您将需要 3 件事。采样时间、间隔时间和总间隔。您将设置一个采样时间,比如说 12 秒。您将每 12 秒获得一次模拟值。60 秒后,您将取总数并除以 (60/12 == 5)。然后,您将该值添加到您总计的先前值平均值,然后除以您累积的间隔总数(总间隔)。希望我没有把它弄复杂。

于 2015-12-09T18:51:27.497 回答
0

看看 FFL 和 FFU。它们是先进先出缓冲区。您指定所需缓冲区的长度,并在同一缓冲区上成对使用 FFL 和 FFU。运行平均值并不难计算,并且根据平台(SLC 与 CLX),有多种最佳实现方法。在这两种平台上都可以使用的最简单的方法是使用 counter.ACC 作为值来间接引用 FIFO 的元素编号以进行加法函数,然后除以 FIFO 中的元素数量。这一切都可以在单个多分支梯级中完成。

1 . 使用 FFL 以某个计时器间隔将您的值加载到 FIFO 缓冲区中。

2 . 如果您不需要 FIFO 值“弹出”以在其他地方使用,只需在 FIFO 已满时将 .POS 设置为 0 并让它继续使用新值更新,这些值不会被清除,因此它们仍然可以读取你的运行平均值。但是您必须使用 FFU 将 .POS 退回或使用 MOV 功能在 .POS 已满后更改它,否则它将停止取值。

3 . 创建一个 .PRE 等于 FIFO 的 .LEN 的计数器

4 . 在并行梯级上,计数器每次递增。ACC 使用 ADD 函数。这是假设 CLX 的示例。如果你使用 SLC,你可以做同样的事情,但显然你不能使用标签名称:

添加值 1:AllValues 值 2:FIFO[IndexCounter.ACC] 目标:AllValues

5 . 当您的 counter.DN 位被设置时,将 AllValues 除以 FIFO.LEN 并存储在 RunningAverage 标记中,然后重置计数器。为每次扫描设置一次计数器步骤,或将其全部放入定期函数中以执行例程。

于 2016-02-18T08:21:00.997 回答
0

我从你的问题中了解到的是你想检查输入电压是否改变了使用你得到的模拟值,在我的情况下我正在使用0 to 10v。只需简单地将模拟值存储在我的意思的最大输入处,10v然后做同样的事情0v,您就可以简单地计算 的值1v。您所要做的就是将值与+/- 1v从计算中获得的值进行比较。您可以使用 n 个模拟输入动态地执行此操作(n = PLC 支持的最大模拟输入。)

于 2016-01-28T06:15:33.030 回答