Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: mepexa от 05 Января 2018, 14:31:25

Название: Функция delay
Отправлено: mepexa от 05 Января 2018, 14:31:25
Здравствуйте. Как организовать функцию "delay" ?
Название: Re: функция delay
Отправлено: Simple-Scada от 05 Января 2018, 23:38:06
Здравствуйте. Процедура delay в скриптах не предусмотрена и задержки можно реализовать только на основе таймеров или событий.

UPD: начиная с версии 2.6.14.0 добавлена возможность запускать задержки через RunDelay (https://simple-scada.com/help/script/rundelay.html).
Название: Re: функция delay
Отправлено: AutoCY от 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?
Название: Re: функция delay
Отправлено: deldemo от 09 Января 2018, 14:49:59
Цитировать
AutoCY
Здравствуйте.
Возможно должно быть так
Код: (delphi)
if    vrTime_1.AsDateTime > 5 then
      a.Value := 0;//Т.е. при vrTime_1 > 5 сек должно произойти обнуление переменной а. Но обнуление не происходит.
Скрипт как я понял секундный, а значит значение в 5000 это примерно полтора часа
Название: Re: функция delay
Отправлено: AutoCY от 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;
Название: Re: функция delay
Отправлено: Simple-Scada от 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 и проверять время нужно при помощи функций для работы с датой/временем (https://simple-scada.com/help/script/datetime.html). Например:
Код: (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;
Название: Re: функция delay
Отправлено: AutoCY от 10 Января 2018, 11:00:13
Simple-Scada, последний пример наиболее подходит к поставленной задаче, т.к. выполнение этого скрипта будет происходить не по нажатию кнопки, а в связи с выполнением определенных условий. Большое спасибо за науку!  :)
Название: Re: функция delay
Отправлено: terrabit от 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 секунд, потом сформировать аварийное сообщение. Если за это время авария ушла, то нужно сбросить счётчик времени и при новом возникновении аварии заново его запустить.

Буду очень благодарен за помощь       
Название: Re: функция delay
Отправлено: Simple-Scada от 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.
Название: Re: функция delay
Отправлено: terrabit от 18 Апреля 2018, 14:10:27
Огромное спасибо, всё работает!