我有一个应用程序,它将电压和温度作为模拟输入,并使用涉及信号处理的算法进行一些处理,例如低通滤波、指数平滑和其他通常可以用高级编程语言完成的步骤,例如C 或 C++。
我很好奇如何使用 PLC,尤其是 Allen-Bradley Control-Logix 系统来执行这些相同的步骤?在我看来,带有梯形逻辑的指令集对此太有限了。我可以使用结构化文本执行此操作吗?
我有一个应用程序,它将电压和温度作为模拟输入,并使用涉及信号处理的算法进行一些处理,例如低通滤波、指数平滑和其他通常可以用高级编程语言完成的步骤,例如C 或 C++。
我很好奇如何使用 PLC,尤其是 Allen-Bradley Control-Logix 系统来执行这些相同的步骤?在我看来,带有梯形逻辑的指令集对此太有限了。我可以使用结构化文本执行此操作吗?
梯形逻辑可以很好地完成计算,尽管它不是世界上最好的编程语言。它具有完整的条件、算术、数组等。
您真正的问题是使您的计算适合大多数梯形逻辑引擎(和 Control Logix)运行的循环执行模型:在控件中从上到下重复执行程序,每个梯级或计算每次扫描仅执行一次。
如果您需要在生成结果之前重复循环一组值,您可能难以解决梯形图引擎每次扫描“只执行一次”所有内容的愿望,并且您需要执行循环以生成结果。事实上,我相信有 FOR 循环运算符可以像传统循环一样重复一段梯形代码;您需要确保在循环/算法中花费的时间不会对扫描速率产生重大影响。
对您来说,让扫描率作为您的循环之一可能会奏效;通常,您通过将新值接受到数组中然后在该数组上计算结果来计算过滤器。由于无论如何您基本上不能接受比每个扫描周期更快的值,因此您可以在每个扫描周期计算最多一个过滤器结果而不会丢失任何精度。如果您的数组大小适中(例如,10 个值),您实际上可以简单地将数组上的多项式编码为一个方程以产生您的过滤器结果,然后将该多项式(klunkily 但直接)编码为梯形逻辑。
Control Logix PLC 不必执行循环扫描。我现在没有 RSLogix 5000,但是在定义项目时,您需要创建一个循环扫描执行的程序。但是您可以创建其他没有的程序。您还可以通过触发器(对常规输入扫描无用)或固定计时器(对输入扫描非常有用)运行它们。请记住,将输入扫描计时器设置得比仪器更新更快是没有意义的——现代 PLC 经常执行扫描的速度比仪表更新数据的速度要快得多。
我为此使用的一项好技术是创建一个名为 one-second 或类似名称的程序。该程序将扫描您的所有输入,并执行所有信号处理,然后写入缓冲内存位置。程序的其余部分查看那些缓冲的内存位置,从不直接监视输入。您可以将输入缓冲程序设置为尽可能快地执行您的过程,直到 PLC 在出现故障之前可以处理的任何内容。
将信号处理函数本身编写为附加指令也是一个好主意,然后使用您需要的任何参数调用它们。
因此,您可以拥有一个具有如下调用接口的 AOI:
input-1_buffered := input_smooth (low_pass, input-1);
这将调用您的 input_smooth 函数,使用 input-1 作为值,使用 input-1_buffered 作为最终位置。low_pass 将在 input_smooth 函数中用于跳转到适当的逻辑。
然后,您可以在结构化文本中编写实际的平滑逻辑,而无需任何人理解,因为它只会存在于那个 AOI 中。