Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Rolich от 11 Января 2023, 12:24:40

Название: Формирование периодов работы агрегатов
Отправлено: Rolich от 11 Января 2023, 12:24:40
Доброго всем времени суток
SCADA через OPC получает данные о состоянии агрегатов: 1-в работе, 0-остановлен
Значения тэгов по изменению сохраняются в базу Postgres
Есть 2 вопроса:
1. Как организовать учёт и визуализацию текущего простоя? Т.е. если перешел из состояния 1 в 0 - учитываем простой, перешел обратно в 1 - прекращаем учёт
2. Как организовать просмотр простоев за выбранный период ?
Спасибо
Название: Re: Формирование периодов работы агрегатов
Отправлено: Simple_Scada от 11 Января 2023, 16:08:05
Здравствуйте.

Проще всего для этого использовать систему отчетов (https://simple-scada.com/help/report/index.html). Пример построения отчета с выводом времени работы/простоя можно найти по ссылке (https://simple-scada.com/help/report/rep-time-work-idle.html). Если требуется вычислить время наработки/простоя и вывести его на мнемосхему, то можно использовать процедуры  ArchiveTimeOn (https://simple-scada.com/help/script/archivetimeon.html) и ArchiveTimeOff (https://simple-scada.com/help/script/archivetimeoff.html).
Название: Re: Формирование периодов работы агрегатов
Отправлено: Rolich от 12 Января 2023, 07:21:43
Спасибо за рекомендации, буду копать
Если можно - подскажите, как результат работы процедуры ArchiveTimeOn вывести результат преобразования, описанный по ссылке выше, на экран ? Переменная, описанная в скрипте aText - внутренняя, а как её завязать на переменную проекта типа String ?
Спасибо
Название: Re: Формирование периодов работы агрегатов
Отправлено: Simple_Scada от 12 Января 2023, 12:54:59
Здравствуйте.

Если время наработки/простоя всегда меньше 24 часов, то проще всего будет использовать для вывода компонент Календарь (https://simple-scada.com/help/manual/calendar.html) и настроить его так, чтобы отображалось только время - см. свойства Стиль, Дата, Время. У календаря в свойстве "Переменная" нужно указать переменную, в которую запишется результат процедуры ArchiveTimeOn, например "MyVariableRes".

Если время наработки/простоя больше 24 часов, то можно выводить его в компонент Текст (https://simple-scada.com/help/manual/text.html) как это описано в примере №2 по ссылке (https://simple-scada.com/help/script/archivetimeon.html). Создавать дополнительные переменные для этого не требуется.

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

Далее нужно создать скрипт с типом события "Изменились переменные", добавить в список скрипта (как это описано в примере (https://simple-scada.com/help/script/changemulvar.html)) переменные "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 и т.д. по имени, после чего результат вычислений будет записываться в найденные переменные.
Название: Re: Формирование периодов работы агрегатов
Отправлено: Rolich от 12 Января 2023, 14:00:44
Большое спасибо за обстоятельный ответ, но есть ещё вопрос: как организовать подсчёт и визуализацию текущего простоя ? То есть, если состояние бита, отвечающего за работу агрегата, изменилось с 1 в 0 - стартует таймер и он же отображается на экране проекта, если состояние вернулось в 1 - счётчик останавливается и сбрасывается в 0.
Как организовать вывод данного таймера с обновлением в режиме реального времени ?
Название: Re: Формирование периодов работы агрегатов
Отправлено: Simple Scada от 13 Января 2023, 11:51:56
Здравствуйте.

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

Пример проекта с временем простоя не более 24 часов во вложении. В примере используется универсальный скрипт, который можно назначить на событие "OnDataChange" любого объекта "Текст". При этом у объекта "Текст" в свойстве "Переменная" нужно указать переменную отвечающую за работу агрегата, а в свойстве "Доп. переменная" переменную для таймера. Также, в проекте имеется пример с использованием шаблонов (https://simple-scada.com/help/manual/template.html).

Цитировать
если состояние бита
Если требуется получить значение бита переменной, то нужно использовать функцию GetBit (https://simple-scada.com/help/script/getbit.html). Примеры можно найти по ссылке (https://simple-scada.com/help/script/bit-color.html).
Название: Re: Формирование периодов работы агрегатов
Отправлено: Rolich от 13 Января 2023, 13:01:43
Огромное спасибо, всё заработало !
Название: Re: Формирование периодов работы агрегатов
Отправлено: Rolich от 16 Января 2023, 07:23:01
Доброго времени суток, уважаемые форумчане !
Всё описанное выше прекрасно работает, честь и хвала админам форума !
Теперь стал вопрос о преобразовании значения наработки в формате DateTime для расчётов
Например, у меня есть значение наработки за сутки, как разделить его на 24 часа, чтобы получить цифровое значение ?
Спасибо
Название: Re: Формирование периодов работы агрегатов
Отправлено: Simple Scada от 16 Января 2023, 12:48:35
Здравствуйте.

Доступные методы для работы с датой и временем можно найти по ссылке (https://simple-scada.com/help/script/datetime.html). Например, чтобы получить общее количество секунд из значения наработки переменной DateTime, можно использовать функцию SecondsBetween (https://simple-scada.com/help/script/secondsbetween.html). Например:
Код: (delphi)
I := SecondsBetween(0, vrAggregate1TimeOn.AsDateTime);
, где vrAggregate1TimeOn – это переменная наработки с типом DateTime. В результате выполнения данного кода Вы получите значение в секундах. Далее с этим значением можно выполнять любые математические операции.
Название: Re: Формирование периодов работы агрегатов
Отправлено: Rolich от 16 Января 2023, 15:54:36
Спасибо !
Название: Re: Формирование периодов работы агрегатов
Отправлено: Rolich от 15 Февраля 2023, 15:21:22
Доброго всем времени суток !
Столкнулся вот с какой проблемой: если простой агрегата происходит длительное время (часы), то при переходе суток состояние простоя не зафиксируется, то есть, например: простой начался в 22:00 и длится 4 часа, соответственно в сутках, в которых он начался, он не учтётся (нет переключения состояния бита), статистика простоев за текущие сутки сформируется некорректно.
Как избежать данной ситуации ?
Название: Re: Формирование периодов работы агрегатов
Отправлено: Simple_Scada от 15 Февраля 2023, 17:31:38
Здравствуйте.

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