Запись значений переменных из кэша в БД.

Avatar
  • обновлен
  • Отвечен

Добрый день.

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

Выглядит это примерно так:

//Latch - флаг события, Deviance - величина отклонения в ед. изм.

Mess:='МВВ мощн. М1 в зоне допуска. Отклн составило макс: '
+FloatToStrEx(GetMaxValueFromDB(GetTimeStamp(Latch),now(),Deviance),0)+' % ';
Log(esInfo, Mess);

Значения в сообщении равны нулю.

Предполагаю. что причина в том, что сервер не сразу переписывает значения в БД, а какое-то время хранит их в кэше. Соответственно, участок БД к которому я пытаюсь адресоваться может быть пуст на момент запуска скрипта.

Пробовал добавлять задержку, тогда более-менее начинает работать, однако хотелось бы сообщения выдавать в реальном времени.

Подскажите, есть ли какое-то другое решение?

Как Вы оцениваете обслуживание, которое получили?

Оценка удовлетворенности от Соломонов Максим Сергеевич 3 года назад

Добавьте комментарий о качестве обслуживания (необязательно):

Avatar
Цитата от Соломонов Максим Сергеевич

Насколько я понимаю в таком случае список должен быть безразмерным, т.к. неизвестна продолжительность периода, а код довольно сильно раздуется.

То есть способа решить задачу через обращение к БД нет?

Насколько я понимаю в таком случае список должен быть безразмерным, т.к. неизвестна продолжительность периода, а код довольно сильно раздуется.

Все верно, список будет безразмерным. Код увеличится не на много.

То есть способа решить задачу через обращение к БД нет

Почему нет. Он есть, Вы его применили. Просто надо учитывать что данные в БД сбрасываются не сразу а накапливаются в кэше (как Вы верно заметили), по этому в реальном времени "вытаскивать" значения из БД не получится. По этой причине мы и предложили как реализовать задачу другим методом, что бы Вы могли получать нужные Вам значения без задержек.

Avatar
Цитата от СИМП Лайт (тех поддержка)

Можно модифицировать пример для подсчета и среднего. В примере используется одна переменная для фиксации максимума, для подсчёта среднего можно аккумулировать значения к примеру в списке, и далее уже по надобности из этого списка можно получить среднее. 

Насколько я понимаю в таком случае список должен быть безразмерным, т.к. неизвестна продолжительность периода, а код довольно сильно раздуется.

То есть способа решить задачу через обращение к БД нет?

Avatar
Цитата от Соломонов Максим Сергеевич

Да, изначально вопрос был в определении максимального значения, и предложенное вами решение эту задачу решает. Однако, если мы зададимся целью посчитать не максимальное отклонение, а среднее, (опять же за период, пока параметр находился вне допуска) то предложенный способ уже не подойдет. Есть ли какой-то вариант на этот случай?

Можно модифицировать пример для подсчета и среднего. В примере используется одна переменная для фиксации максимума, для подсчёта среднего можно аккумулировать значения к примеру в списке, и далее уже по надобности из этого списка можно получить среднее. 

Avatar
Цитата от СИМП Лайт (тех поддержка)

В примере мы фиксируем максимум, я и спросил, из чего Вы сделали вывод что мы считаем среднее? Или я Вашего вопроса не понял. Ранее Вы описали задачу как - "Для удобства анализа, хочется добавлять к нему еще и максимальное отклонение за время которое параметр провел вне допуск" 

Да, изначально вопрос был в определении максимального значения, и предложенное вами решение эту задачу решает. Однако, если мы зададимся целью посчитать не максимальное отклонение, а среднее, (опять же за период, пока параметр находился вне допуска) то предложенный способ уже не подойдет. Есть ли какой-то вариант на этот случай?

Avatar
СИМП Лайт (тех поддержка)
  • Отвечен
Цитата от Соломонов Максим Сергеевич

Среднее отклонение за период вне допуска.

В примере мы фиксируем максимум, я и спросил, из чего Вы сделали вывод что мы считаем среднее? Или я Вашего вопроса не понял. Ранее Вы описали задачу как - "Для удобства анализа, хочется добавлять к нему еще и максимальное отклонение за время которое параметр провел вне допуск" 

Avatar
Цитата от СИМП Лайт (тех поддержка)

День добрый.

Присланный пример как раз и фиксирует максимальное значение переменной когда она находится за зоной верхней уставки. Про какое среднее мы говорим, уточните.

Среднее отклонение за период вне допуска.

Avatar
Цитата от Соломонов Максим Сергеевич

Такой вариант тоже работоспособен, но не позволяет подсчитывать не минимальное/максимальное, а среднее значение. Можете ли что-то подсказать на этот случай?

День добрый.

Присланный пример как раз и фиксирует максимальное значение переменной когда она находится за зоной верхней уставки. Про какое среднее мы говорим, уточните.

Avatar
Цитата от СИМП Лайт (тех поддержка)

а зачем для этой задачи использовать БД. Не проще будет при выходе канала за уставки, фиксировать его максимальное значение и выводить его или записывать в журнал? Или я не верно понял Вашу задачу?

var
  val1, val2: Double;
  status: integer;    
   
  // Выполняется при старте скрипта
  procedure OnStartScript;
  begin
    val2 := 0;
  end;                        
                                             
begin             
  status := GetAlarmStatus('Name');    
  case status of       
    1: // 1 - переменная в рабочей зоне (аналоговый канал)
      begin 
        if val2 <> 0 then
        begin 
          Log(esInfo, 'Max' + FloatToStr(val2));  
          val2 := 0;
        end; 
      end; 
     2: // 2 - переменная выше уставки (аналоговый канал)   
      begin
        val1 := ReadValue('Name');
        if val1 > val2 then
          val2 := val1;
      end;
  end;
end.  

Такой вариант тоже работоспособен, но не позволяет подсчитывать не минимальное/максимальное, а среднее значение. Можете ли что-то подсказать на этот случай?

Avatar
СИМП Лайт (тех поддержка)
  • Отвечен
Цитата от Соломонов Максим Сергеевич

Да. Сообщение о выходе за допустимые пределы пишется в журнал в момент выхода, в момент возврата в зону допуска пишется сообщение о возврате. Для удобства анализа, хочется добавлять к нему еще и максимальное отклонение за время которое параметр провел вне допуска.

Если изменить скрипт следующим образом, начинает работать:


//Latch - флаг события, Deviance - величина отклонения в ед. изм.

Delay(60000);

Mess:='МВВ мощн. М1 в зоне допуска. Отклн составило макс: '
+FloatToStrEx(GetMaxValueFromDB(GetTimeStamp(Latch)-0.00068,now()-0.00068,Deviance),0)+' % ';
Log(esInfo, Mess);

Но сообщение появляется с задержкой, и насчет точности указания временного интервала есть вопросы.

а зачем для этой задачи использовать БД. Не проще будет при выходе канала за уставки, фиксировать его максимальное значение и выводить его или записывать в журнал? Или я не верно понял Вашу задачу?

var
  val1, val2: Double;
  status: integer;    
   
  // Выполняется при старте скрипта
  procedure OnStartScript;
  begin
    val2 := 0;
  end;                        
                                             
begin             
  status := GetAlarmStatus('Name');    
  case status of       
    1: // 1 - переменная в рабочей зоне (аналоговый канал)
      begin 
        if val2 <> 0 then
        begin 
          Log(esInfo, 'Max' + FloatToStr(val2));  
          val2 := 0;
        end; 
      end; 
     2: // 2 - переменная выше уставки (аналоговый канал)   
      begin
        val1 := ReadValue('Name');
        if val1 > val2 then
          val2 := val1;
      end;
  end;
end.  

Avatar
Цитата от СИМП Лайт (тех поддержка)

День добрый.

Так давайте подробней рассмотрим задачу - т.е. есть некий канала, значение которого Вы контролируете, и в случае если канал вне допустимых значений, хотите отобразить максимальное значение канала когда он он был за зоной уставок - верно?

Да. Сообщение о выходе за допустимые пределы пишется в журнал в момент выхода, в момент возврата в зону допуска пишется сообщение о возврате. Для удобства анализа, хочется добавлять к нему еще и максимальное отклонение за время которое параметр провел вне допуска.

Если изменить скрипт следующим образом, начинает работать:


//Latch - флаг события, Deviance - величина отклонения в ед. изм.

Delay(60000);

Mess:='МВВ мощн. М1 в зоне допуска. Отклн составило макс: '
+FloatToStrEx(GetMaxValueFromDB(GetTimeStamp(Latch)-0.00068,now()-0.00068,Deviance),0)+' % ';
Log(esInfo, Mess);

Но сообщение появляется с задержкой, и насчет точности указания временного интервала есть вопросы.