RAPID 信号的互锁和同步 WaitTestAndSet 和 TestAndSet

RAPID 信号的互锁和同步


      WaitTestAndSet  指令等待指定的持久型 BOOL 变量变成 FALSE.当变量值变为 FALSE, 该指令将设置变量为 TRUE  并继续执行. 该持久型变量可被作为同步或者互斥时的一个 BOOL 信号量。
      这个指令与 TestAndSet 有着同样的基本功能。但是 WaitTestAndSet 一直等到 BOOL 变量变成 FALSE ,而 TestAndSet指令立即终止。
      不推荐在中断程序中使用 WaitTestAndSet 指令。UNDO handler, 或者 event routines.

      举例:在资源需要同时访问的时候:
      Use of some RAPID routines with function problems when executed inparallel.
      Use of the FlexPendant - Operator Log.


Example 1

       为了避免在操作日志上输出混合的日志(一个是主程序的,一个是背景程序的)使用 WaitTestAndSet 功能保证每个任务输出的三行都是在一起的,不被其他任务的输出打乱。如果 MAIN 程序通过 WaitTestAndSet  首先设置了标志位  (tproutine_inuse),那么背景程序  BACK1 必须等待  MAIN 程序离开标志位之后,背景程序才能输出日志。

MAIN program task:
          PERS bool tproutine_inuse := FALSE;
          ...
         WaitTestAndSet tproutine_inuse;
         TPWrite "First line from MAIN";
         TPWrite "Second line from MAIN";
         TPWrite "Third line from MAIN";
         tproutine_inuse := FALSE;

BACK1 program task:
        PERS bool tproutine_inuse := FALSE;
         ...
        WaitTestAndSet tproutine_inuse;
        TPWrite "First line from BACK1";
        TPWrite "Second line from BACK1";
        TPWrite "Third line from BACK1";
        tproutine_inuse := FALSE;




你可能感兴趣的:(RAPID 信号的互锁和同步 WaitTestAndSet 和 TestAndSet)