Вход

Просмотр полной версии : ПЛК 210 не обнуляется счетчик оставшихся импульсов на высокочастотном выходе.



Sergey7786
07.11.2024, 22:22
Здравствуйте. Работаю с ПЛК Овен 210-03, Среда CoDeSys v 3.5 SP17 Patch 3+
Использую первый выход (Выход1) на LeftSide как Генератор импульсов для управления драйвером шагового двигателя. Генератор импульсов имеет Регистр "Количество импульсов генератора (запись)" и "Осталось сгенерировать импульсов". Я назначил в регистр "Количество импульсов генератора (запись)" переменную SetCountPWM: UDINT; а на регистр "Осталось сгенерировать импульсов" переменную LeftCountPWM: UDINT;
В чем проблема. Когда я загружаю число в регистр "Количество импульсов генератора (запись)" переменную SetCountPWM: UDINT всё нормально, импульсы загружаются и начинают расходоваться на выдачу. Когда мне необходимо срочно остановить генерацию и удалить число из регистра "Осталось сгенерировать импульсов" у меня не получается это сделать. Я пишу присвоение переменной 0, но в регистре продолжает находиться число оставшихся импульсов. Причем иногда удаление происходит, иногда не происходит. В последний раз у меня получился костыль, когда я, используя язык SFC поставил в шаге запись переменной в ноль и условие завершения шага "счетчик оставшихся импульсов равен 0 И время работы шага больше 100мс", то есть не производить 100мс ничего далее, после подачи команды на обнуление счетчика оставшихся импульсов.
Прошу помощи разъяснить что я делаю не так и как оптимизировать загрузку и удаление чисел из регистров высокочастотного выхода без костылей с задержкой шага. Заранее спасибо.

Евгений Кислов
08.11.2024, 06:13
Добрый день.


Прошу помощи разъяснить что я делаю не так

Для этого надо понять, что вы делаете.
Свяжитесь, пожалуйста, со мной через телеграм (см. в подписи) или напишите на support@owen.ru
Подготовьте доступ по AnyDesk для демонстрации ситуации.

Николай Суриков
08.11.2024, 06:46
Если посмотреть на пиктограммы переменных, то можно понять, что одни предназначены для записи, а другие для чтения.
Следовательно "Количество импульсов генератора (запись)" предназначена для записи значения и установки количества импульсов, а переменная "Осталось сгенерировать импульсов" предназначена только для чтения.
79910

Sergey7786
08.11.2024, 09:58
Если посмотреть на пиктограммы переменных, то можно понять, что одни предназначены для записи, а другие для чтения.
Следовательно "Количество импульсов генератора (запись)" предназначена для записи значения и установки количества импульсов, а переменная "Осталось сгенерировать импульсов" предназначена только для чтения.
79910

Тогда получается чтобы обнулить регистр "Осталось сгенерировать импульсов"(только чтение) мне нужно записать 0 в регистр "Количество импульсов генератора(запись" и подождать один цикл чтобы счетчик тоже встал в ноль?
У меня проблема в том, что в регистре "Осталось сгенерировать импульсов"(только чтение) при срочной остановке остаётся некоторое количество импульсов, которые потом добавляются к новому заданию. Я, вот, ищу эффективную мгновенную очистку счетчика оставшихся импульсов.

Николай Суриков
08.11.2024, 11:44
Тогда получается чтобы обнулить регистр "Осталось сгенерировать импульсов"(только чтение) мне нужно записать 0 в регистр "Количество импульсов генератора(запись" и подождать один цикл чтобы счетчик тоже встал в ноль?
У меня проблема в том, что в регистре "Осталось сгенерировать импульсов"(только чтение) при срочной остановке остаётся некоторое количество импульсов, которые потом добавляются к новому заданию. Я, вот, ищу эффективную мгновенную очистку счетчика оставшихся импульсов.

К сожалению область в которой я использую ПЛК не требует работы с быстрыми входами и выходами, по-этому нет практического опыта.
Скорее всего так и есть.
Записать 0 --- подать команду пуск --- подать команду стоп --- записать количество импульсов --- подать команду пуск

Sergey7786
08.11.2024, 12:01
К сожалению область в которой я использую ПЛК не требует работы с быстрыми входами и выходами, по-этому нет практического опыта.
Скорее всего так и есть.
Записать 0 --- подать команду пуск --- подать команду стоп --- записать количество импульсов --- подать команду пуск


Из того что я выяснил на текущее время это как вы и написали. Счетчик оставшихся импульсов никак не чистится. Только обнуляется последующей новой командой "Количество импульсов генератора(запись)" :=0 импульсов. То есть мне нужно снова поехать куда-то, но на 0 импульсов чтобы счетчик обнулился. Иначе никак. В обще прекрасно. Лишняя команда на движение чтобы просто обнулить счетчик. Никакого условного CLEAR_COUNTER:=TRUE в функционале генератора импульсов нет. Жаль.

МихаилГл
08.11.2024, 12:51
Здравствуйте. Работаю с ПЛК Овен 210-03, Среда CoDeSys v 3.5 SP17 Patch 3+
Использую первый выход (Выход1) на LeftSide как Генератор импульсов для управления драйвером шагового двигателя. Генератор импульсов имеет Регистр "Количество импульсов генератора (запись)" и "Осталось сгенерировать импульсов". Я назначил в регистр "Количество импульсов генератора (запись)" переменную SetCountPWM: UDINT; а на регистр "Осталось сгенерировать импульсов" переменную LeftCountPWM: UDINT;
В чем проблема. Когда я загружаю число в регистр "Количество импульсов генератора (запись)" переменную SetCountPWM: UDINT всё нормально, импульсы загружаются и начинают расходоваться на выдачу. Когда мне необходимо срочно остановить генерацию и удалить число из регистра "Осталось сгенерировать импульсов" у меня не получается это сделать. Я пишу присвоение переменной 0, но в регистре продолжает находиться число оставшихся импульсов. Причем иногда удаление происходит, иногда не происходит. В последний раз у меня получился костыль, когда я, используя язык SFC поставил в шаге запись переменной в ноль и условие завершения шага "счетчик оставшихся импульсов равен 0 И время работы шага больше 100мс", то есть не производить 100мс ничего далее, после подачи команды на обнуление счетчика оставшихся импульсов.
Прошу помощи разъяснить что я делаю не так и как оптимизировать загрузку и удаление чисел из регистров высокочастотного выхода без костылей с задержкой шага. Заранее спасибо.


Из того что я выяснил на текущее время это как вы и написали. Счетчик оставшихся импульсов никак не чистится. Только обнуляется последующей новой командой "Количество импульсов генератора(запись)" :=0 импульсов. То есть мне нужно снова поехать куда-то, но на 0 импульсов чтобы счетчик обнулился. Иначе никак. В обще прекрасно. Лишняя команда на движение чтобы просто обнулить счетчик. Никакого условного CLEAR_COUNTER:=TRUE в функционале генератора импульсов нет. Жаль.

А как в документации: CODESYS V3.5. Описание таргет-файлов, - не пробовали:
79918

Sergey7786
08.11.2024, 16:33
Очень интересно. А по какому адресу находится канал Запустить генератор? Это Выход1?

МихаилГл
08.11.2024, 16:38
Очень интересно. А по какому адресу находится канал Запустить генератор? Это Вход1?

На скрине Николая Сурикова этот бит есть. Вы не через шаблон работаете?

PS Блин, какой шаблон, это же интегрированные в плк выхода...

Sergey7786
08.11.2024, 16:49
79929
А у меня нет настроек запуска генератора! Таргет-файл поврежденный?

Евгений Кислов
08.11.2024, 16:55
79929
А у меня нет настроек запуска генератора! Таргет-файл поврежденный?

У вас корректный таргет-файл.
Скриншот Михаила касается, естественно, не той линейки ПЛК, которую используете вы (ПЛК210-0x), а новой (ПЛК210-1x).

Ручное распределение памяти, которое видно на вашем скриншоте (синие М) - тоже сомнительный подход.
https://www.owen.ru/forum/showthread.php?t=28167&p=305691&viewfull=1#post305691

МихаилГл
08.11.2024, 16:56
79929
А у меня нет настроек запуска генератора! Таргет-файл поврежденный?

У вас похоже не генератор а шим... Могу врать, надо смотреть. Но я уже не на работе. Кстати в доке, которую я дал, там говорится про шим и т.д. Без плк не могу подсказать, возможно надо где-то поменять настройки типа выхода.

PS Ну вот и гвардия подоспела и напихала полные карманы огурцов мне..

Sergey7786
08.11.2024, 17:09
У вас корректный таргет-файл.
Скриншот Михаила касается, естественно, не той линейки ПЛК, которую используете вы (ПЛК210-0x), а новой (ПЛК210-1x).

Ручное распределение памяти, которое видно на вашем скриншоте (синие М) - тоже сомнительный подход.
https://www.owen.ru/forum/showthread.php?t=28167&p=305691&viewfull=1#post305691

Хорошо. Тогда подскажите пожалуйста как обнулять счетчик оставшихся импульсов если напрямую туда ноль слать нельзя, а управление генератором отсутствует?

МихаилГл
08.11.2024, 17:15
Хорошо. Тогда подскажите пожалуйста как обнулять счетчик оставшихся импульсов если напрямую туда ноль слать нельзя, а управление генератором отсутствует?

4. Для формирования команды остановки генератора импульсов следует записать в канал Количество
импульсов для генерации значение 0. Фактическая остановка генерации происходит в одном из
следующих циклов ПЛК. В течение этого времени (между отправкой команды остановки генерации и
ее выполнением) генерация импульсов продолжается, и значение канала Осталось сгенерировать
импульсов уменьшается. Последний импульс генератора всегда отрабатывается до конца (т. е. в
процессе остановки генератора не может произойти генерации импульса, чья длительность меньше
заданной). После остановки генерации канал Осталось сгенерировать импульсов сохраняет свое
последнее значение до записи нового значения в канал Количество импульсов для генерации, что
приведет к началу генерации новой порции импульсов. Новое значение канала Количество
импульсов для генерации приводит к запуску генерации импульсов только в том случае, если
текущее значение данного канала – 0.

Сейчас вроде правильно скопировал, для ПЛК-0Х

Sergey7786
08.11.2024, 17:40
4. Для формирования команды остановки генератора импульсов следует записать в канал Количество
импульсов для генерации значение 0. Фактическая остановка генерации происходит в одном из
следующих циклов ПЛК. В течение этого времени (между отправкой команды остановки генерации и
ее выполнением) генерация импульсов продолжается, и значение канала Осталось сгенерировать
импульсов уменьшается. Последний импульс генератора всегда отрабатывается до конца (т. е. в
процессе остановки генератора не может произойти генерации импульса, чья длительность меньше
заданной). После остановки генерации канал Осталось сгенерировать импульсов сохраняет свое
последнее значение до записи нового значения в канал Количество импульсов для генерации, что
приведет к началу генерации новой порции импульсов. Новое значение канала Количество
импульсов для генерации приводит к запуску генерации импульсов только в том случае, если
текущее значение данного канала – 0.

Сейчас вроде правильно скопировал, для ПЛК-0Х

Здесь не понятно что необходимо предпринять чтобы в регистре "Осталось сгенерировать импульсов" принудительно стало 0 импульсов когда я захочу.

По какому адресу находится канал Запустить генератор в ПЛК210-03 если его таргет не отображает его в настройках генератора?

МихаилГл
08.11.2024, 17:51
Здесь не понятно что необходимо предпринять чтобы в регистре "Осталось сгенерировать импульсов" принудительно стало 0 импульсов когда я захочу.

По какому адресу находится канал Запустить генератор в ПЛК210-03 если его таргет не отображает его в настройках генератора?

Внимательно читайте. Там всё написано. Генератор запускается, когда он досчитал предыдущее значение до 0. Т.е. если вы при считающем генераторе запишите новое значение, он должен досчитать да 0, потом снова запуститься. Или если вы сначала запишите в генератор 0.тогда он остановится, но оставшееся число при этом не сбросится. Оно снова начнёт отсчёт, но только когда снова запишите новое число. Не сбрасывается оно в 0.

PS Осталось только проверить написанное в инструкции.

Sergey7786
08.11.2024, 18:07
Не сбрасывается оно в 0.

Вот в этом и проблема. Как мне аварийно остановить движение и продолжить по новому заданию когда в счетчике оставшихся импульсов остались импульсы и они прибавятся в новым?

МихаилГл
08.11.2024, 18:18
Задать 0, потом задать новое значение. Задать 0 это аварийный останов.

Новое значение канала Количество
импульсов для генерации приводит к запуску генерации импульсов только в том случае, если
текущее значение данного канала – 0.

Sergey7786
08.11.2024, 18:29
Задать 0, потом задать новое значение. Задать 0 это аварийный останов.

Новое значение канала Количество
импульсов для генерации приводит к запуску генерации импульсов только в том случае, если
текущее значение данного канала – 0.

У меня едет когда в счетчике оставшихся импульсов есть импульсы. Там просто оставшиеся импульсы добавляются к новым и поездка происходит по более длинному пути.

МихаилГл
08.11.2024, 18:34
У меня едет когда в счетчике оставшихся импульсов есть импульсы. Там просто оставшиеся импульсы добавляются к новым и поездка происходит по более длинному пути.

Дайте фрагмент кода, где вы это делаете. Если эти элементы идут друг за другом, то похоже так и будет. Надо через задержку похоже, или через проверку остановки числа оставшихся импульсов...

Sergey7786
08.11.2024, 19:31
Если эти элементы идут друг за другом, то похоже так и будет. Надо через задержку похоже, или через проверку остановки числа оставшихся импульсов...

Так и есть.
Если блоки перезаписи пачек импульсов идут друг за другом, то импульсы задания суммируются с оставшимися импульсами.
Если между блоками есть задержка, то импульсы задания записываются поверх оставшихся корректно, удаляя их.

Я так делал, я описывал в ОП-посте. У меня вопрос: Можно ли не костылить задержку, или как то принудительно удалять оставшиеся импульсы из счетчика. Ну вот мне например нельзя ставить задержку и гонять быстро по разным координатам.

Евгений Кислов, прокомментируйте пожалуйста необходимость введения задержки между двумя блоками записи импульсов в генераторе импульсов. Какая минимальная задержка допускается и можно ли её избежать?

МихаилГл
08.11.2024, 19:35
Поставьте блок приравнивания к нулю последним. Чтоб при входе в подпрограмму уже был ноль и тогда должно заработать по идее. То есть блок задания нового значения должен быть первым. Надеюсь вы на st пишите. Скрин бы приложили, было бы проще сказать как лучше сделать.

PS Просто линукс присвоит 0 корректно только в конце при выходе из подпрограммы. А при входе уже будет ноль. А так, когда сначала делаете ноль, а потом изменяете, то по идее этому выходу ноль так и не присвоится, и Таггарт не обработает логику корректно.

Sergey7786
08.11.2024, 19:44
Поставьте блок приравнивания к нулю последним. Чтоб при входе в подпрограмму уже был ноль и тогда должно заработать по идее. То есть блок задания нового значения должен быть первым. Надеюсь вы на st пишите. Скрин бы приложили, было бы проще сказать как лучше сделать.

PS Просто линукс присвоит 0 корректно только в конце при выходе из подпрограммы. А при входе уже будет ноль. А так, когда сначала делаете ноль, а потом изменяете, то по идее этому выходу ноль так и не присвоится, и Таггарт не обработает логику корректно.

Не, всё. Это уже выше меня) Спасибо большое за помощь. Я подожду комментария Евгения Кислова по поводу вынужденной задержки между перезарядкой пачек импульсов в генератор.

МихаилГл
08.11.2024, 19:50
Просто все контроллеры работает по такой логике:
Чтение входов
Обработка программы
Запись выходов

А присвоение сначала 0 а потом Х выходу в подпрограмме никогда не приведёт к установке выхода в 0. Это и на сименсе, и на роквеле.

А задержка как раз и позволила выйти из программы, присвоить выходу 0 и дольше заработать. В st я бы просто поменял эти условия местами, и всё по идее заработало бы. Много раз на такое натыкался.

Евгений Кислов
08.11.2024, 19:57
Евгений Кислов, прокомментируйте пожалуйста необходимость введения задержки между двумя блоками записи импульсов в генераторе импульсов. Какая минимальная задержка допускается и можно ли её избежать?

Для каких-то комментариев - нужно предметно обсудить вашу ситуацию и определить ваш настоящий вопрос.
Чтобы это сделать - воспользуйтесь, пожалуйста, рекомендацией из этого поста:
https://owen.ru/forum/showthread.php?t=40466&p=450389&viewfull=1#post450389