演算子:__COMPARE_AND_SWAP
マルチコア演算子は、IEC61131-3規格の拡張です。
演算子は、セマフォを実装するために使用できます。たとえば、さまざまなタスクによって書き込まれた変数への排他的アクセスを保証するために使用できます。
__COMPARE_AND_SWAP
データ型へのポインタを取得します __XWORD
変数、古い値、および入力としての新しい値(例: bMutex := __COMPARE_AND_SWAP(ADR(dwSynch), dwOld, dwNew);
)。古い値と新しい値はデータ型にすることもできます __XWORD
変数。参照 __XWORD
変数は古い値と比較され、両方が等しい場合は、新しい値が書き込まれます。関数の結果は次のとおりです。 TRUE
新しい値を書き込めたとき。
ヒント
コンパイラはデータ型を自動的に置き換えます __XWORD
と DWORD
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