Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Задержка на языке ST

  1. #1

    По умолчанию Задержка на языке ST

    Подскажите как сделать задержку на языке ST.
    Аналог Sleep или Wait...

  2. #2

    По умолчанию Никак....

    программа выполянется циклически

    ну если кусочек надо сделать после определенного события

    myTON:TON;
    myR_TRIG:R_TRIG;

    myTON(IN:=external_event,PT:=t#10s500ms);
    myR_TRIG(CLK:=myTon.Q);
    if myR_TRIG.Q then
    (*
    действие после задержки - однократно
    *)

    end_if

  3. #3

    По умолчанию

    Цитата Сообщение от Малышев Олег Посмотреть сообщение
    программа выполянется циклически

    ну если кусочек надо сделать после определенного события

    myTON:TON;
    myR_TRIG:R_TRIG;

    myTON(IN:=external_event,PT:=t#10s500ms);
    myR_TRIG(CLK:=myTon.Q);
    if myR_TRIG.Q then
    (*
    действие после задержки - однократно
    *)

    end_if
    Прошу прощения, но я ничего не понял можно комментарии к каждой строчке.

    Например, я хочу, чтобы регистр менял значение через интервал в 1сек.

    в обычной программе это выглядело бы примерно так:

    FOR i:=1 TO 10 DO
    reg:=i;
    (* SLEEP 1 или что-то подобное *)
    END_FOR

  4. #4

    Post

    Цитата Сообщение от burn Посмотреть сообщение
    Прошу прощения, но я ничего не понял можно комментарии к каждой строчке.

    Например, я хочу, чтобы регистр менял значение через интервал в 1сек.

    в обычной программе это выглядело бы примерно так:

    FOR i:=1 TO 10 DO
    reg:=i;
    (* SLEEP 1 или что-то подобное *)
    END_FOR
    Для того что бы разобраться просто надо ознакомится с документацией: файло «CoDeSys_V23_RU.pdf» там всё есть.
    Например про функциональный блок «TON» можно прочитать на 10-54 стр., а про «R_TRIG» прочитать на 10-49 стр., «if …. Then….end_if» прочитать на 2-14 стр.
    P. S. Более подробно вряд ли кто нибудь ответит, если только всё сделает за Вас :-)

  5. #5

    По умолчанию

    Цитата Сообщение от burn Посмотреть сообщение
    ...в обычной программе это выглядело бы примерно так:...
    В смысле в программе на языке Си...

    В МЭК программе цикл уже есть всегда. Напишите на ST простейшую программу x := x+1; и запустите, станет понятно.
    Классически программа ПЛК выполняет много всяких разных операций одновременно. Все они в лоб пишутся подряд, одно за другим (цепи в LD или FBD или строки в ST) в одной программе, и крутятся в рабочем цикле. Поэтому таких мертвых задержек как в Си делать нельзя принципиально, иначе все станет на время этой задержки. Поэтому таймеры МЭК сначала запускаются в одном цикле вызова программы (по фронту входа), затем в других циклах идет опрос вышло ли время (единичка на выходе: IF...). Таймер МЭК для ПЛК это как некий внешний железный прибор, подключенный к входам/выходам. Запустили его, опрашиваем до готовности.

    Подробнее тут

  6. #6

    По умолчанию

    Цитата Сообщение от burn Посмотреть сообщение
    Прошу прощения, но я ничего не понял можно комментарии к каждой строчке.
    myTON:TON; (*определение фун блока таймера*)
    myR_TRIG:R_TRIG; (*определение фун блока детектора переднего фронта*)

    myTON(IN:=external_event,PT:=t#10s500ms); (*инициализация ФБ таймера, если переменная external_event переходит в true, то начинается отсчет времени, по окончании отсчета выход Q переходит в true*)

    myR_TRIG(CLK:=myTon.Q); (*детектирование переднего фронта выхода Q*)

    if myR_TRIG.Q then (*если передний фронт есть, то выполняются действия внутри условия*)
    (*
    действие после задержки - однократно
    *)

    end_if;

  7. #7

    По умолчанию

    Цитата Сообщение от burn Посмотреть сообщение
    Например, я хочу, чтобы регистр менял значение через интервал в 1сек.

    в обычной программе это выглядело бы примерно так:

    FOR i:=1 TO 10 DO
    reg:=i;
    (* SLEEP 1 или что-то подобное *)
    END_FOR
    если еще актуально, то мой вариант на эту тему:

    FUNCTION_BLOCK example
    VAR_INPUT
    iVar: INT;
    END_VAR
    VAR_OUTPUT
    END_VAR
    VAR
    timer: TON;
    iReg: INT;
    END_VAR
    --------------------------------------

    timer(IN:= NOT timer.Q, PT:=T#1s ); (* вызов таймера с самосбросом*)

    IF timer.Q (* присваивание регистру (iReg) значения iVar будет происходить раз в 1 сек*)
    THEN
    iReg:=iVar;
    END_IF

  8. #8
    незарегистрированный
    Гость

    По умолчанию

    Еще вариант

    i - глобальная переменная

    Пишете ПРОГРАММУ MY_COUNT
    i:=i+1;

    Залезаете в task config..

    Создаете новую задачу - MY_TASK1
    к ней цепляете MY_COUNT
    type ставите ciclyc
    interval = одна секунда.

    Вот и все.
    Типа обработки прерывания.

    В PLC_PRG спокойно читаете i

    PS
    Только кажется к MY_TASK2 придется прицепить
    PLC_PRG c type = freewheeling.
    Тут можно вообще без PLC_PRG обойтись.

  9. #9

    По умолчанию

    Перефразируя классиков, что только не сделают программисты ПЛК чтобы не использовать стандартные механизмы. Страна Кулибиных...Только надо ли на каждом углу велосипед изобретать?

    Есть библиотека SysLibTime.lib, в которой доступно и время в секундах/минутах и т.д. и высокоточное системное время с разрешением 1 мкс.

  10. #10
    незарегистрированный
    Гость

    По умолчанию

    Некоторые ученые полагают что яйца на бить с тупого конца.
    Я же глубоко убежден что это неправильно. Только с острого.

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

    Понятие "прерывание" возникло несколько раньше какого-то syslib...
    Поэтому Ваши же слова я повторяю по отношению к Вам.
    .........

    PS
    Помимо библиотек, существуют возможности самого ПЛК.

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

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