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

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

Автор Тема: Еще раз к вопросу задержки или Delay  (Прочитано 4527 раз)

Brandon_heat

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Еще раз к вопросу задержки или Delay
« : 14 Января 2019, 10:52:47 »
Доброго дня, подскажите такой вопрос, всю голову уже изломал, нужно сделать просто задержку между действиями (например между перебором значений из таблицы) задержка 1-3 секунды не суть важно, вот такой у меня код... разные если честно пробовал уже но ни один результата не дает
Код: (delphi)
var
  vrTimer: TM_Variable;
  a: integer;
  i: integer;
  aSeconds: Int64;
begin
  a := Table1.RowCount;    // ПОЛУЧАЕТ КОЛ-ВО ЗНАЧЕНИЙ В ТАБЛИЦЕ
  i := 1;      // ТУТ ИЛИ 0 ИЛИ 1
  while i < a do
  begin
    Text1.Text := IntToStr(i);   // ВЫВОДИМ ЗНАЧЕНИЕ В ПОЛЕ ТЕКСТ
    vrTimer.Value := now;    // ЛОВИМ ЗНАЧЕНИЕ СЕЙЧАС ВО ВРЕМЕНИ
    aSeconds := SecondsBetween(now, vrTimer.AsDateTime);   // ЗДЕСЬ ВРОДЕ КАК РАЗНИЦА ПО ВРЕМЕНИ
         
    if aSeconds >= 2 then  // ЕСЛИ ПРОШЛО 2 СЕКУНДЫ ТО ВЫПОЛНЯЕМ
    begin
      i := i+1;
      vrTimer.Value := now;  // И ЗАНОВО ОБНУЛЯЕМ ТАЙМЕР
    end;
  end;
end.
наверно что то не так делаю. спасибо за помощь.
« Изменён: 14 Января 2019, 15:57:38 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Еще раз к вопросу задержки или Delay
« Ответ #1 : 14 Января 2019, 16:00:37 »
Здравствуйте. Правильная реализация таймера описана здесь.

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

Brandon_heat

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Еще раз к вопросу задержки или Delay
« Ответ #2 : 14 Января 2019, 17:19:43 »
именно такой код я нашел на форуме , сделал его, но мне приходится выставлять интервал хотя бы 10000 иначе все пролетает очень быстро. и я немного не понимаю +1 к числу типа integer это разве одна секунда? не вижу тут параметров какой нибудь структуры типа time или вроде того. спасибо.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Еще раз к вопросу задержки или Delay
« Ответ #3 : 14 Января 2019, 17:25:46 »
Скрипт с типом события "Прошла секунда". Он выполняется не чаще чем раз в секунду. Поэтому прибавляя в нём по 1, можно отмерять секунды. Аналогично в скрипте "Прошел час" можно отмерять часы и т.д.

Цитировать
но мне приходится выставлять интервал хотя бы 10000 иначе все пролетает очень быстро.
Трудно что-то посоветовать не представляя задачи которую Вы хотите решить. Непонятно что именно пролетает быстро? Цикл по строкам таблицы? Цикл в рамках скрипта всегда будет пролетать очень быстро. Если нужно проверять одну строку в секунду, то не используйте цикл, а просто в секундном скрипте проверяйте сначала первую строку, при следующем выполнении вторую и т.д. Или партиями, если нужно (например по 10 строк в секунду). Аналогично для других интервалов времени.
Установка переменной интервала в 10000 приведёт к тому, что скрипт будет моментально выполняться раз в 166 минут.
« Изменён: 14 Января 2019, 17:27:44 от Simple-Scada »

Brandon_heat

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Еще раз к вопросу задержки или Delay
« Ответ #4 : 14 Января 2019, 20:21:43 »
Спасибо за совет, попробую в секундном цикле . а задача вот какая, попробую ее объяснить и небольшую схемку от руки начерчу.
Есть погрузчик, он катается туда сюда по рельсам. у этого погрузчика есть 4 точки остановки. 0,1,2,3. двигатель погрузчика связан с ПЛК в котором доезд до каждой точки строго описан, теперь мне нужно из скада системы только отправлять на плк номера точек куда нужно ехать, т.е. есть на странице допустим вкладка с табличкой, в эту табличку я записываю определенный маршрут , допустим -> в точку 3, после в точку 2, после в точку 0, после в точку 1 , если коротко то 3, 2,0,1. и все нажимаю кнопку и запускаю цикл из таблицы считывается точка отправляется в плк , с плк на частотник и погрузчик поехал до точки 3, пока в точку 3 он не приехал и пока статус переменной допустим rabota = TRUE, тоесть погрузчик еще едет следующее значение мы на плк не посылаем, как только погрузчик доехал новое значение из скада системы отправляется на плк, и так до конца таблицы. загвоздка у меня вот в чем была, по таблице я худо бедно пробегаюсь и даже на опц сервер значения эти отправляю, но параллельно значение запуска (переменная pusk_opc которая равна FALSE, что бы погрузчик поехал ее надо изменить на TRUE, погрузчик трогается и переменная автоматом выставляется на FALSE опять) не проходит , как будто опц одновременно сигнал получает и запуск не делает, вот я и хотел бы разделить запись точки и запуск секундной паузой что бы записи переменных не накладывались друг на друга.

pan2000

  • Постоялец
  • ***
  • Сообщений: 225
    • Просмотр профиля
Re: Еще раз к вопросу задержки или Delay
« Ответ #5 : 15 Января 2019, 21:51:28 »
... вот я и хотел бы разделить запись точки и запуск секундной паузой что бы записи переменных не накладывались друг на друга.
Использование сдвиг-регистра для формирования временной диаграммы с периодом 1 сек.
Код: (delphi)
...
kuda_exat.Value := <очередной элемент таблицы движения>;  // запуск очередного цикла движения
sh_reg.Value := 1;                                        // внутренний тег типа integer
...
Скрипт "Прошла секунда"
Код: (delphi)
...
if GetBit(sh_reg.AsInt,2) then pusk_opc.Value := true;  // задержка от 1 до 2 сек.
sh_reg.Value := sh_reg.AsInt + sh_reg.AsInt;            // сдвиг на 1 разряд влево
...
Во вложении пример для модели загрузчика. Для просмотра трендов надо подключить БД.
« Изменён: 16 Января 2019, 10:03:46 от Simple-Scada »

Brandon_heat

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Еще раз к вопросу задержки или Delay
« Ответ #6 : 16 Января 2019, 09:38:48 »
Спасибо, попробую, и вот еще какой вопрос, с секундным циклом вроде все получилось, но не могу понять как сделать так что бы секундный цикл запускался только при нажатие на кнопку, (почему то секундный цикл работает прям при загрузке самой формы , основного окна и не останавливается никак) ну и по окончании выполнения цикла или когда цикл переберет все элементы таблицы этот скрипт останавливался и отжимал кнопку обратно. спасибо.

pan2000

  • Постоялец
  • ***
  • Сообщений: 225
    • Просмотр профиля
Re: Еще раз к вопросу задержки или Delay
« Ответ #7 : 16 Января 2019, 11:48:31 »
Можно включить в скрипт "Прошла секунда" условный оператор, управляемой кнопкой.

Переменная iPush типа integer, 0 разряд связан с кнопкой на два состояния с фиксацией.
Переменная iCycleCounter типа integer - счетчик циклов.
Код: (delphi)
const Cycles = 20;
begin
  if GetBit(iPush.AsInt,0) then
    // кнопка нажата
    if iCycleCounter.asInt > 0 then                 // счетчик циклов:
      iCycleCounter.Value := iCycleCounter.AsInt - 1 //   ещё не 0, уменьшить
    else
      iPush.Value := SetBit(iPush.Asint, 0, false)  //    =0, отпустить кнопку
  else
    // кнопка отжата
    iCycleCounter.Value := Cycles;                   // начальное значение счетчика циклов
end.
P.S. Еще один вариант управления циклом можно посмотреть во вложении к моему предыдущему сообщению.
« Изменён: 16 Января 2019, 17:42:22 от pan2000 »

Brandon_heat

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Еще раз к вопросу задержки или Delay
« Ответ #8 : 16 Января 2019, 20:42:19 »
Так все с кнопкой получилось, спасибо. но раз уж тут пошло обсуждение:) вот такой еще вопрос ... есть ФБ под названием таблица... нет ли какой-нибудь хитрой функции или процедуры что бы содержимое записывать в файл и соответственно все это дело потом в таблицу читать. вот для чего это надо... в файле будет так называемая циклограмма (последовательность перемещения тележки по точкам) при запуске скады , из файла загружается циклограмма в таблицу ну и по этой таблице тележка потом едет. и сюда же еще вопрос... можно как то пустую таблицу при запущенной скаде заполнять, а то я ее заполняю в режиме программирования, но я хотел бы что бы оператор самостоятельно забивал движение такое какое ему нужно. спасибо.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Еще раз к вопросу задержки или Delay
« Ответ #9 : 17 Января 2019, 15:31:06 »
Цитировать
можно как то пустую таблицу при запущенной скаде заполнять, а то я ее заполняю в режиме программирования, но я хотел бы что бы оператор самостоятельно забивал движение такое какое ему нужно.
Можно, если сделать ячейки таблицы доступными для редактирования (см. свойство Редактирование) и связать каждую ячейку с переменной. Тогда можно будет через клиент скады редактировать значения в таких ячейках. Для сохранения таблицы в файл придется пройти в цикле по всей таблице и записать данные в файл при помощи процедур для работы с файлами. Загружать данные можно аналогично, но придётся читать значение из файла и записывать его в соответствующую ячейку через переменную, что не очень удобно (особенно если таблица большая).
Другой вариант - работать как с таблицей рецептов, через БД. Полноценный пример есть в стандартном Демо-проекте, страница "Скрипты" -> "Работа с БД (рецепты)". Он же подробно описан в этой статье.