Большой коэффициент трансформации и wb-rules

Всем добрый день! Недавно создавал тему - Помощь в подборе вторичного трансформатора тока

Пришло время взяться за написание правил для правильного расчета токов, мощностей и энергий. Написал правило, в котором создаю новое виртуальное устройство с указанием всех электрических параметров со счетчика WB-MAP и там же в модуле перемножаю на нужный коэффициент. В итоге все работает замечательно, но если создать таких виртуальных устройств примерно 10 штук, то очень грузит процессор! А если создать больше 10, то сервис wb-rules вообще зависает и сыпет ошибки:

 ERROR: [wbgo_mqtt] MQTT token wait timeout: *mqtt.PublishToken (&{{{{0 0} 0 0 {{} 0} {{} 0}} 0xedd380 <nil>} 62100})

Коротко по модулю - просто тупо на каждый передаваемый контрол создается отдельное правило с whenChange. Сам модуль прикладываю в zip-архиве.

Пример использования в правилах:

var electricalChannel = require('moduleConverterMAP');  // Подключаем модуль

var QF2table = {
    coefficient: 1,
    Urms: 'wb-map3e_165/Urms L2',
    Upeak: 'wb-map3e_165/Upeak L2',
    Irms: 'wb-map3e_165/Irms L2',
    Ipeak: 'wb-map3e_165/Ipeak L2',
    P: 'wb-map3e_165/P L2',
    Q: 'wb-map3e_165/Q L2',
    S: 'wb-map3e_165/S L2',
    PF: 'wb-map3e_165/PF L2',
    APenergy: 'wb-map3e_165/AP energy L2',
    ANenergy: 'wb-map3e_165/AN energy L2',
    RPenergy: 'wb-map3e_165/RP energy L2',
    RNenergy: 'wb-map3e_165/RN energy L2',
    Frequency: 'wb-map3e_165/Frequency'
};

electricalChannel.createElectricalChannel('Рабочий стол' , 'energyTable' , QF2table );

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

moduleConverterMAP.zip (3,3 КБ)

Добрый день.
То есть 26 правил вызывают такую нагрузку? Пожалуй попробую воспроизвести синтетически.
И, кстати, отлично описанная тема, благодарю. И на код смотрю - и его офрмление вызывает радость.

Большое спасибо! Я старался как мог, хотя JS не мой конёк, но вот из-за правил пришлось изучать и вникать в тонкости и нюансы)))

Сейчас у себя немного потестировал вызовы функций с моим модулем:

Описание Нагрузка процессора, %
Без функций 16-18
1 функция вызова 22-25
2 функции вызова 29-32
3 функции вызова 38-42
3 функции вызова и отключенный счетчик 5-8

Т.е. один вызов функции съедает в среднем 8% процессора. Получается да, 26 правил на один вызов функции для однофазной нагрузки. Но правила для meta #error наверное можно в счет не брать, т.к. вообще не отрабатывают из-за отсутствия ошибок.

И странно, что при физически отключенном счетчике wb-rules вообще практически перестает потреблять процессорное время, хотя даже правила удалял с его участием. Т.е. в папках wb-rules и wb-rules-modules всё пусто и счетчик подключен к шине - 12-16%, как только счетчик отключаю от шины - 3-6%.

А что за контроллер, кстати? какая версия, какой релиз ПО стоит?
Я пока не воспроизводил, скорее всего займусь завтра.

Номер партии: 7.4.3K/2GC 1D/M-2GC
Релиз: wb-2501 stable

Счетчик WB-MAP3E fw2 (версия прошивки 2.10.2)

Пока еще не начинал даже, к сожалению.

Ну - занялся воспроизведением

1 лайк

Ну как там? Есть интересные новости?))

Добрый день.
Хороших нет. Но интересные есть.
Чтобы поизраться с модулем я сделавл эмулятор.
Банально

//02_22_module_device.js

function makeNewVirtualControl(vdName, nameControl, typeControl){
  //log.info("GetDevice", getDevice("vdName"))
  if (getDevice(vdName) === undefined) {
   //log.info("Define new")
    defineVirtualDevice(vdName, {
      title: vdName,
      cells: {},
    })
  }
     //Тут проверим есть ли уже контрол и если нет - создадим.
    if (!getDevice(vdName).isControlExists(nameControl)) {
      log.info("Контрола "+nameControl+" нет, создаем.")
      getDevice(vdName).addControl(nameControl, typeControl);
    }
}

 
var devName=["wb-map3e_165", "wb-map3e_166","wb-map3e_167"];

var devControls1=["Urms L2", "Upeak L2", "Irms L2",        "Ipeak L2",   "P L2",   "Q L2", "S L2",  "PF L2",  "AP energy L2", "AN energy L2", "RP energy L2", "RN energy L2", "Frequency"]

log.info(typeof(devControls1)) 

devName.forEach(function(itemDev) {
  log.info (itemDev)
  //log.info ("Значение!", itemDev,value)
  devControls1.forEach(function(itemControl) {
    log.info (itemControl)
    makeNewVirtualControl(itemDev, itemControl,  {type: "value", value: "0", readonly: true})
    var nameLocal = itemDev
    
    setInterval(function () {
        devControls1.forEach(function(itemControl){
        //log.info ("itemControl", nameLocal+"/"+itemControl)
        dev[nameLocal+"/"+itemControl] = 33*Math.random() ;
        })
      }, 600);

  })
})
 

публикует рандомные значения в топики. Пару раз в секунду. И заметил то что производительность движка правил сильно уменьшилась.
Этот скрипт ппотребляет недоспустимо много ресурсов.
Отдал его разработчикам, описав багом. Жду результата.

Чтобы убедиться, что не в модуле дело. Написал правило бессмысленное и беспощадное. Просто в ручную создал 13 штук whenChange с передачей параметра в виртуальное устройство. Ситуация такая же, примерно 6% ресурсов процессора отнимает данный скрипт.

defineVirtualDevice( "VirtTEST MAP", {
    title: "VirtTEST MAP",
    cells: {
        p1: {
            title: 'p1',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p2: {
            title: 'p2',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p3: {
            title: 'p3',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p4: {
            title: 'p4',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p5: {
            title: 'p5',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p6: {
            title: 'p6',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p7: {
            title: 'p7',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p8: {
            title: 'p8',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p9: {
            title: 'p9',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p10: {
            title: 'p10',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p11: {
            title: 'p11',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p12: {
            title: 'p12',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        },
        p13: {
            title: 'p13',
            type: "value",
            value: 0,
            readonly: true,
            forceDefault: true
        }
    }
});


defineRule("TST-1", {
    whenChanged: 'wb-map3e_165/Urms L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p1"] = newValue;
    }
});

defineRule("TST-2", {
    whenChanged: 'wb-map3e_165/Upeak L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p2"] = newValue;
    }
});

defineRule("TST-3", {
    whenChanged: 'wb-map3e_165/Irms L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p3"] = newValue;
    }
});

defineRule("TST-4", {
    whenChanged: 'wb-map3e_165/Ipeak L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p4"] = newValue;
    }
});

defineRule("TST-5", {
    whenChanged: 'wb-map3e_165/P L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p5"] = newValue;
    }
});

defineRule("TST-6", {
    whenChanged: 'wb-map3e_165/Urms L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p6"] = newValue;
    }
});

defineRule("TST-7", {
    whenChanged: 'wb-map3e_165/Q L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p7"] = newValue;
    }
});

defineRule("TST-8", {
    whenChanged: 'wb-map3e_165/S L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p8"] = newValue;
    }
});

defineRule("TST-9", {
    whenChanged: 'wb-map3e_165/PF L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p9"] = newValue;
    }
});

defineRule("TST-10", {
    whenChanged: 'wb-map3e_165/AP energy L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p10"] = newValue;
    }
});

defineRule("TST-11", {
    whenChanged: 'wb-map3e_165/AN energy L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p11"] = newValue;
    }
});

defineRule("TST-12", {
    whenChanged: 'wb-map3e_165/RP energy L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p12"] = newValue;
    }
});

defineRule("TST-13", {
    whenChanged: 'wb-map3e_165/RN energy L3',
    then: function (newValue) { 
        dev["VirtTEST MAP"]["p13"] = newValue;
    }
});

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

Сейчас откатился с сбросом до заводских настроек до версии 202408211041_wb-2407_bullseye_wb7x.fit - результат тот же.

Да, тоже исследую.

Добрый день! Есть какие-то новости на сегодня? )))

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

Добрый день.
А можно в качестве фич-реквеста по данной теме попросить сделать возможность выбора коэффициента трансформации прямо в шаблонах WB-MAP (а еще и желательно в шаблонах других счетчиков типа Меркурия и тд)?
Ну и соответсвенно переложить данную работу по пересчету с wb-rules на wb-mqtt-serial?

Это есть в планах, даже не в шаблонах а в самих измерителях, внутри.

А в насколько далеких это планах?

Пока сроков нет, то есть планы не оперативные.