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

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

Автор Тема: Тип переменной Time  (Прочитано 4620 раз)

ZloiVadik

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Тип переменной Time
« : 06 Октября 2021, 20:43:52 »
Не пойму как в скада time передать, нет такого типа данных... С контроллера надо вывести значение текущего таймера и без мсек. По факту получаю набор милисекунд через тип single. Видимо надо скрипт и вытащить из формата DataTime?
« Изменён: 07 Октября 2021, 08:56:12 от Simple_Scada »

ZloiVadik

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #1 : 07 Октября 2021, 15:28:34 »
Разобрался. В формате переменной сдвиг -3 и формат 0

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Тип переменной Time
« Ответ #2 : 07 Октября 2021, 16:36:58 »
Здравствуйте.

Обычно все переменные связанные с датой/временем поступают в скаду от OPC-сервера с типом данных DateTime. Далее такую переменную можно в поле.  Или в компоненте Календарь с любым форматом, например без даты, только часы, минуты, секунды. Если же у Вас переменная это не стандартная переменная времени и импортируется в скаду с типом данных отличным от DateTime, то нужно её преобразовывать в нужный формат. Помимо формата и сдвига запятой можно использовать методы для работы с датой/временем, которые описаны здесь. Есть функции для перевода количества секунд в переменную DateTime, перевода UnixTimestamp в DateTime и так далее.

ZloiVadik

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #3 : 09 Октября 2021, 20:40:31 »
Приветствую.
Получается передать набор секунд и миллисекунд и не могу понять почему ведь формат DateTime, почему автоматом на 60 не делит? В проекте с S7-1200 в Skada надо передаваться TOD и только часы с минуты. Как проще поступить, может все таймерные функции уже в Scada  реализовать, а с контроллера только пусковые тэги?

ZloiVadik

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #4 : 09 Октября 2021, 21:05:27 »
попробовал компонент календарь, очень удобно выделяет только часы с минутами, но переменная перевёрнута, т.е. годы меняются по миллисекундно. У S7 TOD 32 бита, а в Skada 64 не с этим связанно. Тип time точно так же ведёт себя. OPS встроенный в S7...
Понял. У меня TOD считывается с таймера, т.е. без даты, года, месяца. Помогите всё же корректно и без лишнего передать переменную...
« Изменён: 09 Октября 2021, 21:38:53 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Тип переменной Time
« Ответ #5 : 09 Октября 2021, 21:38:32 »
Всё верно, ведь это несовместимые типы. Чтобы понять, нужно разобраться с типами данных и с тем, как в них хранятся данные.
TIME_OF_DAY - беззнаковое 32-битное целое (описание здесь), в скаде ему соответствует тип данных LongWord, но никак не DateTime.
DateTime - вещественное, двойной точности, 64 бита, он равен типу данных Double и является им по сути (описание здесь).
Как мы писали ранее, несовместимые типы придется преобразовывать, т.к. данные в них хранятся по-разному. Количество миллисекунд (т.е. TIME_OF_DAY) можно легко перевести в тип DateTime, по формуле:
Код: (delphi)
begin
  vrDateTime.Value := vrTOD.AsInt64 / 86400000;
end.
скрипт должен выполняться по изменению переменной vrTOD. Тогда при vrTOD = 1000, в переменной DateTime время будет равно одной секунде 00:00:01.000.
« Изменён: 09 Октября 2021, 21:47:58 от Simple-Scada »

ZloiVadik

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #6 : 10 Октября 2021, 11:32:13 »
Получилось, вот спасибо ;D. Хотя конечно странно, что приходится преобразовывать данные с самого массового контроллера... видимо для простоты и универсализма

Wildrover

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #7 : 21 Августа 2023, 11:11:04 »
Тип TOD есть не только в S7, но и во всех контроллерах на Codesys.

Имеем 320 групп освещения, у каждой есть время включения и отключения.
Получается что нам надо отконвертить 640 переменных из LongWord (так TOD приходит в скаду) в DateTime (все эти переменные еще нужно вручную завести), а потом обратно.

Товарищи разработчики, сжальтесь, нужна нативная поддержка типа TOD.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Тип переменной Time
« Ответ #8 : 21 Августа 2023, 16:21:53 »
Можно сделать преобразование гораздо проще, без скриптов, т.к. зависимость линейная. Для этого нужно задать у переменной шкалу 0..86400000 и масштабирование в визуальную шкалу 0..1. Но в текущих версиях скады масштабирование не применяется к переменным DateTime, поэтому такой вариант не сработает. В ближайшем обновлении сделаем чтобы масштабирование применялось к DateTime и можно будет сделать как описано выше.

ZloiVadik

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #9 : 21 Августа 2023, 16:43:39 »
У меня получилось только с часами и минутами значение, а вот дней нет в календаре...

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Тип переменной Time
« Ответ #10 : 21 Августа 2023, 17:08:43 »
Цитировать
У меня получилось только с часами и минутами значение, а вот дней нет в календаре...
Верно, ведь в типе данных TOD нет значения даты, месяца, года. Это количество миллисекунд от 0 до 86400000, т.е. всего 24 часа.
« Изменён: 21 Августа 2023, 17:14:53 от Simple_Scada »

ZloiVadik

  • Новичок
  • *
  • Сообщений: 49
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #11 : 21 Августа 2023, 18:06:58 »
Раз поднялась тема, давайте ещё раз пожалуйста. Мне нужно видеть в скада время простоя станка. Получилось только 24 часа максимум, а желательно что ещё были дни.\
С контроллера передаётся тип данных Time, т.е. максимальное значение в ms 4194967295 или 49d17h2m47s295ms.
Далее скриптом, выше переводится в скадовский формат DataTime и через календарь имеем часы и минуты. А всё же нужно ещё дни.
Скажите можно это как-то сделать?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Тип переменной Time
« Ответ #12 : 22 Августа 2023, 13:02:59 »
Цитировать
и через календарь имеем часы и минуты. А всё же нужно ещё дни.
Через календарь невозможно вывести значения времени, без привязки к году и месяцу. Он не предназначен для вывода времени таймеров (счетчиков секунд/миллисекунд). Это самый обычный Календарь, а не секундомер.

Если Вам нужно отобразить таймер наработки на мнемосхеме, то просто разместите на мнемосхеме компонент Текст, привяжите его к переменной Time (0..4294967295) и на событие OnDataChange назначьте следующий скрипт:
Код: (delphi)
var
  v: Int64;
  days, hours, minutes, seconds, msc: Integer;

  function AddZeros(AValue, ALen: Integer): string;
  begin
    Result := IntToStr(AValue);
    while Length(Result) < aLen do
      Result := '0' + Result;
  end;

begin
  if Sender is TM_Text then
    with Sender as TM_Text do
    begin
      v := AsInt64;
      days := v div 86400000;
      hours := (v div 3600000) mod 24;
      minutes := (v div 60000) mod 60;
      seconds := (v div 1000) mod 60;
      msc := v mod 1000;
      Text := AddZeros(days, 2) + ' дней ' + AddZeros(hours, 2) + ':' + AddZeros(minutes, 2) + ':' + AddZeros(seconds, 2) + '.' + AddZeros(msc, 3);
    end
end.
Это универсальный скрипт, его можно назначить множеству компонентов Текст и в них будет отображаться время в формате 00 дней 00:00:00.000 взятое из связанной переменной.


Цитировать
Товарищи разработчики, сжальтесь, нужна нативная поддержка типа TOD.
Wildrover, если Вам также нужно только отобразить значение времени наработки из переменной TOD на мнемосхеме, то нет необходимости делать отдельные переменные TDateTime, Вы также можете использовать всего один универсальный скрипт и любое количество компонентов Текст, как описано выше. TOD - это обычная LongWord переменная, отобразить её значение в скаде, при необходимости, можно как угодно.

Wildrover

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #13 : 27 Августа 2023, 15:01:59 »
Цитировать
Wildrover, если Вам также нужно только отобразить значение времени наработки из переменной TOD на мнемосхеме, то нет необходимости делать отдельные переменные TDateTime, Вы также можете использовать всего один универсальный скрипт и любое количество компонентов Текст, как описано выше. TOD - это обычная LongWord переменная, отобразить её значение в скаде, при необходимости, можно как угодно.
Нет. Задача совершенно другая.

Цитировать
Имеем 320 групп освещения, у каждой есть время включения и отключения.
Получается что нам надо отконвертить 640 переменных из LongWord (так TOD приходит в скаду) в DateTime (все эти переменные еще нужно вручную завести), а потом обратно.
Зачем коллега использует TOD для наработки, спросите у него. Если дни его не интересуют или он их отсчитывает в отдельной переменной, это его дело.
Мне нужно именно время дня для включения и отключения систем, с возможностью редактирования в скаде.
Так как программы для контроллеров так же пишу я, то есть возможность сделать следуещее в Codesys:
Код
VAR RETAIN
StartStop: WORD;
StartTime: LREAL;
StopTime: LREAL;
END_VAR


Тогда переменные StartTime и StopTime, после импорта в Simple-Scada объявляем не Double, а DateTime и можно их использовать в объекте TMCalendar.
Пока так. Но тем не менее хотелось бы иметь нативную поддержку TOD.
« Изменён: 28 Августа 2023, 11:44:29 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2998
    • Просмотр профиля
    • Simple-Scada
Re: Тип переменной Time
« Ответ #14 : 28 Августа 2023, 11:59:43 »
Цитировать
после импорта в Simple-Scada объявляем не Double, а DateTime и можно их использовать в объекте TMCalendar.
Верно, TDateTime это и есть Double, поэтому если у Вас в Double переменной хранится дата/время, то выбрав тип TDateTime с ней можно будет работать через календарь.

Цитировать
Но тем не менее хотелось бы иметь нативную поддержку TOD.
Такая поддержка уже есть т.к. TOD это псевдоним для типа LongWord (а LongWord это один из базовых типов). TOD переменные сейчас можно и читать и изменять из скады, например через компонент Поле, или через скрипты, задавая количество миллисекунд. А представление в виде часов/минут/секунд для работы с компонентом Календарь в ближайшем обновлении скады можно будет получить просто выставив соответствующую визуальную шкалу, как писали в переписке выше. И скада сама будет переводить из LongWord в DateTime и обратно.