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

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

Автор Тема: Как перевести числовое значение в количество дней\часов\минут  (Прочитано 7169 раз)

George

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Добрый день.
ОРС сервер получает с контроллера время работы оборудования в виде числа (которое равно количеству секунд)
Подскажите, как обработать эту переменную и преобразовать это число в дни\часы\минуты ?
Спасибо.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.

Создайте в проекте объект типа текст, например с именем Text1 и свяжите его с вашей секундной переменной. Далее на событие OnDataChange напишите такой скрипт:
Код
begin
  Text1.Text := SecondsToStr(Text1.AsInt64);
end.

, где Text1.AsInt - значение переменной связанной с объектом Text1 в виде целого числа;
описание функции SecondsToStr смотрите здесь.

Второй вариант создать универсальный скрипт:
Код
begin
  if Sender is TM_Text then
    with Sender as TM_Text do
      Text := SecondsToStr(AsInt64);
end.

Такой универсальный скрипт можно назначить на событие OnDataChange разных объектов Текст, каждый из которых связан со своей секундной переменой и всё будет работать (не придется писать отдельный скрипт для каждого объекта Текст, как в первом варианте).
« Изменён: 24 Августа 2017, 23:52:23 от Simple-Scada »

Ragnarok

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Здравствуйте!

Я делал так:
aInt_Est - количество секунд.

Код
Text1.Text := IntToStr((aInt_Est.Value div 3600) div 24) + ' дней ' +  IntToStr((aInt_Est.Value div 3600) mod 24) + 'часов ' + IntToStr((aInt_Est.Value mod 3600) div 60) + 'минут';
« Изменён: 24 Августа 2017, 10:12:23 от Simple_Scada »

George

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Здравствуйте.

Создайте в проекте объект типа текст, например с именем Text1 и свяжите его с вашей секундной переменной. Далее на событие OnDataChange напишите такой скрипт:
Код
begin
  Text1.Text := SecondsToStr(Text1.AsInt64);
end.

, где Text1.AsInt - значение переменной связанной с объектом Text1 в виде целого числа;
описание функции SecondsToStr смотрите здесь.

Второй вариант создать универсальный скрипт:
Код
begin
  if Sender is TM_Text then
    with Sender as TM_Text do
      Text := SecondsToStr(AsInt64);
end.

Такой универсальный скрипт можно назначить на событие OnDataChange разных объектов Текст, каждый из которых связан со своей секундной переменой и всё будет работать (не придется писать отдельный скрипт для каждого объекта Текст, как в первом варианте).

« Изменён: 24 Августа 2017, 23:52:11 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Какую версию Simple-Scada Вы используете? Функция SecondsToStr доступна с версии Simple-Scada 2.2.1.0 (16 Мая 2017).  Если у Вас более старая версия, то обновитесь до последней версии - скачать можно по ссылке.

George

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Какую версию Simple-Scada Вы используете? Функция SecondsToStr доступна с версии Simple-Scada 2.2.1.0 (16 Мая 2017).  Если у Вас более старая версия, то обновитесь до последней версии - скачать можно по ссылке.

Большое спасибо!
Скачал последнюю версию и все вышеописанное работает, но, если позволите, в дополнение еще пара вопросов:
1. Мы получаем данные в формате чч:мм:сек
Если количество часов превысит 99, то они отобразятся? (т.е. 200 или 1200 часов..)
2. Можно-ли все перевести в формат дни\часы\минуты\сек ?
    (видел процедуру SecondsToDateTime, но не уверен, что это то, что нужно...)
Спасибо!

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Цитировать
Если количество часов превысит 99, то они отобразятся? (т.е. 200 или 1200 часов..)
Да, отобразятся.

Цитировать
Можно-ли все перевести в формат дни\часы\минуты\сек?
Да, для этого можно использовать пример который предложили участники форума выше, либо воспользоваться функцией SecondsToDateTime, изменённые примеры ниже.

Обычный скрипт:
Код
var
  aDT: TDateTime;
begin
  aDT := SecondsToDateTime(Text1.AsInt64);
  Text1.Text := IntToStr(DaysBetween(aDT, 0)) + ' дней, ' + TimeToStr(aDT);
end.

Универсальный скрипт для любых объектов Текст:
Код
var
  aDT: TDateTime;
begin
  if Sender is TM_Text then
    with Sender as TM_Text do
    begin
      aDT := SecondsToDateTime(AsInt64);
      Text := IntToStr(DaysBetween(aDT, 0)) + ' дней, ' + TimeToStr(aDT);
    end;
end.
« Изменён: 24 Августа 2017, 23:51:46 от Simple-Scada »