PDA

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



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

petera
05.04.2016, 14:14
Заведите переменную, которая устанавливается в 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, то ее можно сбрасывать при вызове ФБ в нужный момент времени "...появляется сигнал (Допустим нажали кнопку) и мой функциональный блок получил разрешение работать. Заходит программа в блок первый раз и выполняет разовые настройки переменных, и циклически работает с этим блок. Отпустили кнопку, потом опять нажали. Оно снова выполнило разовые настройки (сбросило переменные после предыдущей работы локальные и глобальны) и пошло дальше работать..."

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

petera
05.04.2016, 14:35
А еще можно к ФБ прицепить действие
23652

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

Нажали кнопку - вызвали действие "Init"

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

ЗЫ
IF (NOT init) THEN = если init не равно TRUE, то....

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

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

petera
05.04.2016, 15:03
Тю, блин эти примочки SodeSysa было бы IF init<>TRUE THEN, сразу бы понял ))
Или как на Си IF init!=TRUE THEN
Спасибо.
23654
Тю,
IF init<>TRUE THEN
IF init=TRUE THEN
сие - индусский код

Neverov
05.04.2016, 15:22
23654
Тю,
IF init<>TRUE THEN
IF init=TRUE THEN
сие - индусский код

Почему ?? IF init!=TRUE THEN сие - индусский код. Просто вместо "NOT" стоит "!=", что означает тоже самое, и не увеличивает код. Просто обычай языка С++

petera
05.04.2016, 15:35
Почему ?? 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);
Теперь инициализация ФБ будет происходить и при первом вызове и в дальнейшем от кнопки.

amn
05.04.2016, 15:47
Можно просто с триггером:

R_TRIG_start(CLK:= start, Q=> );
IF R_TRIG_start.Q THEN
a:=0;
END_IF
IF start THEN
a:=a+1;
END_IF

Neverov
05.04.2016, 16:28
Можно просто с триггером:

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 то выполняется следующее ?

amn
05.04.2016, 16:35
После IF идет условие. То, что написано в условии может быть как TRUE, так и FALSE. В зависимости от этого код после THEN или будет выполняться или нет. TRUE - код выполняется, FALSE - код не выполняется.

Yegor
05.04.2016, 18:24
Простое правило: если true или false стоит не справа от ":=", то его нужно убрать. Условию IF требуется булевое значение, каким бы способом оно ни было получено. Булевые переменные сами по себе дают булевое значение, и сравнивать их с чем-то еще не требуется.

capzap
06.04.2016, 05:56
тоже вставлю 5 копеек, меня удивило упоминание Си, в любом языке программирования условие следит за результатом вычисления и работает если поставить if true then или if (true) {}

Neverov
06.04.2016, 14:00
сколько читал про программирование до этого, ни разу не встречал хоть пару слов про это. Спасибо

capzap
06.04.2016, 15:39
сколько читал про программирование до этого, ни разу не встречал хоть пару слов про это. Спасибо
http://cppstudio.com/post/6449/ вот первая ссылка в гугле