Какая связь между Драйвером и БД?

Стартовая страница Форумы Ошибки в работе Какая связь между Драйвером и БД?

Просмотр 15 сообщений - с 1 по 15 (из 53 всего)
  • Автор
    Записи
  • #43114
    manjey73
    Участник

    Вот наткнулся тут на ошибку, но не понимаю, где собственно ее искать.
    И пока непонятно, какая связь между Коммуникатором, работой драйвера и запись в БД? (чуть ниже будет видно на скринах).

    Итак, предыстория. Есть у нас ДГУ без интерфейса в мозгах, но есть счетчик ДО и счетчик ПОСЛЕ ДГУ.
    Решил написать скрипт, который будет контролировать косвенно, что ДГУ запустился.

    Скрипт контроля по двум каналам — взяты по одному каналу напряжения от счетчиков bef (before) и aft (after). Счетчики Энергомера 303 и Меркурий 236

    public double DguControl(int bef, int aft)
    {
      double outval = double.NaN;
    
      if (AND(bef, aft) > 0)
      {
        outval = 1; // 1 - Сеть есть
      }
      else if (Stat(bef) == 0 && Stat(aft) == 0)
      {
        outval = 0; // 0 - Нет сети, генератор  в STOP
      }
      else if (Stat(bef) == 0 && Stat(aft) > 0)
      {
        outval = 2; // 2 - Нет сети, генератор  в RUN
      }
    return outval;
    }

    Скрипт логического И

    // Логическое И
    public double AND(params int[] cnls)
    {
    double result = 1;
    foreach (int cnlNum in cnls)
    {
      if (Val(cnlNum) < 1 || Stat(cnlNum) < 1)
        result = 0;
    }
    return result;
    }

    Формула в расчетном канале DguControl(803, 517)
    803 — это канал «Напряжение L1» счетчика Энергомера
    517 — это канал «Напряжение L1» счетчика Меркурий

    Скрин графика

    Ровно в 0 минут и в 30 минут каждого часа запись значения 0 в базу. Проверял утилитой.

    При этом, на том же компьютере создал такой же расчетный канал и натравил на устройство с Modbus протоколом (в качестве каналов выступили показания Температуры датчиков уровней двух генераторов, дизельного и бензинового)

    Еще точно такие же каналы создал дома для разных устройств (Scada на OrangePi процессор ARM)
    1. Напряжение двух счетчиков (Меркурий и SDM220 (MBus протокол))
    2. ПР200 Овен (Modbus) просто каких-то два канала

    И странно, но таких пиков каждые полчаса НЕТ.

    Вот и вопрос — виновник драйвер Энергомеры? и каким таким образом драйвер в принципе может влиять на запись в БД?

    Маска событий выставлена 9 для всех вариантов.

    И главное как избавиться от такого поведения?

    #43115
    JurasskPark
    Участник

    Как я понимаю, когда вы записываете значение, то значение рассчиталось скриптом, на Stat = 1, о том что значение качественное не записали.
    Я так с календарем мучался пока не понял, что нужно Stat = 1 записывать при расчёте.

    #43116
    manjey73
    Участник

    Так почему нет такой проблемы у той же самой формулы в других вариантах?
    Формула полностью идентична, скопированная на другую машинку с первой.
    + на первой сделана такая же формула на два Modbus устройства.

    #43117
    manjey73
    Участник

    Да, из особенностей, Период опроса драйверов счетчиков на 1-ом ПК каждые 20 секунд.

    #43118
    manjey73
    Участник

    Например Канал 803 не пишет в минутную БД, есть копия минутной БД для архива 3 месяца (90 дней)
    и в ней нет этих получасовых пиков, как на расчетном канале.

    • Ответ изменён 2 месяца, 2 недели назад пользователем manjey73.
    #43120
    manjey73
    Участник

    И да, проверял. Сеансы и Запросы драйвера без ошибок.

    #43121
    manjey73
    Участник

    Э, может тут копия БД играет роль? Есть две минутных БД, одна 365 дней, другая 90 дней.
    По факту как бы две БД и типа Модуль БД просто не успевает каждые полчаса что-то сделать и записать?

    #43122
    JurasskPark
    Участник

    А если так?

    
    public double AND(params int[] cnls)
    {
        double result = 1;
        foreach (int cnlNum in cnls)
        {
            // Если нет связи (Stat=0), но прошло меньше 2 секунд с начала опроса - считаем что связь есть
            if(Stat(cnlNum) == 0 && TimeSinceLastGood(cnlNum) < 2000) 
            {
                continue; 
            }
            if (Val(cnlNum) < 1 || Stat(cnlNum) < 1)
                result = 0;
        }
        return result;
    }
    
    #43123
    manjey73
    Участник

    блин. Сама по себе формула проверяет статус канала, какой статус канала от Коммуникатора, если от него НЕТ ошибок?

    ессно всегда 1. Вот что и удивляет.

    #43124
    manjey73
    Участник

    Тем более Curent Data включена на всех каналах.
    На Расчетных ничего не выставлено, значит запись по умолчанию в Текущие, Минутные (код архива Min) и Часовые (код архива Hour)

    #43125
    manjey73
    Участник

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

    И да, там не было этих формул в принципе.

    • Ответ изменён 2 месяца, 2 недели назад пользователем manjey73.
    #43127
    manjey73
    Участник
    #43128
    JurasskPark
    Участник

    А не может быть проблемой в самом счетчике? у нас так газовые сбоили на часовых, поэтому мы им время сдвигали на +5 секунд.

    #43129
    manjey73
    Участник
    IsPeriodic = true
    LogEnabled = false
    MaxQueueSize = 1000
    PullToPeriod = 0
    ReadOnly = false
    Retention = 365
    UseCopyDir = false
    WriteWithPeriod = true
    WritingPeriod = 1
    WritingPeriodUnit = Minute

    у другого архива отличие только в днях, выставлено 90.
    Счетчики пишут только в 90 дневный.
    Modbus устройства пишут в обычный минутный (стоит маска 15)

    #43131
    manjey73
    Участник

    Данные счетчиков без пропусков и без этих вот пиков непонятных.

Просмотр 15 сообщений - с 1 по 15 (из 53 всего)
  • Для ответа в этой теме необходимо авторизоваться.