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

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

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

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Тип переменной Time
« Ответ #15 : 05 Сентября 2023, 10:03:22 »
Цитировать
Мне нужно именно время дня для включения и отключения систем, с возможностью редактирования в скаде.
В обновлении 2.6.8.0 поддерживается масштабирование для переменных DateTime. Чтобы отображать TOD переменную как DateTime выполните следующие действия:
1. Назначьте TOD переменной тип DateTime и шкалу 0 .. 86400000;
2. На вкладке доп. параметров включите режим масштабирования и задайте визуальную шкалу 0 .. 1;
Полученную переменную можно привязать к компонентам Календарь для отображения и изменения времени TOD.

Wildrover

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #16 : 05 Сентября 2023, 21:22:51 »
Спасибо. В следующем проекте протестирую.

ZloiVadik

  • Пользователь
  • **
  • Сообщений: 56
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #17 : 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 скриптов?
Т.е. полученный результат надо в переменную физическую записывать. 

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 285
    • Просмотр профиля
    • Simple-Scada
Re: Тип переменной Time
« Ответ #18 : 18 Апреля 2024, 12:01:19 »
Здравствуйте.

У меня таких таймеров 30шт и надо сохранить в файл. Создавать 30 переменных и 30 скриптов?
См. комментарий к скрипту:
Цитировать
Это универсальный скрипт, его можно назначить множеству компонентов Текст и в них будет отображаться время в формате 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.

Если наработку нужно записывать в строковые переменные и не требуется выводить на мнемосхему, то можно использовать скрипт с типом события "Изменились переменные" указав все 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.
« Изменён: 18 Апреля 2024, 12:47:03 от Simple_Scada »

ZloiVadik

  • Пользователь
  • **
  • Сообщений: 56
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #19 : 18 Апреля 2024, 14:35:54 »
Наработку нужно выводить на мнемосхему.
Первый скрипт подходит, но у меня доп переменная уже занята для скрипта ivisibleEX.
Идея такая, что когда станок останавливается, то появляется таймер его простоя, потом пропадает когда старт, чтобы не перегружать информацией мнемосхему. Это всё сделал, хорошо работает.
Но вот хотел ещё данные в файл писать. Но писать не просто, а привязавшись к календарю, т.е. посуточно.
Что бы потом посмотреть статистику за период.
Или может проще ещё дополнительные 30 time c PLC передавать, минуя мнемосхему и через скаду в файл писать. А в PLC привязаться к календарю и суммировать...
Скада хорошая, но Delphi надо знать :-\   
 
« Изменён: 18 Апреля 2024, 14:40:55 от ZloiVadik »

Apachi

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #20 : 21 Апреля 2024, 09:53:49 »
Здравствуйте!

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

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

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #21 : 21 Апреля 2024, 10:03:33 »
Здравствуйте.

Если используется Simple-Scada 2.6.8.0 или выше, то скрипты можно не использовать. Например, если время задаётся через целочисленную переменную в миллисекундах, в диапазоне от 0 до 86400000, то у данной переменной можно выставить тип данных DateTime, шкалу 0..86400000 и масштабирование в визуальную шкалу 0..1. И эту переменную привязать к календарю.

Apachi

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Тип переменной Time
« Ответ #22 : 21 Апреля 2024, 10:24:53 »
Все получилось. Спасибо большое!