Приветствую всех! Подскажите как получить случайное число в 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;
Сыграть бы на автомате с таким рандомом ))Цитата:
random := DWORD_TO_REAL(TIME_TO_DWORD( TIME()) MOD 1000)/1000;
С вероятностью 90-95% Xn > Xn-1
Мечта дровосека..
Замечания справедливые.
Тогда можно объединить идею с таймером и алгоритм Peterа.
Проблема уже была решена: http://www.owen.ru/forum/showthread....E5%F2%F0%EE%E2
Пишу дипломную работу в среде CODESYS v.3.5. SP5.
Надо выдавать рандомное значение на определенном интервале.
PROGRAM PLC_PRG
VAR
temp_real: real; //температура помещения с датчика
temp_max: REAL:=23; // верхний предел температуры
temp_min: REAL:=16; //нижний предел температуры
temp_error: BOOL:=0;
vlag_real: REAL; //влажность помещения
vlag_max: REAL:=70; //максимальная допустимая влажность
vlag_min: REAL:=30; //минимальная допустимая влажность
vlag_error: BOOL:=0;
END_VAR
Так вот temp_real надо выдавать в пределах от 16 до 23.Не пойму, как это сделать.
Надо отметить, что я провожу только лишь эмуляцию и с реальным контроллером дело иметь не буду.
Спасибо за ответ. Но я не пойму, как это реализовать именно в CODESYS v.3.5 на ST. Если говорить о моей компетентности в программировании, то она нулевая, т.к. уже второй день сижу ковыряюсь с ,казалось бы, легкой темой. Подключил библиотеку BASIC(OSCAT), там есть функция рдм,рдм2,как ее применить можно?
вроде как здесь должен быть окончательный вариант для ST, правда для КДС2.3
Спасибо уж точно не мне, я только выбил исходники