Страница 11 из 57 ПерваяПервая ... 91011121321 ... ПоследняяПоследняя
Показано с 101 по 110 из 688

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

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

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

    По умолчанию

    Первая же команда PRU_FB_GetParameter(pru_num:=0, index:=28, value:=ADR(TMP)) уводит ПЛК в перезагрузку.
    PRU_FB_GetParameter(pru_num:=0, index:=29, value:=ADR(QUANTITY_LEFT));
    а вот определение в программе...

    #define in_reg R29
    #define out_reg R28

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

    кстати, за один проход цикла PRU считывается и записывается по одному регистру, надеюсь в вашем модуле данные поступят в блок синхронизированным пакетом?
    Последний раз редактировалось Дмитрий Артюховский; 19.09.2016 в 22:20.

  2. #2

    По умолчанию

    Цитата Сообщение от Дмитрий Артюховский Посмотреть сообщение
    а вот определение в программе...

    #define in_reg R29
    #define out_reg R28

    Вы пытаетесь писать в регистр для чтения... а регистр можно использовать для обмена либо в одну, либо в другую сторону...
    Это всё ерунда.
    Я же говорил какая у меня программа:
    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Для примера, вот так выглядит pulse.p -- т.е. просто вызов одного моего ФБ.
    Код:
    ;include "target.trg"
    FBDECL
    #defFB PRU_PULSE PRU_PULSE
    /FBDECL
    
    SYNCLIST
    IN=R25
    IN=R26
    IN=R27
    OUT=R28
    OUT=R29
    /SYNCLIST
    PROGRAMM
    PRU_PULSE
    /PROGRAMM
    Я вообще 3 регистра на вход и 2 на выход использую.


    Скорее всего, проблема в том, что PRU не даёт отмашку "данные переданы/прочитаны", поэтому на ПЛК стороне операции PRU_FB_SetParameter/PRU_FB_GetParameter зависают (похоже, они ждут) и в конце концов ПЛК перегружается по watchdog'у.

    Поправлю программу, чтобы были отмашки, и, наверняка заработает.

  3. #3

    По умолчанию

    Поправил обмен данными между PRU и ПЛК.

    pru_pulse_v2.zip

    Теперь-то уж наверняка заработает.

    Итого:

    Код:
    FUNCTION_BLOCK PRU_PULSE
    (* Output will be generated to FAST OUTPUT 3 *)
    VAR_INPUT
      ENABLE: BOOL;
      CYCLE_LENGTH: WORD; (* PRU cycles: 40...65486 == 65486-50;   40 == 0.27us,  65486 == 436 us *)
      QUANTITY: DWORD; (* 0..2147483647 == (2<<30)-1 *)
    END_VAR
    VAR_OUTPUT
      READY : BOOL;
      QUANTITY_LEFT: DWORD; (* for debugging *)
    END_VAR
    Последний раз редактировалось Владимир Ситников; 20.09.2016 в 12:58.

  4. #4

    По умолчанию

    Спасибо прибористу за тестирование.

    Собственно, лучше не скажешь:
    Цитата Сообщение от приборист
    Поробовал, все заработало.
    Скорость на ходу изменяет.
    Вечером будет побольше времени потестировать.
    Шах и мат?


    Собственно, программа:

    Код:
    PROGRAM PRU_PULSE_GENERATOR 
      variables: 
        burst : PRU_GENER_BURST; 
        enable : BOOL; 
        cycleLength : WORD; 
        quantity : DWORD; 
        ready : BOOL; 
        qtyLeft : DWORD; 
        dataReady : BOOL; 
        controlRegisterAddress : DWORD; 
        currentCycles : WORD; 
       
      body: 
        (* безопасные значения *) 
        enable := FALSE; 
        cycleLength := 100; 
        quantity := 0; 
        WHILE TRUE DO 
          (* собственно полезная работа *) 
          burst(enable := enable, quantity := quantity); 
           
          controlRegisterAddress := 16#700C;
          (* Пока есть время, передаём-принимаем данные *)
          REPEAT 
            ASM 
              LBCO dataReady, 3, 0, 1 
            END_ASM 
             
            IF dataReady THEN 
              (* Приём *) 
              ASM 
                LBCO quantity, 3, 100, 4 
                LBCO cycleLength, 3, 104, 2 
                LBCO enable, 3, 108, 1 
              END_ASM 
               
              (* Передача *) 
              ready := burst.ready; 
              ASM 
                SBCO ready, 3, 112, 1 
              END_ASM 
              qtyLeft := burst.qtyLeft; 
              ASM 
                SBCO qtyLeft, 3, 116, 4 
              END_ASM 
               
              dataReady := FALSE; 
              ASM 
                SBCO dataReady, 3, 0, 1 
              END_ASM 
            END_IF; 
             
            ASM 
              LBBO currentCycles, controlRegisterAddress, 0, 2
            END_ASM 
            currentCycles := currentCycles + 40; 
          UNTIL currentCycles < cycleLength 
          END_REPEAT; 
          (* Остаток задержки ждём более точно, без приёма-передачи *)
          WAIT_TICK(pruCycleLength := cycleLength); 
           
          PRU_OUT1(Q := burst.out); 
        END_WHILE; 
    END_PROGRAM
    Код:
    FUNCTION_BLOCK PRU_GENER_BURST 
      variables: 
        input enable : BOOL; 
        input quantity : DWORD; 
        output out : BOOL; 
        output ready : BOOL; 
        retain output qtyLeft : DWORD; 
       
      body: 
        IF enable THEN 
          IF qtyLeft > 0 THEN 
            (* Идёт генерация *) 
            qtyLeft := qtyLeft - 1; 
          ELSIF ready THEN 
            (* Всё сгенерировали, ждём пока передёрнут enable для следующего включения *) 
          ELSE 
            (* Поступила команда на включение *) 
            qtyLeft := SHL(quantity, 1); 
            qtyLeft := qtyLeft - 1; 
          END_IF; 
          ready := qtyLeft = 0; 
        ELSE 
          (* Выключаемся *) 
          qtyLeft := 0; 
          ready := FALSE; 
        END_IF; 
        (* Если всё сделали, то out выключится. Если пачка ещё генерируется, то младший бит и есть меандр *) 
        out := qtyLeft.0;
    Код:
    FUNCTION_BLOCK WAIT_TICK 
      variables: 
        input pruCycleLength : WORD; 
        cyclesLeft : WORD; 
        currentCycles : WORD; 
        controlRegisterAddress : DWORD; 
       
      body: 
        (* 0x00007000..0x00007FFF -- PRU0 Control Registers, 0xC -- cycle count register *) 
        controlRegisterAddress := 16#700C; 
        ASM 
          LBBO currentCycles, controlRegisterAddress, 0, 2 ; Load cycle count, 1+wdcnt*1==2 cycles 
        END_ASM 
        currentCycles := currentCycles + 8; 
        IF pruCycleLength > currentCycles THEN 
          cyclesLeft := pruCycleLength - currentCycles; 
          cyclesLeft := cyclesLeft XOR 0; 
          IF cyclesLeft.0 THEN 
            cyclesLeft := cyclesLeft XOR 1; 
          END_IF; 
          WHILE cyclesLeft <> 0 DO 
            cyclesLeft := cyclesLeft - 2; 
          END_WHILE; 
        ELSE 
          cyclesLeft := 0; 
        END_IF; 
        ASM 
          SBBO cyclesLeft, controlRegisterAddress, 0, 2 ; Load cycle count, 1+wdcnt*1==2 cycles 
        END_ASM

  5. #5

    По умолчанию

    Вот и славненько. Мои искренние поздравления Владимиру Ситникову !

    Теперь вопросы.

    С какой прошивкой должен быть ПЛК110 [М02] ?

    Будет ли в ФБ реализован разгон ШД ?

    Будет ли сделан ФБ о котором я писал в посте 197.

    И самое главное. Будут ли подвижки в позиции программистов фирмы "ОВЕН" к тому, что делает и предлагает Владимир Ситников ?
    Последний раз редактировалось Newcomer; 20.09.2016 в 12:05.

  6. #6

    По умолчанию

    Цитата Сообщение от Newcomer Посмотреть сообщение
    С какой прошивкой должен быть ПЛК110 [М02] ?
    Без понятия. Ждём прибориста.


    Цитата Сообщение от Newcomer Посмотреть сообщение
    Будет ли в ФБ реализован разгон ШД ?
    Сделаю.
    Я читал что есть по S-кривым, но с ними всё сложно. Сделаю трапецию.

    Цитата Сообщение от Newcomer Посмотреть сообщение
    Будет ли сделан ФБ о котором я писал в посте 197.
    А какая длительность работы того блока нужна?
    Как вариант -- выставить "quantity=230-1". Такого количества шагов хватит?

    Цитата Сообщение от Newcomer Посмотреть сообщение
    И самое главное. Будут ли подвижки в позиции программистов фирмы "ОВЕН" к тому, что делает и предлагает Владимир Ситников ?
    Почему самый главный вопрос стоит последним по списку? Непорядок...
    Последний раз редактировалось Владимир Ситников; 20.09.2016 в 12:28.

  7. #7

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    А какая длительность работы того блока нужна?
    Как вариант -- выставить "quantity=232-1". Такого количества шагов хватит?.
    После разгона до номинальной частоты ШД может работать неограниченно долгое время.

  8. #8

    По умолчанию

    Цитата Сообщение от Newcomer Посмотреть сообщение
    После разгона до номинальной частоты ШД может работать неограниченно долгое время.
    Сутки?
    Месяц?
    Или сколько?

    230-1 это 2147483647 импульсов (да, реальное ограничение 230-1, а не 232-1 как я говорил ранее)
    Если считать 1000имп/оборот (с запасом на дробление), то это 2'147'483 оборотов
    Если оно крутится со скоростью 100 оборотов/сек (у кого-то реально так крутит?), то это 21'400 сек == 5 часов

    Мне не сложно сделать параметр "не останавливаться", просто пытаюсь тех процесс понять
    Последний раз редактировалось Владимир Ситников; 20.09.2016 в 13:47.

  9. #9
    Пользователь
    Регистрация
    12.07.2007
    Адрес
    Воронеж
    Сообщений
    884

    По умолчанию

    Итак, спасибо Владимиру.
    Блок протестировал - все работает.
    Прошивка ПЛК - последняя с сайта.
    Проверял на 3 выходе.

    Скорость на лету меняет.
    Количество импульсов на лету не меняет (пока острой необходимости в этом не вижу)

    Пожелания:
    в ФБ добавить настройку выхода (т.е. настраивать DO1-DO4)
    Сделать плавный разгон торможение (количество импульсов старт\стоп и делитель для скорости)
    Сделать возможность использования 2 таких блоков на разные выхода (независимые). С 4 выходами видимо будет проблема? С двумя думаю проблем не должно возникнуть - использовать 2 PRU/
    Последний раз редактировалось приборист; 21.09.2016 в 10:05. Причина: Людей путаю :)

  10. #10

    По умолчанию

    Цитата Сообщение от приборист Посмотреть сообщение
    Итак, спасибо Валерию.
    Я Владимир, но не суть.

    Цитата Сообщение от приборист Посмотреть сообщение
    Сделать плавный разгон торможение (количество импульсов старт\стоп и делитель для скорости)
    Делитель это что? Настройка шаг-полушаг? Или ещё что-то?

    Вроде, равноускоренный разгон обычно делают. Т.е. на входе "начальная скорость", "макс скорость", "количество импульсов" и т.п.

    Цитата Сообщение от приборист Посмотреть сообщение
    Пожелания:
    в ФБ добавить настройку выхода (т.е. настраивать DO1-DO4)
    Сделать возможность использования 2 таких блоков на разные выхода (независимые). С 4 выходами видимо будет проблема? С двумя думаю проблем не должно возникнуть - использовать 2 PRU/
    Два блока параллельно на одном PRU с разными частотами действительно сложнее, чем один. Но вполне может получиться.
    Разгон требует вычислительных ресурсов (~1 деление, которое будет около 200 тактов занимать. Два блока на разгон будут потреблять ~400 тактов, т.е. 3мкс, но и это вполне укладывается в требуемую скорость.

    Да, выбор выхода это правильно.


    Собственно, вопрос к Владиславу: где можно найти файл target.trg для PRU1?
    Последний раз редактировалось Владимир Ситников; 21.09.2016 в 00:08.

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

Похожие темы

  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, 11:24

Ваши права

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