Страница 7 из 57 ПерваяПервая ... 5678917 ... ПоследняяПоследняя
Показано с 61 по 70 из 688

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

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

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

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Появилась минутка, сделал блок на ST.
    Код для PRU можно писать на ST ?

  2. #2

    По умолчанию

    Цитата Сообщение от Вольд Посмотреть сообщение
    Код для PRU можно писать на ST ?
    И да и нет.
    Если есть ST код, то его можно вручную перевести на PRU-понятный ассемблер.

    Но
    1) ST код нужен и для общего понимания, и для того, чтобы в КДС эмуляция работала
    2) Переводить ST на ассемблер проще, чем сразу писать на asm

    Примерно так (я исключил половину строк-комментариев, которые нужны для связки PRU-КДС. Привет Владиславу, если можно со спец комментариями выкладывать, то могу и с ними):
    Код:
    .origin 0
    .entrypoint __INIT_PROGRAM
    ;include "standart_classes.m"
    #include "Defs.h"
    
    #define enableIn R1.b0
    #define quantityIn R1.w0
    
    #define out R1.b0
    #define readyOut R1.b0
    #define qtyLeft R1.w0
    
    
    ;FB_WORKTIME=9
    ;FB_NAME=PRU_GENER_BURST
    
    
    __INIT_PROGRAM:
            QBEQ _NEED_STOP, enableIn, 0 //% если сказали выключатьс_, идём выключатьс_
            QBEQ _BURST_DONE, qtyLeft, 0 //% если импульсы кончились, идём ждать передёргивани_ enable
            SUB qtyLeft, qtyLeft, 1 //% минус импульс
            QBA _FINISH_5TICK //%
    
    _BURST_DONE: ; 3-ий такт
            QBEQ _FINISH_4TICK, readyOut, 1 //% пока ready не сбросилось, ждём передёргивани_ enable
            LSL qtyLeft, quantityIn, 1 //% qtyLeft := quantity * 2
            QBA _FINISH_6TICK //%
    
    _NEED_STOP: ; 2-ой такт
            LDI qtyLeft, 0 //% останавливаемс_ -- обнул_ем qtyLeft
    
    _FINISH_3TICK: ; 3ий такт
            ADD temp, temp, 0 //% NOP
    
    _FINISH_4TICK: ; 4ый такт
            ADD temp, temp, 0 //% NOP
    
    _FINISH_5TICK: ; 5ый такт
            ADD temp, temp, 0 //% NOP
    
    _FINISH_6TICK: ; 6ый такт
            MIN temp.w0, qtyLeft, 1 //% Смотрим, осталось ли что генерировать
            XOR readyOut, temp.b0, 0 //% readyOut := MIN(qtyLeft, 1) XOR 1  ==  qtyLeft = 0
            ADD temp.w0, qtyLeft, 0 //% загружаем qtyLeft в регистр, чтобы потом считать младший бит
            AND out, temp.b0, 1 //% out := qtyLeft.0

  3. #3

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Появилась минутка, сделал блок на ST.
    Получается, для генерации следующей пачки импульсов нужно передёрнуть вход enable (сделать enable==false, дождаться пока ready перейдёт в false, потом передать enable=true и тогда пойдёт вторая пачка). Это то, что ожидалось?

    По поводу изменения частоты импульсов: текущий подход к программированию PRU предполагает, что PRU выполняется своим циклом, поэтому тут я сделал "переключение сигнала out при каждом цикле PRU". Норм? Или делитель какой-то нужен?
    Или с такой стороны: нормально ли, если для изменения частоты меандра нужно перезаливать PRU программу?
    Нужны ли меандры разной частоты по разным выходам?


    Код:
    FUNCTION_BLOCK PRU_GENER_BURST
    VAR_INPUT
      enable : BOOL;
      quantity : WORD;
    END_VAR
    VAR_OUTPUT
      out : BOOL;
      ready : BOOL;
    END_VAR
    VAR
      qtyLeft : WORD;
    END_VAR
      IF enable THEN
        IF qtyLeft > 0 THEN
          (* Идёт генерация *)
          qtyLeft := qtyLeft - 1;
        ELSIF ready THEN
          (* Всё сгенерировали, ждём пока передёрнут enable для следующего включения *)
        ELSE
          (* Поступила команда на включение *)
          qtyLeft := quantity * 2;
        END_IF;
      ELSE
        (* Выключаемся *)
        qtyLeft := 0;
      END_IF;
      ready := qtyLeft = 0;
      (* Если всё сделали, то out выключится. Если пачка ещё генерируется, то младший бит и есть меандр *)
      out := qtyLeft.0;
      
    END_FUNCTION_BLOCK
    Кажется скоро появится первый приличный ФБ для управления ШД. Если все получится, то следующим шагом, по моему, должно быть разработка более продвинутого ФБ. Я имею ввиду ФБ, в котором осуществляется плавный разгон и торможение ШД. Это реализовано во всех буржуйских ПЛК, которые управляют ШД. Вот ссылка на статью, в которой изложен этот вопрос: http://electroprivod.ru/akseleration.htm
    Последний раз редактировалось Newcomer; 08.09.2016 в 12:41.

  4. #4

    По умолчанию

    Цитата Сообщение от Newcomer Посмотреть сообщение
    Я имею ввиду ФБ, в котором осуществляется плавный разгон и торможение ШД
    Нашёл пример Amtel'а.
    Статья: http://www.atmel.com/images/doc8017.pdf (вариант на русском, который, кстати, более подробный: http://avrdoc.narod.ru/index/0-7 )
    Код (MIT license == проблем нет): https://code.google.com/archive/p/st...or-controller/

    Собственно, нужный код рассчёта задержек между импульсами: https://github.com/rob-smallshire/st...ntr.c#L77-L127

    Там они, кстати, памятью не пользуются, а просто на каждом шаге вычисляют длительность очередного импульса.

    По моим прикидкам, подобные вычисления будут занимать 300 тактов, т.е. порядка 2 мкс.
    Собственно, вопрос: есть ли смысл заморачиваться с памятью и предвычислением, или достаточно, если минимальный импульс будет 3-4 мкс?
    Последний раз редактировалось Владимир Ситников; 11.09.2016 в 22:35.

  5. #5

    По умолчанию

    Цикл можно менять, в т.ч. и на ходу, для этого предполагается использовать семейство FB START, START_CONST и START_VAR
    Если же период генерации на порядки больше цикла PRU - нужен внешний делитель сигнала тактирования
    Тролль-наседка, добрый, нежный и ласковый

  6. #6

    По умолчанию

    Пока ПЛК нет под рукой, решил сделать нехитрый компилятор ST -> PRU.asm.
    Так что, +100500 к скорости написания PRU блоков.

    Вот так выглядит:
    Снимок экрана 2016-08-29 в 14.12.25.png

  7. #7

    По умолчанию

    Сделал ещё "1 процент": эмулятор PRU процессора.
    Останется его скрестить со средой разработки PRU программ, и можно без ПЛК отлаживаться.

    https://github.com/vlsi/pru-emulator...rTest.java#L50

  8. #8

    По умолчанию

    Посмотрел-покрутил имеющиеся PRU блоки, и сделал свой компилятор.
    В имеющихся блоках мне не понравилось то, что для одного только сложения нужна куча _разных_ блоков: "сложение BYTE+BYTE, WORD+BYTE, WORD+WORD". Но это ещё не всё, ведь, для сложения двух переменных и сложения переменной с константой тоже разные блоки нужны. На мой взгляд, это слишком сложно. Если сложение, то должен быть просто блок сложения.

    Описывать в своей среде разновидности "PRU_ADD", "PRU_ADD_CONST", "PRU_ADD_BYTE_CONST" и правила выбора это была бы та ещё песня.

    Понятно, что какие-то блоки всё равно проще на ассемблере писать (например, чтение входов-выходов, работа с host), поэтому сделал ассемблерные вставки в ST.

    Всё нижеупомянутое получается одной кнопкой, без привлечения bat файлов, exe файлов и т.п.

    Собственно, до сборки финального PRU0.prg (файла, который заливается в ПЛК) осталось сделать обработку ассемблерных инструкций работы с памятью: LBCO/SBCO и LBBO/SBBO. Там ничего сложного нет, просто нужно немного времени.

    Пример программы:
    s1_asm_test.png

    Вот промежуточный ассемблер.
    Тут особенность, что команда QBLT label, src, 42 означает "branch to label if 42 < src" (по крайней мере, так говорится в документации на процессор)

    se_asm_test_intermediate.png

    PRU, разумеется, с переменными работать не умеет, поэтому назначаем регистры.
    sf_asm_regalloc.png

    И превращаем в java код (ну, чтобы генерировать файл для заливки в ПЛК и/или запускать эмулятор PRU)
    sg_asmtest_java.png


    Вот, например, блок чтения 1-го входа. Описали 1 раз -- и уже можно использовать в программе.
    Присмотрелся -- тут ошибка. Должно, конечно, быть LSR Q, R31.dw, 21 (регистр b0 байтовый и в нём никак 21 бит не влезет). Но сама ошибка не влияет на суть (лень картинки переделывать)
    s5_pru_in1.png


    Попробуем что-нибудь посложнее.

    Напишем на ST PRU_CTU_WORD (ну, как в стандарте 61131 через RTRIG):
    s8_ctu_dword.png

    И сделаем цикл, в котором подаём IN1 на вход CTU и младшие 2 бита счётчика выводим на OUT1 и OUT2.
    s9_counter_program.png

    На ассемблере получается такая дичь. Компилятор подставил все-все переменные и вызовы блоков в финальную программу и превратил в ассемблер. При желании понять можно, но на ST всё-таки гораздо понятнее.
    si_counter_asm_final.png

    Из интересного:
    1) Видно, что распределитель регистров (liveness analysis + linear scan register allocation) догадался переиспользовал регистр R1.b3 по ходу программы. Например, в самом конце где записываются OUT1 и OUT2 видно, что сам записываемый бит хранится как раз в R1.b3.

    2) Особых оптимизаций сейчас нет. Например, a:=b; может приводить к выделению временного регистра для a (это видно на "бесполезной" команде в начале вызова RTRIG: ADD R2.b0, R1.b3, 0). Но если уж нужны будут оптимизации -- посмотрим потом. Как-никак, а SSA (я про Static single assignment form) за 1-2 дня не сделать.
    Изображения Изображения
    Последний раз редактировалось Владимир Ситников; 08.09.2016 в 16:34.

  9. #9

    По умолчанию

    Скоро vladimirisitnikov закончит разработку ФБ для управления ШД. Было бы не плохо если фирма "ОВЕН" профинансирует изготовления стенда для натурных испытаний системы управления ШД на базе ПЛК110 М02. Кроме ПЛК понадобятся ШД, драйвер ШД, источник питания на 36 или 48 вольт. Затраты небольшие. Схему электрическую принципиальную + перечень элементов могу представить.
    Последний раз редактировалось Newcomer; 08.09.2016 в 12:42.

  10. #10

    По умолчанию

    PRU0.prg и PRU1.prg это файлы программ PRU. И да, они, по расширению, совпадают с prg 2-го КоДеСис-а.
    prg отлично формируются уже представленным ПО из имеющихся или заново создаваемых ФБ.
    Тролль-наседка, добрый, нежный и ласковый

Страница 7 из 57 ПерваяПервая ... 5678917 ... ПоследняяПоследняя

Похожие темы

  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

Ваши права

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