Генератор случайных чисел LAD FBD

Инженерное программное обеспечение
Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Генератор случайных чисел LAD FBD

Сообщение Henek »

Всем привет.
В общем кто подскажет как организовать генератор случайных чисел в LAD и FBD?
Не могу найти в стандартных библиотеках.
Вообще то нужен еще цифровой фильтр, например медианный, тоже не могу найти в библиотеках.
Где это находится? :wall:
Интерисует только LAD и FBD. На SCL отдельным блоком написать думаю что смогу без больших проблем.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Генератор случайных чисел LAD FBD

Сообщение Михайло »

Вы можете написать код в SCL, но потом без проблем использовать в LAD/FBD вызовом функции. Готовых функций нет, но, извините, писать в LAD и FBD эти функции - извращение.

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

Михайло писал(а):Готовых функций нет
Понятно
Михайло писал(а):писать в LAD и FBD эти функции - извращение.
Не, ну, тут никто не спорит. Я просто грешным делом подумал что в библиотеке гдето есть, или доставить библиотеку может какую нибудь необходимо.
Михайло писал(а):Вы можете написать код в SCL, но потом без проблем использовать в LAD/FBD вызовом функции.
Хорошо, предположим я напишу такие функции. А как их сохранить в библиотеку как библиотечную функцию.
Например в свое время я написал универсальную фукцию управления задвижкой и использовал ее как библиотечную на языке ST (в принципе тот же SCL).
И еще вопрос. А никогда, никто не пробовал юзать библиотеки OSCAT? Если есть такая возможность использования то как их интегрировать в TIA Portal? У меня для BECKHOFFа есть огромные библиотеки. Помоему существует что то и для сименса. Полазию у них на сайте. Но как интегрировать?

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Генератор случайных чисел LAD FBD

Сообщение Михайло »

OSCAT - это библиотека наверное только к Codesys-совместимым ПЛК?..

Тут нашёл некие подходящие готовые сименсовские функции, но для старого Step 7:
https://support.industry.siemens.com/cs ... n&lc=ru-RU

В описании функции FC45 RANDOM написано, что нужно взять 16-битное слово, взять функцию XOR от 10, 12, 13 и 15 битов, сдвинуть слово влево, итоговый результат XOR записать в освободившийся бит справа. Вопрос лишь в том, где взять начальное значение этого слова.

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

Вопрос лишь в том, где взять начальное значение этого слова.
Ну это элементарно. Инкриментный круговой счетчик проходов главного цикла+обработка насчитаного числа проходов по таймеру, или по прерыванию, или по любому другому синхроимпульсу. А дальше там фантазировать можно до упаду.
Например считать проходы в какой нибудь UDINT или LREAL и потом раз в секунду брать 8 младших бит можно 16 или больше или меньше. Там изначально будет всё случайным. Потом есть еще формула которая с этого randа генерит еще один rand уже необходимым диапазоном. Фрмулу с ходу не нашел, нужно свои beckhoffовские дела пересматривать найду если интересно выложу.
Михайло подскажите если возможно. Как прерывания с определенной частотой вызывать, как с прецизионной частотой вызывать. Или дайте ссылочку где это написано доходчиво.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Генератор случайных чисел LAD FBD

Сообщение Михайло »

Сразу скажите, какой контроллер (S7-1200, 1500, 300/400) и среда разработки (TIA Portal или Step7 Pro).

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

S7-1200
TIA Portal V14 STEP 7 V14 SP1 Professional
TIA Portal если правильно понимаю это всего лишь своего рода оболочка.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Генератор случайных чисел LAD FBD

Сообщение Михайло »

Посмотрите OB30 Cyclic Interrupt.
оффтоп
TIA Portal - это связующий портал (или туннель) между несколькими программами Step 7, WinCC, Startdrive, Safety и т.д. :) Но мало, кто знает, что это просто отдельная программка наравне с остальными. В народе как-то установилось, что так называется вся программная платформа. И Сименс не спешит исправить это представление, видимо нравится.

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

Михайло спасибо за ответ.
Посмотрите OB30 Cyclic Interrupt.
Как раз курю эту тему. Нашел подходящую литературу.
Но тут заморочка случись. Осознал что без SCL никак. Обнаружил что это тот же самый ST. С которым как бы дружу.
Нашел пару примеров генераторов случайных(на самом деле достаточно простенького псевдослучайного) чисел и начинаю нифига не понимать.
VAR_OUTPUT
rRandom : Real; // random number
END_VAR

VAR_TEMP
diTime : DInt; // time as DINT
rTime : Real;
timeTck : Time; // actual system time
END_VAR

BEGIN

// read systemtime
#timeTck := TIME_TCK(); // TIME

// calculate random number
#diTime := TIME_TO_DINT(#timeTck);
#rTime := DINT_TO_REAL( #diTime );
#rRandom := SIN(#rTime);

END_FUNCTION

Возникло пару вопросов
# -что означает этот знак?
BEGIN -обязательно писать и что это такое(ниразу не использовал)?
Коректно ли в программе инициализирован таймер?
Правильно ли я понимаю что в случае использования функции нужно заканчивать END_FUNCTION, а для блока END_BLOCK?

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Генератор случайных чисел LAD FBD

Сообщение Михайло »

Всё просто. Следующее похоже во многих компьютерных языках программирования.
Программа состоит из:
- объявлений (деклараций) переменных
- тела программы.

Объявления (декларации) - это то, что заключено в так называемые "скобки" VAR_OUTPUT ... END_VAR; VAR_TEMP ... END_VAR
Тело программы - это то, что внутри "операторских скобок" BEGIN ... END_FUNCTION или BEGIN ... END_BLOCK.

Значок # перед именем переменной означает, что вы обращаетесь к переменной, которая объявлена тут же в данной функции/блоке в разделе объявлений (деклараций). Такие переменные (с префиксом #) называются локальными. Таким образом они отличаются от глобальных переменных, которые не помечаются "решёточкой".

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

С решеткой понятно. С темой локальных\глобальных переменных более-менее понятно хоть и не до конца. Думаю что разберусь.
А как например в создаваемый блок всунуть например таймер
Я в ST делал так
FUNCTION_BLOCK NAME //здесь может быть не блок, а функция
//Объявляем переменные. Существует 2 способа такого объявления, на данный момент не принципиально.
VAR
TimeName:TON; //TimeName-это любое имя таймера хоть vAsIa_BaTaReJkIn. Компилятор видит тип таймера и его имя, обращения всегда по имени в дальнейшем.
Timer_IN:BOOL;
Timer_PT:TIME;
Timer_Q:BOOL;
Timer_ET:TIME;
END_VAR
..............//тут еще какие нибудь переменные IN, OUT, TEMP.
//Дальше текст программы
//Объявляем таймер в программе.
TimeName(
IN:=Timer_IN,
PT:=Timer_PT,
Q=>Timer_Q,
ET=>Timer_ET)
.......//текст
.......//какой нибудь
.......//программы

END_FUNCTION_BLOCK
Об чем собственно говоря я.
Не совсем понятен синтаксис. Я в ST писал именно в том виде как представил. Но в TP переменные объявляются в окне выше редактора программы, что в принципе понятно и весьма удобно, с этим разобрался.
А как таймер объявить?
Какой формат объявления таймера в программе?
Пример в предидущем посте я содрал без изменений с одного из форумов конкретно для TP. Как работает этот генератор понятно, понятно что написан не до конца. По идее работать должен, результат кривоватый будет, но работать должен. Только почему то не работает. При компиляции ошибок не обнаруживает. При попытке загрузить в контроллер получаются дрова.

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

Блин хоть плач не выходит
Изображение
Изображение
Ошибка выглядит так
Изображение

Что с этим делать не знаю. Михайло помогайте, без Вас никак.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Генератор случайных чисел LAD FBD

Сообщение Михайло »

Тьфу, блин, вы меня запутали. :) У Сименса не надо писать всякие там BEGIN...END, они и так подразумеваются, очевидны, так как декларация идёт отдельно в верхнем выплывающем окне, границы тела программы не требуется обозначать операторскими скобками.

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

Еще одни грабли.
TIME_TCK в S7-1200 существует?
Если существует то необходимо ли его конфигурировать в свойствах контроллера?
Если необходимо конфигурировать в свойствах контроллера то где хоть примерно?
END_IF :)

Если не существует TIME_TCK то как програмно добратся до тактового генератора ПЛК? В смысле взять системные (не програмные) отсчеты времени. В конечном итоге как считать данные регистров счетчиков системного(физического) тактового генератора. Чего то в литературе ничего вменяемого найти не могу.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Генератор случайных чисел LAD FBD

Сообщение Автоматизатор »

Henek писал(а):Если не существует TIME_TCK то как програмно добратся до тактового генератора ПЛК? В смысле взять системные (не програмные) отсчеты времени. В конечном итоге как считать данные регистров счетчиков системного(физического) тактового генератора. Чего то в литературе ничего вменяемого найти не могу.
S7-1200 Programmable controller. System Manual

p.338
Table 9- 9 System time instructions
RD_SYS_T (Read time-of-day) reads the current system time from the CPU. This time value does not include local time zone or daylight saving time offsets.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Генератор случайных чисел LAD FBD

Сообщение Михайло »

Мне кажется, речь идёт не о функции типа RD_SYS_T(), а о простом Clock_memory (который по умолчанию пишется в байт MB0).

Надо нажать на PLC_1 правой кнопкой мыши и выбрать Properties. Откроется "целый мир важных настроек". На вкладке Clock & system memory, нужно включить галочки. Новые настройки прогрузить в CPU. Важно разобраться с Clock memory и заметить номер байта, в который пишется значение регистра тактового генератора.

В программе вместо

Код: Выделить всё

#timeTck:=TIME_TCK();
написать

Код: Выделить всё

#timeTck:=MB0;
где 0 - это номер байта Clock memory, заданный в настройках CPU.

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

Автоматизатор писал(а):p.338
Table 9- 9 System time instructions
Конечно же я читаю эту документацию. У меня есть на русском. Данный раздел есть буква в букву.
Михайло писал(а):Мне кажется, речь идёт не о функции типа RD_SYS_T(), а о простом Clock_memory (который по умолчанию пишется в байт MB0).
Думаю что возможно именно так.
Речь идет об тактовом генераторе и об делителях тактового генератора ПЛК. Это набор таких себе счетчиков и их регистров.
Откуда то же же тактируется ПЛК, откуда то ПЛК берет точные отсчеты времени например для часов. Из того что вычитал на заморских форумах то то именно оттуда сименсовый RAND берет данные для генерации.
Михайло писал(а):В описании функции FC45 RANDOM написано, что нужно взять 16-битное слово, взять функцию XOR от 10, 12, 13 и 15 битов, сдвинуть слово влево, итоговый результат XOR записать в освободившийся бит справа. Вопрос лишь в том, где взять начальное значение этого слова.
Оттуда и берет, "шум" тактового генератора как правило и используется для качественной генерации случайных чисел.
Михайло писал(а):Надо нажать на PLC_1 правой кнопкой мыши и выбрать Properties. Откроется "целый мир важных настроек".
Да. Я пользуюсь этим.
Просто удивляюсь. 3 года не работал с сименсом, так сложилось. Удивительно сколько можно забыть за это время. А SCL тогда вообще не было, была всяка бурда асемблерподобная, я ее учить просто не пробовал и не собирался.
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

Мужики спасайте. Чёт голова моя не думает.
Проблема гдето глубже.
Михайло писал(а):Мне кажется, речь идёт не о функции типа RD_SYS_T(), а о простом Clock_memory (который по умолчанию пишется в байт MB0).
Сконфигурирован, проверен, работает. Создал цепь подрубил счетчик. Всё работает как часы.
Переделал немного программу
VAR_INPUT
Time_0 : Time;

VAR_OUTPUT
rRandom : Real;
diTime : DInt;
rTime : Real;

//непосредственно программа
//#Time_0 := MB0 ;
//
//#diTime := TIME_TO_DINT #Time_0 ;
//#rTime := DINT_TO_REAL #diTime ;
//#rRandom := SIN #rTime ;

При попытке раскоментировать любую строку программа в процессе компиляции и загрузки в ПЛК дает ошибку
Изображение

При попытке именно этим переменным присвоить какие либо значения или присвоить значения элементарных математических операций всё работает как часы, компилируется и грузится в контроллер. Таким образом синтаксис проверен. Ошибок нет.
ЧТО НЕ ТАК? Это приметивнейшие действия. Где я косячу
:wall: :wall: :wall: :wall: :wall: :wall:

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Генератор случайных чисел LAD FBD

Сообщение Михайло »

TIME_TO_DINT(VAR). Скобочки у функции забыл.

Henek
Любитель
Сообщения: 44
Зарегистрирован: 30 апр 2018, 00:42

Re: Генератор случайных чисел LAD FBD

Сообщение Henek »

Так, супер, Михайло спасибо.
Осталась ошибка в строке
так не работает
#Time_0 := MB0 ;
так скотина тоже не работает
#Time_0 := (MB0) ;
Михайло, MB0 это 10 гц. Там что в этом регистре счет идет. Если идет счет то в каких единицах времени?

Ответить