RAPID 訊號的互鎖和同步 WaitTestAndSet 和 TestAndSet
阿新 • • 發佈:2019-02-01
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;