Здравствуйте!
Необходимо сделать задержку для обнуления переменной - а. Написал следующий код (в упрощенной форме):
if btn = true then
TimerStart(vrTime_1, 0); //Включение и выключение таймера. Эта часть работает.
if vrTime_1.AsDateTime > 5000 then
a.Value := 0;//Т.е. при vrTime_1 > 5 сек должно произойти обнуление переменной а. Но обнуление не происходит.
По всей видимости не правильно выразил vrTime_1.AsDateTime > 5000?
AutoCY
Здравствуйте.
Возможно должно быть так
if vrTime_1.AsDateTime > 5 then
a.Value := 0;//Т.е. при vrTime_1 > 5 сек должно произойти обнуление переменной а. Но обнуление не происходит.
Скрипт как я понял секундный, а значит значение в 5000 это примерно полтора часа
Возможно должно быть так
if vrTime_1.AsDateTime > 5 then
a.Value := 0;
Скрипт как я понял секундный, а значит значение в 5000 это примерно полтора часа
День добрый! Да событие 1 s. Значение 5000 менял на разные (в том числе и 5). Пока получилось сделать так:
if vrTime_1.Value > ('00:00:05') then
begin
a.Value := 0;
AutoCY, здравствуйте. Можно сделать на основе локальной переменной без использования таймерных функций и без внутренней переменной vrTime_1, вот пример секундного скрипта:
var
aTimer: Byte;
begin
if aTimer < 5 then
begin
aTimer := aTimer + 1; // каждую секунду увеличиваем счетчик на 1
if aTimer = 5 then // если прошло 5 секунд
a.Value := 0; // то обнуляем переменную
end;
end.
Т.е. идёт отсчет с нуля до 5, каждую секунду. На пятой секунде выполняется обнуление переменной "а". Такой таймер срабатывает только один раз. Если нужно другое поведение таймера, то опишите его, мы изменим пример.
Если рассматривать приведённый Вами пример, то переменная vrTime_1 имеет тип DateTime и проверять время нужно при помощи функций для работы с датой/временем (https://simple-scada.com/help/script/datetime.html). Например:
if btn = true then
TimerStart(vrTime_1, 0); // включение и выключение таймера. Эта часть работает.
if SecondsBetween(vrTime_1.AsDateTime, 0) > 5 then
a.Value := 0;
Но учитывайте, что в Вашем примере запись нуля в переменную "a" происходит каждую секунду, если таймер больше 5 секунд. Может быть нужно предусмотреть остановку таймера, например:
if btn = true then
TimerStart(vrTime_1, 0); // включение и выключение таймера. Эта часть работает.
if SecondsBetween(vrTime_1.AsDateTime, 0) > 5 then
begin
a.Value := 0;
TimerReset(vrTime_1);
end;
Добрый день!
Пытался повторить описанные выше примеры, почему-то не получилось - сообщение не формируется. Вот весь код моего скрипта типа "Прошла секунда":
begin
//если пришла авария связи
if Svyaz_s_PDU_1_1.Value <> 1 then
TimerStart(vrTime_1, 0);
if SecondsBetween(vrTime_1.AsDateTime, 0) > 120 then
begin
TimerReset(vrTime_1);
AddMessage(Now, mkAlarm, 'Нет связи с PDU 1.1', True, True);
text63.Text := 'connect alarm';
end;
end.
суть такая - если значение переменной Svyaz_s_PDU_1_1.Value стало не равно 1, нужно подождать 120 секунд, потом сформировать аварийное сообщение. Если за это время авария ушла, то нужно сбросить счётчик времени и при новом возникновении аварии заново его запустить.
Буду очень благодарен за помощь
Здравствуйте.
У Вас таймер запускается снова и снова (с нуля), когда срабатывает условие "if Svyaz_s_PDU_1_1.Value <> 1 then". А нужно запускать таймер только если он не запущен. Т.е. вот так:
begin
if Svyaz_s_PDU_1_1.Value <> 1 then
begin
if TimerGetState(vrTime_1) <> 1 then
TimerStart(vrTime_1, 0);
end else
TimerReset(vrTime_1);
if TimerGetState(vrTime_1) = 1 then
if SecondsBetween(vrTime_1.AsDateTime, 0) > 30 then
begin
TimerReset(vrTime_1);
AddMessage(Now, mkAlarm, 'Нет связи с PDU 1.1', True, True);
text63.Text := 'connect alarm';
end;
end.