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