(*
RNG calculates random numbers from 0 to 1.
RNG requires two in_out variables to maintain state.
*)
FUNCTION RNG : REAL
VAR_IN_OUT
m_z : DWORD;
m_w : DWORD;
END_VAR
VAR
u: DINT;
END_VAR
m_z:=DINT_TO_DWORD(36969*DWORD_TO_DINT(m_z AND 16#FFFF)+DWORD_TO_DINT(SHR(m_z,16)));
m_w:=DINT_TO_DWORD(18000*DWORD_TO_DINT(m_w AND 16#FFFF)+DWORD_TO_DINT(SHR(m_w,16)));
u := DWORD_TO_DINT( SHL(m_z,16))+DWORD_TO_DINT(m_w);
RNG :=DINT_TO_REAL(u+1)*2.328306435454494E-10+0.5;
END_FUNCTION
// http://www.codeproject.com/KB/recipes/SimpleRNG.aspx