Страница 85 из 117 ПерваяПервая ... 3575838485868795 ... ПоследняяПоследняя
Показано с 841 по 850 из 1349

Тема: Hardella IDE

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    Возвращаюсь к теме энкодеров на Hardella. Написанные мною модули успешно работают в железе. Однако есть небольшой недостаток - при выключении теряются показания (счетчики) энкодера, что естественно по причине того, что память PRU не энергонезависимая. Ломаю голову на тему сохранения показаний. Вопрос не приоритетный, но хочется что бы всё было по фен-шую.
    В прошлых реализациях на ПЛК старой версии (без PRU) просто засовывал переменную показаний в ретайн, и этого было достаточно. Хотелось бы сделать нечто подобное и на новой версии ПЛК.
    Можно сделать следующим образом:
    1) У PRU переменной/FB блока ставим retain
    2) При этом на КДС стороне будет создана отдельная программа (напр PRU0_RETAINS) с retain переменными
    3) При "pru_memory_read" будут обновляться переменные в PRU0_RETAINS)
    4) В момент PRU0Init брать значения из PRU0_RETAINS и с помощью них инициализровать PRU.

  2. #2

    По умолчанию

    Проверили на железе этот вариант:

    accel_ramp = 51492.89 + 7560.61*q - 65000*EXP(-(q-16)/100.0);
    decel_ramp = accel_ramp*32


    При числе импульсов 16...25 удается уложиться в промежуток от 15 до 16 мс. При 26 импульсах и более не получается уложиться в промежуток от 15 до 16 мс. Чем большее количество импульсов генерируется тем хуже результат.

    Если считать accel_ramp = (2 * q)/(0,016 * 0,016); (классическая формула), а decel_ramp = 500000000;, то в для 16 <= q <= 160 все нормально. При q > 160 генерация пачки импульсов перестает укладываться в промежуток от 15 до 16 мс.

    Возможно, ваша формула для accel_ramp более точна (она дает большее значение чем классическая формула) и надо просто увеличить decel_ramp.

    Попробуем на железе так:

    accel_ramp = 51492.89 + 7560.61*q - 65000*EXP(-(q-16)/100.0);
    decel_ramp = 500000000;
    Последний раз редактировалось Newcomer; 09.07.2017 в 15:15.

  3. #3

    По умолчанию

    Цитата Сообщение от Newcomer Посмотреть сообщение
    При 26 импульсах и более не получается уложиться в промежуток от 15 до 16 мс.
    От какого момента отсчитываете 15-16мс?
    В него входит время ПЛК цикла?
    Есть возможность измерить длительность, которая фактически получается?
    Фактическое время работы стабильно или меняется от раза к разу?


    Цитата Сообщение от Newcomer Посмотреть сообщение
    Возможно, ваша формула для accel_ramp более точна (она дает большее значение чем классическая формула) и надо просто увеличить decel_ramp.
    На всякий случай: я формулу подбирал не исходя из законов физики, а исходя из фактической длительности генерации импульсов на эмуляторе. Т.е. формула подобрана именно для случая decel_ramp=accel_ramp*32 и неизвестно как она себя поведёт при других значениях decel_ramp. Попробовать-то можно, но я без понятия.

  4. #4

    По умолчанию

    В цикле ПЛК делается проверка:

    IF SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_state = STOP_STEPPER_RUN_STATE THEN
    SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_st epper_enable := FALSE; END_IF


    У меня цикл ПЛК = 1 мс. Крайнее значение временного интервала - 16,7 мс. Возможно, промежуток, в котором должна кончаться генерация пачки импульсов, надо задавать 14 - 15 мс. Тогда цикл ПЛК гарантированно не будет вносить погрешность.

  5. #5

    По умолчанию

    Цитата Сообщение от Newcomer Посмотреть сообщение
    У меня цикл ПЛК = 1 мс. Крайнее значение временного интервала - 16,7 мс. Возможно, промежуток, в котором должна кончаться генерация пачки импульсов, надо задавать 14 - 15 мс. Тогда цикл ПЛК гарантированно не будет вносить погрешность.
    Да, похоже на цикл ПЛК.

    А что является критерием запуска генерации? Внешний импульс? Если так, то, может, его в PRU ловить, и тогда не будет зависимости от цикла ПЛК.

  6. #6

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Да, похоже на цикл ПЛК.

    А что является критерием запуска генерации? Внешний импульс? Если так, то, может, его в PRU ловить, и тогда не будет зависимости от цикла ПЛК.
    Очередная генерация должна начинаться по истечению 16,7 мс. Если генерация пачки импульсов не укладывается в это время, то происходит смещение по времени начала генерации следующей пачки импульсов. Всего может быть до 15 000 пачек импульсов. Представляете какая ошибка по времени может накопиться ?

    В программе ПЛК предусмотрена автокоррекция, которая позволяет на каждом шаге компенсировать временную погрешность в пределах +/- 1 мс. Если погрешность на каждом шаге больше 1 мс, то ее компенсировать нельзя. Эта погрешность накапливается и на 15 000 шагах может быть очень большой, что неприемлемо. Максимальная временная погрешность на 15 000 шагах должна быть не более 15 мс.
    Последний раз редактировалось Newcomer; 09.07.2017 в 16:41.

  7. #7

    По умолчанию

    Цитата Сообщение от Newcomer Посмотреть сообщение
    Очередная генерация должна начинаться по истечению 16,7 мс. Если генерация пачки импульсов не укладывается в это время, то происходит смещение по времени начала генерации следующей пачки импульсов. Всего может быть до 15 000 пачек импульсов. Представляете какая ошибка по времени может накопиться ?

    В программе ПЛК предусмотрена автокоррекция, которая позволяет на каждом шаге компенсировать временную погрешность в пределах +/- 1 мс. Если погрешность на каждом шаге больше 1 мс, то ее компенсировать нельзя. Эта погрешность накапливается и на 15 000 шагах может быть очень большой, что неприемлемо. Максимальная временная погрешность на 15 000 шагах должна быть не более 15 мс.
    Вообще говоря, в PRU программе можно работать со временем (см pru_current_time), и точность должна быть довольно хорошей. Во всяком случае, должно быть точнее, чем цикл ПЛК.

  8. #8

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Вообще говоря, в PRU программе можно работать со временем (см pru_current_time), и точность должна быть довольно хорошей. Во всяком случае, должно быть точнее, чем цикл ПЛК.
    Погрешность, связанная с циклом ПЛК равном 1 мс, не страшна, т.к. есть автокоррекция +/- 1 мс. Страшна погрешность возникающая из-за того, что генерация пачки импульсов на каждом шаге не укладывается в заданное время.
    Последний раз редактировалось Newcomer; 09.07.2017 в 17:10.

  9. #9

    По умолчанию

    Владимир, задаю заведомо большее чем над accel_ramp и получаю совсем плохой результат. Пачка импульсов генерируется много дольше расчетного времени. Т.е. ФБ steper не верно интерпретирует accel_ramp, который ему задается.
    Последний раз редактировалось Newcomer; 10.07.2017 в 13:38.

  10. #10
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,287

    По умолчанию

    Приподниму малость тему.

    Моя разработка модуля PRU-энкодера с детектором машинного нуля уже успешно работает около трех месяцев в режиме 24\7.
    После модернизации оборудования, при наладке, выявился интересный глюк. Установка имеет несколько электромагнитных клапанов, которые управляются с ПЛК через промежуточные реле. Напряжение питания их соленоидов 230VAC. При размыкании (отпускании) реле одного из соленоидов происходил сброс показаний энкодера в ноль. Флаг машинного нуля при этом не сбрасывался, как не наблюдалось сбоев и в ПЛЦ_ПРГ. Проблему мы конечно решили методом изменения и экранировки разводки, но как говорится, "осадочек остался". Я понимаю, что это вопрос к производителю ПЛК, однако я не могу понять почему сбрасывался один регистр ПРУ, но не сбрасывался другой.
    --------------
    Другой вопрос.
    Есть задумка модернизации еще одной установки, но там нужен ПРУ-модуль почти как для ШД.
    Установка содержит три не очень навороченных сервопривода с возможностью управления от Step\Dir.
    Задача заключается в том, что бы на привод №1 выдать образцовую частоту вращения F, на привод №2выдать F +- дельта, где дельта= 3% с максимально плавной регулировкой, на привод №3 выдать F+5% с ограничением момента (это функционал привода).
    Частота импульсов примерно 30-50кГц. Т.е. например на привод №1 отправляем 32500Гц, на привод №2 - 32614Гц, на привод №3 - 32894Гц. Направление менять не требуется, ибо вращение идет всегда только в одну сторону. Рассматриваю так же просто передачу уставки скорости по Модбасу, но там только в Гц, и думаю будет грубовато.
    Собственно вопросы:
    1). В процессе работы есть оперативная необходимость изменения частоты любого из приводов без останова генератора, т. к. останов недопустим. Получится ли сделать три таких независимых генератора импульсов?
    2). Генераторы должны работать бесконечно.
    Последний раз редактировалось Sulfur; 05.10.2017 в 08:57.

Страница 85 из 117 ПерваяПервая ... 3575838485868795 ... ПоследняяПоследняя

Ваши права

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