Просмотр полной версии : Определение первого захода в функциональный блок.
Есть созданный мной функциональный блок. В нём сделал первую строчку If bSTRAT=TRUE THEN //Разрешение работы всего блока если подали единицу на вход, а внутри всякая фигня.
Надо что бы только его активации там выполнялись разовые настройки переменных.
То есть идёт основная программа, появляется сигнал (Допустим нажали кнопку) и мой функциональный блок получил разрешение работать. Заходит программа в блок первый раз и выполняет разовые настройки переменных, и циклически работает с этим блок. Отпустили кнопку, потом опять нажали. Оно снова выполнило разовые настройки (сбросило переменные после предыдущей работы локальные и глобальны) и пошло дальше работать.
Думал присобачить R_TRIG к bSTRAT, но что-то не вышло.
Правильно ли так разрешать работу функционального блока ?
И как реализовать разовые настройки при активации блока? Не хочется ставить счетчики или таймеры, знаю что должен быть способ как-то легче организовать данную задачу.
Заведите переменную, которая устанавливается в 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, то ее можно сбрасывать при вызове ФБ в нужный момент времени "...появляется сигнал (Допустим нажали кнопку) и мой функциональный блок получил разрешение работать. Заходит программа в блок первый раз и выполняет разовые настройки переменных, и циклически работает с этим блок. Отпустили кнопку, потом опять нажали. Оно снова выполнило разовые настройки (сбросило переменные после предыдущей работы локальные и глобальны) и пошло дальше работать..."
А как понять "IF NOT init THEN" ??? NOT - Вроде как делает инверсию переменной FALSE -> TRUE и наоборот. А там насколько я знаю ставят сравнение что-то с чем-то
Чего то в голову не приходить что эта функция там делает.
А еще можно к ФБ прицепить действие
23652
В действии прописать разовые(начальные) настройки переменных ФБ
23653
Нажали кнопку - вызвали действие "Init"
А как понять "IF NOT init THEN" ??? NOT - Вроде как делает инверсию переменной FALSE -> TRUE и наоборот. А там насколько я знаю ставят сравнение что-то с чем-то
Чего то в голову не приходить что эта функция там делает.
При первом вызове ФБ переменная init равна FALSE, по этому код внутри IF NOT init THEN выполняется только один раз, т.к в конце IF - init устанавливается в TRUE.
ЗЫ
IF (NOT init) THEN = если init не равно TRUE, то....
Тю, блин эти примочки SodeSysa было бы IF init<>TRUE THEN, сразу бы понял ))
Или как на Си IF init!=TRUE THEN
Спасибо.
А в какой момент init после первого цикла будет обнулятся ??? (Первый твой пост в теме)
Есть основной цикл ПЛК (который ты там не показал), и есть этот функц. блок.
После его исключения из основного цикла (Убрали сигнал на разрешение работы с другого функционального блока) переменная init не обнулится вроде как.
И когда потом этот блок опять получит разрешение работать (повторно появился сигнал с другого ф. блока) то либо init при заходе в блок заново будет инициализироваться со значение "0" но тогда это будет постоянно каждый цикл ПЛК пр нажатой кнопке (и тогда это становится бессмысленным). Либо в ней останется предыдущее значение "1".
Тю, блин эти примочки SodeSysa было бы IF init<>TRUE THEN, сразу бы понял ))
Или как на Си IF init!=TRUE THEN
Спасибо.
23654
Тю,
IF init<>TRUE THEN
IF init=TRUE THEN
сие - индусский код
23654
Тю,
IF init<>TRUE THEN
IF init=TRUE THEN
сие - индусский код
Почему ?? IF init!=TRUE THEN сие - индусский код. Просто вместо "NOT" стоит "!=", что означает тоже самое, и не увеличивает код. Просто обычай языка С++
Почему ?? IF init!=TRUE THEN сие - индусский код. Просто вместо "NOT" стоит "!=", что означает тоже самое, и не увеличивает код. Просто обычай языка С++
В КДС
IF init=TRUE THEN здесь init=TRUE - масло маслянное, достаточно просто IF init THEN.
А в какой момент init после первого цикла будет обнулятся ??? (Первый твой пост в теме)
Есть основной цикл ПЛК (который ты там не показал), и есть этот функц. блок.
После его исключения из основного цикла (Сигнал с другого функционального блока) переменная init не обнулится вроде как.
И когда потом этот блок опять получит разрешение работать (повторно появился сигнал с другого ф. блока) то либо init при заходе в блок заново будет инициализироваться со значение "0" но тогда это будет постоянно каждый цикл ПЛК пр нажатой кнопке (и тогда это становится бессмысленным). Либо в ней останется предыдущее значение "1".
Изначально писал как инициализировать ФБ при его безусловном первом вызове.
От кнопки предлагаю добавить входную переменную "res"
23656
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);
Теперь инициализация ФБ будет происходить и при первом вызове и в дальнейшем от кнопки.
Можно просто с триггером:
R_TRIG_start(CLK:= start, Q=> );
IF R_TRIG_start.Q THEN
a:=0;
END_IF
IF start THEN
a:=a+1;
END_IF
Можно просто с триггером:
R_TRIG_start(CLK:= start, Q=> );
IF R_TRIG_start.Q THEN
a:=0;
END_IF
IF start THEN
a:=a+1;
END_IF
И опять пару глупых вопросов
IF R_TRIG_start.Q THEN //если R_TRIG_start.Q ??? то выполняем следующее. Опять для меня загадка )))
IF start THEN // Если start то выполняем следующее. Осмелюсь предположить что если start=TRUE то выполняется следующее ?
После IF идет условие. То, что написано в условии может быть как TRUE, так и FALSE. В зависимости от этого код после THEN или будет выполняться или нет. TRUE - код выполняется, FALSE - код не выполняется.
Простое правило: если true или false стоит не справа от ":=", то его нужно убрать. Условию IF требуется булевое значение, каким бы способом оно ни было получено. Булевые переменные сами по себе дают булевое значение, и сравнивать их с чем-то еще не требуется.
тоже вставлю 5 копеек, меня удивило упоминание Си, в любом языке программирования условие следит за результатом вычисления и работает если поставить if true then или if (true) {}
сколько читал про программирование до этого, ни разу не встречал хоть пару слов про это. Спасибо
сколько читал про программирование до этого, ни разу не встречал хоть пару слов про это. Спасибо
http://cppstudio.com/post/6449/ вот первая ссылка в гугле
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot