Просмотр полной версии : Hardella IDE
Вопрос по модулю FAST_PWM. Возможно ли этот модуль применять в качестве "регулятора" скорости ШД?
Задача такая:
1. Имеются четыре ШД, которые нужно крутить бесконечно, но с разными скоростями.
2. Все ШД крутятся в одном направлении, DIR не нужен в принципе.
3. Все ШД начинают крутиться одновременно, останавливаться одновременно.
4. Разгон\торможение должно быть.
5. Некоторые ШД могут быть отключены программно из хоста.
Думаю делать так:
1. Для каждого канала свой бит Enable, если Enable.xx=FALSE, то FDOxx:=FALSE.
2. Скважность для всех каналов одинаковая и равна 50%.
3. Рампа разгона\торможения делается в хосте.
4. Значение текущей скорости передается в переменную period соответствующего канала.
Будет ли скорость ШД меняться "на лету", т. е. без останова, установки новой скорости и перезапуска процесса?
Если резко поменять period, то возможен пропуск импульсов.
Не думаю, что это будет критично для моей задачи.
Пытаюсь сообразить шнековый дозатор на ШД, там пропуск не так критичен как на каком-нибудь ЧПУ.
Еще вопрос по логике работы собственно Харделлы.
Если я выставляю в конфигурации fixed cicle допустим 10мкс, а в программе использую R_TRIG (F_TRIG), то длительность импульса выхода Q этих триггеров так же будет 10мкс?
Всем доброго времени суток! Народ,помогите новичку! В скором будущем планирую автоматизировать несколько единиц оборудования. Нужен шаговый двигатель.Ранее с ними сталкивался,но управление было от простейшего генератора на логике. Теперь будет использоваться ПЛК. Хотел заказать ПЛК110 с быстрыми выходами,но,почитав форумы,начал сомневаться... Нужна ещё и Hardella,танцы с бубном(не судите строго),с языком ST практически незнаком... Собственно,вопрос:стоит ли заказывать ПЛК110? Может есть другие(не от Овена),которые более оптимизированы к таким задачам? В Melsec,насколько я знаю,есть готовые решения,но контроллеры стоят,как чугунный мост... Стоит ли вообще продолжать изучать КДС? Всем спасибо!
Харделла не так страшна как кажется. Тем более, что на ней уже есть готовые решения для ШД. До четырех ШД можно повесить на один ПЛК110.
Чего нет на ПЛК110, то это специальных заморочек типа "электронного кулачка". Если же нужно просто отсчитать необходимое количество импульсов с разгоном и торможением, то вполне рабочий вариант.
Эти готовые решения можно импортировать в КДС? Если да,то в каком виде? Только ST?
Владимир Ситников
06.12.2019, 16:09
Эти готовые решения можно импортировать в КДС? Если да,то в каком виде? Только ST?
На КДС же можно разные блоки на разных языках делать.
Hardella генерирует ST код. Но его потом менять не нужно. В основной программе его используем как кота в мешке. Передаём параметры "с какой скоростью нужно крутить ШД" и оно крутит.
Основную программу можно хоть на каком языке.
Лучше, конечно, на ST :) , но это не суть.
Для импорта в КДС используется библиотека? Во время движения можно менять скорость?
Владимир Ситников
06.12.2019, 16:22
Для импорта в КДС используется библиотека? Во время движения можно менять скорость?
Есть немного разные блоки. В одном можно, в другом нет.
Hardella генерирует *.exp файл, который импортируется в КДС проект через механизм import, и всё. Библиотеки не нужны.
Ясно... Осталось поставить саму Hardella... При установке вылезает ошибка из-за отсутствия восьмой явы,скачал по ссылке в посте 1223.Там туча exe-файлов,как установить-непонятно((
Владимир Ситников
06.12.2019, 17:19
Ясно... Осталось поставить саму Hardella... При установке вылезает ошибка из-за отсутствия восьмой явы,скачал по ссылке в посте 1223.Там туча exe-файлов,как установить-непонятно((
Нужна 8-ая версия, т.е. JBRSDK8 -> Windows-x64.
Не работает?
До харделлы дело ещё не дошло,не могу поставить яву...По ссылке из поста 1223 скачался архив. Распаковал,но не могу запустить инсталлятор. Там много exe-файлов.Который запускает установку-непонятно...
Шурей86
Отправил в ЛС ссылку на рабочий инстальник явы.
Владимир Ситников
Подскажите пожалуйста по этому (https://owen.ru/forum/showthread.php?t=23013&p=319753&viewfull=1#post319753) сообщению.
Русского языка в Hardella нет??
А зачем? Лично у меня там не было потребности никогда.
Nikolay.L
17.12.2019, 08:41
Владимир Ситников, а ПЛК серии 210 планируешь включить в поддержку Hardellы? Там вроде как до 12/8 быстрых входов/выходов обещают...
И ещё вопрос, а сотрудники ОВЕНа хоть чем нито помогали в разработке Hardellы?
Владимир Ситников
17.12.2019, 13:58
И ещё вопрос, а сотрудники ОВЕНа хоть чем нито помогали в разработке Hardellы?
ОВЕН в прошивке ПЛК сделали возможным отвязать быстрые IO от CoDeSys программы, они рассказали как IO связаны с регистрами PRU процессоров, дали документацию на сам PRU процессор, и ещё они дали формальное согласие на
Владимир Ситников, а ПЛК серии 210 планируешь включить в поддержку Hardellы?
Тут, наверное, нужно в ОВЕН вопрос задать. Буду ли я домой покупать ПЛК210 (с учётом того, что у меня уже установлен 110?) Вряд ли :)
Отсутствие NTP сказывается, и точность времени хромает, но и так норм.
Я так понимаю, архитектура несильно поменялась, и формально смежные подходы вполне могут работать.
Там вроде как до 12/8 быстрых входов/выходов обещают...
Это да. Если на этих выходах управляемые программы делать, так вообще бомба же получится.
Буду ли я домой покупать ПЛК210 (с учётом того, что у меня уже установлен 110?) Вряд ли :)
Отсутствие NTP сказывается, и точность времени хромает, но и так норм.
Я так понимаю, архитектура несильно поменялась, и формально смежные подходы вполне могут работать..
210 программируется в КДС3.5. Соответственно конфигуратор входов/выходов, различного рода мастеров и слейвов и других добавляемых объектов поменялся. NTP присутствует, как ни как на борту линукс
Владимир Ситников
17.12.2019, 14:34
210 программируется в КДС3.5. Соответственно конфигуратор входов/выходов, различного рода мастеров и слейвов и других добавляемых объектов поменялся.
Но само железо по-прежнему ARM и PRU ядра для быстрых IO. Т.е. вполне возможно, что сам подход к программированию PRU тот же самый.
NTP присутствует, как ни как на борту линукс
Я к тому, что в моём ПЛК110 нет NTP. Наверное, можно либо на сокетах написать, либо готовое взять, но я никак не дойду до этого, и раз в год выставляю "точное время".
Но само железо по-прежнему ARM и PRU ядра для быстрых IO.
сама черепаха может выдавать предупреждения подобные этому (https://owen.ru/forum/showthread.php?t=23013&p=300646&viewfull=1#post300646), вот про это я и предупреждаю, да и импорт файлов в проект совсем иной чем в КДС2.3
Nikolay.L
23.12.2019, 20:20
Владимир Ситников, большое спасибо за ответы. У меня появились ещё: возможно ли на базе вашего решения для ПЛК110 создать интерпретатор G-кодов, или что то подобное? Для траектории хотя бы по 2м осям с линейной интерполяцией. С бесшовным переходом между участками.
Владимир Ситников
23.12.2019, 20:27
Владимир Ситников, большое спасибо за ответы. У меня появились ещё: возможно ли на базе вашего решения для ПЛК110 создать интерпретатор G-кодов, или что то подобное? Для траектории хотя бы по 2м осям с линейной интерполяцией. С бесшовным переходом между участками.
Ну, как бы всё к этому и шло. Технически-то и сейчас, наверное, можно сделать.
Но, возможно, стоит доработать regalloc (https://en.wikipedia.org/wiki/Register_allocation) (ну, сейчас PRU программа должна целиком помещаться в регистры и компилятор не умеет временно выгружать переменные из регистров в память)
Р.Александр
26.12.2019, 20:31
Вопрос из практики - в описании ПЛК110 "быстрые выходы" питаются напряжением 12-30 вольт. В то же время все драйвера ШД требуют в качестве Step и Dir уровней 5 вольт. При 12 вольтах тоже работают, но требуется токоограничительный резистор, который может в какой то степени ограничивать допустимую частоту импульсов на входе Step.
Никто не пробовал питать выхода пятью вольтами (то есть, подавать 5 вольт на вход +U )? Просто у меня источник питания дает напряжение +24 и +5. Проверить на практике пока не могу - нет свободного ПЛК.
Да, имеется в виду работа с Hardella, обычный режим - это другое.
Р.Александр
26.12.2019, 20:49
Ну, как бы всё к этому и шло. Технически-то и сейчас, наверное, можно сделать.
Но, возможно, стоит доработать regalloc (https://en.wikipedia.org/wiki/Register_allocation) (ну, сейчас PRU программа должна целиком помещаться в регистры и компилятор не умеет временно выгружать переменные из регистров в память)
Я использовал для этой цели в двухкоординатной системе управления мультиплексор (MUX).
Правда, не получается плавное изменение скорости "на ходу", но ступенчато можно изменять , если число строк не очень большое.
Никто не пробовал питать выхода пятью вольтами (то есть, подавать 5 вольт на вход +U )
1. В ПЛК 110 быстрые выходы выполнены по такому же принципу как и не очень быстрые -. по схеме "отрытый коллектор". Единственное отличие - быстрым требуется внешний источник питания +U. Подавать на него напряжение не рекомендуемое производителем я бы не рекомендовал тоже. Неизвестно как оно себя поведет. А упрощенно логика работы выхода выглядит так: выход OFF - его вывод висит в воздухе, выход ON - вывод замкнут на COM. Если нет питания +U, то вывод висит в воздухе независимо от состояния выхода. Эту фичу можно использовать в качестве аппаратной аварийной защиты. Упрощенно - напряжение на +U можно подавать через большую красную кнопку в виде гриба.
2. В широко распространенных драйверах ШД входа выполнены на оптронах, которым по определению требуется резистор. Иногда этот резистор, с номиналом рассчитанным на амплитуду 5V уже впаян внутри драйвера. Для других напряжений просто добавляется дополнительный. Например я использую 2к2 для +24В, проблем нет.
Р.Александр
27.12.2019, 12:45
1. В ПЛК 110 быстрые выходы выполнены по такому же принципу как и не очень быстрые -. по схеме "отрытый коллектор". Единственное отличие - быстрым требуется внешний источник питания +U. Подавать на него напряжение не рекомендуемое производителем я бы не рекомендовал тоже. Неизвестно как оно себя поведет. А упрощенно логика работы выхода выглядит так: выход OFF - его вывод висит в воздухе, выход ON - вывод замкнут на COM. Если нет питания +U, то вывод висит в воздухе независимо от состояния выхода. Эту фичу можно использовать в качестве аппаратной аварийной защиты. Упрощенно - напряжение на +U можно подавать через большую красную кнопку в виде гриба.
2. В широко распространенных драйверах ШД входа выполнены на оптронах, которым по определению требуется резистор. Иногда этот резистор, с номиналом рассчитанным на амплитуду 5V уже впаян внутри драйвера. Для других напряжений просто добавляется дополнительный. Например я использую 2к2 для +24В, проблем нет.
Согласное описанию контроллера, быстрые выходы собраны не на оптронах, а на полевых транзисторах. Любой резистор представляет из себя вместе с емкостями входа и монтажа RC фильтр, сглаживающий фронты импульсов STEP, чем больше резистор, тем ниже частота среза фильтра и больше сглаживающее действие, что может на больших скоростях приводить к пропуску импульсов, особенно если большой коэффициент дробления.
Поэтому желательно обойтись без резистора.
Там частота не настолько большая, что бы заваливать фронты. Кроме того, резистор уже есть внутри драйвера. На пропуски шагов больше влияют резонансы в ШД, кривая механика и высокие обороты ШД, нежели резистор в цепи управления. У меня на столе лежит гибридный сервоШД, уверенно работает до 105кГц с ранее обозначенным резистором. Причем ограничение по частоте скорее всего со стороны контроллера (клон FX3U).
Если есть желание питать входа драйверов именно +5V, то используйте дополнительный источник питания. Минус Степ\Дир драйвера на выход ПЛК, плюс Степ\Дир на +5V дополнительный. Минус дополнительного источника на СОМ группы быстрых выходов ПЛК.
Р.Александр
27.12.2019, 14:08
Там частота не настолько большая, что бы заваливать фронты. Кроме того, резистор уже есть внутри драйвера. ........
Если есть желание питать входа драйверов именно +5V, то используйте дополнительный источник питания. Минус Степ\Дир драйвера на выход ПЛК, плюс Степ\Дир на +5V дополнительный. Минус дополнительного источника на СОМ группы быстрых выходов ПЛК.
На частотах порядка 100 килогерц и выше уже становится на осциллограмме заметно, если резистор больше 1 килоома. Внутри резистор на несколько ом, порядка 20-50, так как сам драйвер работает с уровнями порядка 2,5-3 вольта.
Насчет подключения - так я об этом и говорю, можно ли так использовать. По описанию напряжение не меньше 12 вольт.
Я пробовал подключать прямо без резисторов с питание 12 вольт, у меня четко ШД работал (кратковременно) до частоты порядка 250 килогерц, выше не стал гонять, запас был. Но боюсь спалить входа драйвера.
murdemon
17.01.2020, 21:50
начал парсер gcode ковырять , может тут кому пригодится. на PRU в общем-то 2 функции надо линейное перемещение и круговое реализовать и можно простым gcode управлять шаговиками step dir. выкладывайте сюда, если у кого что получится.
начал парсер gcode ковырять , может тут кому пригодится. на PRU в общем-то 2 функции надо линейное перемещение и круговое реализовать и можно простым gcode управлять шаговиками step dir. выкладывайте сюда, если у кого что получится.
А что надо выкладывать ?
murdemon
26.01.2020, 18:14
прикладывать надо мозги :)
https://youtu.be/S8Z8DCpVsrc
murdemon
30.01.2020, 15:52
наработки небольшие по gcode и другим motion, есть и gcode и cam... не до конца понятно, как эмулировать виртуальный привод в коде.
murdemon
01.02.2020, 21:17
CNC интерполятор и декодер GCODE , есть и круговая и линейная интерполяция можно прикручивать к PRU.
CNC интерполятор и декодер GCODE , есть и круговая и линейная интерполяция можно прикручивать к PRU.
Пояснил бы что к чему прикручивать. В Hardella что надо сделать ?
murdemon
02.02.2020, 12:16
сделать цикл 20мкс, у в нем уставку по позиции в PRU передавать. В PRU расчет сколько надо импульсов сделать чтобы за 20мкс оказаться в той точке (на данном смещении). (те подсчет частоты импульсов) и с интераолятора dx dy передавать каждые 20мкс. как-то так. Нет ПЛК и всего остального. Есть только PI с CAN и сервы с CANOpen , как руки дойдут то буду дальше крутить.
сделать цикл 20мкс, у в нем уставку по позиции в PRU передавать. В PRU расчет сколько надо импульсов сделать чтобы за 20мкс оказаться в той точке (на данном смещении). (те подсчет частоты импульсов) и с интераолятора dx dy передавать каждые 20мкс. как-то так. Нет ПЛК и всего остального. Есть только PI с CAN и сервы с CANOpen , как руки дойдут то буду дальше крутить.
20 мкс будет маловато. За такое время в программе PRU мало что получится сделать. При неизменном времени движения (20 мкс) и переменных расстояниях перемещения режущего инструмента надо будет менять на ходу частоту следования импулсов на быстрых выходах ПЛК. Тут основная проблема разгон и торможение. Еще одна проблема смена на ходу направления движения режущего инструмента.
murdemon
03.02.2020, 10:40
ну на практике наверное не просто , разгоны и тд все софт из Codesys делает. А так знаем что цикл 20мкс, а цикл PRU t , и надо за 20кмс выдать столько-то импульсов , наверное можно организовать. Хотя сам не пробовал с PRU работать. Во вложении пример с GCODE для V3 + коррекция режущего инструмента и тд.
murdemon
03.02.2020, 12:30
Сам писал :) все для людей.
Rake Runner
03.02.2020, 12:41
Сам писал :) все для людей.
Приятно познакомиться, мистер Хилмар.
47035
murdemon
03.02.2020, 12:56
Приятно, мистер Frog.
Добрый день всем! После генерации кода Харделлой и открытия Кодесиса названия всех параметром к конфигурации ПЛК пишутся кракозабрами + какая-то ошибка билда вылезает. При этом код сгенерился нормально.
48048
Собственно код ниже
48049
Собственно что может быть? И да проект под ПЛК73...
Добрый день всем! После генерации кода Харделлой и открытия Кодесиса названия всех параметром к конфигурации ПЛК пишутся кракозабрами + какая-то ошибка билда вылезает. При этом код сгенерился нормально.
48048
Собственно код ниже
48049
Собственно что может быть? И да проект под ПЛК73...
Какой ПЛК73. Hardella работает только на ПЛК110[М02].
Черепаха работает на Яве, которая в свою очередь по умолчанию использует юникод и виндузовый ср1251 превращается в такие символы
Можно сделать экспорт конфигурации и в текстовом редакторе подобрать нужную кодировку, это как один из вариантов
Владимир Ситников
23.03.2020, 18:33
Какой ПЛК73. Hardella работает только на ПЛК110[М02].
Как знать. Как знать.
aRRma99 использует широкоизвестный в узких кругах подход "использовать Hardella не для PRU программирования, а как редактор ST".
Такое, и для ПЛК73 тоже должно работать.
Но, блин, не сказать, что текущее состояние сильно лучше КДС :-/
aRRma99, а какие файлы получаются в итоге?
Можно на содержимое папки c:\...\Project4\target посмотреть?
Владимир Ситников
23.03.2020, 18:34
Черепаха работает на Яве, которая в свою очередь по умолчанию использует юникод и виндузовый ср1251 превращается в такие символы
Как бы да, похоже. Но откуда unicode символы? Вроде, в исходном коде всё латинскими набрано.
Как бы да, похоже. Но откуда unicode символы? Вроде, в исходном коде всё латинскими набрано.
ява проглатывает любую кодировку, а вот компилит и дает на выход в той в которой указано. по крайней мере с теми приложениями с которыми мне приходится работать постоянно за этим приходится следить
Как знать. Как знать.
aRRma99 использует широкоизвестный в узких кругах подход "использовать Hardella не для PRU программирования, а как редактор ST".
Такое, и для ПЛК73 тоже должно работать.
Но, блин, не сказать, что текущее состояние сильно лучше КДС :-/
aRRma99, а какие файлы получаются в итоге?
Можно на содержимое папки c:\...\Project4\target посмотреть?
А зачем Hardella нужна в ПЛК73 ?
Как знать. Как знать.
aRRma99 использует широкоизвестный в узких кругах подход "использовать Hardella не для PRU программирования, а как редактор ST".
Такое, и для ПЛК73 тоже должно работать.
Но, блин, не сказать, что текущее состояние сильно лучше КДС :-/
aRRma99, а какие файлы получаются в итоге?
Можно на содержимое папки c:\...\Project4\target посмотреть?
Даже текущее состояние в разы лучше Кодесиса, а еще и все заработает как надо так вообще! Кстати замечал данную проблему и у самого Кодесиса. Многие студенты которые ставят себе на комп Кодесис видят в конфигурации иероглифы, причем иероглифами написаны прям все слова в конфигурации. Хотя у самого в данный момент нет такой проблемы (только при экспорте из Харделлы)
48062
А зачем Hardella нужна в ПЛК73 ?
Чтобы в 10 раз быстрее набирать и рефакторить код. У меня проекты есть на много тысяч строк и поддерживать их в кодесисе одна боль....
Чтобы в 10 раз быстрее набирать и рефакторить код. У меня проекты есть на много тысяч строк и поддерживать их в кодесисе одна боль....
Вряд ли с Hardella получится лучше чем с CoDeSys. Отец основатель Hardella В.Ситников про это ясно пишет. ;)
Lexey-ru
24.03.2020, 16:16
Добрый день.
Задача не стандартная , управление позиционированием, основанное на четырёх ШД.
Визуально представляет из себя четырёхкоординатный станок, но код динамический, т.е. не прямой алгоритм как на Mach3.
По этому планирую использовать для управления ПЛК.
С ОВЕН110-30М2 немного знаком, но действительно в кодесисе 2.3, по крайне мере не нашёл готовых библиотек, для работы с ШД и сервоприводами.
Наткнулся на данную ветку, скачал hadella IDE 1/7/2 , хотел бы протестировать на столе, но зашёл в тупик, как добавить в конфигурацию ещё дополнительные блоки управления ШД? т.е. всего должно получиться 4 шт.
STEPPER_RPU2 добавил, методом копирования, а прописать в SteppersConfig не получается, окно с кодом не редактируется.
Или проблема в том , что hadella IDE поддерживает максимум 2 ШД ?
Кто нибудь реализовал на железе управление ШД через данную среду?
Заранее благодарю Вас.
Владимир Ситников
24.03.2020, 16:57
Отец основатель Hardella В.Ситников про это ясно пишет. ;)
Я немного не про это пишу.
Я про то, что текущее состояние едва ли лучше КДС (по крайней мере, это моя оценка). Не значит, что лучше не будет.
Возможно, aRRma99 это первый случай использования Hardella для простого программирования.
Даже я свой домашний ПЛК110 по-простому в КДС программировал :-/
Вряд ли с Hardella получится лучше чем с CoDeSys
По факту, оказалось, что и сам стандарт 61131 на удивление кривой.
Например, система типов (signed, unsigned, byte, word и это всё) сделана хаотично, и без какой-либо симметрии.
В результате, несложные конструкции типа -1 уже вызывают кучу вопросов к тому что это должно означать.
И это ещё сверху полируется своеобразным взглядом КДС на стандарты.
Но, конечно, возможность "взять фрагмент кода, вынести в блок" или "объявить переменную по месту" или ещё чего -- можно без проблем дорабатывать и должно быть удобнее.
Ну или вечная тема "любителей конфигуратора" или "любителей modbus библиотеки".
Как раз в Hardella можно было бы сделать нормальный и понятный конфигуратор (который в результате генерировал бы modbus.lib код). Но тут снова: либо никто не понимает, либо уже привыкли.
;)
Тут, конечно, можно было бы посмотреть, что как бы 5 лет прошло.
Но, блин, дальше ШД как-то заинтересованности не слышно.
Вернее, как неслышно. Тут, конечно, регулярно что-то пишут про ШД (ну и да, давно бы пора сделать нормальное изменение скорости на ходу).
И, да, как-то раз меня ни с того ни с сего материально поблагодарили со словами, что станок у них заработал. Это, конечно, здорово.
Владимир Ситников
24.03.2020, 17:18
Или проблема в том , что hadella IDE поддерживает максимум 2 ШД ?
Кто нибудь реализовал на железе управление ШД через данную среду?
Заранее благодарю Вас.
Вот пример проекта с 4 ШД: https://owen.ru/forum/showthread.php?t=23013&p=282856&viewfull=1#post282856
Добрый день.
Задача не стандартная , управление позиционированием, основанное на четырёх ШД.
Визуально представляет из себя четырёхкоординатный станок, но код динамический, т.е. не прямой алгоритм как на Mach3.
Что значит код динамический ?
Lexey-ru
24.03.2020, 22:56
В процессе будут меняться заготовки , высота, диаметры и т.д... соответственно в зависимости от этого будут кардинально изменяться координаты. Цикл исполнения программы бесконечный.
Благодарю за ссылки, буду разбираться, значит можно 4 шд запустить.
Lexey-ru
можно 4 шд запустить.
Да, можно. Но только в одно направление. Харделле доступно только четыре быстрых выхода. Для полноценного командования четырмя ШД требуется минимум восемь. Да, можно в качестве ДИР использовать обычные выходы, однако следует принимать во внимание возможный лаг между работой обычных и быстрых выходов. Например начинать махать Степом после некоей задержки после смены Дира.
Lexey-ru
25.03.2020, 23:22
Мне конечно же необходимо крутить в обои направления.
Можно дополнительные модули расширения установить высокоскоростные. В таком случае не будет дефицита с количеством быстрых выходов.
Владимир Ситников
25.03.2020, 23:33
Мне конечно же необходимо крутить в обои направления.
Можно дополнительные модули расширения установить высокоскоростные. В таком случае не будет дефицита с количеством быстрых выходов.
Правильно. Модуль называется ПЛК110-М02 :)
На других модулях ОВЕН (вроде как) нет возможности точного управления количеством импульсов.
Lexey-ru
26.03.2020, 18:29
Я имел в виду модули расширения :
https://owen.ru/product/moduli_diskretnogo_vivoda_s_interfejsom_rs_485
Владимир Ситников
26.03.2020, 18:37
Я имел в виду модули расширения :
https://owen.ru/product/moduli_diskretnogo_vivoda_s_interfejsom_rs_485
Это я понимаю, но чтобы на выходе МУ что-либо поменялось оно должно получить команду по modbus.
Ну и в МУ нет возможности "генерировать указанное количество импульсов".
В целом, конечно, можно управлять ШД в режиме ШИМ выхода, но точность позиционировать будет плавать (т.к. сигналы по modbus ходят непонятно как)
Доброго времени!
Нужен частотомер на быстрых вх. ПЛК110М02. (от 100 до 10100 Гц)
Решил что надо писать прогу для PRU
но раньше ничего подобного на таких языках не делал.
Наваял вот что:
А как из харделлы скопировать код? )))
прикрепил проект.
если расширение сменить на msd то проект откроется в Hardella?
Идея такова: измеряем длительность паузы между импульсами. И исходя из полученного значения высчитываем частоту.
Если считать что время цикла 1 мкСек.
Но у меня на втором канале IDE подсвечивает переменные красным.
Его, 2 к***** я просто скопировал. И не могу понять что не так сделал.
Владимир Ситников
06.07.2020, 10:18
Доброго времени!
Нужен частотомер на быстрых вх. ПЛК110М02. (от 100 до 10100 Гц)
Решил что надо писать прогу для PRU
но раньше ничего подобного на таких языках не делал.
Наваял вот что:
Это плюс. Вроде, в ПЛК110М02 быстрые входы могут работать в режиме счётчика.
Тогда можно в обычной КДС программе считывать показатель этого счётчика, смотреть сколько оно намотало "за секунду" и усреднять, если нужно.
Так не работает?
Я не к тому, что Hardella не работает, а, скорее, к тому, что простой частотомер на fast counter'ах (из обычного КДС) может оказаться проще и понятнее.
Так сказать, не стрелять из пушки по воробьям.
А как из харделлы скопировать код? )))
Да, это непросто. Либо выделять всё и ctrl+c/v, либо папку с проектом сохранить в zip архив.
Но у меня на втором канале IDE подсвечивает переменные красным.
Переменные объявлены? Нет проблем в духе "русская буква C в названии переменной"?
По-хорошему, если переменные объявлены, то ctrl+пробел в Hardella должно показывать автодополнение и там эти переменные должны быть.
Если перейти на красную переменную (напр CounterCH2), и нажать ctrl+пробел, то что-нибудь будет?
ctrl+пробел = успех.
Хотя переменные объявлены... ну да ладно.
В идеале я пытаюсь добавить управление быстрыми выходами. по достижении заданной частоты. (материал сыпится, время идёт... С кодесис тут наверняка будут мСек плясать не предсказуемо)
ctrl+c/v не получается. Перемешиваются строки...
PROGRAM FAST_COUNTER
variables:
@Export
@Export
inputs : FAST_INPUTS;
CounterCH1 : WORD; (* счётчик для первого канала *)
CounterCH2 : WORD; (* счётчик для второго канала *)
StartCounter1 : BOOL; (* начался отсчёт по первому каналу *)
StartCounter2 : BOOL; (* начался отсчёт по 2 каналу *)
body:
(* первый канал *)
(* проверка флага начатого отсчёта *)
IF StartCounter1 THEN (* если флаг установлен *)
IF R_TRIG(CLK := inputs.in1).Q THEN (* ждём передний фронт второго импульса *)
(* если импульс пришёл *)
counter1 := CounterCH1; (* записываем значение на выход *)
CounterCH1 := 0; (* обнуляем счётчик *)
(* иначе, если флаг начала установлен, но пока нет переднего фронта второго импульса *)
ELSE
CounterCH1 := CounterCH1 + 1; (* считаем циклы *)
END_IF;
(* иначе, если флаг первого импульса не установлен *)
ELSE
IF F_TRIG(CLK := inputs.in1).Q THEN (* ждём заднего фронта первого импульса *)
StartCounter1 := TRUE; (* если импульс пришёл, устанавливаем флаг начала счёта *)
CounterCH1 := CounterCH1 + 1; (* и начинаем счёт циклов *)
END_IF;
END_IF;
(* второй канал *)
(* проверка флага начатого отсчёта *)
IF StartCounter2 THEN (* если флаг установлен *)
IF R_TRIG(CLK := inputs.in2).Q THEN (* ждём передний фронт второго импульса *)
(* если импульс пришёл *)
counter2 := CounterCH2; (* записываем значение на выход *)
CounterCH2 := 0; (* обнуляем счётчик *)
(* иначе, если флаг начала установлен, но пока нет переднего фронта второго импульса *)
ELSE
CounterCH2 := CounterCH2 + 1; (* считаем циклы *)
END_IF;
(* иначе, если флаг первого импульса не установлен *)
ELSE
IF F_TRIG(CLK := inputs.in2).Q THEN (* ждём заднего фронта первого импульса *)
StartCounter2 := TRUE; (* если импульс пришёл, устанавливаем флаг начала счёта *)
CounterCH2 := CounterCH2 + 1; (* и начинаем счёт циклов *)
END_IF;
END_IF;
END_PROGRAM
output counter1 : WORD; (* This variable will be visible in CoDeSys program *) output counter2 : WORD; (* период между импульсами в мкСек Канал ном.2 *)
Хотя вроде ничего. А в блокнот, - так безобразие....
Владимир Ситников
06.07.2020, 10:53
В идеале я пытаюсь добавить управление быстрыми выходами. по достижении заданной частоты.
Да, если управление, тогда действительно можно и в Hardella сделать PRU программу.
Подскажите пожалуйста:
Если я пишу программу для получения информации с быстрых входов (1 и 2) и воздействия на быстрые выходы (с 1-го по 4-ый), мне нужно писать 2 программы? Одна для PRU0, вторая для PRU1. Так?
Где почитать как взаимодействовать между PRU0 и PRU1?. (то есть, - если из пру0 я читаю входы и в зависимости от полученного результата воздействую на выходы 3 и 4, то как посылать данные о текущем состоянии входов на пру1?)
Такая программа для PRU1 корректа?
IF counter1 = FinalValueCH1 AND counter2 = FinalValueCH2 THEN
portion_ready := TRUE;
CASE CurrentOutputs OF
1: FAST_OUTPUTS(out1 := FALSE);
2: FAST_OUTPUTS(out2 := FALSE);
3: FAST_OUTPUTS(out3 := FALSE);
4: FAST_OUTPUTS(out4 := FALSE);
END_CASE;
ELSE
CASE CurrentOutputs OF
1: FAST_OUTPUTS(out1 := TRUE);
2: FAST_OUTPUTS(out2 := TRUE);
3: FAST_OUTPUTS(out3 := TRUE);
4: FAST_OUTPUTS(out4 := TRUE);
END_CASE;
END_IF;
Владимир Ситников
07.07.2020, 11:09
Подскажите пожалуйста:
Если я пишу программу для получения информации с быстрых входов (1 и 2) и воздействия на быстрые выходы (с 1-го по 4-ый), мне нужно писать 2 программы? Одна для PRU0, вторая для PRU1. Так?
https://hardella.com/docs/pru/features-and-limits/#%D0%A5%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80% D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B8-%D0%9F%D0%9B%D0%9A110-%D0%9C02
Первые два быстрых выхода запитаны от PRU0, поэтому если двух достаточно, то обмен городить не нужно.
Если нужен именно обмен между PRU0 и PRU1 (и обмен нужен быстрый), то делать нужно через ассемблерную вставку.
В самой серде, наверное, надо подумать как сделать пересылку данных. Объявлять где-то глобальную переменную что-ли, чтобы можно в pru0 в её записывать, а в pru1 читать.
Владимир Ситников
07.07.2020, 11:14
То есть такая программа для PRU0 корректа?
IF counter1 = FinalValueCH1 AND counter2 = FinalValueCH2 THEN
portion_ready := TRUE;
CASE CurrentOutputs OF
1: FAST_OUTPUTS(out1 := FALSE);
2: FAST_OUTPUTS(out2 := FALSE);
3: FAST_OUTPUTS(out3 := FALSE);
4: FAST_OUTPUTS(out4 := FALSE);
END_CASE;
ELSE
CASE CurrentOutputs OF
1: FAST_OUTPUTS(out1 := TRUE);
2: FAST_OUTPUTS(out2 := TRUE);
3: FAST_OUTPUTS(out3 := TRUE);
4: FAST_OUTPUTS(out4 := TRUE);
END_CASE;
END_IF;
По-хорошему, должна быть ошибка компиляции про out3, out4, т.к. управлять 3-4 выходами из pru0 невозможно.
Ага. Понятно.
Только смущают слова:
наверное, надо подумать как сделать пересылку данных. Объявлять где-то глобальную переменную что-ли
то есть проверенного действом способа пока нет.
Как и какую вставку делать нужно узнавать из документации по AM1808?
Apd.:
However for
passing information between PRUs, each PRU can access the data ram of the ‘other’ PRU through address 0x0000 2000.
Переводчик: Однако для
передавая информацию между PRU, каждый PRU может получить доступ к полосе данных 'другого' PRU по адресу 0x0000 2000.
Как из Харделлы сделать переменные, для их записи из программы для PRU0 в Data RAM1 (PRU1)?
Владимир Ситников
07.07.2020, 12:46
Пишем ASM -- появляется ассемблерная вставка (возможно, ctrl+пробел поможет).
И далее команды типа
-- Передаём данные из PRU0 в PRU1
SBCO R29.b0, 4, 100, 1 ; пишем данные из регистра R29 в память по адресу 100
-- Читаем данные в PRU1 и далее используем их
LBCO R29.b0, 4, 100, 1 ; загружаем данные в регистр R29 из байта по адресу 100
Если не ошибаюсь, то 4 это есть указание на то, что "работаем с памятью другого ядра"
Вроде, вместо регистра в LBCO / SBCO должно быть возможно указывать переменные (но в последнем параметре нужно верно указывать размер читаемых-записываемых данных)
Сейчас Hardella использует память только для обмена с основной программой, поэтому использовать адреса большие 100 безопасно.
Эх...
А про команды ассемблера для этого контроллера где почитать? Если на вскидку? как задать поиск в гугле?
А вообще. Пока откажусь от идеи передавать данные между РПУ((((
Поставлю на костыли (буду работать 2 каналами и переключать их рэлюхами :eek:
А пока скомпилировал проект в Hardella :cool:
скоро запилю на реальное железо и буду тестить.
Владимир Ситников
07.07.2020, 22:26
Эх...
А про команды ассемблера для этого контроллера где почитать? Если на вскидку? как задать поиск в гугле?
Например: "PRU Assembly Instruction User Guide", AM1808
Для обмена нужны инструкции SBCO и LBCO.
Доброго времени.
Испытал в железе.
Основа работает!:cool:
Огромное спасибо Владимиру! (как сдам проект, ещё спасибо "скажу")
Но пока есть момент, измеренные показания очень сильно скачут. +\- 70 Гц.
Может кто может высказать критику по поводу моего кода:
"(* Первый канал *)
IF StartCounter1 THEN (* проверяем флаг начала отсчёта, если счёт идёт то ждём передний фронт второго импульса: *)
IF R_TRIG(CLK := inputs.in1).Q THEN (* если словили передний фронт сигнала то: *)
counter1Hz := Counter1; (* записать значение из счётчика 1 в переменную памяти *)
Counter1 := 0; (* обнулить счётчик *)
ELSE
Counter1 := Counter1 + 1; (* иначе прибавляем к счётчику 1 и ждём в следующем цикле *)
END_IF;
(* флаг начала отсчёта не установлен *)
ELSE
IF F_TRIG(CLK := inputs.in1).Q THEN (* тогда ждём задний фронт сигнала *)
StartCounter1 := TRUE; (* словили задний фронт. Будем начинать счёт. Устанавливаем флаг начала отсчёта. *)
Counter1 := Counter1 + 1; (* прибавляем 1 к счётчику *)
END_IF;
END_IF; "
Весь код, это + ещё один канал и 4 строчки воздействия на выходы.
CoDeSys запрашивает данные каждый новый цикл... (может из за этого косяк?)
Если во время обмена данными, PRU не выполняет программу, тут то погрешность и вылезает? Может можно и нужно сбрасывать измерения которые были не закончены во время когда пришёл запрос от КДС?
Пишу новую "поэму" с усреднением из 10 измерений, но не уверен что это самый лучший вариант, да и обсчёт двух каналов, а потом ещё сложение и деление из 10 измерений... (тут я уже точно выхожу за рамки 1 мкСек.
"поэму" с усреднением из 10 измерений
Может перенести это в основную ПОУ? Т. е. ПРУ будет показывать насчитанное между передними фронтами inputs.in1 без промежуточных данных, а основная программа в ПЛК будет усреднять данные. Вроде даже в библиотеке OSCAT уже есть готовые ФБ усреднения.
Тут вылезают не контролируемые (а так ли это?) задержки реакции выхода на достижение заданного значения.
(из за того что время обработки программы в КДС не стабильное. +\- мСек...)
У меня в коде ошибка. Я не сбрасываю "флаг" что отсчёт уже идёт...
не брезгуйте конструкцией IF...ELSIF
И вместо ФБ ловли фронтов используйте
foo := inputs.in1
(*где то потом*)
IF foo and NOT bar THEN
...
ELSIF NOT foo and bar THEN
...
END_IF;
bar := foo;
должно стать более читаемо и менее затратно
Владимир Ситников
22.07.2020, 08:30
Если усреднять за 16, то вместо деления можно использовать сдвиг -- будет гораздо быстрее.
IF ... IF F_TRIG -- с этим поосторожнее нужно быть. Сам по себе триггер же сбрасывать нужно, а, если внешняя проверка не выполнена, то и триггер не сбросится.
Если есть Hardella проект -- могу прогнать на эмуляторе -- посмотреть сколько тактов занимает программа
Владимир Ситников
22.07.2020, 08:50
На какой частоте приходят данные?
Вообще говоря, обмен с КДС выполняется как часть задержки между циклами. Иначе говоря, PRU прогамма могла бы просто сделать задержку до следующего цикла, но перед этим происходит обмен (если нужен).
Сам обмен довольно быстрый. Вроде, 20нс на переменную или около того.
все ничего, но это что то вирусное
Counter1 := Counter1 + 1; (* прибавляем 1 к счётчику *)
не брезгуйте конструкцией IF...ELSIF
И вместо ФБ ловли фронтов используйте
foo := inputs.in1
(*где то потом*)
IF foo and NOT bar THEN
...
ELSIF NOT foo and bar THEN
...
END_IF;
bar := foo;
должно стать более читаемо и менее затратно
if input.in1 xor x then
x := not x;
if x then
..
else
..
end_if
end_if
имхо еще менее затратно. Тут же какие-то мкс/нс ловят )) ?
не брезгуйте конструкцией IF...ELSIF
И вместо ФБ ловли фронтов используйте
[CODE]
foo := inputs.in1
(*где то потом*)
IF foo and NOT bar THEN
...
Смысл понятен. Спасибо за ответ.
Если усреднять за 16, то вместо деления можно использовать сдвиг -- будет гораздо быстрее.
ЭТО ГЕНИАЛЬНО!!! ))) Если придётся усреднять, то именно так и сделаю!
IF ... IF F_TRIG -- с этим поосторожнее нужно быть. Сам по себе триггер же сбрасывать нужно, а, если внешняя проверка не выполнена, то и триггер не сбросится.
Пытаюсь родить что то иное. Спс за подсказку. Пока, получается, что через раз я должен наблюдать измеренное значение = 1. Надо конечно исправить.
Если есть Hardella проект -- могу прогнать на эмуляторе -- посмотреть сколько тактов занимает программа
По самым грубым подсчётам, 37 команд. То есть примерно 185нСек. (я, правда, да же близко не представляю сколько м.ц. занимают используемые мной команды)
Но тут до 1000 нСек как до луны. Должен уложиться.
Упаковать проект и выложить сюда конечно нет проблем. Но надо ли это...
На какой частоте приходят данные?
Вообще говоря, обмен с КДС выполняется как часть задержки между циклами. Иначе говоря, PRU прогамма могла бы просто сделать задержку до следующего цикла, но перед этим происходит обмен (если нужен).
Сам обмен довольно быстрый. Вроде, 20нс на переменную или около того.
Насчёт обмена понял. С учётом моих частот у меня да же длительность импульса закончится не успеет.
Минимальная частота примерно 700 Гц. То есть по расчётам не более 1428 импульсов.
Максимальная частота 10100 герц. То есть моя программа теоретически пройдёт почти 100 оборотов между импульсами.
Так что ни о каких мкСек речи не идёт))
все ничего, но это что то вирусное
Не понял юмора? что не так? (без сарказма. Действительно не понимаю что не так)
Тут же какие-то мкс/нс ловят )) ?
Неее...))) 10КГц макс.
И ещё один ламерский вопрос))) Надо ли заморачиваться делать защиту от дребезга? или это уже встроено по умолчанию? На харделла.ком вижу 1 строчку что fast_inputs учитывает настройку фильтрации. А где эти настройки по смотреть или\и поменять не нахожу...
(осцилом я вижу не большие помехи на входе... вот и болит голова)
Владимир здравствуйте!
Можете глянуть сколько времени занимает программа?
Что то с усреднением выходит медленно(
На после усреднения я получаю значение 104 импульса. (примерная частота 3КГц)
Владимир Ситников
02.08.2020, 12:56
Вроде, программа-то простая.
Что значит "с усреднением выходит медленно"?
Ещё вспомнил: в program configuration есть галочка "report statistics". Её пробовали?
Тогда в генерируемых Pru0MemoryRead будет возвращаться статистика:
output maxCycleTimeMicros : REAL; (* maximum time it took to perform PRU cycle, microseconds *)
output lastCycleTimeMicros : REAL; (* last duration of the PRU cycle, microseconds *)
output maxOutputWriteTimeMicros : REAL; (* max timestamp of the output write time, microseconds *)
output lastOutputWriteTimeMicros : REAL; (* last timestamp when outputs were written, microseconds *)
Можно прямо в КСД открыть и смотреть сколько времени работает PRU программа.
CycleTimeMicros -- это длительность работы PRU программы (вроде, общая)
OutputWriteTimeMicros -- это длительность обмена из PRU в КДС
max... сейчас вычисляется на КДС стороне, поэтому, да, если иногда циклы долгие, то можно не заметить.
Медленно: - осцилограф говорит что время паузы между импульсами ~285мкСек. А ПРУ программа при добавлении усреднения выводит значение 105.
За совет, спасибо. Попробую.
Пока буду искать косяк в своей программе.
Владимир Ситников
02.08.2020, 14:44
Медленно: - осцилограф говорит что время паузы между импульсами ~285мкСек. А ПРУ программа при добавлении усреднения выводит значение 105.
За совет, спасибо. Попробую.
Пока буду искать косяк в своей программе.
А что всё-таки должна делать программа?
Измерять частоту? И что потом?
Как-никак, если указан цикл 0.5мкс, то программа 570 раз прокрутится за 28
Ещё наблюдение: есть блок PRU_CURRENT_TIME с помощью которого можно получать "количество тактов, пройденных PRU процессором" -- totalCycles
С его помощью можно относительно измерять интервалы времени.
FUNCTION_BLOCK PRU_CURRENT_TIME
output totalCycles : DWORD; (* Total CPU ticks elapsed *)
output prevOutputWriteTime : DWORD; (* Absolute time when previous outputs were written (in CPU ticks) *)
output cycleLength : DWORD; (* PRU cycle length in CPU ticks *)
Например:
FUNCTION_BLOCK FREQ
variables:
input in : BOOL;
output cnt : WORD;
output delta : DWORD;
totalCycles : DWORD;
prevRtrigTime : DWORD;
timer : PRU_CURRENT_TIME;
body:
IF R_TRIG(CLK := in).Q THEN
cnt := cnt + 1;
totalCycles := timer.totalCycles;
delta := totalCycles - prevRtrigTime;
prevRtrigTime := totalCycles;
END_IF;
Тогда detla и будет интервалом между передними фронтами импульсов (единица измерения -- 1 такт, который равен 5нс).
Владимир Ситников
02.08.2020, 15:17
Подал на in1 1..0..1..0 -- программа выполняется за 21..48 тактов (==0.25мкс).
Честно говоря, не понял зачем такие case, у которых все ветки одинаковые (у case всегда выполняется только одна ветка).
По bool команде вкл. выход. Частота начнёт расти. По достижении заданного значения программа выключает выход.
Проблемма в том что оказыватся частота моя очень (за короткий промежуток времени) не стабильна. Как раз ~70 Гц. (судя по осциллографу)
А требуется точность огого (( По расчётам точность получается 37 импульсов. А требуется 56. Теоретически конечно укладываюсь, но практически... пока не получается.
Пока пишу разные варианты. В пн. буду пробовать.
По изменению AverCount измеренное значение пишется в разные регистры. Потом это дело складывается и сдвигается(делим на 16)...
Но потом я понял что проще сразу складывать...
А теперь я понял что и действительно не нужены эти CASE))
Вроде стабилизировалось значение.
Пришёл к выводу что мне 2 канала всё равно не надо. Сложил и их, да усреднил как принято)
В покое, - только 1 единица скачет.
Но при этом чувствует зараза))) Рядом станок зашевелился, показания "в пляс"
Дискретность не наращивал. Т.к. по данным с осциллографа точность измерения слабо увеличится (достаточно низкая частота и довольно большие периоды). А вот разброс из за плавания частоты, прямопропорционально.
github не даёт скачать hardella :(
Владимир Ситников
12.09.2020, 11:23
github не даёт скачать hardella :(
Как не даёт? Какая ошибка? Прямо сейчас проверил -- 1.7.2 mac качается.
Как не даёт? Какая ошибка? Прямо сейчас проверил -- 1.7.2 mac качается.
сервер не найден
это на домашней оптике без антивира с разных браузеров
странно, зато на телефон по мобильной сети скачивается..
Приветствую всех!
Озадачился я тут одним проектом.
Исходные данные: ШД - одна ось, "аналоговые" регуляторы 2шт.
Требуется организовать работу ШД с управлением от регуляторов. Один (Рег1) отвечает за скорость, второй (Рег2) за амплитуду. Траектория работы ШД - синусоидальные колебания. Т. е. Рег2 импульсов вперед\назад со скоростью Рег1, с ускорениями и торможениями (фиксированные). При останове - возврат в нулевую позицию из любого положения.
Нашел в библиотеке ОSСАТ синусный генератор. Думаю его реал-выход превратить в DINT, а уже эти данные передавать в программу в PRU.
Вот думаю как сделать "следящий" генератор импульсов с автоматической сменой сигнала DIR.
Идея вроде бы проста - PRU смотрит во входной регистр DINT, вычисляет разницу между текущим счетчиком положения, и согласно получившемуся знаку крутит ШД в нужную сторону на определенное количество импульсов с разгоном\торможением.
Буду рад любой помощи.
Здравствуйте. После недавнего обновления Windows перестала запускаться Hardella. Показывала окно с ошибками Java. Обновил Java и перестало работать совсем. Только у меня так?
Как не даёт? Какая ошибка? Прямо сейчас проверил -- 1.7.2 mac качается.
Здравствуйте. После недавнего обновления Windows перестала запускаться Hardella. Показывала окно с ошибками Java. Обновил Java и перестало работать совсем. Только у меня так?
Здравствуйте. После недавнего обновления Windows перестала запускаться Hardella. Показывала окно с ошибками Java. Обновил Java и перестало работать совсем. Только у меня так?
https://owen.ru/forum/showthread.php?t=23013&p=303277&viewfull=1#post303277
Shurick
Как сделал я:
1. Поставил VirtualBox с дополнениями.
2. Поставил в него ХР. Сетевой адаптер не активировал.
3. Установил в виртуальную ХР нужную яву и HardellaIDE.
4. Настроил общую папку для обмена с основной ОС.
Да, это занимает несколько Гб на дисках. Но это позволяет сохранить среду разработки от причуд мелкомягких и санмикроситемов.
большое спасибо! я просто снес Java 11 и установил Java 8
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot