Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Функция delay  (Прочитано 9641 раз)

mepexa

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Функция delay
« : 05 Января 2018, 14:31:25 »
Здравствуйте. Как организовать функцию "delay" ?
« Изменён: 21 Апреля 2018, 11:26:55 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: функция delay
« Ответ #1 : 05 Января 2018, 23:38:06 »
Здравствуйте. Процедура delay в скриптах не предусмотрена и задержки можно реализовать только на основе таймеров или событий.

UPD: начиная с версии 2.6.14.0 добавлена возможность запускать задержки через RunDelay.
« Изменён: 29 Августа 2024, 10:33:47 от Simple-Scada »

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: функция delay
« Ответ #2 : 09 Января 2018, 12:45:23 »
Здравствуйте!

Необходимо сделать задержку для обнуления переменной - а. Написал следующий код (в упрощенной форме):

Код: (delphi)
if  btn = true then
   TimerStart(vrTime_1, 0);  //Включение и выключение таймера. Эта часть работает.

if    vrTime_1.AsDateTime > 5000 then
      a.Value := 0;//Т.е. при vrTime_1 > 5 сек должно произойти обнуление переменной а. Но обнуление не происходит.

По всей видимости не правильно выразил vrTime_1.AsDateTime > 5000?
« Изменён: 26 Мая 2018, 13:35:57 от Simple-Scada »

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: функция delay
« Ответ #3 : 09 Января 2018, 14:49:59 »
Цитировать
AutoCY
Здравствуйте.
Возможно должно быть так
Код: (delphi)
if    vrTime_1.AsDateTime > 5 then
      a.Value := 0;//Т.е. при vrTime_1 > 5 сек должно произойти обнуление переменной а. Но обнуление не происходит.
Скрипт как я понял секундный, а значит значение в 5000 это примерно полтора часа
« Изменён: 26 Мая 2018, 13:36:07 от Simple-Scada »

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: функция delay
« Ответ #4 : 09 Января 2018, 15:03:42 »
Возможно должно быть так
Код: (delphi)
if    vrTime_1.AsDateTime > 5 then
      a.Value := 0;

Скрипт как я понял секундный, а значит значение в 5000 это примерно полтора часа

День добрый! Да событие 1 s. Значение 5000 менял на разные (в том числе и 5). Пока получилось сделать так:

Код: (delphi)
 if    vrTime_1.Value > ('00:00:05') then
        begin
         a.Value := 0;
« Изменён: 26 Мая 2018, 13:36:33 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: функция delay
« Ответ #5 : 10 Января 2018, 00:05:34 »
AutoCY, здравствуйте. Можно сделать на основе локальной переменной без использования таймерных функций и без внутренней переменной vrTime_1, вот пример секундного скрипта:

Код: (delphi)
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 и проверять время нужно при помощи функций для работы с датой/временем. Например:
Код: (delphi)
if  btn = true then
  TimerStart(vrTime_1, 0);  // включение и выключение таймера. Эта часть работает.

if SecondsBetween(vrTime_1.AsDateTime, 0) > 5 then
  a.Value := 0;

Но учитывайте, что в Вашем примере запись нуля в переменную "a" происходит каждую секунду, если таймер больше 5 секунд. Может быть нужно предусмотреть остановку таймера, например:
Код: (delphi)
if  btn = true then
  TimerStart(vrTime_1, 0);  // включение и выключение таймера. Эта часть работает.

if SecondsBetween(vrTime_1.AsDateTime, 0) > 5 then
begin
  a.Value := 0;
  TimerReset(vrTime_1);
end;
« Изменён: 26 Мая 2018, 13:36:50 от Simple-Scada »

AutoCY

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: функция delay
« Ответ #6 : 10 Января 2018, 11:00:13 »
Simple-Scada, последний пример наиболее подходит к поставленной задаче, т.к. выполнение этого скрипта будет происходить не по нажатию кнопки, а в связи с выполнением определенных условий. Большое спасибо за науку!  :)

terrabit

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: функция delay
« Ответ #7 : 10 Апреля 2018, 14:22:21 »
Добрый день!

Пытался повторить описанные выше примеры, почему-то не получилось - сообщение не формируется. Вот весь код моего скрипта типа "Прошла секунда":
Код: (delphi)
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 секунд, потом сформировать аварийное сообщение. Если за это время авария ушла, то нужно сбросить счётчик времени и при новом возникновении аварии заново его запустить.

Буду очень благодарен за помощь       
« Изменён: 26 Мая 2018, 13:37:06 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: функция delay
« Ответ #8 : 12 Апреля 2018, 10:31:33 »
Здравствуйте.
У Вас таймер запускается снова и снова (с нуля), когда срабатывает условие "if Svyaz_s_PDU_1_1.Value <> 1 then". А нужно запускать таймер только если он не запущен. Т.е. вот так:
Код: (delphi)
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.
« Изменён: 26 Мая 2018, 13:37:12 от Simple-Scada »

terrabit

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: функция delay
« Ответ #9 : 18 Апреля 2018, 14:10:27 »
Огромное спасибо, всё работает!