Страница 52 из 68 ПерваяПервая ... 242505152535462 ... ПоследняяПоследняя
Показано с 511 по 520 из 677

Тема: Программирование ПЛК110 [М02] для задач реального времени

  1. #511

    По умолчанию

    Цитата Сообщение от Вольд Посмотреть сообщение
    А по какой причине может произойти останов PRU программы и как это выявить ?
    Например, ионизирующее излучение, удар молнии, проблемы с питанием, ну и "кривой код" в конце концов.
    Выявлять можно во время очередного обмена данными. Смысл в том, что для обмена информацией PRU и host в любом случае должны как-то координироваться. Если host будет ждать ответа от PRU бесконечно долго, то к нему самому придёт собака. Поэтому, логично при операциях обмена использовать таймаут. Скажем, 100ms. Если достигнут таймаут, то считаем, что обмен не состоялся, а pru, возможно, заклинило.

    Аналогично, на стороне PRU можно следить за частотой обменов и переходить в безопасное состояние, если host давно не общался с PRU.

  2. #512
    Пользователь
    Регистрация
    28.01.2011
    Адрес
    Новосибирск
    Сообщений
    79

    По умолчанию

    Вот описание энкодера буржуйского контроллера ЭНКОДЕР.rar

  3. #513

    По умолчанию

    Создал пробный проект. Включил в него ФБ PRU_STEPPER, сделанный В.Ситниковым. После компиляции проекта имею такой результат. Не пойму в чем дело.
    Изображения Изображения

  4. #514

    По умолчанию

    Цитата Сообщение от Newcomer Посмотреть сообщение
    Создал пробный проект. Включил в него ФБ PRU_STEPPER, сделанный В.Ситниковым. После компиляции проекта имею такой результат. Не пойму в чем дело.
    В проект нужно было добавить pruaccesslib.lib
    Эту библиотеку можно взять в каком-нибудь "писании от Владислава".

  5. #515

    По умолчанию

    Все получилось. Проект компилируется без ошибок.

  6. #516

    По умолчанию

    Есть прогресс в "доступном всем PRUграммировании".

    Программа: Снимок экрана 2016-10-18 в 10.13.35.png

    Эта самая программа будет автоматически вызываться в PRU цикле. Упомянутые в @Export переменные будут передаваться из/в КДС.
    Например, 3 быстрых входа будут использоваться для ABZ энкодера, а 4-ый будет подаваться в КДС напрямую (для прочих целей).

    "PRU configuration": Снимок экрана 2016-10-18 в 10.14.02.png
    Тут говорится, что "в PRU0 будет выполняться нужная нам программа с циклом в 1мкс", "в PRU1 будет программа по умолчанию", и настраивается фильтрация в 2мс для IN4 (этот вход в энкодере не участвует)


    При компиляции это добро завернётся в WHILE TRUE цикл и разбавится обменом с КДС.
    Примерно так:
    Снимок экрана 2016-10-18 в 10.20.12.png

    На выходе будет готовая к употреблению КДС.exp библиотека. Т.е. импортируем её и магическим образом заработает PRU.

  7. #517

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Есть прогресс в "доступном всем PRUграммировании".

    Программа: Снимок экрана 2016-10-18 в 10.13.35.png

    Эта самая программа будет автоматически вызываться в PRU цикле. Упомянутые в @Export переменные будут передаваться из/в КДС.
    Например, 3 быстрых входа будут использоваться для ABZ энкодера, а 4-ый будет подаваться в КДС напрямую (для прочих целей).

    "PRU configuration": Снимок экрана 2016-10-18 в 10.14.02.png
    Тут говорится, что "в PRU0 будет выполняться нужная нам программа с циклом в 1мкс", "в PRU1 будет программа по умолчанию", и настраивается фильтрация в 2мс для IN4 (этот вход в энкодере не участвует)


    При компиляции это добро завернётся в WHILE TRUE цикл и разбавится обменом с КДС.
    Примерно так:
    Снимок экрана 2016-10-18 в 10.20.12.png

    На выходе будет готовая к употреблению КДС.exp библиотека. Т.е. импортируем её и магическим образом заработает PRU.
    По завершению всех работ желательно оформить пример с исходными кодами для PRU и прикладной программы для ПЛК.

  8. #518

    По умолчанию

    Цитата Сообщение от Вольд Посмотреть сообщение
    По завершению всех работ желательно оформить пример с исходными кодами для PRU и прикладной программы для ПЛК.
    Я у какого-то производителя ШД (или ПЛК?) видел документацию в духе "задача-решение". "Надо двигать и считать пакеты молока? --- делай так". Что-то в таком духе.
    Там совсем небольшие примеры, и на них показывались подходы.

    Где видел -- не помню, но по-моему, выглядело хорошо.
    Нечто похожее в документации на ОЛ, но там примеров, вроде, всего пара штук.

    Собственно, вопрос в примерах. И, по-моему, лучше если примеры жизненные, а не просто "как подключить 2 энкодера".

    Переведу с русского на русский: кто может -- накидывайте примеров.
    Сами примеры будут доступны в самой среде. Можно будет зайти и посмотреть / скопировать и т.п.
    Последний раз редактировалось Владимир Ситников; 18.10.2016 в 11:22.

  9. #519

    По умолчанию

    Достаточно одного хорошего примера, в котором будет показано как пользоваться доступным всем инструментарием для PRU программирования.
    Последний раз редактировалось Вольд; 18.10.2016 в 11:59.

  10. #520

    По умолчанию

    Так, после некоторых танцев с бубном, PRU программа начала компилироваться.

    В двух словах:
    На эмуляторе работает, значит можно переходить к
    1) Созданию кнопки, которая создаст КДС.exp
    2) Созданию кнопки "новый PRU проект"
    3) Сделать PRU1. Надо сначала протестировать подход с PRU0 в железе, а потом уже делать PRU1.



    PRU configuration.
    Ничего особенного, просто выполняем программу с циклом в 1мкс, и фильтруем 4-ый вход с временем фильтрации 5
    Снимок экрана 2016-10-22 в 20.36.37.png

    Программа для PRU0.
    Напомню суть задачи: при подаче "enable=true", должен запуститься мотор и выключиться тогда, когда энкодер отсчитает заданное количество импульсов.
    Снимок экрана 2016-10-22 в 21.32.44.png

    Собственно, так и написано. Проверяем энкодер, вызываем блок "управления мотором", выход блока подаём на fast_OUT1.
    Эти три действия выполняются раз в микросекунду (согласно PRU configuration выше). В оставшееся время происходит обмен данными и обработка входов.

    Если думаете, что в блоке FAST_OUTPUTS будет ассемблер, то там его не найдёте:
    Снимок экрана 2016-10-22 в 21.33.43.png

    Блок FAST_INPUTS выглядит так же (тоже пустой). Для работы с входами-выходами никакого ассемблера использовать не нужно. Есть несколько "волшебных" ФБ -- их и используем.
    Код внутри блоков input/output и т.п. появляется в момент компиляции. Например, для входов там добавляется вызов фильтрации (если она указана в PRU configuration).


    Как и планировалось, для передачи данных из-в КДС ассемблер тоже не нужен. Достаточно подставить @Export над теми переменными, которые понадобятся в КДС.

    При компиляции получается программа для PRU и КДС библиотека.
    В этом примере создался следующий блок обмена данными:
    Снимок экрана 2016-10-22 в 21.43.35.png

    Для порядка, протестируем программу. Сделаем вид, что цикл ПЛК составляет 1мс, и попробуем пару запусков нашей машины.

    Что тут видно:
    1) При запуске махины (enable 0 -> 1), она запускает мотор, энкодер начинает крутиться, и всё это добро останавливается при достижении нужного количества импульсов. Я указал runLength = 326, оно так и останавливается

    2) Первые 12 мс значение на 4-ом входе дёргается (это прямо в тестовой программе сделана подача морганий на fast in), и фильтрация это верно отрабатывает. Вспомним, что в PRU configuration указана фильтрация 5мс. Как раз после этих 5мс значение in4_filtered переходит в единицу.

    Код:
    1 ms, in.enable=0, in.runLength=326, out.counter=0, out.position=0, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=0, out.in4_filtered=0, fastOut4=0, encoder=0
    2 ms, in.enable=0, in.runLength=326, out.counter=0, out.position=0, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=0
    3 ms, in.enable=0, in.runLength=326, out.counter=0, out.position=0, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=0, out.in4_filtered=0, fastOut4=0, encoder=0
    4 ms, in.enable=0, in.runLength=326, out.counter=0, out.position=0, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=0
    5 ms, in.enable=0, in.runLength=326, out.counter=0, out.position=0, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=0, out.in4_filtered=0, fastOut4=0, encoder=0
    6 ms, in.enable=1, in.runLength=326, out.counter=100, out.position=100, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=101
    7 ms, in.enable=1, in.runLength=326, out.counter=200, out.position=200, out.zeroDetected=0, out.offset=99, out.state=MOVING, in4_raw=0, out.in4_filtered=0, fastOut4=1, encoder=201
    8 ms, in.enable=1, in.runLength=326, out.counter=300, out.position=300, out.zeroDetected=0, out.offset=199, out.state=MOVING, in4_raw=1, out.in4_filtered=0, fastOut4=1, encoder=301
    9 ms, in.enable=1, in.runLength=326, out.counter=400, out.position=400, out.zeroDetected=0, out.offset=299, out.state=MOVING, in4_raw=0, out.in4_filtered=0, fastOut4=1, encoder=401
    10 ms, in.enable=1, in.runLength=326, out.counter=500, out.position=500, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=501
    11 ms, in.enable=1, in.runLength=326, out.counter=600, out.position=600, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=0, out.in4_filtered=0, fastOut4=0, encoder=601
    12 ms, in.enable=1, in.runLength=326, out.counter=700, out.position=700, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=701
    13 ms, in.enable=1, in.runLength=326, out.counter=800, out.position=800, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=801
    14 ms, in.enable=1, in.runLength=326, out.counter=900, out.position=900, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=901
    15 ms, in.enable=1, in.runLength=326, out.counter=1000, out.position=1000, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=1001
    16 ms, in.enable=1, in.runLength=326, out.counter=1100, out.position=1100, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=0, fastOut4=0, encoder=1101
    17 ms, in.enable=1, in.runLength=326, out.counter=1200, out.position=1200, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=1201
    18 ms, in.enable=1, in.runLength=326, out.counter=1300, out.position=1300, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=1301
    19 ms, in.enable=0, in.runLength=326, out.counter=1301, out.position=1301, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=1301
    20 ms, in.enable=0, in.runLength=326, out.counter=1301, out.position=1301, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=1301
    21 ms, in.enable=0, in.runLength=326, out.counter=1301, out.position=1301, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=1301
    22 ms, in.enable=1, in.runLength=326, out.counter=1401, out.position=1401, out.zeroDetected=0, out.offset=0, out.state=STOP, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=1402
    23 ms, in.enable=1, in.runLength=326, out.counter=1501, out.position=1501, out.zeroDetected=0, out.offset=99, out.state=MOVING, in4_raw=1, out.in4_filtered=1, fastOut4=1, encoder=1502
    24 ms, in.enable=1, in.runLength=326, out.counter=1601, out.position=1601, out.zeroDetected=0, out.offset=199, out.state=MOVING, in4_raw=1, out.in4_filtered=1, fastOut4=1, encoder=1602
    25 ms, in.enable=1, in.runLength=326, out.counter=1701, out.position=1701, out.zeroDetected=0, out.offset=299, out.state=MOVING, in4_raw=1, out.in4_filtered=1, fastOut4=1, encoder=1702
    26 ms, in.enable=1, in.runLength=326, out.counter=1801, out.position=1801, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=1802
    27 ms, in.enable=1, in.runLength=326, out.counter=1901, out.position=1901, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=1902
    28 ms, in.enable=1, in.runLength=326, out.counter=2001, out.position=2001, out.zeroDetected=0, out.offset=326, out.state=DONE, in4_raw=1, out.in4_filtered=1, fastOut4=0, encoder=2002

    Из забавного, блок для фильтрации входов получился гораздо больше, чем я ожидал изначально:
    Снимок экрана 2016-10-22 в 22.01.48.png
    Работает, и ладно. Надо будет -- соптимизируем или сделаем другую реализацию.

    Давным-давно, Yegor предложил сделать возможность использования ФБ без объявления в переменных. Например, для одноразовых RTRIG это в самый раз.
    Эта штука пригодилась.

    Например, ФБ для обработки входов (с фильтрацией) создаётся таким образом:
    Снимок экрана 2016-10-22 в 22.13.17.png
    PRU_DEBOUNCE не объявляется, и не захламляет "область объявления переменных".

    Аналогично, в конце кода ABZ энкодера лаконично располагаем RTRIG и радуемся:
    Снимок экрана 2016-10-22 в 22.22.20.png

Страница 52 из 68 ПерваяПервая ... 242505152535462 ... ПоследняяПоследняя

Похожие темы

  1. Ответов: 38
    Последнее сообщение: 24.01.2022, 11:56
  2. Ответов: 10
    Последнее сообщение: 11.06.2021, 14:55
  3. часы реального времени
    от vetaly в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 28.08.2015, 16:21
  4. Таймер реального времени УТ1-РiС
    от ser10 в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 16.09.2010, 12:24

Ваши права

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