PDA

Просмотр полной версии : Генератор случайных чисел



Stas
21.12.2018, 06:46
Здравствуйте,
Контроллер ПЛК220-30.Р.М

Пытаюсь сделать проверку связи Контроллер <--> ПК, путем отправки случайного числа в программу установленную на компьютер.
Сделал следующее : в контроллере создал переменную "Связь" далее просто написал Связь:= Связь+1;
Все работает, но связь проверяется до тех пор пока переменная "Связь" не достигает видимо конечного максимального значения и перестаёт изменяться.

Как можно сделать чтоб переменная "Связь" изменялась постоянно, типа : Связь:= (какой-то генератор случайных чисел);

melky
21.12.2018, 09:24
RND не? вроде должна быть такая функция. Или счетчик со сбросом и проверка что новое число отличается от старого

lara197a
21.12.2018, 10:03
https://docviewer.yandex.ru/view/102777458/?*=wXpALb1tNGaOeKGd4m8vzV2Ha4V7InVybCI6Imh0dHA6Ly9 3d3cucHJvcm9ib3QucnUvbG9hZC9rbmlnYV8lQ0YlRTUlRjIlR jAlRUUlRTItJUM4LiVDMi4tJUNGJUYwJUVFJUUzJUYwJUUwJUV DJUVDJUU4JUYwJUYzJUU1JUVDJUZCJUU1LSVFQyVFOCVFQSVGM CVFRSVFQSVFRSVFRCVGMiVGMCVFRSVFQiVFQiVFNSVGMCVGQi5 wZGYiLCJ0aXRsZSI6ImtuaWdhXyVDRiVFNSVGMiVGMCVFRSVFM i0lQzguJUMyLi0lQ0YlRjAlRUUlRTMlRjAlRTAlRUMlRUMlRTg lRjAlRjMlRTUlRUMlRkIlRTUtJUVDJUU4JUVBJUYwJUVFJUVBJ UVFJUVEJUYyJUYwJUVFJUVCJUVCJUU1JUYwJUZCLnBkZiIsInV pZCI6IjEwMjc3NzQ1OCIsInl1IjoiNjM3ODg4NjI2MTQ4NzU3N DA1OSIsIm5vaWZyYW1lIjp0cnVlLCJ0cyI6MTU0NTM3NTcxMzg 2Mywic2VycFBhcmFtcyI6Imxhbmc9cnUmbmFtZT1rbmlnYV8lQ 0YlRTUlRjIlRjAlRUUlRTItJUM4LiVDMi4tJUNGJUYwJUVFJUU zJUYwJUUwJUVDJUVDJUU4JUYwJUYzJUU1JUVDJUZCJUU1LSVFQ yVFOCVFQSVGMCVFRSVFQSVFRSVFRCVGMiVGMCVFRSVFQiVFQiV FNSVGMCVGQi5wZGYmdG09MTU0NTM3NTUzMSZ0bGQ9cnUmdGV4d D0lRDAlQkYlRDAlQjUlRDElODIlRDElODAlRDAlQkUlRDAlQjI lMjAlRDAlQjguJUQwJUIyJTIwJUQwJUJGJUQxJTgwJUQwJUJFJ UQwJUIzJUQxJTgwJUQwJUIwJUQwJUJDJUQwJUJDJUQwJUI4JUQ xJTgwJUQxJTgzJUQwJUI1JUQwJUJDJUQxJThCJUQwJUI1JTIwJ UQwJUJBJUQwJUJFJUQwJUJEJUQxJTgyJUQxJTgwJUQwJUJFJUQ wJUJCJUQwJUJCJUQwJUI1JUQxJTgwJUQxJThCJTIwJUQxJTgxJ UQxJTgyJUQwJUIwJUQwJUJEJUQwJUI0JUQwJUIwJUQxJTgwJUQ xJTgyJUQwJUJEJUQxJThCJUQwJUI1JTIwJUQxJThGJUQwJUI3J UQxJThCJUQwJUJBJUQwJUI4JTIwJUQwJUI4JTIwJUQwJUI4JUQ wJUJEJUQxJTgxJUQxJTgyJUQxJTgwJUQxJTgzJUQwJUJDJUQwJ UI1JUQwJUJEJUQxJTgyJUQxJThCJnVybD1odHRwJTNBJTJGJTJ Gd3d3LnByb3JvYm90LnJ1JTJGbG9hZCUyRmtuaWdhXyUyNUNGJ TI1RTUlMjVGMiUyNUYwJTI1RUUlMjVFMi0lMjVDOC4lMjVDMi4 tJTI1Q0YlMjVGMCUyNUVFJTI1RTMlMjVGMCUyNUUwJTI1RUMlM jVFQyUyNUU4JTI1RjAlMjVGMyUyNUU1JTI1RUMlMjVGQiUyNUU 1LSUyNUVDJTI1RTglMjVFQSUyNUYwJTI1RUUlMjVFQSUyNUVFJ TI1RUQlMjVGMiUyNUYwJTI1RUUlMjVFQiUyNUVCJTI1RTUlMjV GMCUyNUZCLnBkZiZscj03Jm1pbWU9cGRmJmwxMG49cnUmc2lnb j0xOGE0YTQzNGY3N2ViYjY0OTQ2MjA3YjA0OTgwMmQ2MSZrZXl ubz0wIn0%3D&lang=ru
Раньше эту книжку давали всем на курсах Овен.
стр. 210

Владимир Ситников
21.12.2018, 12:07
...
Раньше эту книжку давали всем на курсах Овен.
стр. 210

Только не "генератор Петрова", только не это.
Понятно, что для конкретной задачи без разницы (должно быть достаточно даже простого +1), но нет никакого смысла в том, чтобы вообще когда-либо использовать генератор Петрова (и вообще помнить о его существовании). Единственный случай когда генератор Петрова нужен -- на лабораторных для того, чтобы показать как НЕ надо делать генераторы случайных чисел.

Есть гораздо более хорошие генераторы, которые столь же легко реализуются в ПЛК/ПР (для Xorshift, например, нужно несколько сдвигов и несколько XOR'ов): http://www.owen.ru/forum/showthread.php?t=901&page=3&p=215894&viewfull=1#post215894

melky
21.12.2018, 13:29
Владимир Ситников ну на кой это все автору ? ему банально контролировать наличие связи путем изменения переменной. Зачем ему возможности криптографии, сдвигов и подвигов ?

Владимир Ситников
21.12.2018, 13:44
Владимир Ситников ну на кой это все автору ? ему банально контролировать наличие связи путем изменения переменной. Зачем ему возможности криптографии, сдвигов и подвигов ?

Это вопрос? Или риторический?

1) Я отвечал не автору, а тов. lara197a
2) Я же сказал, что "должно быть достаточно даже простого +1"
3) А вот использовать "генератор Петрова" вообще нет никакого смысла. Вне зависимости от целей использования.

Koion
21.12.2018, 14:28
а зачем такие сложности с числами? просто 2мя битами связь контролируется прекрасно.

Stas
24.12.2018, 07:53
Мне не важно каким будет тип данных переменной "Связь". Главное чтоб эта переменная постоянно менялась и все.
Может как вариант попробовать считать секунды с внутренних часов контроллера? Есть такая возможность?

а максимально число я не знаю какое, когда увидел что нет связи , подключился к контроллеру и увидел что переменная "Связь" просто остановилась и перестала менять своё значение.

petera
24.12.2018, 10:27
Мне не важно каким будет тип данных переменной "Связь". Главное чтоб эта переменная постоянно менялась и все.
Может как вариант попробовать считать секунды с внутренних часов контроллера? Есть такая возможность?

а максимально число я не знаю какое, когда увидел что нет связи , подключился к контроллеру и увидел что переменная "Связь" просто остановилась и перестала менять своё значение.
Тогда этот код ничуть не хуже подсчета секунд внутренних часов контроллера

PROGRAM PLC_PRG
VAR
myTIMER: TON;
Sviaz: WORD;
END_VAR

myTIMER(in:= NOT myTIMER.Q, PT:= t#500ms);
Sviaz:= Sviaz + BOOL_TO_WORD(myTIMER.Q);


ЗЫ.
Хотя можно и без таймера

PROGRAM PLC_PRG
VAR
Sviaz: WORD;
END_VAR

Sviaz:= TIME_TO_WORD(TIME()) / 1000;

ЗЫ
В обоих вариантах максимальное число 65535, затем счет будет повторяться
Т.е. 0, 1, 2,...65535, 0,1, 2,...65535,..

capzap
25.12.2018, 08:30
Мне не важно каким будет тип данных переменной "Связь". Главное чтоб эта переменная постоянно менялась и все.
Может как вариант попробовать считать секунды с внутренних часов контроллера? Есть такая возможность?

а максимально число я не знаю какое, когда увидел что нет связи , подключился к контроллеру и увидел что переменная "Связь" просто остановилась и перестала менять своё значение.

так может дело не в
переменная "Связь" не достигает видимо конечного максимального значения и перестаёт изменятьсяа в банальном отсутствии модуля button в конфигурации, если это какая то старая модель плк. И к тому же, не встречал ПЛК220-30.Р.М еще в ассортименте Овена

capzap
25.12.2018, 16:53
Валенок,не забываем что i++ делает не конфигурация, а программа, поэтому слова
перестаёт изменятьсямогут иметь отношение к бутону, не зависимо как устроена конфигурация

capzap
25.12.2018, 18:08
Дык пока сам аффтор не определился с вариантом, подозреваю что вариант 2. А там i++ делает не программа, и даже не конфигурация, а чужая программа ))

PS
Смысл этих гаданий если ТС не в состоянии полно описать ситуацию ?

врядли этот вариант
Пытаюсь сделать проверку связи Контроллер <--> ПК, путем отправки случайного числа в программу установленную на компьютер

Stas
26.12.2018, 11:08
Вариант от petera подошел, спасибо.

Sviaz:= TIME_TO_WORD(TIME()) / 1000;

Я же писал , какая разница кто мастер и так далее, всего то нужна постоянно меняющаяся переменная и ВСЕ. Я уже сам отправлю её куда надо(в стороннюю программу).
Куда еще проще? Есть простые генераторы: пила, синусоида, случайное число, треугольник, битовый меандр.

Вопрос решен.

capzap
26.12.2018, 14:08
Вариант от petera подошел, спасибо.

Sviaz:= TIME_TO_WORD(TIME()) / 1000;

Я же писал , какая разница кто мастер и так далее, всего то нужна постоянно меняющаяся переменная и ВСЕ. Я уже сам отправлю её куда надо(в стороннюю программу).
Куда еще проще? Есть простые генераторы: пила, синусоида, случайное число, треугольник, битовый меандр.

Вопрос решен.
суть совершенно не в том, решен вопрос или нет у Вас. Элементарно xBool := NOT xBool;Sviaz:= BOOL_TO_WORD(xBool); тоже подойдет, для такого рода задач. А вот остановка счета счетчика в нормальной программе не происходит. Каков бы тип данных не был, он должен считать циклический от начала диапазона до конца, разница только в том что у четырехбайтных переход к наименьшему значению перейдет через более 40-ка суток, но ни как не будет зависать просто так