Просмотр полной версии : Таймер обратного счета
Подскажите, как реализовать такой алгоритм:
-механизм включается через время T1 на время Т2. Времена Т2 и Т1 задаюся(это реализовал).После отключения нужно показывать сколько осталось до следующего вкючения(обратный отсчет Т1)
ну что то вроде tp.PT - tp.ET
Sergey666
28.11.2013, 14:37
Tmr_tik1s(In:=not Tmr_tik1s,Pt:=t#1s);
if Tmr_tik1s.Q then
T:=T-1;
end_if
Если Т типа TIME то ничего не выйдет
так то есть преобразования TIME_TO_DWORD и обратно
Если Т типа TIME то ничего не выйдет
..
T:=T - Tmr_tik1s.PT
..
а как таймер обратного отсчета реализовать в CFC? Есть какие-нибудь библиотечные решения?
а как таймер обратного отсчета реализовать в CFC? Есть какие-нибудь библиотечные решения?
Есть не библиотечное решение
я эту миниатюру нарисовал, в переменной "T" выставил 15000 ms (15 сек). Он в обратно считает, но дробными числами в переменной "count". А мне надо на панель ип 320 обратный отсчет в секундах отобразить
Василий Кашуба
05.02.2014, 14:49
я эту миниатюру нарисовал, в переменной "T" выставил 15000 ms (15 сек). Он в обратно считает, но дробными числами в переменной "count". А мне надо на панель ип 320 обратный отсчет в секундах отобразить
Преобразуйте реал в целочисленные.
спасибо всем, с обратным отсчетом все получилось. только у меня теперь значения уставок таймеров не сохраняются. Я в переменных уставок ретайн установил в кодесис - все равно, когда включаю плк и ип- все по нулям... В панели памяти нет(?), надо при включении загружать в регистр, который отображает на панели уставку, последнее установленное значение, сохраненное в переменной ретайн? А как это сделать пошагово?
var retain
ретайн..
end_var
var
init:bool;
end_var
if not init then
init:=true;
регистр:=ретайн;
end_if
ретайн:=регистр;
..работа с регистром..
А как этот код влепить в программу на cfc? у меня там две переменные типа time: t7 и t11. Они с работают с таймерами TON7 и TP7. Я никогда не сталкивался с текстовыми языками, поэтому у меня возникают определенные трудности с текстовыми кодами.
А вот так выглядит на CFC пример уважаемого Валенка
По моему ретайн/регистр местами надо поменять.
Ну и, чисто имхо, МOVE(2) можно заменить на ..MOVE(0).ENO---(S)init
Да и MOVE(4) можно не ставить, только палка [регистр]---[ретайн]
Извините.
Посты #14+#15
11749
Только, что бы это работало правильно, данный фрагмент должен выполняться самым первым в программе. По этому порядок выполнения блоков должен быть таким, как на рисунке и остальные блоки в Вашей программе должны иметь номер начиная с 7
Когда-то у меня были проблемы с выходом ENO у MOVE. Промучился я с ним долго, потом отказался от него и больше не использовал.
Сейчас попытался разобраться и выяснил вот что. Попробуйте поменять несколько раз вход in и посмотреть на выход k и l.
11751
Выход l меняется, а выход k нет.
Выход l меняется, а выход k нет.
:) да ладно, может наоборот, ель постоянный, а ка меняется
Все правильно, наоборот :). Только суть от этого не меняется. Надо это учитывать, а в документации про это не написано, или я не нашел.
А чего Вы должны найти в документации? Eno так то не предназначен для присваивания, если блок закончил работу без ошибок на нем будет истина,это передается переменной,далее наступает выполнение следующего действия,присвоение результата выходу и после eno повторяет состояние en
Вот как то так, измените порядок жействий и результат будет одинаковым
PS
Каюсь, когда писал про MOVE(0).ENO----(s)init, cделал лишнее (s)
PS PS
Потерял нить )))) А причем тут таймер обратного отчета ?
Вся суть как раз в "палке". Применительно к 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
макросы – это отдельная песня, но курево кончилось
А я жду про макросы, Валенок. Если в 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
Нужен бы таймер с обратным отсчетом в 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
прямо таки Word? Это тогда таймер у Вас получится чуть более минуты
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot