Skip to main content

运算符:TEST_AND_SET

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

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

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

该操作是原子的,这意味着它不能被另一个任务中断。这也适用于多核平台。

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

159. 例子

下面的例子展示了一个典型的用法。对类型的独占访问权 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