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

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

Автор Тема: Формирование периодов работы агрегатов  (Прочитано 4303 раз)

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Доброго всем времени суток
SCADA через OPC получает данные о состоянии агрегатов: 1-в работе, 0-остановлен
Значения тэгов по изменению сохраняются в базу Postgres
Есть 2 вопроса:
1. Как организовать учёт и визуализацию текущего простоя? Т.е. если перешел из состояния 1 в 0 - учитываем простой, перешел обратно в 1 - прекращаем учёт
2. Как организовать просмотр простоев за выбранный период ?
Спасибо

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #1 : 11 Января 2023, 16:08:05 »
Здравствуйте.

Проще всего для этого использовать систему отчетов. Пример построения отчета с выводом времени работы/простоя можно найти по ссылке. Если требуется вычислить время наработки/простоя и вывести его на мнемосхему, то можно использовать процедуры  ArchiveTimeOn и ArchiveTimeOff.

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #2 : 12 Января 2023, 07:21:43 »
Спасибо за рекомендации, буду копать
Если можно - подскажите, как результат работы процедуры ArchiveTimeOn вывести результат преобразования, описанный по ссылке выше, на экран ? Переменная, описанная в скрипте aText - внутренняя, а как её завязать на переменную проекта типа String ?
Спасибо
« Изменён: 12 Января 2023, 08:05:50 от Rolich »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #3 : 12 Января 2023, 12:54:59 »
Здравствуйте.

Если время наработки/простоя всегда меньше 24 часов, то проще всего будет использовать для вывода компонент Календарь и настроить его так, чтобы отображалось только время - см. свойства Стиль, Дата, Время. У календаря в свойстве "Переменная" нужно указать переменную, в которую запишется результат процедуры ArchiveTimeOn, например "MyVariableRes".

Если время наработки/простоя больше 24 часов, то можно выводить его в компонент Текст как это описано в примере №2 по ссылке. Создавать дополнительные переменные для этого не требуется.

Если обязательно требуется записывать результаты вычислений ArchiveTimeOn в строковые переменные, то для каждого агрегата нужно создать переменные с однотипными именами, например: vrAggregate1TimeOn, vrAggregate2TimeOn и тд. Для указанных переменных нужно выбрать тип данных DateTime. В эти переменные будет записываться результат вычисления времени наработки. Аналогично, необходимо создать однотипные переменные с типом данных String, например с именами: vrAggregate1TimeOnStr, vrAggregate2TimeOnStr и тд. В эти переменные будет записываться результат вычисления времени наработки в виде строки.

Далее нужно создать скрипт с типом события "Изменились переменные", добавить в список скрипта (как это описано в примере) переменные "vrAggregate1TimeOn", "vrAggregate2TimeOn" и т.д., после чего написать универсальный скрипт:
Код: (delphi)
var
  aVar: TM_Variable;
  aDay, aMonth, aYear: string;

  function myFormat(AVal: Integer; aSymbols: Byte): string;
  begin
    Result := IntToStr(AVal);
    while Length(Result) < aSymbols do
      Result := '0' + Result;
  end;
begin
  aVar := GetVariableByName(Variable.Name + 'Str'); // ищем переменную с именем "vrAggregate1TimeOn", "vrAggregate2TimeOn" и тд.
  if aVar <> nil then  // если переменная существует
  begin
    SetTimeFormat('hh:mm');
    if YearOf(Variable.AsDateTime) < 2016 then
    begin
      aDay := myFormat(DaysBetween(Variable.AsDateTime, 0), 2) + '.';
      aMonth := myFormat(MonthsBetween(Variable.AsDateTime, 0), 2) + '.';
      aYear := myFormat(YearsBetween(Variable.AsDateTime, 0), 4) + ' ';
      aVar.Value :=  aDay + aMonth + aYear + TimeToStr(Variable.AsDateTime);
    end else
      aVar.Value := '00.00.0000 00:00';
  end;
end.
В данном скрипте с помощью функции GetVariableByName будет осуществляться поиск переменных vrAggregate1TimeOnStr, vrAggregate2TimeOnStr и т.д. по имени, после чего результат вычислений будет записываться в найденные переменные.

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #4 : 12 Января 2023, 14:00:44 »
Большое спасибо за обстоятельный ответ, но есть ещё вопрос: как организовать подсчёт и визуализацию текущего простоя ? То есть, если состояние бита, отвечающего за работу агрегата, изменилось с 1 в 0 - стартует таймер и он же отображается на экране проекта, если состояние вернулось в 1 - счётчик останавливается и сбрасывается в 0.
Как организовать вывод данного таймера с обновлением в режиме реального времени ?
« Изменён: 12 Января 2023, 15:14:18 от Rolich »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 272
    • Просмотр профиля
    • Simple-Scada
Re: Формирование периодов работы агрегатов
« Ответ #5 : 13 Января 2023, 11:51:56 »
Здравствуйте.

То есть, если состояние бита, отвечающего за работу агрегата, изменилось с 1 в 0 - стартует таймер и он же отображается на экране проекта, если состояние вернулось в 1 - счётчик останавливается и сбрасывается в 0.Как организовать вывод данного таймера с обновлением в режиме реального времени ?
Для решения данной задачи можно использовать таймерные функции. Пример работы с таймерами можно найти в демо-проекте -> страница "Скрипты" -> "Простые скрипты (1)" -> пример №3. Пример простейшего таймера можно посмотреть по ссылке(в скрипт можно добавить условие, по которому будет запускаться таймер).

Пример проекта с временем простоя не более 24 часов во вложении. В примере используется универсальный скрипт, который можно назначить на событие "OnDataChange" любого объекта "Текст". При этом у объекта "Текст" в свойстве "Переменная" нужно указать переменную отвечающую за работу агрегата, а в свойстве "Доп. переменная" переменную для таймера. Также, в проекте имеется пример с использованием шаблонов.

Цитировать
если состояние бита
Если требуется получить значение бита переменной, то нужно использовать функцию GetBit. Примеры можно найти по ссылке.

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #6 : 13 Января 2023, 13:01:43 »
Огромное спасибо, всё заработало !

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #7 : 16 Января 2023, 07:23:01 »
Доброго времени суток, уважаемые форумчане !
Всё описанное выше прекрасно работает, честь и хвала админам форума !
Теперь стал вопрос о преобразовании значения наработки в формате DateTime для расчётов
Например, у меня есть значение наработки за сутки, как разделить его на 24 часа, чтобы получить цифровое значение ?
Спасибо

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 272
    • Просмотр профиля
    • Simple-Scada
Re: Формирование периодов работы агрегатов
« Ответ #8 : 16 Января 2023, 12:48:35 »
Здравствуйте.

Доступные методы для работы с датой и временем можно найти по ссылке. Например, чтобы получить общее количество секунд из значения наработки переменной DateTime, можно использовать функцию SecondsBetween. Например:
Код: (delphi)
I := SecondsBetween(0, vrAggregate1TimeOn.AsDateTime);
, где vrAggregate1TimeOn – это переменная наработки с типом DateTime. В результате выполнения данного кода Вы получите значение в секундах. Далее с этим значением можно выполнять любые математические операции.
« Изменён: 16 Января 2023, 12:49:54 от Simple_Scada »

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #9 : 16 Января 2023, 15:54:36 »
Спасибо !

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #10 : 15 Февраля 2023, 15:21:22 »
Доброго всем времени суток !
Столкнулся вот с какой проблемой: если простой агрегата происходит длительное время (часы), то при переходе суток состояние простоя не зафиксируется, то есть, например: простой начался в 22:00 и длится 4 часа, соответственно в сутках, в которых он начался, он не учтётся (нет переключения состояния бита), статистика простоев за текущие сутки сформируется некорректно.
Как избежать данной ситуации ?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: Формирование периодов работы агрегатов
« Ответ #11 : 15 Февраля 2023, 17:31:38 »
Здравствуйте.

У Вас простой агрегата вычисляется через ArchiveTimeOff или в системе отчетов? Пришлите на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\" и укажите, какой скрипт/отчет нужно проверить.