<?xml version="1.0" encoding="UTF-8"?>

<UserFunctionMgr>
   <UserFunction
       Expression="(*&#13;&#10;&#9;RAND calculates random numbers from 0 to 1.&#13;&#10;&#9;RAND requires two in_out variables to maintain state.&#13;&#10;*)&#13;&#10;FUNCTION RAND : REAL&#10;&#9;VAR_IN_OUT&#10;&#9;&#9;m_z : DWORD;&#10;&#9;&#9;m_w : DWORD;&#10;&#9;END_VAR&#13;&#10;&#9;VAR&#13;&#10;&#9;&#9;u: DINT;&#13;&#10;&#9;&#9;seed: REAL;&#13;&#10;&#9; END_VAR&#13;&#10;&#9;&#13;&#10;&#9;IF (m_z OR m_w) = 0 THEN&#13;&#10;&#13;&#10;&#9;&#9;IF %MD7.0 = 1 THEN&#9;//controller is an RMC75&#13;&#10;&#9;&#9;&#9;seed := REG_REAL(20,2);&#13;&#10;&#9;&#9;ELSEIF %MD7.0 = 2 THEN&#9;//controller is an RMC150&#13;&#10;&#9;&#9;&#9;seed := REG_REAL(44,2);&#13;&#10;&#9;&#9;ELSEIF %MD7.0 = 4 THEN &#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;//controller is an RMC200&#13;&#10; &#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;seed := REG_REAL(18,2);&#13;&#10;&#9;&#9;END_IF&#13;&#10;&#13;&#10;&#9;&#9;m_z:=DINT_TO_DWORD(REAL_TO_DINT(seed*1000000000.0)); &#13;&#10;&#9;&#9;m_w:=DINT_TO_DWORD(_SysTicks);&#13;&#10;&#13;&#10;&#9;END_IF&#13;&#10;&#13;&#10;&#9;m_z:=DINT_TO_DWORD(36969*DWORD_TO_DINT(m_z AND 16#FFFF)+DWORD_TO_DINT(SHR(m_z,16)));&#13;&#10;&#9;m_w:=DINT_TO_DWORD(18000*DWORD_TO_DINT(m_w AND 16#FFFF)+DWORD_TO_DINT(SHR(m_w,16)));&#13;&#10;&#9;u := &#32;DWORD_TO_DINT( SHL(m_z,16))+DWORD_TO_DINT(m_w);&#13;&#10;&#13;&#10;&#9;RAND :=DINT_TO_REAL(u+1)*2.328306435454494E-10+0.5;&#13;&#10;&#13;&#10;END_FUNCTION"/>
</UserFunctionMgr>
