Приветствую всех! Подскажите как получить случайное число в 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;
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
ИМХО, если получение случайного числа не связано с чтением текущего времени оно априори случайным не бывает.
Компьютеры они такие...... такие предсказуемые
вот алгоритм из книги Петрова:
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;
Последний раз редактировалось Спорягин Кирилл; 04.08.2015 в 18:15.