该多核运算符是IEC 61131-3标准的扩展。
该运算符可用于实现信号量,例如,以保证对不同任务写入的变量的独占访问。
TEST_AND_SET获取DWORD类型变量作为其输入。必须可以对该变量进行写访问。变量设置为1,并返回前一个值作为结果。
该操作是atomic性的,这意味着它不能被其他任务中断。这也适用于多核平台。
例如,程序中的调用是dwOldValue := TEST_AND_SET(dw);,其中变量dwOldValue和dw必须为数据类型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; // 没有写入成功