Страница 109 из 135 ПерваяПервая ... 95999107108109110111119 ... ПоследняяПоследняя
Показано с 1,081 по 1,090 из 1349

Тема: Hardella IDE

  1. #1081

    По умолчанию

    Цитата Сообщение от Дмитрий520 Посмотреть сообщение
    Спасибо за ответ! с Информацией в #1083 ознакомился, но не понял как быть с DI3 и DI4 ПЛК, они не буду работать в обычном режиме?
    Через Hardella можно задействовать DI1..DI4
    DI3, DI4 должны работать. Например, так, как в примере про энкодер

    Цитата Сообщение от Дмитрий520 Посмотреть сообщение
    По вопросу 3. если enable:=FALSE, то шд не останавливается пока не выполнит заданное quantity или я что то не так делаю?
    Должно останавливаться с учётом decel_ramp.
    Если перевод enable:=false не останавливает, то показывайте код (и рассказывайте какую версию Hardella используете).


    Цитата Сообщение от Дмитрий520 Посмотреть сообщение
    но не понял как быть с DI3 и DI4 ПЛК, они не буду работать в обычном режиме?
    Что имеется ввиду под словами "в обычном режиме"?

  2. #1082

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    Отличная новость. Ждемс.
    Вы хотите запитать 2 ШД?
    Пробовали один в PRU0, второй в PRU1?
    Один блок PRU_STEPPER без проблем помещается в одно ядро, поэтому непонятно зачем вы пытаетесь "поместить два блока в одно ядро".

    Т.е. берите стандартный пример "step motors", там программа, которая управляет двумя ШД. Чем она не подошла?

    Цитата Сообщение от IVM Посмотреть сообщение
    Отличная новость. Ждемс.
    Сделал использование вспомогательной памяти, регистры теперь не заканчиваются, но это всё равно не решает проблему "размещения двух ШД блоков в одном ядре".
    Если размещать 2 блока в одном ядре, то примерно 12-15 переменных не помещаются в регистры, и размер кода получается 1060 команд т.к. добавляется довольно много команд по передаче данных между регистрами и памятью. А памяти у каждого ядра всего на 1024 команды.

    Да, 1060 и 1024 это не так далеко, и, возможно, если объединить какие-нибудь переменные (например, сделать accel_ramp всегда равным decel_ramp), то может и получиться ужать два блока в 1024 команды. Но какой смысл? Можно же просто выполнять один ШД в одном ядре, а второй во втором.

    Цитата Сообщение от IVM Посмотреть сообщение
    А стековая память у PRU есть ? Вот такая: https://studfiles.net/preview/4339738/page:16/). Очень удобно прятать в ней регистры.
    Команд работы со стеком нет, но, "прятать" регистры -- не проблема. Проблема, что кода получается много. Например, если объявить (и вызвать) два ФБ PRU_STEPPER, то размер программы увеличивается более чем в два раза (по отношению к одному блоку).

    Компилировать блок 1 раз и переиспользовать, конечно, можно, но:
    1) Два ШД можно сделать и на существующем механизме
    2) Подобная доработка компилятора может занять сравнимое время с разработкой механизма, когда часть программы выполняется в PRU, а часть в основной программе. При этом, у варианта "часть программы в основной КДС" преимущество в том, что в КДС программе более точные вычисления (FLOAT/REAL и т.п.), а в PRU только целочисленная арифметика.

  3. #1083

    По умолчанию

    Двумя ШД я управляю без проблем. Мне надо управлять тремя ШД.

    Что-то мне не понятна ситуация с ФБ. Если создаются 2 экземпляра ФБ, то это не должно привести к двойному увеличению памяти программы, т.к. ФБ один и это его код занимает память. Ведь в том то и смысл использование ФБ. Памяти данных для двух экземпляров ФБ действительно понадобится в два раза больше. Если сохранять регистры после отработки экземпляра ФБ, то проблем с нехваткой регистров не должно быть.
    Изображения Изображения
    Последний раз редактировалось IVM; 28.01.2018 в 14:28.

  4. #1084

    По умолчанию

    Владимир, что мешает PRU циклически исполнять один и тот же код с двумя разными наборами данных ?

    Последовательность действий такая:
    1) загружаем в регистры первый набор данных;
    2) исполняем код;
    3) сохраняем регистры в ОЗУ;
    4) загружаем в регистры второй набор данных;
    5) исполняем код;
    6) сохраняем регистры в ОЗУ.

    Далее по кругу.

  5. #1085

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    Двумя ШД я управляю без проблем. Мне надо управлять тремя ШД.
    Ясно.

    Цитата Сообщение от IVM Посмотреть сообщение
    Что-то мне не понятна ситуация с ФБ. Если создаются 2 экземпляра ФБ, то это не должно привести к двойному увеличению памяти программы, т.к. ФБ один и это его код занимает память. Ведь в том то и смысл использование ФБ. Памяти данных для двух экземпляров ФБ действительно понадобится в два раза больше. Если сохранять регистры после отработки экземпляра ФБ, то проблем с нехваткой регистров не должно быть.
    Сейчас при компиляции Hardella подставляет всё-всё содержимое всех вложенных ФБ в финальную программу. Это упрощает компиляцию, т.к. в программе, где всё подставлено остаются лишь арифметико-логические операции и условные переходы.

  6. #1086

    По умолчанию

    То о чем я писал в предыдущем посте сделать можно ?

  7. #1087

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    То о чем я писал в предыдущем посте сделать можно ?
    Тут 2 варианта:
    1) Я могу выкатить версию, которая по-прежнему объединяет все ФБ в одну программу, но которая использует память при нехватке регистров.
    Тогда вы сможете поправить ФБ PRU_STEPPER так, чтобы этот блок вызывался в разных PRU циклах на разных данных.

    Т.е. примерно так:
    Код:
    vars
       stepper: PRU_STEPPER;
       
       current: BOOL;
    
       quantity1, accel1, decel1, ...: ...; (* данные для 1-го ШД *)
       quantity2, accel2, decel2, ...: ...; (* данные для 2-го ШД *) 
    
    код:
     if current THEN
       stepper.quantity := quantity1;
       stepper.accel := accel1;
       ...
     ELSE
       stepper.quantity := quantity2;
       stepper.accel := accel2;
       ...
      end_if;  
      stepper(); (* обрабатываем данные *)
     if current THEN
      quantity1 := stepper.quantity; (* запоминаем состояние ФБ, чтобы переиспользовать через цикл *)
     end if;
    Т.е. запоминать состояние нужно будет вручную, в специально подготовленных переменных

    2) Делать поддержку "переиспользования кода ФБ" в самом компиляторе Hardella непросто, т.к. в системе команд PRU "обращение к памяти" может выполняться либо по абсолютному адресу (не подходит, т.к. нам нужно более одного экземпляра ФБ), либо через регистр R0. Вызов процедур -- значит нужен стек, и для обращения к стеку снова придётся использовать этот самый R0. Т.е. нужно продумывать жонглирование регистрами. На первый взгляд, это непростая задача.
    Возможно, проще придумать и реализовать работу с массивами, и вынести математическую часть в КДС-код. PRU код станет меньше, точность вычислений повысится, и заодно появится возможность менять параметры хода на ходу.

  8. #1088

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Тут 2 варианта:
    1) Я могу выкатить версию, которая по-прежнему объединяет все ФБ в одну программу, но которая использует память при нехватке регистров.
    Тогда вы сможете поправить ФБ PRU_STEPPER так, чтобы этот блок вызывался в разных PRU циклах на разных данных.
    Так памяти программ для для двух ФБ не хватает.

  9. #1089

    По умолчанию

    Цитата Сообщение от IVM Посмотреть сообщение
    Так памяти программ для для двух ФБ не хватает.
    Так это будет один экземпляр, и один вызов. Просто перед вызовом нужно полностью заменить его состояние значениями из вспомогательных переменных.

  10. #1090

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Просто перед вызовом нужно полностью заменить его состояние значениями из вспомогательных переменных.
    Для вспомогательных переменных то же память данных нужна, которой может не хватить.
    Последний раз редактировалось IVM; 28.01.2018 в 18:49.

Страница 109 из 135 ПерваяПервая ... 95999107108109110111119 ... ПоследняяПоследняя

Ваши права

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