Немного подправил алгоритм Peterа.
Теперь на выходе Out случайное число от 0 до 1.
FUNCTION_BLOCK random
(* В выходе Out генерируется случайное число от 0 до 1 *)
VAR_INPUT
InitValue : UDINT;
END_VAR
VAR_OUTPUT
Out : REAL;
END_VAR
VAR CONSTANT
MaxUDINT : UDINT := 16#FFFFFFFF;
END_VAR
VAR
a1 : BOOL;
a2 : BOOL;
a5 : BOOL;
a18 : BOOL;
a0 : BOOL;
Q : UDINT;
END_VAR
IF Q=0 THEN
IF InitValue <> 0 THEN
Q:=InitValue;
ELSE
Q:=123456;
END_IF;
END_IF;
a1:=Q.2;
a2:=Q.3;
a5:=Q.6;
a18:=Q.18;
a0:=(((a1 XOR a2) XOR a5) XOR a18);
Q:=2*Q;
Q.0:=a0;
Out:=UDINT_TO_REAL(Q)/UDINT_TO_REAL(MaxUDINT);




