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

Тема: Определение первого захода в функциональный блок.

  1. #1

    По умолчанию Определение первого захода в функциональный блок.

    Есть созданный мной функциональный блок. В нём сделал первую строчку If bSTRAT=TRUE THEN //Разрешение работы всего блока если подали единицу на вход, а внутри всякая фигня.
    Надо что бы только его активации там выполнялись разовые настройки переменных.
    То есть идёт основная программа, появляется сигнал (Допустим нажали кнопку) и мой функциональный блок получил разрешение работать. Заходит программа в блок первый раз и выполняет разовые настройки переменных, и циклически работает с этим блок. Отпустили кнопку, потом опять нажали. Оно снова выполнило разовые настройки (сбросило переменные после предыдущей работы локальные и глобальны) и пошло дальше работать.
    Думал присобачить R_TRIG к bSTRAT, но что-то не вышло.
    Правильно ли так разрешать работу функционального блока ?
    И как реализовать разовые настройки при активации блока? Не хочется ставить счетчики или таймеры, знаю что должен быть способ как-то легче организовать данную задачу.

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

    По умолчанию

    Заведите переменную, которая устанавливается в TRUE при первом вызове ф.блока. И в теле программы ФБ используйте ее состояние
    Код:
    FUNCTION_BLOCK My1
    VAR_INPUT
    END_VAR
    VAR_OUTPUT
    END_VAR
    VAR
        init: BOOL;        (*Флаг инициализации*)
    END_VAR
    IF NOT init THEN
    (* Здесь
    ..............................
    .............................
    ............................
    код который нужен при первом вызове программы*)
    init:=TRUE;
    END_IF
    
    
    (*Здесь
    ..................................
    .................................
    ................................
    основной код*)
    Или так, если при первом вызове ФБ нужна только инициализация, например, каких-либо переменных, а основной код нужно выполнять только со второго вызова ФБ
    Код:
    IF NOT init THEN
    (* Здесь
    ..............................
    .............................
    ............................
    код который нужен при первом вызове программы*)
    init:=TRUE;
    ELSE
    (*Здесь
    ..................................
    .................................
    ................................
    основной код*)
    END_IF
    Если переменную "init" сделать VAR_INPUT, то ее можно сбрасывать при вызове ФБ в нужный момент времени "...появляется сигнал (Допустим нажали кнопку) и мой функциональный блок получил разрешение работать. Заходит программа в блок первый раз и выполняет разовые настройки переменных, и циклически работает с этим блок. Отпустили кнопку, потом опять нажали. Оно снова выполнило разовые настройки (сбросило переменные после предыдущей работы локальные и глобальны) и пошло дальше работать..."
    Последний раз редактировалось petera; 05.04.2016 в 14:20.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  3. #3

    По умолчанию

    А как понять "IF NOT init THEN" ??? NOT - Вроде как делает инверсию переменной FALSE -> TRUE и наоборот. А там насколько я знаю ставят сравнение что-то с чем-то
    Чего то в голову не приходить что эта функция там делает.
    Последний раз редактировалось Neverov; 05.04.2016 в 14:34.

  4. #4
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    А еще можно к ФБ прицепить действие
    Захват-3.png

    В действии прописать разовые(начальные) настройки переменных ФБ
    Захват-4.png

    Нажали кнопку - вызвали действие "Init"
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #5
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от Neverov Посмотреть сообщение
    А как понять "IF NOT init THEN" ??? NOT - Вроде как делает инверсию переменной FALSE -> TRUE и наоборот. А там насколько я знаю ставят сравнение что-то с чем-то
    Чего то в голову не приходить что эта функция там делает.
    При первом вызове ФБ переменная init равна FALSE, по этому код внутри IF NOT init THEN выполняется только один раз, т.к в конце IF - init устанавливается в TRUE.

    ЗЫ
    IF (NOT init) THEN = если init не равно TRUE, то....
    Последний раз редактировалось petera; 05.04.2016 в 14:42.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  6. #6

    По умолчанию

    Тю, блин эти примочки SodeSysa было бы IF init<>TRUE THEN, сразу бы понял ))
    Или как на Си IF init!=TRUE THEN
    Спасибо.

  7. #7

    По умолчанию

    А в какой момент init после первого цикла будет обнулятся ??? (Первый твой пост в теме)
    Есть основной цикл ПЛК (который ты там не показал), и есть этот функц. блок.
    После его исключения из основного цикла (Убрали сигнал на разрешение работы с другого функционального блока) переменная init не обнулится вроде как.
    И когда потом этот блок опять получит разрешение работать (повторно появился сигнал с другого ф. блока) то либо init при заходе в блок заново будет инициализироваться со значение "0" но тогда это будет постоянно каждый цикл ПЛК пр нажатой кнопке (и тогда это становится бессмысленным). Либо в ней останется предыдущее значение "1".
    Последний раз редактировалось Neverov; 05.04.2016 в 15:25.

  8. #8
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от Neverov Посмотреть сообщение
    Тю, блин эти примочки SodeSysa было бы IF init<>TRUE THEN, сразу бы понял ))
    Или как на Си IF init!=TRUE THEN
    Спасибо.
    Захват-5.png
    Тю,
    IF init<>TRUE THEN
    IF init=TRUE THEN
    сие - индусский код
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  9. #9

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Захват-5.png
    Тю,
    IF init<>TRUE THEN
    IF init=TRUE THEN
    сие - индусский код
    Почему ?? IF init!=TRUE THEN сие - индусский код. Просто вместо "NOT" стоит "!=", что означает тоже самое, и не увеличивает код. Просто обычай языка С++

  10. #10
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от Neverov Посмотреть сообщение
    Почему ?? IF init!=TRUE THEN сие - индусский код. Просто вместо "NOT" стоит "!=", что означает тоже самое, и не увеличивает код. Просто обычай языка С++
    В КДС
    IF init=TRUE THEN здесь init=TRUE - масло маслянное, достаточно просто IF init THEN.
    А в какой момент init после первого цикла будет обнулятся ??? (Первый твой пост в теме)
    Есть основной цикл ПЛК (который ты там не показал), и есть этот функц. блок.
    После его исключения из основного цикла (Сигнал с другого функционального блока) переменная init не обнулится вроде как.
    И когда потом этот блок опять получит разрешение работать (повторно появился сигнал с другого ф. блока) то либо init при заходе в блок заново будет инициализироваться со значение "0" но тогда это будет постоянно каждый цикл ПЛК пр нажатой кнопке (и тогда это становится бессмысленным). Либо в ней останется предыдущее значение "1".
    Изначально писал как инициализировать ФБ при его безусловном первом вызове.
    От кнопки предлагаю добавить входную переменную "res"
    Захват-2.png
    Код:
    FUNCTION_BLOCK My1
    VAR_INPUT
        res: BOOL;        (*Флаг реинициализации*)
    END_VAR
    VAR_OUTPUT
    END_VAR
    VAR
       init: BOOL;        (*Флаг инициализации*)
    END_VAR
    IF NOT init OR res THEN
    (* Здесь
    ..............................
    .............................
    ............................
    код который нужен при первом вызове программы*)
    init:=TRUE;
    res:=FALSE;
    END_IF
    
    
    
    
    (*Здесь
    ..................................
    .................................
    ................................
    основной код*)
    А вот кнопку нужно пропустить через R_TRIG
    Код:
    PROGRAM PLC_PRG
    VAR
        R_TRIG1: R_TRIG;
        Bt1: BOOL;
        My_Test: My1;
    END_VAR
    R_TRIG1(CLK:= Bt1 );
    My_Test(res:= R_TRIG1.Q);
    Теперь инициализация ФБ будет происходить и при первом вызове и в дальнейшем от кнопки.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

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

Похожие темы

  1. Функциональный блок PID
    от Hemann в разделе Программируемые реле
    Ответов: 78
    Последнее сообщение: 04.05.2017, 08:57
  2. LD + функциональный блок
    от дрю в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 26.04.2014, 09:47
  3. Функциональный блок для МЭ110-224.1М
    от rustam_m в разделе ПЛК3хх
    Ответов: 10
    Последнее сообщение: 10.03.2013, 20:07
  4. Пользовательский функциональный блок
    от fill-forty в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 17.08.2009, 09:49

Ваши права

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