Ваши комментарии

Можно попробовать снизить время опроса до 500 мс для начала. Или пересмотреть логику скрипта. У Вас круглосуточное производство? Я к тому что может не сбрасывать счетчик каждый час, а сбрасывать к примеру в нерабочее время в конце смены к примеру. 

День добрый.

К сожалению из скрипта опросить напрямую устройство нет возможности.

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

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

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

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

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

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

День добрый.

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

Добрый вечер.

Исправлено версия 4.7.7.75

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

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.  

День добрый.

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

Калькулятор расхода, я думаю тут не подойдёт. Вариант на вскидку -  Сохраняете значение счетчика каждый час (как Вы сделали), далее можно в скрипте читать БД по записанному каналу и считать уже за произвольный интервал.  



Сервис поддержки клиентов работает на платформе UserEcho