Всем привет.
В общем кто подскажет как организовать генератор случайных чисел в LAD и FBD?
Не могу найти в стандартных библиотеках.
Вообще то нужен еще цифровой фильтр, например медианный, тоже не могу найти в библиотеках.
Где это находится?
Интерисует только LAD и FBD. На SCL отдельным блоком написать думаю что смогу без больших проблем.
Генератор случайных чисел LAD FBD
Re: Генератор случайных чисел LAD FBD
Вы можете написать код в SCL, но потом без проблем использовать в LAD/FBD вызовом функции. Готовых функций нет, но, извините, писать в LAD и FBD эти функции - извращение.
Re: Генератор случайных чисел LAD FBD
ПонятноМихайло писал(а):Готовых функций нет
Не, ну, тут никто не спорит. Я просто грешным делом подумал что в библиотеке гдето есть, или доставить библиотеку может какую нибудь необходимо.Михайло писал(а):писать в LAD и FBD эти функции - извращение.
Хорошо, предположим я напишу такие функции. А как их сохранить в библиотеку как библиотечную функцию.Михайло писал(а):Вы можете написать код в SCL, но потом без проблем использовать в LAD/FBD вызовом функции.
Например в свое время я написал универсальную фукцию управления задвижкой и использовал ее как библиотечную на языке ST (в принципе тот же SCL).
И еще вопрос. А никогда, никто не пробовал юзать библиотеки OSCAT? Если есть такая возможность использования то как их интегрировать в TIA Portal? У меня для BECKHOFFа есть огромные библиотеки. Помоему существует что то и для сименса. Полазию у них на сайте. Но как интегрировать?
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 записать в освободившийся бит справа. Вопрос лишь в том, где взять начальное значение этого слова.
Тут нашёл некие подходящие готовые сименсовские функции, но для старого Step 7:
https://support.industry.siemens.com/cs ... n&lc=ru-RU
В описании функции FC45 RANDOM написано, что нужно взять 16-битное слово, взять функцию XOR от 10, 12, 13 и 15 битов, сдвинуть слово влево, итоговый результат XOR записать в освободившийся бит справа. Вопрос лишь в том, где взять начальное значение этого слова.
Re: Генератор случайных чисел LAD FBD
Ну это элементарно. Инкриментный круговой счетчик проходов главного цикла+обработка насчитаного числа проходов по таймеру, или по прерыванию, или по любому другому синхроимпульсу. А дальше там фантазировать можно до упаду.Вопрос лишь в том, где взять начальное значение этого слова.
Например считать проходы в какой нибудь UDINT или LREAL и потом раз в секунду брать 8 младших бит можно 16 или больше или меньше. Там изначально будет всё случайным. Потом есть еще формула которая с этого randа генерит еще один rand уже необходимым диапазоном. Фрмулу с ходу не нашел, нужно свои beckhoffовские дела пересматривать найду если интересно выложу.
Михайло подскажите если возможно. Как прерывания с определенной частотой вызывать, как с прецизионной частотой вызывать. Или дайте ссылочку где это написано доходчиво.
Re: Генератор случайных чисел LAD FBD
Сразу скажите, какой контроллер (S7-1200, 1500, 300/400) и среда разработки (TIA Portal или Step7 Pro).
Re: Генератор случайных чисел LAD FBD
S7-1200
TIA Portal V14 STEP 7 V14 SP1 Professional
TIA Portal если правильно понимаю это всего лишь своего рода оболочка.
TIA Portal V14 STEP 7 V14 SP1 Professional
TIA Portal если правильно понимаю это всего лишь своего рода оболочка.
Re: Генератор случайных чисел LAD FBD
Посмотрите OB30 Cyclic Interrupt.
оффтоп
Re: Генератор случайных чисел LAD FBD
Михайло спасибо за ответ.
Но тут заморочка случись. Осознал что без 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?
Как раз курю эту тему. Нашел подходящую литературу.Посмотрите 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?
Re: Генератор случайных чисел LAD FBD
Всё просто. Следующее похоже во многих компьютерных языках программирования.
Программа состоит из:
- объявлений (деклараций) переменных
- тела программы.
Объявления (декларации) - это то, что заключено в так называемые "скобки" VAR_OUTPUT ... END_VAR; VAR_TEMP ... END_VAR
Тело программы - это то, что внутри "операторских скобок" BEGIN ... END_FUNCTION или BEGIN ... END_BLOCK.
Значок # перед именем переменной означает, что вы обращаетесь к переменной, которая объявлена тут же в данной функции/блоке в разделе объявлений (деклараций). Такие переменные (с префиксом #) называются локальными. Таким образом они отличаются от глобальных переменных, которые не помечаются "решёточкой".
Программа состоит из:
- объявлений (деклараций) переменных
- тела программы.
Объявления (декларации) - это то, что заключено в так называемые "скобки" VAR_OUTPUT ... END_VAR; VAR_TEMP ... END_VAR
Тело программы - это то, что внутри "операторских скобок" BEGIN ... END_FUNCTION или BEGIN ... END_BLOCK.
Значок # перед именем переменной означает, что вы обращаетесь к переменной, которая объявлена тут же в данной функции/блоке в разделе объявлений (деклараций). Такие переменные (с префиксом #) называются локальными. Таким образом они отличаются от глобальных переменных, которые не помечаются "решёточкой".
Re: Генератор случайных чисел LAD FBD
С решеткой понятно. С темой локальных\глобальных переменных более-менее понятно хоть и не до конца. Думаю что разберусь.
А как например в создаваемый блок всунуть например таймер
Я в 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. Как работает этот генератор понятно, понятно что написан не до конца. По идее работать должен, результат кривоватый будет, но работать должен. Только почему то не работает. При компиляции ошибок не обнаруживает. При попытке загрузить в контроллер получаются дрова.
А как например в создаваемый блок всунуть например таймер
Я в 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. Как работает этот генератор понятно, понятно что написан не до конца. По идее работать должен, результат кривоватый будет, но работать должен. Только почему то не работает. При компиляции ошибок не обнаруживает. При попытке загрузить в контроллер получаются дрова.
Re: Генератор случайных чисел LAD FBD
Тьфу, блин, вы меня запутали. У Сименса не надо писать всякие там BEGIN...END, они и так подразумеваются, очевидны, так как декларация идёт отдельно в верхнем выплывающем окне, границы тела программы не требуется обозначать операторскими скобками.
Re: Генератор случайных чисел LAD FBD
Еще одни грабли.
TIME_TCK в S7-1200 существует?
Если существует то необходимо ли его конфигурировать в свойствах контроллера?
Если необходимо конфигурировать в свойствах контроллера то где хоть примерно?
END_IF
Если не существует TIME_TCK то как програмно добратся до тактового генератора ПЛК? В смысле взять системные (не програмные) отсчеты времени. В конечном итоге как считать данные регистров счетчиков системного(физического) тактового генератора. Чего то в литературе ничего вменяемого найти не могу.
TIME_TCK в S7-1200 существует?
Если существует то необходимо ли его конфигурировать в свойствах контроллера?
Если необходимо конфигурировать в свойствах контроллера то где хоть примерно?
END_IF
Если не существует TIME_TCK то как програмно добратся до тактового генератора ПЛК? В смысле взять системные (не програмные) отсчеты времени. В конечном итоге как считать данные регистров счетчиков системного(физического) тактового генератора. Чего то в литературе ничего вменяемого найти не могу.
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: Генератор случайных чисел LAD FBD
S7-1200 Programmable controller. System ManualHenek писал(а):Если не существует TIME_TCK то как програмно добратся до тактового генератора ПЛК? В смысле взять системные (не програмные) отсчеты времени. В конечном итоге как считать данные регистров счетчиков системного(физического) тактового генератора. Чего то в литературе ничего вменяемого найти не могу.
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.
Re: Генератор случайных чисел LAD FBD
Мне кажется, речь идёт не о функции типа RD_SYS_T(), а о простом Clock_memory (который по умолчанию пишется в байт MB0).
Надо нажать на PLC_1 правой кнопкой мыши и выбрать Properties. Откроется "целый мир важных настроек". На вкладке Clock & system memory, нужно включить галочки. Новые настройки прогрузить в CPU. Важно разобраться с Clock memory и заметить номер байта, в который пишется значение регистра тактового генератора.
В программе вместо
написать
где 0 - это номер байта Clock memory, заданный в настройках CPU.
Надо нажать на PLC_1 правой кнопкой мыши и выбрать Properties. Откроется "целый мир важных настроек". На вкладке Clock & system memory, нужно включить галочки. Новые настройки прогрузить в CPU. Важно разобраться с Clock memory и заметить номер байта, в который пишется значение регистра тактового генератора.
В программе вместо
Код: Выделить всё
#timeTck:=TIME_TCK();
Код: Выделить всё
#timeTck:=MB0;
Re: Генератор случайных чисел LAD FBD
Конечно же я читаю эту документацию. У меня есть на русском. Данный раздел есть буква в букву.Автоматизатор писал(а):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 тогда вообще не было, была всяка бурда асемблерподобная, я ее учить просто не пробовал и не собирался.
Re: Генератор случайных чисел LAD FBD
Мужики спасайте. Чёт голова моя не думает.
Проблема гдето глубже.
Переделал немного программу
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 ;
При попытке раскоментировать любую строку программа в процессе компиляции и загрузки в ПЛК дает ошибку
При попытке именно этим переменным присвоить какие либо значения или присвоить значения элементарных математических операций всё работает как часы, компилируется и грузится в контроллер. Таким образом синтаксис проверен. Ошибок нет.
ЧТО НЕ ТАК? Это приметивнейшие действия. Где я косячу
Проблема гдето глубже.
Сконфигурирован, проверен, работает. Создал цепь подрубил счетчик. Всё работает как часы.Михайло писал(а):Мне кажется, речь идёт не о функции типа 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 ;
При попытке раскоментировать любую строку программа в процессе компиляции и загрузки в ПЛК дает ошибку
При попытке именно этим переменным присвоить какие либо значения или присвоить значения элементарных математических операций всё работает как часы, компилируется и грузится в контроллер. Таким образом синтаксис проверен. Ошибок нет.
ЧТО НЕ ТАК? Это приметивнейшие действия. Где я косячу
Re: Генератор случайных чисел LAD FBD
TIME_TO_DINT(VAR). Скобочки у функции забыл.
Re: Генератор случайных чисел LAD FBD
Так, супер, Михайло спасибо.
Осталась ошибка в строке
так не работает
#Time_0 := MB0 ;
так скотина тоже не работает
#Time_0 := (MB0) ;
Михайло, MB0 это 10 гц. Там что в этом регистре счет идет. Если идет счет то в каких единицах времени?
Осталась ошибка в строке
так не работает
#Time_0 := MB0 ;
так скотина тоже не работает
#Time_0 := (MB0) ;
Михайло, MB0 это 10 гц. Там что в этом регистре счет идет. Если идет счет то в каких единицах времени?