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

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

Добрый день.

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

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

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

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

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

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

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

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

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

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

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

Avatar
СИМП Лайт (тех поддержка)
  • На рассмотрении

День добрый.

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

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

День добрый.

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

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

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


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

Delay(60000);

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

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

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
Цитата от СИМП Лайт (тех поддержка)

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

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
Цитата от Соломонов Максим Сергеевич

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

День добрый.

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

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

День добрый.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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