Приветствую всех! Подскажите как получить случайное число в codesys 3.5.
Вид для печати
Приветствую всех! Подскажите как получить случайное число в codesys 3.5.
Oscat
rdm,rdm2
Код:FUNCTION_BLOCK rnd
VAR_INPUT
initvalue: DWORD; (* Initialization value *)
END_VAR
VAR_OUTPUT
SRND: DWORD; (* procedure works like rnd, but it is *)
END_VAR (* improved [no util.lib, better input/ *)
VAR (* output definition ... *)
a1: BOOL;
a2: BOOL;
a5: BOOL;
a18: BOOL;
a0: BOOL;
Q: DWORD;
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;
SRND:=Q;
ИМХО, если получение случайного числа не связано с чтением текущего времени оно априори случайным не бывает.
Компьютеры они такие...... такие предсказуемые :)
вот алгоритм из книги Петрова:
FUNCTION_BLOCK random(*.........случайное число 1..250..................*)
VAR_INPUT
en:BOOL; (*.........разрешение рандома...............*)
in:USINT; (*.........начальное значение................*)
END_VAR
(*................................................ ..................*)
VAR_OUTPUT
out:USINT:=1;
END_VAR
(*................................................ ..................*)
VAR
rt:R_TRIG;
END_VAR
================================================== ==================================
rt(clk:=en); (*--------сам код------------------------*)
IF rt.Q THEN out:=in; END_IF
(*--------------------------------*)
out:=out*170-251*(out*170/251);
2 Levantine: вооот уже ближе..
только теперь надо автоматически задавать не 0 а случайное число из рандома =
хе, выбранное по тому же принципу =
TIME() никто не отменял.Цитата:
не 0 а случайное число из рандома
Немного подправил алгоритм 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);
TIME() как писали выше и взять миллисекунды, т.к. цикл плк прыгает и зависит от загруженности, будет это число рандомным.
Пример выше больше похож на шифрование.... Надо на вход подать число? Если я 2 раза подам одно и тоже число, будет результат одинаков?
Согласен с замечанием.
Привожу код генерации случайного числа от 0 до 1 с использованием функции Time.
FUNCTION random : REAL
random := DWORD_TO_REAL(TIME_TO_DWORD( TIME()) MOD 1000)/1000;