Вызов выглядит так:
FB( [необязательно: присвоение входов и чтение выходов] );
Вид для печати
Про такую нотацию знаю, но вопрос возник по тому-что при ветвлении в if и case удобнее обращение через точку, ибо не нужна лишняя переменная. Понятно, нужно отдельно выполнять вызов без параметров.
Это понятно. Разные значения переменных на момент выполнения блока.
Странное решение авторов стандарта все переменные считать статическими, сложно после обычных языков
Не думал в этом ключе.
Подскажите как, при покупке, определить, что ПР100 является М02 и поддерживает ST?
Спасибо за ответ.
Я так понял fb на ST еще очень сырые. Один и тот же код на 200 и 103 работает по разному
И почему редактор ругается на обращение к входным переменным функционального блока в ST? Т.е писать можно, читать нет? Что за бред!
А еще fb не работают если их вызывать в теле case
Вложение 70585
Что еще я забыл сделать ?
Проверил, TON1.PT нельзя сравнивать, а входную переменную можно, вот скрин Вложение 70586 Помню, что уже делал подобное
И так ещёКод:var //объявление локальных переменных
TON1:TON;
end_var
TON1(In:=OnTim, T_z:=T_z, PT:=CurMinute, Q=>Res, ET=>ET);
if CurMinute<>0 then
TON1.PT:=5;
end_if
Код:if ET < CurMinute then
TON1.PT:=5;
end_if
вот так не работает
вот так :Код:case stepTP of
1:
tStepTP(IN := true, PT := 5, sec := sec);
if tStepTP.Q THEN
tStepTP(IN := false);
stepTP := 2;
end_if
(* 2:
tStepTP(IN := true, PT := 10, sec := sec);
if tStepTP.Q THEN
tStepTP(IN := false);
stepTP := 3;
end_if
3:
tStepTP(IN := true, PT := 15, sec := sec);
if tStepTP.Q THEN
tStepTP(IN := false);
stepTP := 4;
end_if
else
;*)
end_case
получим Вложение 70595Код:case stepTP of
1:
tStepTP(IN := true, PT := 5, sec := sec);
if tStepTP.Q THEN
tStepTP(IN := false);
stepTP := 2;
end_if
2:
tStepTP(IN := true, PT := 10, sec := sec);
if tStepTP.Q THEN
tStepTP(IN := false);
stepTP := 3;
end_if
3:
tStepTP(IN := true, PT := 15, sec := sec);
if tStepTP.Q THEN
tStepTP(IN := false);
stepTP := 4;
end_if
else
end_case
вот так
работает только первая ветвь.Цитата:
check_ON(CLK := START);
if check_ON.q then
stepTP := 1;
in := TRUE;
tStepTP.PT := 5;
end_if
if NOT START AND stepTP <> 0 then stepTP := 0;
end_if
tStepTP(IN:= in, sec := sec);
case stepTP of
1:
if tStepTP.Q THEN
in := fALSE;
tStepTP(IN := in);
in := TRUE;
tStepTP.PT := 10;
stepTP := 2;
end_if
2:
if tStepTP.Q THEN
in := fALSE;
tStepTP(IN := in);
in := TRUE;
tStepTP.PT := 15;
stepTP := 3;
end_if
(* 3:
if tStepTP.Q THEN
in := fALSE;
tStepTP(IN := in);
stepTP := 4;
end_if *)
end_case
если раскомментировать"3" - эмулятор выбивает ошибку как в прошлом примере.
Любой вызов fb в теле case не отрабатывает, ну или он вообще не вызывается.
просто сброс/останов таймера через tStepTP(IN := false) в case не работает
В предложенный Вами(рабочий) код в case вставляю fb который тупо считает математику и он не работает или не вызывается
да с чего Вы вообще взяли что это кейсы виноваты, Вы пробовали с другими ФБ так же работать, где аргументов минимум
Вот вложение, когда раскомментируете в Foo переменную RTrig получите точно такую же ошибку, как и у Вас в кейсах, я это объясняю как превышение количества вложений, раз уж все аргументы это некие объекты, возможно перебор по количеству выдает ошибку, у разработчиков конечно есть более правильная версия
Ну если не сложно прогнать пару тестов:
1. Как есть.
2. Раскомментировать case 1.
3. Раскомментировать case 2.
4. Раскомментировать case 3.
Делал не классичеcrий TON. C декрементом до нуля и одним импульсом на выходе при окончании отсчета, обновление счетчика по переднему фронту IN. Вызов таймера за пределами case.
Внутри кейса таймер действительно не вызывается.