Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 21

Тема: формирование импульсов заданной длины на плк110

  1. #11

    По умолчанию

    сделал пока в простом виде без прерываний - результат удручающий. при цикле 1мс выходной импульс скачет на 5 - 10 мс по длительности. никак не ожидал такого поворота. сейчас буду делать через быстрые входы/выходы с усилителем и через обработчик прерываний. может там оно станет лучше. управляю несколькими соленоидами, постоянство времени срабатывания крайне критично для процесса.

  2. #12

    По умолчанию

    о каком плк идет речь? конкретно модель и версия прошивки.

  3. #13
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    все правильно.таймер 1мс вы не сможете использовать из-за того, что цикл от 1мс.
    я сам жду плк 110(обещают к концу декабря), для решения задачи через таймер 20мкс, правда задержек использовать не планирую.
    у меня просто критично само время цикла.
    напишите пожалуйста, какой результат получите.

  4. #14
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,127

    По умолчанию

    Цитата Сообщение от Goga2000 Посмотреть сообщение
    сделал пока в простом виде без прерываний - результат удручающий. при цикле 1мс выходной импульс скачет на 5 - 10 мс по длительности. никак не ожидал такого поворота. сейчас буду делать через быстрые входы/выходы с усилителем и через обработчик прерываний. может там оно станет лучше. управляю несколькими соленоидами, постоянство времени срабатывания крайне критично для процесса.
    А что разве соленоид 1мс отработает?круто.

  5. #15

    По умолчанию

    Цитата Сообщение от Александр Приходько Посмотреть сообщение
    о каком плк идет речь? конкретно модель и версия прошивки.
    ПЛК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.

  6. #16
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    вы лучше при одном вызове устанавливайте переменную, при следующем - сбрасывайте и считайте вызовы счетчиком. при достижении нужного значения выполняйте необходимое действие.
    вызовы у вас идут через постоянное время кратное 20.

  7. #17

    По умолчанию

    если прога в контроллере укладывается в 1 мс, почему-бы не считать эти циклы после прихода сигнала? ну на худой конец суммировать прошлые значения времени цикла из статистики если у контроллера цикл плавает.

    ну и как вариант подвесить контроллер циклом For или While в прерывании от входа на нужное время. но тут засада, если контроллер не поддерживает немедленной регенерации выхода.
    если поддерживает, то таким способом можно организовать даже фазоимпульсное управление кучей симисторов. Но нужно не забыть что основной проге тоже нужно время для работы предусмотреть
    Последний раз редактировалось BETEP; 27.11.2010 в 19:44.

  8. #18

    По умолчанию

    если дискретность порядка 1 мс, то единственный способ решения - использование быстрых входов - выходов и прерываний. (старик Котельников говорил что дискретизация минимум в два раза чаще чем требуемая частота ). Точность отработки прерываний (20мкс) достаточно высокая, вот внутри прерывания и делайте счетчик количества прерываний - это будет ваш таймер, рассчитать сколько прерываний будет за мс вроде не сложно.... циклы for? while и прочие способы задержек должны быть прочно забыты при программировании ПЛК. Быстрые выходы регенерят сразу после завершения очередного прерывания, поэтому можно и фазоимпульсное делать ))) но их только 4 штуки. Да, важным моментом является синхронизация переменных прерывания и основной программы.... если не хотите чудес, то переменные прерывания должны считываться в основной цикл посредством своих копий, один раз в начале цикла.
    Можно конечно извратиться и установив длительность основного цикла 0 мс, выполнять отсчет пауз по часам реального времени... но флуктуации будут большими...
    Последний раз редактировалось Дмитрий Артюховский; 29.11.2010 в 10:40.

  9. #19

    По умолчанию

    для взаимодействия между прерыванием и основной программой без "чудес" достаточно выполнять 2 простых правила.

    1. переменная должна быть простого типа (byte, Word, Dword, Nt, Dint)
    2. переменная должна писаться/читаться только по 1 разу. т.е. в основной программе в одном месте пишем, в прерывании в одном месте читаем. и наоборот.

  10. #20

    По умолчанию

    Цитата Сообщение от Дмитрий Артюховский Посмотреть сообщение
    Точность отработки прерываний (20мкс) достаточно высокая, вот внутри прерывания и делайте счетчик количества прерываний - это будет ваш таймер
    т.е. в этом контроллере кроме прерываний по входу есть прерывания по расписанию и можно запустить очень шустрые цыклы в 20мкс и при этом останется время на работу основной проги и прочие хоз.нужды контроллера? т.е. Вы это советуете???

    Наверно я неправ если думаю что прерывание по входу, или по какому либо событию отрабатывает только один раз на возникновение этого события???
    Задержку внутри прерываний можно организовать только циклом, если выход можно обновить только после окончания прерывания, то в этом контроллере не получится включать разные выхода в разное время в течении одного прерывания.
    Запустить несколько прерываний одновременно? Одновременно будет выполнятся только одно прерывание с самым старшим приоритетом, после его выполнения следующее с меньшим. обычно так и в контроллерах и в компьютерах.

    Попробуйте сделать фазоимпульсное на 4 симистора в каждый полупериод до 85-90% от полупериода. Я за это не берусь, т.к. с этим контроллером знаком поверхностно. Я просто подкинул идею из своего опыта на очень стареньком контроллере, в котором for даже небыло, но были обратные переходы по условию. и немедленная регенерация выхода по команде

    Про "чудеса" улыбнуло... действительно нужно понимать простую истину что время на месте не стоит и прерывание может появится в любой момент исполнения основной проги. даже в тот момент когда для выполнения какой то функции уже прочитана часть Dint а прерывание уже изменило значение на отрицательное? с каким числом тогда отработает функция если проц читает из памяти только по 16 бит? что в этом сложного?
    Последний раз редактировалось BETEP; 30.11.2010 в 00:27.

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •