多核操作器是 IEC 61131-3 标准的延伸。
该运算符可用于执行信号,例如,保证对不同任务写入的变量的独占访问。
__COMPARE_AND_SWAP
获取指向数据类型__XWORD
变量的指针、一个旧值和一个新值作为其输入(例如:bMutex := __COMPARE_AND_SWAP(ADR(dwSynch), dwOld, dwNew);
)。新旧值也可以是数据类型__XWORD
变量。__XWORD
变量与旧值进行比较,如果两者相等,则写入新值。当可以写入新值时,函数的结果是TRUE
。
在 32 位系统上,编译器会自动将数据类型__XWORD
替换为DWORD
;在 64 位系统上,则会自动将数据类型LWORD
替换为 。
该操作是原子操作,因此不会被其他任务中断,即使在多核平台上也是如此。
示例
下面的示例展示了一种典型的用法。应实现对STRING
类型变量的独占访问,该变量通过pstrOutput
指针寻址。
对字符串的访问不是原子式的。如果多个任务同时写入同一个字符串,那么内容可能会不一致。
有了这个函数,就可以在不同的任务中写入相同的 STRING 变量。
FUNCTION ExclusiveStringWrite : BOOL VAR_INPUT strToWrite : STRING; pstrOutput : POINTER TO STRING; END_VAR VAR_STAT dwSynch : __XWORD; END_VAR VAR bMutex: BOOL; END_VAR bMutex:= __COMPARE_AND_SWAP(ADR(dwSynch), 0, 1); (* compare with 0 and write 1 as atomic operation *) IF bMutex THEN // bMutex is TRUE if write could be done pstrOutput^ := strToWrite; // Now you can write safely on the string dwSynch := 0; // The __XWORD variable must be reset. ExclusiveStringWrite := TRUE; // Writing was successful ELSE ExclusiveStringWrite := FALSE; // Writing was not successful END_IF