Не смею оспаривать. Я просто исхожу из соображений минимизации кода.
Вид для печати
Расскажу о том, как тестируют эти ФБ.
Берём, например, блок для ABZ энкодера.
Из ST сам собой генерируется следущий java код.
Тут и команды для процессора, и вспомогательные методы, чтобы обращаться ко входам-выходам ФБ не через регистры процессора, а в человекопонятной форме setA/setB/getPosition и т.п.
Вложение 26919
Потом пишем тест: подаём по очереди значения на входы A/B и смотрим правильно ли блок на них реагирует.
Вложение 26918
Так же есть аналогичный тест на вращение в другую сторону.
Запускаем тесты, и видим, что работает:
Вложение 26920
Для полноты картины можно добавить тестов, когда крутим туда-сюда, в разные стороны и т.п., но и сейчас уже должно быть хорошо.
Аналогичный тест и для блока "управления мотором":
Вложение 26921
Теперь можно хоть как менять сами блоки или компилятор -- тесты сразу покажут, если поведение вдруг сломается.
Владимир Ситников
Наконец-то появилось время сесть на мой проект. Начал разбираться с PRU. Появились грабли.
Сделал простенький проект чисто для отработки моей темы, и при добавлении библиотеки pru_cutter.lib при компиляции практически пустого проекта получаю ошибку:
Вложение 27514
Причем при неиспользовании FB PRU в проекте.
Так же не совсем понятно, как конфигурировать Fast Discrete Input и Fast Discrete Output в конфигурации ПЛК. Ставить Direct Control?
Насколько я понял, выходная переменная VALUE FB PRU_ABZ имеет тип WORD. В моей задаче используется энкодер 360имп\об, причем в работе установки есть ситуация, когда показания энкодера могут иметь отрицательные значения. Хотелось бы иметь тип этой переменной INT, что бы не заморачиваться с лишними преобразованиями.
Ошибки "PRU_FB_GETPARAMETER" означают, что нужно добавить библиотеку pruaccesslib.lib
Сама библиотека находится тут: http://www.owen.ru/forum/showthread.php?t=22169 (pack1.zip)
Без разницы как. Всё равно конфигуратор с этими выходами работать не будет. Вернее, через конфигуратор будут работать только fast out1 и fast out2.
out3 out4 же будут работать только через PRU0 (т.е. через программу)
Пока WORD.
За время пути, PRU программирование успело подрасти, и можно всю программу для управления быстрыми входами-выходами написать в Hardella (ну, это на случай, если логика управления изменится)
Владимир Ситников
Залил все нужные библиотеки во все нужные места, загрузил программу, записал файл PRU0.PRG в ПЛК, разобрался с INT\WORD. Заработало.
Однако не так как ожидалось. Итак, проблемы:
1. Энкодер считает все импульсы по всем фронтам. В результате я имею показания -1440...1440. Решил банальным делением на 4 с отбрасыванием дробной части (TRUNC).
2. Счетчик считает по входу FDI1, т.е. с одного из входов энкодера. А должен считать со входа FDI4 (FDI1=A, FDI2=B, FDI3=Z энкодера).
3. После снятия сигнала enable со входа FB PRU_CUTTER выход FDO3 остается активным. Хотелось бы, что бы этот вход имел FALSE при enable = FALSE в любой ситуации. А так же, чтобы PRU_CUTTER не считал при enable=FALSE.
----------------
По поводу видео - пока еще не готово, но задумал собрать эмулятор сервопривода на шаговом движке, жду комплектующие.
Ну, можно пообсуждать бага это или фича.
А в целом обработка энкодера устраивает?
Т.е. счётный вход совсем отдельно?
Я почему-то решил, что считать энкодер нужно.
Считать нужно передние фронты?
Да, режим "аварийной остановки" не был предусмотрен.
В коде это видно: http://www.owen.ru/forum/showthread....l=1#post223074 (см. последнюю картинку -- блок PRU_CUTTER)
Оттуда же следует и обходной вариант: если изменить runLength в 0, то блок остановится.
Но, да, логичнее будет, если оно и по сбросу enable будет останавливаться.
Я понемногу делаю сайт с документацией для среды -- можно пример использовать как "стандартный пример", если не возражаете.
Ну, с фотографией установки и т.п. По-моему, хороший пример. А "реальность" объекта сильно улучшит качество самого примера.
Да. Мои опасения только в том, что насколько мне известно, операция деления занимает много процессорного времени. Именно поэтому я стараюсь свести к минимуму всю арифметику в главном цикле.
Счетный вход именно отдельно, т. к. на него идет сигнал с другого устройства.
Без разницы. Главное, что бы не было пропусков.
runLength в процессе работы меняться будет крайне редко, и поэтому лучше сделать останов счета и гашение выхода по сигналу enable.
Не возражаю. Готов даже предоставить весь проект модернизации термоформовочной машины Meaf серии BMS600, естественно, когда он будет готов. Однако с реальным "воплощением в железо" не могу назвать даже примерных сроков, т. к. работа ведется по остаточному принципу на перспективу.
Есть в логике машины ситуация, когда транспорт управляется в ручном режиме (заправка материала), причем движение может быть в любую сторону. Именно в этой ситуации и надо что бы счетчик не считал, что бы не накапливать "лишние" показания. Хотя, если сброс счетчика делается по переднему фронту сигнала enable, то данная проблемка не актуальна.
По факту, к этому входу будет подключаться либо настоящий энкодер с ценой 500-1024 имп\об (зависит от конкретной модели), либо выход сервопривода, который эмулирует "энкодерный" сигнал. Настоящий энкодер устанавливается непосредственно на вал двигателя привода транспорта. Будет использоваться только одна фаза, поскольку быстрых входов на ПЛК всего 4 шт, 3 из которых заняты под "главный" энкодер.
Задокументировал пример тут: https://hardella.com/docs/pru/examples/material-cutter/
Код входит в стандартную поставку Hardella 1.6.0 -- так что можете упражняться.
Владимир Ситников
Спасибо. Очень увлекательный ресурс. Как раз завершаю работу над эмулятором сервопривода. Вероятно после новогодних каникул предоставлю свою редакцию PRU-блоков, а так же, если все заработает, то и воплощение в "железе", но пока только эмуляцию. По поводу реализации на реальной машине не могу назвать даже примерных сроков, т. к. данное решение зависит не от меня.
Последние сообщения, касающиеся Hardella, были перенесены в соответствующую тему:
http://www.owen.ru/forum/showthread.php?t=23013&page=29
Прошу все обсуждения, касающиеся данного ПО, вести в указанной теме, а также на форуме разработчика.
Сделал эмулятор сервопривода на автономном контроллере шагового двигателя (нонейм) + драйвер ТВ6600 + ШД Nema23 56mm + энкодер Baumer 500имп\об.
В виду невысоких скоростных параметров контроллера не получилось добиться максимальных оборотов ШД. Ориентировочная скорость вращения ШД получилась около 750 об\мин. Срывов счета не наблюдалось. Однако наблюдается переезд после снятия команды работы с контроллера ШД. Переезд примерно 4-6% от заданных параметров.
Во вложении файлы проекта и подправленный проект PRU.
Счет счетчика по входу FDI4 не останавливается после снятия команды enable, сброс происходит по переднему фронту enable.
Выходы FDO2..4 используются для управления приводом (частотником) транспорта. Выход FDO1 может при необходимости использоваться из хост-программы как обычный выход.
Доброго времени суток!!!
У меня ПЛК 110-60 К.М. (старый)и два энкодера подключенных на быстрые входа как Fast encoder. Один из энкодеров стоит на вибростоле через амартизирующие проставки и на самом энкодере нет вибрации, а на вал куда крепиться энкодер прикручен механизм подачи бетона и сам вал имеет возможность перемещения вперед-назад (от вибрации и "кривой" конструкции) на какие-то 1-2мм. Энкодер на 10000 имп/об. весь ход 960 имп вперед и назад до 0 имп. При выключеном вибростоле счет идет ровно и правильно, все работает а при включеном начинает бегать хаотично(из-за "кривой" конструкции) хотя сам механизм стоит на месте. Так вот вопрос: подскажите или направьте в правильном направлении, как обработать word который приходит с входов энкодера для игнорирования лишних движений вала??? Пробовал сделать retain переменную в которую по остановке писал положение энкодера, но тогда когда показания прыгали от 960-0 мне выдавало 65535 в этой переменной(максимальное word), а мне надо всего 960???
никто разобраться помочь не желает?
ГУРУ вы где?:)
Энкодеры на А и В подключены? Есть муфты как пружины гибкие... Они помогут.
да А и В. Есть муфты, но дело в механике!!!! люфт во время вибрации между шестернями передается на вал энкодера и я так понимаю он в свою очередь считает ипульсы по фронту и в зависимости от того как остановился привод считает вперед или назад. Мой вопрос о том как остановить счет со входа энкодера когда он не используется (то есть привод доехал и встал, а энкодер должен перестать считать)????
Или программу пример как обработать энкодер и тогда во время простоя я ее буду выключать и вибрация не будет учитываться!!!
А не нужно впадать в ступор.
Либо нужно проверить код работы со значением энкодера (если ПЛК не перегружать, то и вибрацию оно должно нормально отрабатывать)
Либо (если уж так не терпится завораживает обработку энкодера) действительно не учитывать энкодер в момент Ы.
Либо (если прямо совсем нужно ставить энкодер на паузу), то брать Hardella и обрабатывать энкодер там.
Но, наверняка достаточно будет привести КДС в порядок, и наверняка никакие паузы энкодера не нужны.
К работе ПЛК нет притензий. Через fast encider все хорошо считает без пропусков и с большим запасом по скорости(я энкодер крутил с гораздо большей скоростью и он мне все считал без пропусков). ПЛК не перегружен. В том-то и дело, что привод стоит а импульсы идут то в++ то в-- их не одинаковое кол-во все от времени вибрации зависит и в каком месте остановился энкодер (я так понимаю на каком фронте энкодера). Просто конструкция такая, что между зубьями шестеренок есть люфт и энкодер считает все импульсы при вибрации, при чем в обе стороны.Цитата:
Но, наверняка достаточно будет привести КДС в порядок, и наверняка никакие паузы энкодера не нужны.
как это сделать??? ведь записать в %IW0.0 ни чего не получается!!!!!Цитата:
Либо (если уж так не терпится завораживает обработку энкодера) действительно не учитывать энкодер в момент Ы.
я не знаю что это, но погуглю))))Цитата:
Либо (если прямо совсем нужно ставить энкодер на паузу), то брать Hardella и обрабатывать энкодер там.
Это пока то что пришло в голову полазив по всем форумам((((
Чуть позже опробую этот кусок
Panalexfix
У Вас энкодер 10000 об\мин, а нужно всего лишь 960 импульсов. Может стОит присмотреть другую модель, с меньшим разрешением?
Другой вариант.
Поскольку скачки связаны именно с вибрацией, то нужно рассмотреть возможность использования гибкой связи. Т. е. сам энкодер закреплен на невибрирующей поверхности, а вращение ему передается через гибкое соединение. Причем на стороне энкодера не должно быть легкого вращения, т. е. нужно демпфировать вращение для успокоения.
Ну и вариант с Hardella не стОит сбрасывать со счетов.
Всем спасибо!!!!
Решил проблему координально без изменения программы, к стати или написал криво или на старых ПЛК 110-60 не работает вообще то, что выше выложил. В общем долго всматривался в работу энкодера и механизма. Косяк в том что агрегат находится далеко от компа и выяснил, что излишняя вибрация передается через соединительную муфту вала энкодера и привода, так-как сделана она из обычной резиновой шланги хоть и мягкой, но не на столько чтоб гасить вибрацию стола. Чтоб проверить догадки взял обычную пружину с нужным диаметром и через нее соединил. И тут все заработало. Еще раз спасибо всем!!!! А на счет Hardella обязательно посмотрю интересно уж очень)))))))
Приветствую!
Впервые столкнулся со связкой плк+энкодер, не совсем ясно как реализовать задачу и какими средствами я обладаю в лице codesys и библиотек.
Задача: Асинхронный двигатель 750 об/мин с энкодером (сейчас экспериментирую с 250имп/об) на валу возит по салазкам устройство, в зависимости от позиции этого самого устройства включаются/выключаются другие вспомогательные устройства. С реализацией всего думаю вопросов не возникнет, проблема в обработке данных с энкодера. Устройство ездит вперед и назад (291 мм в одну сторону). При включении лини перед началом работы необходимо реализовать сброс на ноль по ВБИ. От позиции этого же устройства зависит скорость его перемещения, т.е. задание на ПЧ.
Так вот подключил AB на FDI1, FDI2 - показания вижу, считает в обе стороны, за оборот 1000имп, но думаю не проблема могу поделить на 4. Не пойму как реализовать обнуление по вкл DI? Возможно есть готовые функции для подобных задач?
Да, с ST знаком очень слабо, получится реализовать в CFC?
ps С библиотекой oscat работает, считает в обе стороны, сброс есть, по-прежнему 1000 имп. на оборот, но стоит чуть прибавить скорость считает меньше, если крутить еще быстрее начинает считать в противоположную сторону(пробую на столе).
acs.ufk
Стандартными библиотеками Овен НЕ получится сделать сброс энкодера по желанию. Столкнулся с подобной проблемой, решил с помощью HardellaIDE (разработка Владимира Ситникова).
Пропуски и неадекватность счета происходит потому, что библиотека оскат работает в основном цикле ПЛК на основном просцессоре. Проект Hardella использует сопроцессор быстрых входов вне цикла основного процессора ПЛК, и поэтому не зависит от нагруженности ПЛК, и позволяет считать импульсы до 100кГц без пропусков и ошибок.