演算子:TEST_AND_SET
マルチコア演算子は、IEC61131-3規格の拡張です。
演算子は、セマフォを実装するために使用できます。たとえば、さまざまなタスクによって書き込まれた変数への排他的アクセスを保証するために使用できます。
TEST_AND_SET
タイプを取得します DWORD
入力として変数。この変数への書き込みアクセスが可能である必要があります。変数はに設定されます 1
結果として前の値が返されます。
操作はアトミックです。つまり、別のタスクによって中断されることはありません。これはマルチコアプラットフォームにも当てはまります。
たとえば、プログラムの呼び出しは dwOldValue := TEST_AND_SET(dw);
、変数 dwOldValue
と dw
データ型である必要があります 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