3

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

ST一般是怎么做的?我只是使用全局变量还是有不同的方法?如果我使用全局变量,那么如何保护它们免受并发修改?

我使用 B&R Automation 的 X20 PLC。

4

2 回答 2

2

异步通信很棘手。

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

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

如果 A_DONE 可以在 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_SEEN 已设置时需要设置 A_DONE,则我们知道我们错过了一个事件并且可以运行一些灾难恢复过程。B 监视 A_DONE,处理 A_DONE 动作,设置 A_DONE_SEEN,监视 A_DONE 变为假,并设置 A_DONE_SEEN_FALSE。

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

于 2015-01-28T03:51:48.720 回答
1

是的,您需要为两个循环程序声明一个具有共享范围的变量。

您可以使用现有的 global.var 文件来执行此操作,也可以创建一个新的变量文件,并通过将其放置在“包”(项目中的文件夹)中来限制程序可以读取或写入的内容。

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

- 在逻辑视图中右键单击

- 添加对象

-选择“文件”类别,然后选择新文件

-name,然后在下拉菜单中更改为“另存为 *.var”

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

没有办法防止并发修改,但您可以使用交叉引用工具查看选定变量在项目中的写入和读取位置。首先建立一个交叉引用,然后使用底部的选项卡。

祝你好运!

于 2015-01-27T22:10:33.730 回答