PDA

Просмотр полной версии : ПЛК110-60.К-М (М02) и высокочастотный таймер - быстрый выход. Срабатывает вачдог.



Рашид
25.01.2022, 10:00
Здравствуйте. Простая задача - покрутить шаговый двигатель. Надо три сигнала - разрешение (ENA), Направление (DIR) - медленные сигналы, обычные выхода справятся и тактовый (PUL), быстрый, порядка 5 кГц (а лучше больше). Знаю, что быстрые входа/выхода у ПЛК110 имеются, решил использовать связку высокочастотный таймер (прерывание) плюс непосредственная запись в быстрые выхода. Скорость моторчика меняю изменяя период вызова таймера (с шагом 20 мкс, разумеется, хотя это довольно дискретно), далее инициализирую таймер. В обработке прерывания от таймера тупо инвертирую сигнал на первом быстром выходе, таким образом и получаю искомый меандр. В самой программе реализовал что-то вроде плавного разгона (меняю период вызова таймера от предустановленного максимума до минимума. Делаю это через заданный интервал времени, для начала выбрал 100 мс). Так вот, если я начинаю более шустро, чем каждые 100 мс, понижать период таймера, ПЛК зависает, перезагружается. Такое иногда случается и на 100 мс. Аналогично с подключенным драйвером шагового двигателя и без него (было подозрение на помехи от движка. Нет.). Моторчик, кстати, раскручивается (но хотелось бы темп ускорить). В debug.txt появляется в итоге запись:
2022. 1.24 14:23:19 # 0 KERNEL LOADED
2022. 1.24 14:23:19 # 17 E PLC was reset by watchdog!
2022. 1.24 14:23:20 # 2 PLC STOPED
2022. 1.24 14:23:20 # 3 M
Last run module Id =834271162
2022. 1.24 14:23:20 # 3 M Last post module Id =-1430524739
2022. 1.24 14:23:20 # 3 M local_status =10020915
2022. 1.24 14:23:20 # 3 M local data #1 =baef29e7
2022. 1.24 14:23:20 # 3 M local data #2 =f8017def
2022. 1.24 14:23:20 # 3 M local data #3 =6ecf71cf
2022. 1.24 14:23:20 # 3 M local data #4 =f3edd1e9
Из чего можно сделать вывод, что ПЛК повис и был перезагружен. От чего такое может быть? Видимо, это происходит, если инициализируешь высокочастотный таймер чаще, чем раз в 100 мс (но это не точно). И что делать с этим?
Тестовый проект во вложении.

Sulfur
25.01.2022, 11:00
Во вложении архив, в котором файлы специальной программы управления ШД для Овен 110М2.
Делаете полный заводской сброс своего ПЛК, файлы PRU0.prg и PRU1.prg просто копируете в корень файловой системы ПЛК, третий файдл экспортируете в проект. Будет добавлено несколько POU для управления сопроцессора быстрых входов\выходов ПЛК.
И не нужно будет использовать всякие таймеры.

A.Simonov
25.01.2022, 11:28
Здравствуйте. Простая задача - покрутить шаговый двигатель. Надо три сигнала - разрешение (ENA), Направление (DIR) - медленные сигналы, обычные выхода справятся и тактовый (PUL), быстрый, порядка 5 кГц (а лучше больше). Знаю, что быстрые входа/выхода у ПЛК110 имеются, решил использовать связку высокочастотный таймер (прерывание) плюс непосредственная запись в быстрые выхода. Скорость моторчика меняю изменяя период вызова таймера (с шагом 20 мкс, разумеется, хотя это довольно дискретно), далее инициализирую таймер. В обработке прерывания от таймера тупо инвертирую сигнал на первом быстром выходе, таким образом и получаю искомый меандр. В самой программе реализовал что-то вроде плавного разгона (меняю период вызова таймера от предустановленного максимума до минимума. Делаю это через заданный интервал времени, для начала выбрал 100 мс). Так вот, если я начинаю более шустро, чем каждые 100 мс, понижать период таймера, ПЛК зависает, перезагружается. Такое иногда случается и на 100 мс. Аналогично с подключенным драйвером шагового двигателя и без него (было подозрение на помехи от движка. Нет.). Моторчик, кстати, раскручивается (но хотелось бы темп ускорить). В debug.txt появляется в итоге запись:
2022. 1.24 14:23:19 # 0 KERNEL LOADED
2022. 1.24 14:23:19 # 17 E PLC was reset by watchdog!
2022. 1.24 14:23:20 # 2 PLC STOPED
2022. 1.24 14:23:20 # 3 M
Last run module Id =834271162
2022. 1.24 14:23:20 # 3 M Last post module Id =-1430524739
2022. 1.24 14:23:20 # 3 M local_status =10020915
2022. 1.24 14:23:20 # 3 M local data #1 =baef29e7
2022. 1.24 14:23:20 # 3 M local data #2 =f8017def
2022. 1.24 14:23:20 # 3 M local data #3 =6ecf71cf
2022. 1.24 14:23:20 # 3 M local data #4 =f3edd1e9
Из чего можно сделать вывод, что ПЛК повис и был перезагружен. От чего такое может быть? Видимо, это происходит, если инициализируешь высокочастотный таймер чаще, чем раз в 100 мс (но это не точно). И что делать с этим?
Тестовый проект во вложении.

Добрый день.

В ветке конфигурации, зайдите в настройки ПЛК и попробуйте там увеличить минимальное время цикла с 1мс до 10мс, скажем, и посмотреть на результат.

Рашид
25.01.2022, 11:30
Во вложении архив, в котором файлы специальной программы управления ШД для Овен 110М2.
Делаете полный заводской сброс своего ПЛК, файлы PRU0.prg и PRU1.prg просто копируете в корень файловой системы ПЛК, третий файдл экспортируете в проект. Будет добавлено несколько POU для управления сопроцессора быстрых входов\выходов ПЛК.
И не нужно будет использовать всякие таймеры.
Попробую, спасибо. Но что не так с прерываниями по таймеру, тоже хотелось бы узнать. Мало ли, приспичит под быстрые процессы использовать.

Рашид
25.01.2022, 11:33
Добрый день.

В ветке конфигурации, зайдите в настройки ПЛК и попробуйте там увеличить минимальное время цикла с 1мс до 10мс, скажем, и посмотреть на результат.

Увеличил. Так же ребутнулся ПЛК после нескольких прогонов инициализаций таймера (с интервалом в 100 мс).

Рашид
25.01.2022, 12:46
Во вложении архив, в котором файлы специальной программы управления ШД для Овен 110М2.
Делаете полный заводской сброс своего ПЛК, файлы PRU0.prg и PRU1.prg просто копируете в корень файловой системы ПЛК, третий файдл экспортируете в проект. Будет добавлено несколько POU для управления сопроцессора быстрых входов\выходов ПЛК.
И не нужно будет использовать всякие таймеры.

.... а есть какой-нибудь мануал к этому или что-нибудь, чтобы разобраться с содержимым? Скопировал, установил, но пока не разобрался, что к чему.

Трофимов Артем
25.01.2022, 13:10
вы переинициализируете таймер прерывания без его остановки - надо выполнить ClearIRQ перед новым SetIRQ

Рашид
25.01.2022, 13:22
вы переинициализируете таймер прерывания без его остановки - надо выполнить ClearIRQ перед новым SetIRQ
Да, действительно, если выполнить ClearIRQ() перед SetIRQ(TIRQ), то никаких зависаний не наблюдается. Спасибо.

Sulfur
25.01.2022, 13:48
Рашид

а есть какой-нибудь мануал к этому или что-нибудь, чтобы разобраться с содержимым?
Программа написана в среде HardellaIDE местными умельцами. Как такового мануала нет, надо читать про возможности среды, там объяснен принцип работы сопроцессора быстрых входов-выходов. В общих чертах - в начале цикла основной POU вызываем программу чтения из PRU, выполняем свою программу, в конце цикла основной POU вызываем программу записи в PRU. Программа в PRU выполняется независимо от основной программы на собственном физическом сопроцессоре, причем не использует даже основной процессор.
--
А в вашем способе есть один ключевой недостаток - отсутствие времени разгона\торможения ШД. Это может привести к выходу из строя драйвера ШД при останове.

Рашид
25.01.2022, 14:05
Рашид

Программа написана в среде HardellaIDE местными умельцами. Как такового мануала нет, надо читать про возможности среды, там объяснен принцип работы сопроцессора быстрых входов-выходов. В общих чертах - в начале цикла основной POU вызываем программу чтения из PRU, выполняем свою программу, в конце цикла основной POU вызываем программу записи в PRU. Программа в PRU выполняется независимо от основной программы на собственном физическом сопроцессоре, причем не использует даже основной процессор.
--
А в вашем способе есть один ключевой недостаток - отсутствие времени разгона\торможения ШД. Это может привести к выходу из строя драйвера ШД при останове.

Понял, буду изучать. Но по поводу недостатка, я как раз и пытался его обойти, реализовав разгон (что нужен разгон стало ясно в самом начале, когда я попытался шустро прокрутить ШД, кроме визга и писка ничего не вышло). В этой тестовой программе не пытаюсь сразу на всю катушку крутить ШД, а формирую меандр с нарастающей частотой частотой от 1 кГц до 5 кГц (с шагом 38 Гц). В итоге мотор довольно плавно раскручивается, без срывов, работает весьма шустро. Но остановку плавную пока не делал, это да, сейчас просто мотор колом встаёт.