PS
Каюсь, когда писал про MOVE(0).ENO----(s)init, cделал лишнее (s)
PS PS
Потерял нить )))) А причем тут таймер обратного отчета ?
PS
Каюсь, когда писал про MOVE(0).ENO----(s)init, cделал лишнее (s)
PS PS
Потерял нить )))) А причем тут таймер обратного отчета ?
Последний раз редактировалось Валенок; 08.02.2014 в 01:46.
Вся суть как раз в "палке". Применительно к ENO "палка" работает не так как ожидается. Еще раз поясню свою мысль: если мы используем просто "палку" MOVE.ENO---переменная, то Выход MOVE.ENO включает переменную, но никогда не выключает. В других случаях MOVE.ENO---MOVE, MOVE.ENO---ADD.EN, MOVE.ENO---RS.SET (остальные не проверял) выход ENO работает предсказуемо, то есть включает и выключает тот блок к которому подключен. Ниже пример с разными вариантами для тех, кто еще не понял о чем идет речь. Включать/выключать переменную in.
Делюсь граблями, на которые наступил .PS PS
Потерял нить )))) А причем тут таймер обратного отчета ?
Вот. Накурил. (С) Я
В CFC есть данные и есть действия.
Данные - переменные, включая структурные.
Действия - это ПОУ и любые операторы.
В CFC возможна организация обратных связей, но следствием этого является следующее:
Любое действие, фактически превращается в структурную переменную (типа ФБ) добавлением полей EN и ENO для условного выполнения. А поля существуют всегда. ENO - это просто псевдоним EN для возможности организации шлейфа.Отсутствие EN/ENO это неявное присвоение TRUE неявному EN.
Для FUNCTION, дополнительно, добавляется неявное поле результата. Т.е. результат функции есть всегда, даже когда она не выполняется, как бы странным это не казалось. Значение результата - определяется последним выполнением.
Действие можно выполнить.
При выполнении действия, оно само берет необходимые значения на входы (при явном определении EN ему требуется обязательное присвоение значения), но свои выходы действие никуда само не суёт. Но есть маленькое исключение подтверждающее правило.
Данные нельзя выполнить.
А значит они не могут взять себе необходимые значения (речь о данных реализованных как ВЫХОД), и если приемник значений – данные, то перемещение значений выполняется (или не выполняется) источником значения.
Тут появляется еще одно исключение.
Опять же - данные нельзя выполнить.
Если и источник значений – данные, то перемещение значений происходит безусловно.
Отмечу особенность. VAR_INPUT в исполняемых структурах (ФБ и PROGRAM) рассматриваются как данные только если обращение/связь к ним как к структурным переменным, а не как к действию.
Следствие - см.выше
Применительно к ST, MOVE не является эквивалентом :=
MOVE это действие по условному перемещению значений (перемещению при условии)
А эквивалент := это перемещение в данные, что может быть частью MOVE
PS
макросы – это отдельная песня, но курево кончилось
Последний раз редактировалось Валенок; 10.02.2014 в 00:10.
А я жду про макросы, Валенок. Если в CFC создать ФБ с выходами и входами- это получится тот же макрос? И как это все переносить в другой проект? Могу курева подкинуть, если что...
Бычок нашёл.
Нет, ФБ и макрос - разные вещи. Некоторое сходство макроса и фб есть. Тем более что любое действие (включая макрос) в CFC и превращается как-бы в ФБ. Но я макрос воспринимаю как набор действий[+данные] вставляемый каждый раз не вызовом, а целиком как есть (уточню позже). На это указывает, косвенно, отсутствие у него собственного EN (ну и мои шоры с характера макроса из асм'а).Точно выяснить это можно прогоном проверочного кода, но сейчас нет по рукой среды.
Приделать макросу EN - прямо указать этот вход и нанизать на него все действия внутри.
+ макроса :
1.Быстрое структурирование и сворачивания портянок на полтора квадратных километра без расписывания ПОУ,
- макроса :
1.Гимор с EN
2.Удаление макроса - удаление его тела, а при удалении вызова ПОУ - его код остается.
CFC'ки в другой проект - перенос через экспорт или использование через биб-ку. Копи-пасте не уверен что работает между проектами, но в пределах проекта нормально.
Нужен бы таймер с обратным отсчетом в MasterScada. Сделал через ФБ "программа ST", код такой:
PROGRAM MAIN_PROGRAM
VAR_INPUT
in:bool;
Timer_Start : BOOL;
Tin:Word;
END_VAR
VAR
TPInst : TP ;
Begin:BOOl;
Timer_run : BOOL;
Tm:TIME;
END_VAR
VAR_OUTPUT
out:bool;
Count:TIME;
out3:bool;
EstTime:TIME;
END_VAR
Tm:=WORD_TO_TIME(Tin*1000);
TPInst(IN := Timer_Start, PT:=Tm);
Timer_run :=TPInst.Q;
out3:=TPInst.Q;
Count:=TPInst.ET;
out:=in;
EstTime:=Tm-Count;
(*TODO: TYPE PROGRAM CODE HERE*)
END_PROGRAM