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

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

Автор Тема: Форматирование переменной даты и время  (Прочитано 16331 раз)

Serhioormano

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
У меня есть переменная даты и время связанная с полем. Но когда я создал эту переменную форма там стоит 0.##. По этому в поле отображается что то типа 30.01 но мне нужно что бы было 00:25 где 00 это минуты а 25 это секунды.

Я павильно понял что если я сделал переменную типа дата время, и начал в нее сохранять данные при помодешь ТаймерСтарт то я смогу оторбразить сколько прошло времени с момента вызова Таймер старт?

Serhioormano

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Форматирование переменной даты и время
« Ответ #1 : 23 Августа 2017, 18:03:50 »
Ну вобщем я не справился. Моя задача была такой, как только насос начинает работать, на экране я показываю сколько времени прошло с момента последнего влкючения.

Подскажите?

Fenix

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Форматирование переменной даты и время
« Ответ #2 : 23 Августа 2017, 18:42:42 »
Serhioormano,

У меня была аналогичная задача, только слегка расширенная. Она заключалась в том, чтобы в любой момент отображать время наработки насоса. Как только насос включается, таймер копится, соответственно при простое - стоит. При этом при перезагрузке сервера данные не должны были "слетать". У Вас аналогичная задача или проще?
« Изменён: 23 Августа 2017, 18:48:05 от Fenix »

Serhioormano

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Форматирование переменной даты и время
« Ответ #3 : 24 Августа 2017, 07:27:31 »
Ну да аналогичная. Только мне нужно считать работу текцщего запуска а не всю. По всей работе если переменную включающую насос, добавить в тренд и сделать архивной, то она будет в базе. Потом можно с базы выбрать и посчтитать общее число работы. И слетать не будет. Можно создать скрипт кторый запускаетя на прошел час, и все.

То же можно сделать и скриптом прошла секунда для моей задачи, но я не уверен что иду правильным путем, может эта задача проще решается.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Форматирование переменной даты и время
« Ответ #4 : 24 Августа 2017, 14:27:07 »
Serhioormano, пример для компонентов Календарь и Текст во вложении (для версии 2.2.4.0)

Serhioormano

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Форматирование переменной даты и время
« Ответ #5 : 24 Августа 2017, 14:56:52 »
Понятно. Вроде все как надо. Только одно осталось, когда я делаю паузу на таймер, у меня число становиться 00:00:00 хотя было 00:02:50. Почему? Я же не сбрасываю счетчик просто делаю ТаймерПауза. Как бы мне сохранить число до того пока я вызову ТаймерРесет?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Форматирование переменной даты и время
« Ответ #6 : 24 Августа 2017, 15:10:53 »
TimerPause не сбрасывает время на 0. Это делает только TimerReset. В примере из предыдущего сообщения когда Вы включаете кнопку таймер запускается, нажимаете снова - ставится на паузу и время замирает, а не сбрасывается в 0. Запускаете снова - сбрасывается и стартует. См. скрипт btnChange_OnDataChange.
« Изменён: 24 Августа 2017, 15:11:58 от Simple-Scada »

Serhioormano

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Форматирование переменной даты и время
« Ответ #7 : 24 Августа 2017, 15:50:43 »
Вот мой скрипт работает раз в 1с

Код
var
  started_dump, started_kol : Boolean;
begin
  if pump_dump_state.AsBool = True AND started_dump = False then
    begin
    TimerReset(timer_dump);
    TimerStart(timer_dump, 0);
    started_dump := True;
    end;
  if pump_dump_state.AsBool = False AND started_dump = True then
    begin
      started_dump := False;
      TimerPause(timer_dump);
    end;
end.

Где
Код
pump_dump_state
это переменная состояния работы насосоа а
Код
timer_dump
это перменная ДатаВремя которая отображается в объекте календарь.

Что не так? Почему у меня все в 0 сбрасывается?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Форматирование переменной даты и время
« Ответ #8 : 24 Августа 2017, 15:53:48 »
Цитировать
Почему у меня все в 0 сбрасывается?
Видимо потому что проходит условие  "if pump_dump_state.AsBool = True AND started_dump = False then" и соответственно выполняется "TimerReset(timer_dump);", который сбрасывает таймер на 0.

Serhioormano

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Форматирование переменной даты и время
« Ответ #9 : 24 Августа 2017, 16:21:26 »
Да действительно. Хотя по скрипту видно что этого не должно происходить.

Пробую другой способ. Значит я к обхекту картики где основная переменная pump_dump_state привязал дополнительную локальную переменную timer_dump типа дататайм. Но если я пробую делать TimerStart(VarVariableEx, 0);   у меня не компилируется скрипт а если вставить родную переменную то все работает. Но у меня таких счетчиков 4 на разных насосах и я стараюсь сделать универсальный скрипт.

К стати хотел использоват тег как имя переменной таймера для использования GetVariableByName но туда только цифры пишуться.
« Изменён: 24 Августа 2017, 16:26:53 от Serhioormano »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Форматирование переменной даты и время
« Ответ #10 : 24 Августа 2017, 16:42:34 »
Цитировать
Хотя по скрипту видно что этого не должно происходить.
В любом случае условие может пройти только когда pump_dump_state будет равна TRUE, а started_dump равна FALSE. Если условие проходит, значит такой момент действительно возникает.

В приведенном Вами примере непонятно для чего используется started_dump. Почему не подходит такой код?
Код
begin
  if pump_dump_state.AsBool = True then
  begin
      TimerReset(timer_dump);
      TimerStart(timer_dump, 0);
  end else
      TimerPause(timer_dump);
end.

Цитировать
Кстати хотел использовать тег как имя переменной таймера для использования GetVariableByName но туда только цифры пишутся.
Да, тег это число. Его можно использовать только как подстановочное значение в однотипном имени, например так:
Код
var
  s: string;
  aVar: TM_Variable;
begin
  s := 'MyVariable_' + IntToStr(Sender.Tag);  // формируем имя в зависимости от тега, напр. 'MyVariable_1'
  aVar := GetVariableByName(s);
  if aVar <> nil then
    aVar.Value := 10;
end.
« Изменён: 24 Августа 2017, 16:43:39 от Simple-Scada »

Serhioormano

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Форматирование переменной даты и время
« Ответ #11 : 24 Августа 2017, 17:15:19 »
Все работает. Но вопрсо открыт почему VariableEx не сработал? Ведь это переменная.

По поводу моего кода почему она срабатывает, я не уверен, но мне кажется это, где то в том как скрипты запускаются кроется. Потому что код вообще понятный и простой. Проблема в том наверно что этот код работал с промежутком 1 секунда. Это не на событие объекта скрипт был. А имено по этому добавлени started_dump. Если мы сработали, я ее меняю и на сделющию секунду, предположительно это уже не сработает. Но видимо скрипт запускается через секунду, даже если предыдущая итерация еще не закончилась, вот и получается что он запускается пока предыдущая итерация еще не помнеяла started_dump и он опять заходит в то условие.

Короче причина не в коде а в том как СС его исполняет я думаю. Асинхронно что ли?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Форматирование переменной даты и время
« Ответ #12 : 24 Августа 2017, 17:23:31 »
Цитировать
Но вопрсо открыт почему VariableEx не сработал? Ведь это переменная.
Значит есть какая-то ошибка в коде. Для универсального скрипта нужно писать так:
Код
begin
  if not (Sender is TM_Object) then Exit;
  with Sender as TM_Object do
    if VariableEx <> nil then
      TimerStart(VariableEx, 0);
end.

Для конкретного объекта так:
Код
begin
  if Shape1.VariableEx <> nil then
    TimerStart(Shape1.VariableEx, 0);
end.

Цитировать
Короче причина не в коде а в том как СС его исполняет я думаю. Асинхронно что ли?
Наоборот, синхронно, иначе со скриптами было бы совсем тяжело. Дело в самом скрипте. Локальные переменные для этого нельзя использовать. Они инициализируются только на время выполнения скрипта и после выполнения освобождаются. 
« Изменён: 24 Августа 2017, 17:25:12 от Simple-Scada »

Serhioormano

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Форматирование переменной даты и время
« Ответ #13 : 24 Августа 2017, 17:32:35 »
Они инициализируются только на время выполнения скрипта и после выполнения освобождаются.

Ну теперь понятно. Значит мне еще нужно было создать глобальные для старта и финиша? Ясно теперь почему. Ну все равно я переделал все на теги. Уже все работает.

К стати спасибо за помощь, очень приятно получать такую качественню поддержку. Мне понравился ваш продукт. Много класных плюшек. Надеюсь что вы займете достойное место в ряду поп. скад.