0
Answered

IR.EVENT_TAG_CHANGE срабатывает независимо от изменения токена

Алексей Цыганков 5 years ago in Tips and Tricks updated by Aleksandr Romanov (CTO) 3 years ago 3
Добрый день, помогите, пожалуйста, разобраться с событием EVENT_TAG_CHANGE. В моем проекте данное событие срабатывает при обновлении данных драйвера, а не при изменении токена :(
Для чистоты эксперимента создал пустой проект, добавил драйвер Modbus TCP to RTU, добавил 1 фидбэк, в скрипте прописал:
IR.AddListener (IR.EVENT_TAG_CHANGE, IR.GetDevice("Modbus TCP to RTU"), function(name,value) { 
IR.Log(name + "=" + value);
})
В итоге в логе вижу:
[05-06-2015 12:14:54.054] INFO Channel 1=0
[05-06-2015 12:14:54.626] INFO Channel 1=0
[05-06-2015 12:14:55.105] INFO Channel 1=0
[05-06-2015 12:14:55.667] INFO Channel 1=0
....
Как видно, токен не меняется, а событие всё равно вызывается каждые 500мс (Update Time в настройках драйвера).
Answered
Событие реагирует на получение данных от оборудования, но не проверяет, произшло ли фактическое изменение этих данных. Для драйверов с циклическим опросом необходимо проверять, было ли изменение:

var reject = 0;

IR.AddListener(IR.EVENT_TAG_CHANGE, IR.GetDevice("Modbus TCP to RTU"), function(name,value)
{
    if  (name == "Command 2" && value == 0)
        reject = 0;
    if (name == "Command 2" && value == 1 && reject == 0) 
    {
        IR.Log('event 1');
        reject = 1;
    }
});

Екатерина, спасибо за ответ.
Но название события вводит в заблуждение. Очень хотелось бы и для этих драйверов событие отрабатывало бы именно на изменение, это избавило бы от лишних переменных и лишнего кода, ну или хотя бы разделить параметр value на два: old_value и new_value.
Алексей, это универальный и единственный слушатель для обработки входящих данных от встроенных драверов Иридиум. Ограничение его функциональности невозможно, т.к. драйверы работают по-разному (событийные системы, системы с периодическим опросом) и присылают данные разного типа.
Название события останется неизменным для сохранения совместимости. Мы рассмотрим возможность введения нового события с автоматическим сравнением предыдущего и нового значения.