Skip to main content

演算子:TEST_AND_SET

マルチコア演算子は、IEC61131-3規格の拡張です。

演算子は、セマフォを実装するために使用できます。たとえば、さまざまなタスクによって書き込まれた変数への排他的アクセスを保証するために使用できます。

TEST_AND_SET タイプを取得します DWORD 入力として変数。この変数への書き込みアクセスが可能である必要があります。変数はに設定されます 1 結果として前の値が返されます。

操作はアトミックです。つまり、別のタスクによって中断されることはありません。これはマルチコアプラットフォームにも当てはまります。

たとえば、プログラムの呼び出しは dwOldValue := TEST_AND_SET(dw);、変数 dwOldValuedw データ型である必要があります DWORD

159.

次の例は、一般的な使用法を示しています。タイプへの排他的アクセス STRING 変数。 pstrOutput ポインタ、実装する必要があります。文字列へのアクセスはアトミックではありません。複数のタスクが同時に同じ文字列に書き込む場合、内容に一貫性がない可能性があります。とともに TEST_AND_SET 関数、同じを書くことが可能になりました STRING さまざまなタスクで変数。

FUNCTION ExclusiveStringWrite : BOOL
VAR_INPUT
        strToWrite : STRING;
        pstrOutput : POINTER TO STRING;
END_VAR
VAR_STAT
        dwSynch : DWORD;
END_VAR
VAR
        dwOldValue: DWORD;
END_VAR

dwOldValue := TEST_AND_SET(dwSynch);  // Write the 1 and read the old value at the same time
IF dwOldValue = 0 THEN                          // 0 means: no other task is currently writing
   pstrOutput^ := strToWrite;         // Now you can write safely on the string
   dwSynch := 0;                        // The DWORD must be reset
   ExclusiveStringWrite := TRUE;          // Writing was successful
ELSE
   ExclusiveStringWrite := FALSE;        // Writing was not successful
END_IF