Есть два варианта.Любитель, который pboedker предложил: тип данных UNION.
Пример:
TYPE U_TestUnion :
UNION
Value_DWORD : DWORD;
Value_REAL : REAL;
END_UNION
END_TYPE
VAR
TestUnion : U_TestUnion;
END_VAR
TestUnion.Value_REAL := 0.819;
//TestUnion.Value_DWORD is now 1062316540 (=16#3F51A9FC)
TestUnion.Value_DWORD := 10;
//TestUnion.Value_REAL is now 1.401298E-44
TestUnion.Value_DWORD := 1062316540;
//TestUnion.Value_REAL is now 0.819
Другой - использовать функцию MEMCPY, которая копирует значения из памяти вДругое место.Функция может называться немного по-разному в разных системах.Делая это, вы можете скопировать содержимое из местоположения вашего реального значения на адрес DWORD и обратно.
В направлении REAL-> DWORD не должно быть никаких забот.Но при копировании из DWORD в REAL могут возникнуть некоторые проблемы, если есть вероятность, что данные были изменены где-либо.Возможно, это значение будет NaN или Infinity , что может привести к сбою ПЛК.Это означает, что REAL не правильно отформатирован десятичное число.
VAR
Value_DWORD : DWORD;
Value_REAL : REAL;
END_VAR
Value_REAL := 0.819;
MEMCPY(destAddr:=ADR(Value_DWORD), srcAddr:=ADR(Value_REAL), n:=SIZEOF(Value_REAL));
//Value_DWORD is now 1062316540 (=16#3F51A9FC)
Value_DWORD := 10;
MEMCPY(destAddr:=ADR(Value_REAL), srcAddr:=ADR(Value_DWORD), n:=SIZEOF(Value_DWORD));
//Value_REAL is now 1.401298E-44
Value_DWORD := 1062316540;
MEMCPY(destAddr:=ADR(Value_REAL), srcAddr:=ADR(Value_DWORD), n:=SIZEOF(Value_DWORD));
//Value_REAL is now 0.819