Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: ZloiVadik от 06 Октября 2021, 20:43:52

Название: Тип переменной Time
Отправлено: ZloiVadik от 06 Октября 2021, 20:43:52
Не пойму как в скада time передать, нет такого типа данных... С контроллера надо вывести значение текущего таймера и без мсек. По факту получаю набор милисекунд через тип single. Видимо надо скрипт и вытащить из формата DataTime?
Название: Re: Тип переменной Time
Отправлено: ZloiVadik от 07 Октября 2021, 15:28:34
Разобрался. В формате переменной сдвиг -3 и формат 0
Название: Re: Тип переменной Time
Отправлено: Simple-Scada от 07 Октября 2021, 16:36:58
Здравствуйте.

Обычно все переменные связанные с датой/временем поступают в скаду от OPC-сервера с типом данных DateTime. Далее такую переменную можно в поле.  Или в компоненте Календарь с любым форматом, например без даты, только часы, минуты, секунды. Если же у Вас переменная это не стандартная переменная времени и импортируется в скаду с типом данных отличным от DateTime, то нужно её преобразовывать в нужный формат. Помимо формата и сдвига запятой можно использовать методы для работы с датой/временем, которые описаны здесь (https://simple-scada.com/help/script/datetime.html). Есть функции для перевода количества секунд в переменную DateTime, перевода UnixTimestamp в DateTime и так далее.
Название: Re: Тип переменной Time
Отправлено: ZloiVadik от 09 Октября 2021, 20:40:31
Приветствую.
Получается передать набор секунд и миллисекунд и не могу понять почему ведь формат DateTime, почему автоматом на 60 не делит? В проекте с S7-1200 в Skada надо передаваться TOD и только часы с минуты. Как проще поступить, может все таймерные функции уже в Scada  реализовать, а с контроллера только пусковые тэги?
Название: Re: Тип переменной Time
Отправлено: ZloiVadik от 09 Октября 2021, 21:05:27
попробовал компонент календарь, очень удобно выделяет только часы с минутами, но переменная перевёрнута, т.е. годы меняются по миллисекундно. У S7 TOD 32 бита, а в Skada 64 не с этим связанно. Тип time точно так же ведёт себя. OPS встроенный в S7...
Понял. У меня TOD считывается с таймера, т.е. без даты, года, месяца. Помогите всё же корректно и без лишнего передать переменную...
Название: Re: Тип переменной Time
Отправлено: Simple-Scada от 09 Октября 2021, 21:38:32
Всё верно, ведь это несовместимые типы. Чтобы понять, нужно разобраться с типами данных и с тем, как в них хранятся данные.
TIME_OF_DAY - беззнаковое 32-битное целое (описание здесь (http://www.plccenter.cn/Siemens_Step7/IDH_TIME_OF_DAY_Data_Type.htm)), в скаде ему соответствует тип данных LongWord, но никак не DateTime.
DateTime - вещественное, двойной точности, 64 бита, он равен типу данных Double и является им по сути (описание здесь (http://www.delphibasics.ru/TDateTime.php)).
Как мы писали ранее, несовместимые типы придется преобразовывать, т.к. данные в них хранятся по-разному. Количество миллисекунд (т.е. TIME_OF_DAY) можно легко перевести в тип DateTime, по формуле:
Код: (delphi)
begin
  vrDateTime.Value := vrTOD.AsInt64 / 86400000;
end.
скрипт должен выполняться по изменению переменной vrTOD. Тогда при vrTOD = 1000, в переменной DateTime время будет равно одной секунде 00:00:01.000.
Название: Re: Тип переменной Time
Отправлено: ZloiVadik от 10 Октября 2021, 11:32:13
Получилось, вот спасибо ;D. Хотя конечно странно, что приходится преобразовывать данные с самого массового контроллера... видимо для простоты и универсализма
Название: Re: Тип переменной Time
Отправлено: Wildrover от 21 Августа 2023, 11:11:04
Тип TOD есть не только в S7, но и во всех контроллерах на Codesys.

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

Товарищи разработчики, сжальтесь, нужна нативная поддержка типа TOD.
Название: Re: Тип переменной Time
Отправлено: Simple-Scada от 21 Августа 2023, 16:21:53
Можно сделать преобразование гораздо проще, без скриптов, т.к. зависимость линейная. Для этого нужно задать у переменной шкалу 0..86400000 и масштабирование в визуальную шкалу (https://simple-scada.com/help/manual/varextra.html#:~:text=%D0%98%D0%BD%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%82%D1%80%D0%B5%D0%B1%D1%83%D0%B5%D1%82%D1%81%D1%8F%20%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C,%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B5%200%20%2D%20150.) 0..1. Но в текущих версиях скады масштабирование не применяется к переменным DateTime, поэтому такой вариант не сработает. В ближайшем обновлении сделаем чтобы масштабирование применялось к DateTime и можно будет сделать как описано выше.
Название: Re: Тип переменной Time
Отправлено: ZloiVadik от 21 Августа 2023, 16:43:39
У меня получилось только с часами и минутами значение, а вот дней нет в календаре...
Название: Re: Тип переменной Time
Отправлено: Simple-Scada от 21 Августа 2023, 17:08:43
Цитировать
У меня получилось только с часами и минутами значение, а вот дней нет в календаре...
Верно, ведь в типе данных TOD нет значения даты, месяца, года. Это количество миллисекунд от 0 до 86400000, т.е. всего 24 часа.
Название: Re: Тип переменной Time
Отправлено: ZloiVadik от 21 Августа 2023, 18:06:58
Раз поднялась тема, давайте ещё раз пожалуйста. Мне нужно видеть в скада время простоя станка. Получилось только 24 часа максимум, а желательно что ещё были дни.\
С контроллера передаётся тип данных Time, т.е. максимальное значение в ms 4194967295 или 49d17h2m47s295ms.
Далее скриптом, выше переводится в скадовский формат DataTime и через календарь имеем часы и минуты. А всё же нужно ещё дни.
Скажите можно это как-то сделать?
Название: Re: Тип переменной Time
Отправлено: Simple-Scada от 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 переменная, отобразить её значение в скаде, при необходимости, можно как угодно.
Название: Re: Тип переменной Time
Отправлено: Wildrover от 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

(https://i.ibb.co/NVWyrLz/start.png)
Тогда переменные StartTime и StopTime, после импорта в Simple-Scada объявляем не Double, а DateTime и можно их использовать в объекте TMCalendar.
Пока так. Но тем не менее хотелось бы иметь нативную поддержку TOD.
Название: Re: Тип переменной Time
Отправлено: Simple-Scada от 28 Августа 2023, 11:59:43
Цитировать
после импорта в Simple-Scada объявляем не Double, а DateTime и можно их использовать в объекте TMCalendar.
Верно, TDateTime это и есть Double (http://delphibasics.ru/TDateTime.php), поэтому если у Вас в Double переменной хранится дата/время, то выбрав тип TDateTime с ней можно будет работать через календарь.

Цитировать
Но тем не менее хотелось бы иметь нативную поддержку TOD.
Такая поддержка уже есть т.к. TOD это псевдоним для типа LongWord (а LongWord это один из базовых типов). TOD переменные сейчас можно и читать и изменять из скады, например через компонент Поле, или через скрипты, задавая количество миллисекунд. А представление в виде часов/минут/секунд для работы с компонентом Календарь в ближайшем обновлении скады можно будет получить просто выставив соответствующую визуальную шкалу, как писали в переписке выше. И скада сама будет переводить из LongWord в DateTime и обратно.
Название: Re: Тип переменной Time
Отправлено: Simple-Scada от 05 Сентября 2023, 10:03:22
Цитировать
Мне нужно именно время дня для включения и отключения систем, с возможностью редактирования в скаде.
В обновлении 2.6.8.0 поддерживается масштабирование для переменных DateTime. Чтобы отображать TOD переменную как DateTime выполните следующие действия:
1. Назначьте TOD переменной тип DateTime и шкалу 0 .. 86400000;
2. На вкладке доп. параметров (https://simple-scada.com/help/manual/varextra.html) включите режим масштабирования и задайте визуальную шкалу 0 .. 1;
Полученную переменную можно привязать к компонентам Календарь для отображения и изменения времени TOD.
Название: Re: Тип переменной Time
Отправлено: Wildrover от 05 Сентября 2023, 21:22:51
Спасибо. В следующем проекте протестирую.
Название: Re: Тип переменной Time
Отправлено: ZloiVadik от 17 Апреля 2024, 17:49:55

Если Вам нужно отобразить таймер наработки на мнемосхеме, то просто разместите на мнемосхеме компонент Текст, привяжите его к переменной 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 взятое из связанной переменной.


Приветствую. Скрипт работает чётко, спасибо.
Подскажите, такой вопрос. У меня таких таймеров 30шт и надо сохранить в файл. Создавать 30 переменных и 30 скриптов?
Т.е. полученный результат надо в переменную физическую записывать. 
Название: Re: Тип переменной Time
Отправлено: Simple Scada от 18 Апреля 2024, 12:01:19
Здравствуйте.

У меня таких таймеров 30шт и надо сохранить в файл. Создавать 30 переменных и 30 скриптов?
См. комментарий к скрипту:
Цитировать
Это универсальный скрипт (https://simple-scada.com/help/script/script-types.html), его можно назначить множеству компонентов Текст и в них будет отображаться время в формате 00 дней 00:00:00.000 взятое из связанной переменной.
Соответственно, писать 30 отдельных скриптов не требуется. Если полученное значение нужно записывать в строковую переменную, то эту переменную можно указать в свойство "Доп. переменная" компонента "Текст" и в скрипт добавить запись в доп. переменную:
Код: (delphi)
var
  v: Int64;
  s: String;
  days, hours, minutes, seconds, msc: Integer;
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;
      s :=  ZeroPad(days, 2) + ' дней ' + ZeroPad(hours, 2) + ':' + ZeroPad(minutes, 2) + ':' + ZeroPad(seconds, 2) + '.' + ZeroPad(msc, 3);
      VariableEx.Value := s;     // записываем полученную строку в доп. переменную
      Text := s;                 // выводим полученную строку в компонент "Текст"
    end
end.

Если наработку нужно записывать в строковые переменные и не требуется выводить на мнемосхему, то можно использовать скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changed-the-variables.html)" указав все 30 переменных в список скрипта и изменив код скрипта под используемый тип события. Например переменные таймеров (с OPC-сервера) имеют имена: vrMyTimer1 … vrMyTimer30. Тогда нужно создать внутренние строковые переменные с именами: vrMyTimer1_String … vrMyTimer30_String и использовать следующий код скрипта:
Код: (delphi)
var
  v: Int64;
  aVar: TM_Variable;
  days, hours, minutes, seconds, msc: Integer;
begin
  aVar := GetVariableByName(Variable.Name + '_String');
  if aVar <> nil then        // если переменная существует
  begin
    v := Variable.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;
    // записываем полученную строку в переменную vrMyTimer#_String
    aVar.Value :=  ZeroPad(days, 2) + ' дней ' + ZeroPad(hours, 2) + ':' + ZeroPad(minutes, 2) + ':' + ZeroPad(seconds, 2) + '.' + ZeroPad(msc, 3);
  end;
end.
Название: Re: Тип переменной Time
Отправлено: ZloiVadik от 18 Апреля 2024, 14:35:54
Наработку нужно выводить на мнемосхему.
Первый скрипт подходит, но у меня доп переменная уже занята для скрипта ivisibleEX.
Идея такая, что когда станок останавливается, то появляется таймер его простоя, потом пропадает когда старт, чтобы не перегружать информацией мнемосхему. Это всё сделал, хорошо работает.
Но вот хотел ещё данные в файл писать. Но писать не просто, а привязавшись к календарю, т.е. посуточно.
Что бы потом посмотреть статистику за период.
Или может проще ещё дополнительные 30 time c PLC передавать, минуя мнемосхему и через скаду в файл писать. А в PLC привязаться к календарю и суммировать...
Скада хорошая, но Delphi надо знать :-\   
 
Название: Re: Тип переменной Time
Отправлено: Apachi от 21 Апреля 2024, 09:53:49
Здравствуйте!

Подскажите пожалуйста как записать в ПЛК значение таймера со СКАДЫ.

Вывожу в скаде календарь с отображением чч:мм:сс. Далее привязываю к основной переменной вирт тэг с типом DitaTime, а к дополнительной значения таймера полученного с ПЛК. По изменению доп переменной работает скрип: Variable.Value := VariableEx.AsDateTime / 86400000;
Все работает.
А как теперь из поля календаря поменять значения в ПЛК?
Пытаюсь написать скрип по изменению уже основной переменной типа VariableEx.Value := Variable.AsInt * 86400000;
Что я делаю не так?
Название: Re: Тип переменной Time
Отправлено: Simple_Scada от 21 Апреля 2024, 10:03:33
Здравствуйте.

Если используется Simple-Scada 2.6.8.0 или выше, то скрипты можно не использовать. Например, если время задаётся через целочисленную переменную в миллисекундах, в диапазоне от 0 до 86400000, то у данной переменной можно выставить тип данных DateTime, шкалу 0..86400000 и масштабирование в визуальную шкалу 0..1 (https://simple-scada.com/help/manual/varextra.html#:~:text=%D0%94%D0%BB%D1%8F%20%D1%8D%D1%82%D0%BE%D0%B3%D0%BE%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8%20%D0%B2%20%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%20%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20(%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B0%20%D0%BD%D0%B0%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2%20%D0%BF%D0%BE%D0%BB%D1%8F%20%22%D0%A1%D0%B4%D0%B2%D0%B8%D0%B3%20%D0%B7%D0%B0%D0%BF%D1%8F%D1%82%D0%BE%D0%B9%22)%20%D0%B8%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D1%8C%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%83%D1%8E%20%D1%88%D0%BA%D0%B0%D0%BB%D1%83%2C%20%D0%B2%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%83%D1%8E%20%D1%82%D1%80%D0%B5%D0%B1%D1%83%D0%B5%D1%82%D1%81%D1%8F%20%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5). И эту переменную привязать к календарю.
Название: Re: Тип переменной Time
Отправлено: Apachi от 21 Апреля 2024, 10:24:53
Все получилось. Спасибо большое!