PDA

Просмотр полной версии : Таймер обратного счета



service
28.11.2013, 13:57
Подскажите, как реализовать такой алгоритм:
-механизм включается через время T1 на время Т2. Времена Т2 и Т1 задаюся(это реализовал).После отключения нужно показывать сколько осталось до следующего вкючения(обратный отсчет Т1)

capzap
28.11.2013, 14:03
ну что то вроде 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

service
28.11.2013, 15:41
Если Т типа TIME то ничего не выйдет

capzap
28.11.2013, 15:46
так то есть преобразования TIME_TO_DWORD и обратно

Валенок
29.11.2013, 00:22
Если Т типа TIME то ничего не выйдет
..
T:=T - Tmr_tik1s.PT
..

Dimooon
04.02.2014, 14:04
а как таймер обратного отсчета реализовать в CFC? Есть какие-нибудь библиотечные решения?

amn
04.02.2014, 15:13
а как таймер обратного отсчета реализовать в CFC? Есть какие-нибудь библиотечные решения?

Есть не библиотечное решение

Dimooon
05.02.2014, 14:45
я эту миниатюру нарисовал, в переменной "T" выставил 15000 ms (15 сек). Он в обратно считает, но дробными числами в переменной "count". А мне надо на панель ип 320 обратный отсчет в секундах отобразить

Василий Кашуба
05.02.2014, 14:49
я эту миниатюру нарисовал, в переменной "T" выставил 15000 ms (15 сек). Он в обратно считает, но дробными числами в переменной "count". А мне надо на панель ип 320 обратный отсчет в секундах отобразить
Преобразуйте реал в целочисленные.

Dimooon
05.02.2014, 16:25
спасибо всем, с обратным отсчетом все получилось. только у меня теперь значения уставок таймеров не сохраняются. Я в переменных уставок ретайн установил в кодесис - все равно, когда включаю плк и ип- все по нулям... В панели памяти нет(?), надо при включении загружать в регистр, который отображает на панели уставку, последнее установленное значение, сохраненное в переменной ретайн? А как это сделать пошагово?

Валенок
05.02.2014, 16:51
var retain
ретайн..
end_var
var
init:bool;
end_var

if not init then
init:=true;
регистр:=ретайн;
end_if

ретайн:=регистр;
..работа с регистром..

Dimooon
06.02.2014, 06:31
А как этот код влепить в программу на cfc? у меня там две переменные типа time: t7 и t11. Они с работают с таймерами TON7 и TP7. Я никогда не сталкивался с текстовыми языками, поэтому у меня возникают определенные трудности с текстовыми кодами.

amn
06.02.2014, 11:56
А вот так выглядит на CFC пример уважаемого Валенка

Валенок
06.02.2014, 14:32
По моему ретайн/регистр местами надо поменять.
Ну и, чисто имхо, МOVE(2) можно заменить на ..MOVE(0).ENO---(S)init
Да и MOVE(4) можно не ставить, только палка [регистр]---[ретайн]
Извините.

petera
06.02.2014, 15:30
Посты #14+#15
11749

Только, что бы это работало правильно, данный фрагмент должен выполняться самым первым в программе. По этому порядок выполнения блоков должен быть таким, как на рисунке и остальные блоки в Вашей программе должны иметь номер начиная с 7

amn
06.02.2014, 18:06
Когда-то у меня были проблемы с выходом ENO у MOVE. Промучился я с ним долго, потом отказался от него и больше не использовал.

Сейчас попытался разобраться и выяснил вот что. Попробуйте поменять несколько раз вход in и посмотреть на выход k и l.

11751

Выход l меняется, а выход k нет.

capzap
06.02.2014, 19:16
Выход l меняется, а выход k нет.

:) да ладно, может наоборот, ель постоянный, а ка меняется

amn
06.02.2014, 23:03
Все правильно, наоборот :). Только суть от этого не меняется. Надо это учитывать, а в документации про это не написано, или я не нашел.

capzap
06.02.2014, 23:14
А чего Вы должны найти в документации? Eno так то не предназначен для присваивания, если блок закончил работу без ошибок на нем будет истина,это передается переменной,далее наступает выполнение следующего действия,присвоение результата выходу и после eno повторяет состояние en

Вот как то так, измените порядок жействий и результат будет одинаковым

Валенок
07.02.2014, 09:26
PS
Каюсь, когда писал про MOVE(0).ENO----(s)init, cделал лишнее (s)


PS PS
Потерял нить )))) А причем тут таймер обратного отчета ?

amn
07.02.2014, 20:24
Вся суть как раз в "палке". Применительно к ENO "палка" работает не так как ожидается. Еще раз поясню свою мысль: если мы используем просто "палку" MOVE.ENO---переменная, то Выход MOVE.ENO включает переменную, но никогда не выключает. В других случаях MOVE.ENO---MOVE, MOVE.ENO---ADD.EN, MOVE.ENO---RS.SET (остальные не проверял) выход ENO работает предсказуемо, то есть включает и выключает тот блок к которому подключен. Ниже пример с разными вариантами для тех, кто еще не понял о чем идет речь. Включать/выключать переменную in.


PS PS
Потерял нить )))) А причем тут таймер обратного отчета ?

Делюсь граблями, на которые наступил :).

Валенок
07.02.2014, 23:20
Вот. Накурил. (С) Я
В CFC есть данные и есть действия.

Данные - переменные, включая структурные.
Действия - это ПОУ и любые операторы.
В CFC возможна организация обратных связей, но следствием этого является следующее:
Любое действие, фактически превращается в структурную переменную (типа ФБ) добавлением полей EN и ENO для условного выполнения. А поля существуют всегда. ENO - это просто псевдоним EN для возможности организации шлейфа.Отсутствие EN/ENO это неявное присвоение TRUE неявному EN.
Для FUNCTION, дополнительно, добавляется неявное поле результата. Т.е. результат функции есть всегда, даже когда она не выполняется, как бы странным это не казалось. Значение результата - определяется последним выполнением.

Действие можно выполнить.
При выполнении действия, оно само берет необходимые значения на входы (при явном определении EN ему требуется обязательное присвоение значения), но свои выходы действие никуда само не суёт. Но есть маленькое исключение подтверждающее правило.
Данные нельзя выполнить.
А значит они не могут взять себе необходимые значения (речь о данных реализованных как ВЫХОД), и если приемник значений – данные, то перемещение значений выполняется (или не выполняется) источником значения.
Тут появляется еще одно исключение.
Опять же - данные нельзя выполнить.
Если и источник значений – данные, то перемещение значений происходит безусловно.

Отмечу особенность. VAR_INPUT в исполняемых структурах (ФБ и PROGRAM) рассматриваются как данные только если обращение/связь к ним как к структурным переменным, а не как к действию.
Следствие - см.выше

Применительно к ST, MOVE не является эквивалентом :=
MOVE это действие по условному перемещению значений (перемещению при условии)
А эквивалент := это перемещение в данные, что может быть частью MOVE

PS
макросы – это отдельная песня, но курево кончилось

Dimooon
10.02.2014, 10:47
А я жду про макросы, Валенок. Если в CFC создать ФБ с выходами и входами- это получится тот же макрос? И как это все переносить в другой проект? Могу курева подкинуть, если что...

Валенок
10.02.2014, 13:47
Бычок нашёл.

Нет, ФБ и макрос - разные вещи. Некоторое сходство макроса и фб есть. Тем более что любое действие (включая макрос) в CFC и превращается как-бы в ФБ. Но я макрос воспринимаю как набор действий[+данные] вставляемый каждый раз не вызовом, а целиком как есть (уточню позже). На это указывает, косвенно, отсутствие у него собственного EN (ну и мои шоры с характера макроса из асм'а).Точно выяснить это можно прогоном проверочного кода, но сейчас нет по рукой среды.
Приделать макросу EN - прямо указать этот вход и нанизать на него все действия внутри.

+ макроса :
1.Быстрое структурирование и сворачивания портянок на полтора квадратных километра без расписывания ПОУ,

- макроса :
1.Гимор с EN
2.Удаление макроса - удаление его тела, а при удалении вызова ПОУ - его код остается.

CFC'ки в другой проект - перенос через экспорт или использование через биб-ку. Копи-пасте не уверен что работает между проектами, но в пределах проекта нормально.

eoldgu
11.11.2016, 09:58
Нужен бы таймер с обратным отсчетом в 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

capzap
11.11.2016, 10:03
Нужен бы таймер с обратным отсчетом в 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? Это тогда таймер у Вас получится чуть более минуты