PDA

Просмотр полной версии : Случайное число в Codesys



radar
30.03.2015, 10:53
Приветствую всех! Подскажите как получить случайное число в codesys 3.5.

приборист
30.03.2015, 11:12
Oscat
rdm,rdm2

petera
30.03.2015, 11:14
Приветствую всех! Подскажите как получить случайное число в codesys 3.5.

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;

melky
30.03.2015, 13:09
ИМХО, если получение случайного числа не связано с чтением текущего времени оно априори случайным не бывает.
Компьютеры они такие...... такие предсказуемые :)

вапросик
30.03.2015, 13:10
вот алгоритм из книги Петрова:

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);

kallion
08.04.2015, 10:05
2 Levantine: вооот уже ближе..
только теперь надо автоматически задавать не 0 а случайное число из рандома =
хе, выбранное по тому же принципу =

Yegor
08.04.2015, 12:17
не 0 а случайное число из рандомаTIME() никто не отменял.

Спорягин Кирилл
04.08.2015, 16:41
Немного подправил алгоритм 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);

Scream
04.08.2015, 17:05
TIME() как писали выше и взять миллисекунды, т.к. цикл плк прыгает и зависит от загруженности, будет это число рандомным.
Пример выше больше похож на шифрование.... Надо на вход подать число? Если я 2 раза подам одно и тоже число, будет результат одинаков?

Спорягин Кирилл
04.08.2015, 18:07
Согласен с замечанием.

Привожу код генерации случайного числа от 0 до 1 с использованием функции Time.

FUNCTION random : REAL

random := DWORD_TO_REAL(TIME_TO_DWORD( TIME()) MOD 1000)/1000;

Вольд
04.08.2015, 18:24
Согласен с замечанием.

Привожу код генерации случайного числа от 0 до 1 с использованием функции Time.

FUNCTION random : REAL

random := DWORD_TO_REAL(TIME_TO_DWORD( TIME()) MOD 1000)/1000;
Ну и каков период повторения ? Плотность распределения вероятности какая ?

Валенок
05.08.2015, 00:44
random := DWORD_TO_REAL(TIME_TO_DWORD( TIME()) MOD 1000)/1000;Сыграть бы на автомате с таким рандомом ))
С вероятностью 90-95% Xn > Xn-1
Мечта дровосека..

Спорягин Кирилл
06.08.2015, 11:06
Замечания справедливые.
Тогда можно объединить идею с таймером и алгоритм Peterа.

Спорягин Кирилл
07.08.2015, 17:31
Проблема уже была решена: http://www.owen.ru/forum/showthread.php?t=901&highlight=%CF%E5%F2%F0%EE%E2

Максим95
19.05.2018, 13:44
Пишу дипломную работу в среде 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.Не пойму, как это сделать.
Надо отметить, что я провожу только лишь эмуляцию и с реальным контроллером дело иметь не буду.

capzap
19.05.2018, 13:46
http://www.owen.ru/forum/showthread.php?t=901&p=215894&viewfull=1#post215894

Максим95
19.05.2018, 14:26
http://www.owen.ru/forum/showthread.php?t=901&p=215894&viewfull=1#post215894

Спасибо за ответ. Но я не пойму, как это реализовать именно в CODESYS v.3.5 на ST. Если говорить о моей компетентности в программировании, то она нулевая, т.к. уже второй день сижу ковыряюсь с ,казалось бы, легкой темой. Подключил библиотеку BASIC(OSCAT), там есть функция рдм,рдм2,как ее применить можно?

capzap
19.05.2018, 14:29
вроде как здесь (http://www.owen.ru/forum/showthread.php?t=24859&p=215572&viewfull=1#post215572) должен быть окончательный вариант для ST, правда для КДС2.3

Максим95
19.05.2018, 16:43
вроде как здесь (http://www.owen.ru/forum/showthread.php?t=24859&p=215572&viewfull=1#post215572) должен быть окончательный вариант для ST, правда для КДС2.3

Спасибо!Проблема решена.

capzap
19.05.2018, 16:46
Спасибо уж точно не мне, я только выбил исходники