Показано с 1 по 10 из 688

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

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

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

    По умолчанию

    Появилась минутка, сделал блок на 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
    Последний раз редактировалось Владимир Ситников; 26.08.2016 в 09:03.

  2. #2
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,188

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Появилась минутка, сделал блок на ST...
    Код:
    FUNCTION_BLOCK PRU_GENER_BURST
    VAR_INPUT
      enable : BOOL;
      quantity : WORD;
    END_VAR
    VAR_OUTPUT
      out : BOOL;
      ready : BOOL;
    END_VAR
    ....
    1.Отчего то кажется что нехватает period'а
    2.А почему низзя изменить quantity пряма на ходу ?
    "А куда миня ?" - "В морг"
    "А может на процедуры ?" - "Врач сказал в морг, значит в морг"

  3. #3

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    "А куда миня ?" - "В морг"
    "А может на процедуры ?" - "Врач сказал в морг, значит в морг"
    В общем, ждём что скажет Владислав.

    Собственно, 2 вопроса:
    1) Норм ли получился блок (я в почте переслал реализацию на ассемблере)
    2) Можно ли мне выкладывать обновлённые библиотеки, или это только через ОВЕН

    Я снова в командировках -- пишу "по приборам", вернее, без ПЛК.
    Поэтому было бы хорошо, если бы
    3) Кто-нибудь попробовал этот самый блок PRU_GENER_BURST
    4) Рассказали как тестировать, если в хозяйстве из быстродействующего только ПЛК110 1шт и есть. Осциллографа у меня нет, мультиметра тоже нет, "населена роботами".
    Замыкать быстрый вход на быстрый выход и делать программу, которая сама себя проверяет?
    Либо, опять же, нужно чтобы какой-нибудь обладатель "быстрого счётчика импульсов" проверил.

  4. #4

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Сколько стоит "хороший осциллограф" если "без фанатизма"?
    В 10'000 р уложится?

    Можно наводку какую-нибудь? (ну, я вообще не в теме выбора этих приборов)
    Нужен аналоговый осциллограф с полосой пропускания не ниже 50 мГц. За 10 т.р. такой не купить. Проще взять где-нибудь на время. Приличный цифровой осциллограф стоит 20...30 т.р.
    Последний раз редактировалось Вольд; 26.08.2016 в 13:57.

  5. #5

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Меньше всего хочется погружаться в "изучение основ выбора правильных осциллографов и щупов к ним".
    С щупом для осциллографа все просто. Бери щуп с делителем 1:10.
    Последний раз редактировалось Вольд; 26.08.2016 в 17:33.

  6. #6

    По умолчанию

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

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

  7. #7

    По умолчанию

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

  8. #8

    По умолчанию

    Цитата Сообщение от Вольд Посмотреть сообщение
    Код для 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

  9. #9

    По умолчанию

    Цитата Сообщение от 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.

  10. #10

    По умолчанию

    Цитата Сообщение от 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.

Похожие темы

  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

Ваши права

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