.

运算符‘TEST_AND_SET’

.
.

该多核运算符是IEC 61131-3标准的扩展。

该运算符可用于实现信号量,例如,以保证对不同任务写入的变量的独占访问。

TEST_AND_SET获取DWORD类型变量作为其输入。必须可以对该变量进行写访问。变量设置为1,并返回前一个值作为结果。

该操作是atomic性的,这意味着它不能被其他任务中断。这也适用于多核平台。

例如,程序中的调用是dwOldValue := TEST_AND_SET(dw);,其中变量dwOldValuedw必须为数据类型DWORD

.

.例如

以下示例显示了典型用法。应该实现对类型为STRING的变量的独占访问,该变量通过pstrOutput指针寻址。对字符串的访问不是atomic性的。如果多个任务同时写入同一字符串,则内容可能不一致。使用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);  // 写1并同时读取旧值
IF dwOldValue = 0 THEN                // 0表示当前没有其他任务在写 
   pstrOutput^ := strToWrite;         // 现在你可以安全地在字符串上写
   dwSynch := 0;                      // 这个DWORD必须被复位
   ExclusiveStringWrite := TRUE;      // 写入成功
ELSE
   ExclusiveStringWrite := FALSE;     // 没有写入成功