Skip to main content

演算子:__COMPARE_AND_SWAP

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

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

__COMPARE_AND_SWAP データ型へのポインタを取得します __XWORD 変数、古い値、および入力としての新しい値(例: bMutex := __COMPARE_AND_SWAP(ADR(dwSynch), dwOld, dwNew);)。古い値と新しい値はデータ型にすることもできます __XWORD 変数。参照 __XWORD 変数は古い値と比較され、両方が等しい場合は、新しい値が書き込まれます。関数の結果は次のとおりです。 TRUE 新しい値を書き込めたとき。

ヒント

コンパイラはデータ型を自動的に置き換えます __XWORDDWORD 32ビットシステムおよび LWORD 64ビットシステム。

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

155.

次の例は、一般的な使用法を示しています。タイプへの排他的アクセス STRING 変数。 pstrOutput ポインタ、実装する必要があります。

文字列へのアクセスはアトミックではありません。複数のタスクが同時に同じ文字列に書き込む場合、内容に一貫性がない可能性があります。

この関数を使用すると、異なるタスクで同じSTRING変数を書き込むことができるようになりました。

FUNCTION ExclusiveStringWrite : BOOL
VAR_INPUT
        strToWrite : STRING;
        pstrOutput : POINTER TO STRING;
END_VAR
VAR_STAT
  dwSynch : __XWORD;
END_VAR
VAR
        bMutex: BOOL;
END_VAR

bMutex:= __COMPARE_AND_SWAP(ADR(dwSynch), 0, 1);
(* compare with 0 and write 1 as atomic operation *)
IF bMutex THEN                                       // bMutex is TRUE if write could be done
    pstrOutput^ := strToWrite;         // Now you can write safely on the string
    dwSynch := 0;                      // The __XWORD variable must be reset.
    ExclusiveStringWrite := TRUE;                // Writing was successful
ELSE
    ExclusiveStringWrite := FALSE;       // Writing was not successful
END_IF