运算符:TEST_AND_SET
多核运算符是 IEC 61131-3 标准的扩展。
运算符可用于实现信号量,例如保证对不同任务写入的变量的独占访问。
TEST_AND_SET 得到一个类型 DWORD 变量作为其输入。必须可以对该变量进行写访问。变量设置为 1 并且之前的值作为结果返回。
该操作是原子的,这意味着它不能被另一个任务中断。这也适用于多核平台。
例如程序中的调用是 dwOldValue := TEST_AND_SET(dw);, 其中变量 dwOldValue 和 dw 必须是数据类型 DWORD.
例 160. 例子
下面的例子展示了一个典型的用法。对类型的独占访问权 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