通常使用哪种方法在结构化文本中的程序之间进行通信

时间:2015-01-27 15:57:56

标签: plc st

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

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

我使用B& R Automation的X20 PLC。

2 个答案:

答案 0 :(得分:1)

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

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

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

- 在逻辑视图中单击

-add object

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

-name,并在下拉列表中更改为“另存为* .var”

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

无法防止并发修改,但您可以使用交叉引用工具查看在项目中编写和读取所选变量的位置。首先构建交叉引用,然后使用底部的选项卡。

祝你好运!

答案 1 :(得分:1)

异步通信很棘手。

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

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

如果A再次发生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变为false,并继续其业务。如果在设置A_DONE或设置A_DONE_SEEN时需要设置A_DONE,我们知道我们错过了一个事件并且可以运行一些灾难恢复过程。 B监视A_DONE,处理A_DONE动作,设置A_DONE_SEEN,监视A_DONE变为false,并设置A_DONE_SEEN_FALSE。

我不了解您的特定PLC,但在许多系统中存在递增计数的原子操作等。您可以使用此而不是握手。