结构化文本中程序间通信一般采用哪种方法

Which method is generally used to communicate between programs in Structured Text

我正在维护一个用 ST 编写的 PLC 项目。要实现一个新功能,我需要让循环程序 A 知道循环程序 B 中何时发生了事件。

这在 ST 中通常是如何完成的?我是简单地使用全局变量还是有不同的方法?如果我使用全局变量,那么如何保护它们免受并发修改?

我使用贝加莱自动化的 X20 PLC。

是的,您需要声明一个对两个循环程序具有共享作用域的变量。

您可以使用现有的 global.var 文件来执行此操作,或者您可以创建一个新的可变文件,并通过将其放置在 "package"(文件夹在你的项目中)。

要创建一个新的 var 声明文件...

-在逻辑视图中右击

-添加对象

-select "file" 类别,并选择新建文件

-name,下拉

改成"save as *.var"

默认情况下,新变量声明的可见性仅限于它所在的包。要验证这一点,请右键单击该文件并转到属性。 Select 详细信息选项卡。

无法防止并发修改,但您可以使用交叉引用工具查看项目中写入和读取 selected 变量的位置。先建立交叉引用,再使用底部的tab

祝你好运!

异步通信很棘手。

所以想象一个全局 A_DONE 初始化为 false,B 偶尔检查它。一个 运行s,并设置 A_DONE。 B 可以对这个事件做出反应……但是如果它需要处理另一个事件,它会做什么呢?

如果您认为告诉 A 发出信号 A_DONE 的事件仅在 B 看到 A_DONE 很久之后才发生,B 可以简单地将 A_DONE 重置为 false(假设这总是发生在下一个 A_DONE 事件)和循环可以重复。

如果 A_DONE 可以发生 "again" 而 B 正在处理查看 A_DONE 的结果,B 不能只是重置 A_DONE:你可能会得到一个时间碎片,其中B 读取 A_DONE,A 再次设置 A_DONE,然后 B 清除 A_DONE;现在你失去了一个事件。如果那个事件正在控制你的反应堆应急棒,这可能会非常糟糕,因为噗,B 错过了它。

在这种情况下,您可能需要从 A 到 B 来回握手。我们添加一个从 B 返回给 A 的信号,称之为 A_DONE_SEEN,让 B 告诉 A 它已经处理了该事件。然后A设置A_DONE,等待A_DONE_SEEN; A 清除 A_DONE,等待 A_DONE_SEEN 变为假,然后继续其业务。如果在 A_DONE 已经设置时需要设置 A_DONE,或者设置了 A_DONE_SEEN,我们知道我们错过了一个事件,并且一些灾难恢复过程可以是 运行。 B 监视 A_DONE,处理 A_DONE 操作,设置 A_DONE_SEEN,监视 A_DONE 变为假,并设置 A_DONE_SEEN_FALSE。

我不知道你的特定 PLC,但在许多系统中有增加计数的原子操作等。你可以使用它而不是握手。