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

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

Автор Тема: Время, таймер и так далее  (Прочитано 4625 раз)

Серега

  • Постоялец
  • ***
  • Сообщений: 229
    • Просмотр профиля
Время, таймер и так далее
« : 15 Июля 2019, 16:40:36 »
Добрый день!
Вопрос №1. Как и где правильно применять процедуру SetTimeFormat('hh:nn:ss');.
Вопрос №2. Для отображения миллисекунд на мнемосхеме достаточно объявить (с учетом вопроса№1) процедуру в виде SetTimeFormat('hh:nn:ss:zzz')? Можете пример привести? 
Не спрашивайте зачем. Стоит такая задача.
Вопрос №3. При запуске TimerStart(vrTime, 0), 0 обозначает начало отсчета времени от 30.12.1899 00:00:00?  Если использовать TimerStart(vrTime, Now), то таймер пойдет с текущего в данный момент времени и сброситься только после команды TimerReset. Что еще можно использовать в данном параметре? Можно ли использовать такую конструкцию:
TimerStart(vrTime, StrToDateTime('15.07.2019 17:00:00')) - запуск таймера в заданные дату и время?
И еще один вопрос №4. Скрипт 'Проект запущен полностью' запускает таймер TimerStart(vrTime_5m, Now). Далее делаем универсальный скрипт на нажатие кнопки aMinute.Value := MinutesBetween(Now, vrTime_5m.AsDateTime) и по идее в переменной aMinute должна быть записана разница. Между чем? Можно по подробнее. Или я не правильно понимаю принцип и как следствие не правильно делаю?   
« Изменён: 16 Июля 2019, 10:13:43 от Серега »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3110
    • Просмотр профиля
    • Simple-Scada
Re: Время, таймер и так далее
« Ответ #1 : 16 Июля 2019, 17:24:06 »
Здравствуйте.

Цитировать
Вопрос №1. Как и где правильно применять процедуру SetTimeFormat('hh:nn:ss');.
Вопрос №2. Для отображения миллисекунд на мнемосхеме достаточно объявить (с учетом вопроса№1) процедуру в виде SetTimeFormat('hh:nn:ss:zzz')? Можете пример привести? 
Чаще всего для вывода на экран даты/времени используют компонент Календарь. У него можно задать нужный формат даты/времени, например время с миллисекундами. Тогда процедуру SetTimeFormat никогда не придётся использовать. Мы рекомендуем выводить все переменные DateTime на мнемосхему именно через компонент Календарь, т.к. он для этого предназначен и позволяет избежать "лишних" конвертаций даты/времени в строку через скрипты.
Формат заданный процедурой SetTimeFormat используется только в функциях TimeToStr, DateTimeToStr, StrToTime, StrToDateTime. Т.е. можно создать скрипт с типом события "Запуск проекта" (он выполнится только один раз - при запуске проекта) и в нём задать какой-то нестандартный формат времени, тогда  вышеперечисленные функции будут использовать заданный формат. Также при желании можно в разных скриптах через SetTimeFormat задавать разный формат, например в одном скрипте с миллисекундами, в другом без.

Цитировать
При запуске TimerStart(vrTime, 0), 0 обозначает начало отсчета времени от 30.12.1899 00:00:00?
Да, т.к. у переменных DateTime значение 0 соответствует  дате/времени "30.12.1899 00:00:00".

Цитировать
Если использовать TimerStart(vrTime, Now), то таймер пойдет с текущего в данный момент времени и сброситься только после команды TimerReset.
Да, Now возвращает текущее время, поэтому отсчет пойдёт от него.

Цитировать
Можно ли использовать такую конструкцию:
TimerStart(vrTime, StrToDateTime('15.07.2019 17:00:00')) - запуск таймера в заданные дату и время?
Да, в качестве времени можно использовать любое значение DateTime. Функция StrToDateTime не исключение, ведь она переводит строку даты/времени в значение DateTime.

Цитировать
делаем универсальный скрипт на нажатие кнопки aMinute.Value := MinutesBetween(Now, vrTime_5m.AsDateTime) и по идее в переменной aMinute должна быть записана разница. Между чем?
Между двумя значениями даты/времени которые Вы передали в MinutesBetween. Т.е. в aMinute.Value будет записано количество минут между текущим временем и временем из переменной vrTime_5m.

Серега

  • Постоялец
  • ***
  • Сообщений: 229
    • Просмотр профиля
Re: Время, таймер и так далее
« Ответ #2 : 17 Июля 2019, 10:59:34 »
Добрый день!
За ответы спасибо. Теперь нужно уточнение.
1. Если не указывать конкретное время для таймера (например Timer.Value := Now или TimerStart(Timer, Now)), то сервер скады устанавливает для Timer текущую дату и время 00:00:00. Но при отображении на мнемосхеме показывается только дата. Почему?
2. Команды типа MinutesBetween, SecondsBetween показывают разницу только когда состояние таймера 0 или -1. То есть когда таймер запущен отследить сколько прошло не получиться?
3. Команда TimerReset сбрасывает таймер до "30.12.1899 00:00:00". Как сбросить до текущих дат и времени? Такое возможно?

И еще одна просьба. В ответе на вопрос №1 1 группы вопросов упоминался элемент календарь и привожу ниже часть ответа:
Цитировать
У него можно задать нужный формат даты/времени, например время с миллисекундами.
Свойство календаря TimeFormat согласно справке:
Цитировать
...Доступен только для чтения. ...
Но и тип TM_CalendarTimeFormat имеет 4 значения и походу являются константами.
Приведите пример как отобразить миллисекунды в календаре?
Спасибо!
« Изменён: 18 Июля 2019, 13:39:13 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3110
    • Просмотр профиля
    • Simple-Scada
Re: Время, таймер и так далее
« Ответ #3 : 18 Июля 2019, 13:51:46 »
Здравствуйте.

Цитировать
Но при отображении на мнемосхеме показывается только дата.
У функций конвертации даты/времени в строку есть такая особенность, что если время равно 00:00:00, то оно не отображается в строке, оставляя только дату.

Цитировать
Команды типа MinutesBetween, SecondsBetween показывают разницу только когда состояние таймера 0 или -1. То есть когда таймер запущен отследить сколько прошло не получиться?
Все функции в скаде работают всегда одинаково, независимо от того запущен таймер, или что-либо ещё. Если очередной результат вызова MinutesBetween или SecondsBetween дал тот же результат, значит переменные времени переданные в эти функции не менялись и разница в минутах / секундах осталась прежней.

Цитировать
Команда TimerReset сбрасывает таймер до "30.12.1899 00:00:00". Как сбросить до текущих дат и времени? Такое возможно?
TimerReset сбрасывает именно в 0, т.е. "30.12.1899 00:00:00". После TimerReset можно просто присвоить в переменную какое-то нужное значение, например: "vrA.Value := Now;".

Цитировать
Но и тип TM_CalendarTimeFormat имеет 4 значения и походу являются константами. Приведите пример как отобразить миллисекунды в календаре?
Свойство TimeFormat нельзя менять из скриптов, т.к. оно доступно только для чтения. Выбрать формат можно только на этапе разработки (см. свойство Календаря "время"). Сейчас мы заметили, что по ошибке забыли включить в форматы времени формат с миллисекундами. Добавим его в ближайшее время и опубликуем обновление.

Серега

  • Постоялец
  • ***
  • Сообщений: 229
    • Просмотр профиля
Re: Время, таймер и так далее
« Ответ #4 : 18 Июля 2019, 14:10:12 »
Спасибо!

Серега

  • Постоялец
  • ***
  • Сообщений: 229
    • Просмотр профиля
Re: Время, таймер и так далее
« Ответ #5 : 06 Июля 2020, 15:08:42 »
Добрый день!
Попросили добавить таймер и вот что заметил.
1. По нажатию кнопки присваиваем переменной типа DateTime текущее время
Код
Start_Time.Value := Now;
2. В 1-секундном скрипте переменной типа DateTime присваиваю следующее:
Код
tTime_Now.Value := StrToDateTime(IntToStr(SecondsBetween(Now, tTime_start.Value)));
3. Там же переменной типа String присваиваю следующее:
Код
tTime_Now_1.Value := SecondsToStr(SecondsBetween(Now, tTime_start.Value));
На прикрепленных картинках видно, что String переменная меняется как надо, то есть с нуля начинается отсчет.
Но вот переменная типа DateTime как-то странно. С "начала веков" отсчитывает часы, а после 23 переходит на текущее время.
Не знаю что это. Можете как то пояснить, может что не правильно делаю?
Жду ответов и вопросов.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3110
    • Просмотр профиля
    • Simple-Scada
Re: Время, таймер и так далее
« Ответ #6 : 07 Июля 2020, 10:07:47 »
Здравствуйте.

Цитировать
На прикрепленных картинках видно, что String переменная меняется как надо, то есть с нуля начинается отсчет.
Но вот переменная типа DateTime как-то странно. С "начала веков" отсчитывает часы, а после 23 переходит на текущее время.
Всё правильно. Функция SecondsToStr переводит количество секунд в строку в формате "чч:мм:сс", что и происходит в Вашем случае. В остальных случаях Вы работаете с DateTime. Это обычное вещественное число (аналогично типу Double). Нулевое значение соответствует дате "30.12.1899 00:00:00". Более подробное описание типа можно найти по этой ссылке.

ACHE

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Время, таймер и так далее
« Ответ #7 : 01 Марта 2024, 08:33:53 »
Функция SecondsToStr переводит количество секунд в строку в формате "чч:мм:сс", что и происходит в Вашем случае. В остальных случаях Вы работаете с DateTime. Это обычное вещественное число (аналогично типу Double). Нулевое значение соответствует дате "30.12.1899 00:00:00". Более подробное описание типа можно найти по этой ссылке.
Здравствуйте. А есть возможность в результате функции SecondsToStr не отображать секунды? В подсчете наработок оборудования нужны только HH:MM. Применяю универсальный скрипт на текст с событием OnDataChenge, и секунды - лишняя информация
Код: (delphi)
var
  aSeconds: Int64;
begin
  if Sender is TM_Text then
    with Sender as TM_Text do
    begin
      aSeconds := SecondsBetween(Variable.AsDateTime, 0);
      Text := SecondsToStr(aSeconds);
    end;
end.
« Изменён: 07 Марта 2024, 16:45:16 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1259
    • Просмотр профиля
Re: Время, таймер и так далее
« Ответ #8 : 02 Марта 2024, 13:27:47 »
Здравствуйте.

Цитировать
А есть возможность в результате функции SecondsToStr не отображать секунды? В подсчете наработок оборудования нужны только HH:MM.
Такой возможности нет, но для решения описанной задачи можно изменить код скрипта следующим образом:
Код: (delphi)
var
  aSeconds, aHours : Int64;
begin
  if Sender is TM_Text then
    with Sender as TM_Text do
    begin
      aHours   := HoursBetween(AsDateTime, 0);
      aSeconds := SecondsBetween(AsDateTime, 0);
      Text := ZeroPad(aHours, 2) + ':' + ZeroPad((aSeconds mod 3600) div 60, 2);
    end;
end.