Просмотр полной версии : формирование импульсов заданной длины на плк110
Goga2000
13.11.2010, 14:41
добрый день.
первый раз работаю с плк. возникла следующая задача: по приходу импульса (длина порядка 5 мс) на цифровой вход необходимо сформировать 3 импульса на разные цифровые выходы, различной длины и с различной задержкой относительно запускающего импульса. точность формируемых задержек и длины импульсов порядка 1 мс. как это можно сделать правильнее? имеется плк110-220.к.
Terrano1992
13.11.2010, 16:38
точность формируемых задержек и длины импульсов порядка 1 мс.
то есть равна типичному времени исполнения одного цикла плк? нет никакой гарантии, что уложитесь. ориентируйтесь хотя бы на то, что в предельный допуск укладываются 2 цикла.
lara197a
13.11.2010, 16:44
вам нужно S7-400.
а так используйте фб "тр" из стандартной библиотеки.
Поперечный
13.11.2010, 17:34
вам нужно S7-400.
а так используйте фб "тр" из стандартной библиотеки.
И TON .......
вам нужно S7-400.
А двигатель от бентли в запорожец вставить не надо?;)
Задача решается на плк с встоенными входами/выходами и функциями прерываний по входу, наличием интервального таймера (таймера прерываний) и немедленного обновления состояний выходов. В зависимости от имени,кол-во вх/вых и доп функций: где-то от 8 тыс. руб.
lara197a
15.11.2010, 17:50
Вообще-то это шутка, парень(pike)- расслабься ты задачу-то читал?
Малышев Олег
16.11.2010, 09:36
Если точность порядка 1 мс используйте примерно такой код
t1,t2,t3:TON;
w1,w2,w3:TP;
.....
t1(IN:=input1,P:=t#3ms);t2(IN:=input1,P:=t#4ms);t3 (IN:=input1,P:=t#5ms);
w1(in:=t1.q,pt:=#2ms,q=>output1);w2(in:=t2.q,pt:=#3ms,q=>output2);w3(in:=t3.q,pt:=#4ms,q=>output3);
Если нужно точнее используйте механизм прерываний ПЛК110. И SysLibTime
lara197a
16.11.2010, 19:22
все же интересно, что это за исполнительный механизм такой.
интервал в 1мс- такое время даже при передаче данных в сети потеряется.
Поперечный
16.11.2010, 22:19
таких "механизмов" море ,шаговый двигатель ,например.
Алексей Дмитриев
20.11.2010, 14:20
зачем это шаговику такая точность?
Goga2000
25.11.2010, 22:40
сделал пока в простом виде без прерываний - результат удручающий. при цикле 1мс выходной импульс скачет на 5 - 10 мс по длительности. никак не ожидал такого поворота. сейчас буду делать через быстрые входы/выходы с усилителем и через обработчик прерываний. может там оно станет лучше. управляю несколькими соленоидами, постоянство времени срабатывания крайне критично для процесса.
Александр Приходько
25.11.2010, 22:51
о каком плк идет речь? конкретно модель и версия прошивки.
lara197a
26.11.2010, 19:12
все правильно.таймер 1мс вы не сможете использовать из-за того, что цикл от 1мс.
я сам жду плк 110(обещают к концу декабря), для решения задачи через таймер 20мкс, правда задержек использовать не планирую.
у меня просто критично само время цикла.
напишите пожалуйста, какой результат получите.
сделал пока в простом виде без прерываний - результат удручающий. при цикле 1мс выходной импульс скачет на 5 - 10 мс по длительности. никак не ожидал такого поворота. сейчас буду делать через быстрые входы/выходы с усилителем и через обработчик прерываний. может там оно станет лучше. управляю несколькими соленоидами, постоянство времени срабатывания крайне критично для процесса.
А что разве соленоид 1мс отработает?круто.
Goga2000
27.11.2010, 06:17
о каком плк идет речь? конкретно модель и версия прошивки.
ПЛК110-220.60.K-M, номер прошивки сейчас не скажу, но приобретался он месяц назад, так что, скорее всего, какая-то из последних.
Сделал через "быстрые выходы" в обработчике прерывания через TON и TP, немного полегчало, но все-равно пока получил джиттер порядка +/- 2 мс. Прерывания вызываются через 60мкс. При меньшем интервале вызова ISR (используется 2 последовательносьти TON+TP и один TOF), ПЛК уходит в перезагрузку, основная программа ничего не делает, только начальную инициализацию.
код ISR:
tof(IN:=in10 AND in11, PT:=t#100ms);
x:=tof.Q;
ton1(IN := x, PT := t#28ms);
tp1(IN := ton1.Q, PT := t#40ms);
(*out9 := tp1.Q;*)
IF (tp1.Q = TRUE) THEN
SysPortOut(0, 1);
END_IF
ton2(IN := x, PT := t#20ms);
tp2(IN := ton2.Q, PT := t#15ms);
IF (tp1.Q = TRUE) THEN
SysPortOut(0, 2);
END_IF
Вот сейчас подумал, что надо бы на время эксперимента отключить ЮСБ кабель, может обмены по нему приводят к задержкам. Если не поможет, то буду пытаться через CurTimeEx.
lara197a
27.11.2010, 13:06
вы лучше при одном вызове устанавливайте переменную, при следующем - сбрасывайте и считайте вызовы счетчиком. при достижении нужного значения выполняйте необходимое действие.
вызовы у вас идут через постоянное время кратное 20.
если прога в контроллере укладывается в 1 мс, почему-бы не считать эти циклы после прихода сигнала? ну на худой конец суммировать прошлые значения времени цикла из статистики если у контроллера цикл плавает.
ну и как вариант подвесить контроллер циклом For или While в прерывании от входа на нужное время. но тут засада, если контроллер не поддерживает немедленной регенерации выхода.
если поддерживает, то таким способом можно организовать даже фазоимпульсное управление кучей симисторов. Но нужно не забыть что основной проге тоже нужно время для работы предусмотреть
Дмитрий Артюховский
29.11.2010, 10:37
если дискретность порядка 1 мс, то единственный способ решения - использование быстрых входов - выходов и прерываний. (старик Котельников говорил что дискретизация минимум в два раза чаще чем требуемая частота ). Точность отработки прерываний (20мкс) достаточно высокая, вот внутри прерывания и делайте счетчик количества прерываний - это будет ваш таймер, рассчитать сколько прерываний будет за мс вроде не сложно.... циклы for? while и прочие способы задержек должны быть прочно забыты при программировании ПЛК. Быстрые выходы регенерят сразу после завершения очередного прерывания, поэтому можно и фазоимпульсное делать ))) но их только 4 штуки. Да, важным моментом является синхронизация переменных прерывания и основной программы.... если не хотите чудес, то переменные прерывания должны считываться в основной цикл посредством своих копий, один раз в начале цикла.
Можно конечно извратиться и установив длительность основного цикла 0 мс, выполнять отсчет пауз по часам реального времени... но флуктуации будут большими...
Филоненко Владислав
29.11.2010, 13:24
для взаимодействия между прерыванием и основной программой без "чудес" достаточно выполнять 2 простых правила.
1. переменная должна быть простого типа (byte, Word, Dword, Nt, Dint)
2. переменная должна писаться/читаться только по 1 разу. т.е. в основной программе в одном месте пишем, в прерывании в одном месте читаем. и наоборот.
Точность отработки прерываний (20мкс) достаточно высокая, вот внутри прерывания и делайте счетчик количества прерываний - это будет ваш таймер
т.е. в этом контроллере кроме прерываний по входу есть прерывания по расписанию и можно запустить очень шустрые цыклы в 20мкс и при этом останется время на работу основной проги и прочие хоз.нужды контроллера? т.е. Вы это советуете???
Наверно я неправ если думаю что прерывание по входу, или по какому либо событию отрабатывает только один раз на возникновение этого события???
Задержку внутри прерываний можно организовать только циклом, если выход можно обновить только после окончания прерывания, то в этом контроллере не получится включать разные выхода в разное время в течении одного прерывания.
Запустить несколько прерываний одновременно? Одновременно будет выполнятся только одно прерывание с самым старшим приоритетом, после его выполнения следующее с меньшим. обычно так и в контроллерах и в компьютерах.
Попробуйте сделать фазоимпульсное на 4 симистора в каждый полупериод до 85-90% от полупериода. Я за это не берусь, т.к. с этим контроллером знаком поверхностно. Я просто подкинул идею из своего опыта на очень стареньком контроллере, в котором for даже небыло, но были обратные переходы по условию. и немедленная регенерация выхода по команде
Про "чудеса" улыбнуло... действительно нужно понимать простую истину что время на месте не стоит и прерывание может появится в любой момент исполнения основной проги. даже в тот момент когда для выполнения какой то функции уже прочитана часть Dint а прерывание уже изменило значение на отрицательное? с каким числом тогда отработает функция если проц читает из памяти только по 16 бит? что в этом сложного?
Дмитрий Артюховский
30.11.2010, 09:02
в этом контроллере только прерывание таймера ... прерываний по входу, да и не каких других, разработчики нам не дают ((((.. поэтому только сканирующий опрос и задержки выполняем расчетом числа циклов прерывания... поэтому для фазоимпульсного управления заводим детекторы нуля на быстрые входы, ловим нулевой цикл по каждому входу и считаем нужное количество счетчиков для определения момента формирования импульса открытия тиристора... ну и добавляем еще пару импульсов для гарантированного открытия )) так что 4 канала легко, но это сожрет все "вкусные" ресурсы контроллера и практического смысла в этом я не вижу
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot