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

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

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Rolich

Страницы: 1 2 3 [4] 5 6
46
Доброго всем времени суток
Имеется битовая переменная, фиксирующая включение/отключение агрегата
В системе отчётов стоит задача отображать количество включений и длительность работы, для чего в источник данных эта переменная внесена в признаками "включения" и "время вкл"
Время простоя отображается с использованием скрипта
{(int)Данные.var1.TotalHours + ":" +(Данные.var1.Minutes).ToString("00")}
Как отобразить количество включений ?

47
Добрый день, уважаемые форумчане
В проекте имеется глобальная переменная, типа DateTime, в которую несколько раз в сутки записывается длительность определённых событий
Вопрос: как подсчитать общую длительность события по этой переменной в отчёте ?

48
Доброго всем времени суток
Решил проблему чуть более элегантно, без костылей с созданием таблиц и сообщениями.
Суть идеи - в "отложенной" записи значений переменной остановки.
Это вполне решает задачу подсчёта количества остановок от 3 до 5 минут и их длительности штатными средствами Simple Scada
Привожу код, может кому-то будет полезно для решения аналогичной задачи:
Код: (delphi)
K := TimerGetState(Timer_prostoya); // проверяем статус работы таймера простоя

// если переменная механизма в false и таймер простоя не запущен - запускаем его
if ((Var1.value = false) and (K = -1)) then
  TimerStart(Timer_prostoya, 0);

// если механизм включился и таймер простоя в диапазоне 180-300 секунд
if ((Var1.value = true) and ((SecondsBetween(0, Timer_prostoya.AsDateTime) > 180) and
   (SecondsBetween(0, Timer_prostoya.AsDateTime) < 300))) then
begin
  Var2.value := true;  // взводим переменную простоя 3-5 минут
  Dlitelnost_prostoya.value := SecondsBetween(0, Timer_prostoya);  // фиксируем длительность произошедшего простоя
  TimerStart(Timer_3_5, 0);  // стартуем таймер простоя 3-5 минут
end;

// если таймер 3-5 минут достиг значения фактического простоя
if SecondsBetween(0, Timer_3_5.AsDateTime) = Dlitelnost_prostoya.value then
begin
  Dlitelnost_prostoya.value := 0;  // обнулили переменную длительности
  TimerReset(Timer_3_5);  // остановили таймер простоя 3-5 минут
  Var2.value := false;    // сбросили переменную простоя 3-5 минут
end;

if ((Var1.value = true) and (K = 1)) then
  TimerReset(Timer_prostoya); // реальный простой окончен, сбрасываем таймер
Спасибо всем за участие в дискуссии, было познавательно !

49
Я понял своё заблуждение касательно ArchiveValueByTime, оно не запишет мне значение Var1 в указанное время, а только прочитает значение AlwTRue/False
Понятно, что задачу можно решить только через БД
Но остаётся ещё вопрос: можно ли работать со значением Var1 в основной БД Simple SCADA, не создавая свои таблицы ?

50
Скрипт будет выполняться каждую секунду, пока запущен проект
Условие выполнится только в 12:30:00 ежедневно

51
Не вижу противоречий в том, что вы описали, с кодом, который приведён выше
Реализация в БД как раз таки и создаёт массу дополнительных проблем для учёта простоев при том, что этот функционал отлично реализован средствами Scada
Прошу экспертов Simple Scada поставить точку в нашей дискуссии - можно ли для решения моей задачи обойтись встроенными средствами, или необходимо писать дополнительный код для работы с БД
Спасибо

52
Timothy, т.е. без создания дополнительной таблицы в БД никак не получится ?
Приведённый выше код работать не будет ?

Nomad, вы не совсем поняли, о чём речь

53
Доброго всем времени суток
Вообще глобально стоит задача подсчитывать количество и длительность простоя механизма, длительностью от 3 до 5 минут.
Алгоритм сейчас такой: по сигналу Var2 остановки механизма запускается таймер отсчёта простоя Timer, в переменную Vremya записывается время начала простоя
Если таймер простоя находится в интервале от 180 до 300 секунд и механизм продолжает стоять, то в переменную Var1 нужно записать true во время начала простоя
Если таймер простоя перешагнул отметку 300 секунд, в переменную Var1 нужно записать false во время начала простоя, т.е. этот простой не учитывать

Код (скрипт выполняется каждую секунду):
Код: (delphi)
Var
Vremya, Timer:TDateTime;
Var1, Var2, AlwTrue, AlwFalse: Boolean;
K:integer;

Begin
  AlwTrue.Value:=true;
  AlwFalse.Value:=false;
  K:=TimerGetState(Timer);
   if ((Var2.value=false) and (K=-1)) then
   begin
    TimerStart(Timer,0);
    Vremya:=Now;
   end;
   if ((Var2.value=true) and (K=1)) then
   begin
    TimerReset(Timer);
    Var1.Value:=false;
   end;
   if ((Var2.value=false) and ((SecondsBetween(0, Timer.AsDateTime)>180) and (SecondsBetween(0, Timer.AsDateTime)<300))) then ArchiveValueByTime(Alwtrue,Var1, Vremya);
   if ((Var2.value=false) and (SecondsBetween(0, Timer.AsDateTime)>300)) then ArchiveValueByTime(Alwfalse,Var1, Vremya);
end.

54
Нужно "вернуться в прошлое" в момент Событие_1 и записать либо 0, либо 1 в переменную, в зависимости от События_2

55
И всё-таки что-то не работает :(

Имеем глобальные переменные:
1. Переменная Дата_события
2. Переменная Бит_События
3. 2 переменные Всегда_true и Всегда_false

Код
If Событие_1 then Дата_События:=Now;
If Событие_2 then ArchiveValueByTime(Всегда_true, Бит_События, Дата_события.Value) else ArchiveValueByTime(Всегда_false, Бит_События, Дата_события.Value);

Что не так ?

56
Коллеги, спасибо за помощь !

57
Спасибо, попробую так. А если мне нужно записать конкретное значение ? Например, такая конструкция будет работать: ArchiveValueByTime(MyVariable, false, aDate) ?

58
Доброго всем времени суток
Вопрос не совсем об этом
Пример: по одному событию включается таймер на 5 минут. По истечении 5 минут, в зависимости от результата другого события, нужно записать значение битовой переменной 5 минут назад.
Как это сделать ?

59
Доброго времени суток, уважаемые форумчане
Может вопрос и простой, но я не нашел решения: как записать значение битовой переменной в заданное время ?

60
Спасибо !

Страницы: 1 2 3 [4] 5 6