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

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

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

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


Сообщения - Rolich

Страницы: 1 2 [3] 4 5 6
31
Доброго всем времени суток
Подскажите, пожалуйста, как контролировать наличие связи с несколькими устройствами в локальной сети ?
Я так понял, что в скрипте "Старт проекта" нужно прописать что-то типа
StartPing('192.168.0.1',3000,device1), но будет ли это работать, есть device1 имеет тип boolean ?
Что нужно прописывать в скрипте по событию "Изменился пинг" ?
Спасибо

32
Большое спасибо !

33
Доброго всем времени суток
Вопрос подсчёта длительности событий решил путём накопления секунд событий нарастающим итогом, а потом вычисления их разности в отчёте
Теперь есть вопрос по форматированию выводимой информации
Сейчас используется выражение
{new DateTime().AddSeconds(Данные.Peremennaya_Prostoya).ToString("HH:mm:ss")}
Это работает, выводит значение в заданном формате времени
Но вот если отчёт строится за длительный период, значение длительности может переваливать за 24 часа и тогда значение формируется неправильно, при переходе через 24 часа обнуляется
Как сделать так, чтобы отображалось фактическое количество часов простоя, более 24 часа ?

34
Тут не получилось, отписался в личку

35
Да, это помогло, спасибо !

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

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

38
Доброго всем времени суток
Решил проблему чуть более элегантно, без костылей с созданием таблиц и сообщениями.
Суть идеи - в "отложенной" записи значений переменной остановки.
Это вполне решает задачу подсчёта количества остановок от 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); // реальный простой окончен, сбрасываем таймер
Спасибо всем за участие в дискуссии, было познавательно !

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

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

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

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

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

43
Доброго всем времени суток
Вообще глобально стоит задача подсчитывать количество и длительность простоя механизма, длительностью от 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.

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

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

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

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

Что не так ?

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