2016-10-10 1 views
0

Примеры на node-opcua @https://github.com/node-opcua/node-opcua говорят, что мне нужно переписать код для каждой переменной, добавленной на OPC-сервер, это достигается при вызове 'addressSpace.addVariable()' ... Но если у меня есть 1000 переменных, это может быть трудной задачей ... и в конечном итоге каждый пользовательский пользователь хочет переписать код, это может быть утомительным ... поэтому я пытаюсь сделать это динамически.js get set with dynamic variables in node-opcua

Операция чтения «тегов» с другого пользовательского сервера (не OPC).

С помощью этого 'тега' серверу opc необходимо добавить их в узел 'device'.

Когда OPC сервер узел opcua найти получить или установить переменный, поступающие из сети, это называют получить или набор соответствующих переменный:

for (var i = 0; i < tags.GetTags.length; i++) 
    { 
     variables[tags.GetTags[i].Tag] = {"value" : 0.0, "is_set" : false}; 

     addressSpace.addVariable({ 
      componentOf: device, // Parent node 
      browseName: tags.GetTags[i].Tag, // Variable name 
      dataType: "Double", // Type 
      value: { 
       get: function() { 
        //console.log(Object.getOwnPropertyNames(this)); 
        return new opcua.Variant({dataType: opcua.DataType.Double, value: variables[this["browseName"]].value }); // WORKS 
       }, 
       set: function (variant) { 
        //console.log(Object.getOwnPropertyNames(this)); 
        variables[this["browseName"]].value = parseFloat(variant.value); // this["browseName"] = UNDEFINED!!! 
        variables[this["browseName"]].is_set = true; 
        return opcua.StatusCodes.Good; 
       } 
      } 
     }); 

     console.log(tags.GetTags[i].Tag); 
    } 

Как я уже говорил, я пытался использовать 'this' в get и set функции с половиной удачи, get имеет свойство this.browseName (имя тега), которое можно использовать для динамического чтения моих переменных, и в настоящее время оно работает.

Проблема с набором, в наборе 'this.browseName' и 'this.nodeId' не существует! Таким образом, он дает ошибку «undefined». Он также не существует в варианте переменной.

Вы знаете, как использовать динамические переменные с указанным выше кодом? Мне нужно иметь один для цикла с одним get и одним набором определений для всех переменных (тегов), которые читают и записывают объект с несколькими свойствами или массив объектов, например 1 get и 1 набор определений, которые записывают правую переменную в записывает массив.

PS: Я нашел на переполнение стека это:

var foo = { a: 5, b: 6, init: function() { this.c = this.a + this.b; return this; } }

Но в моем случае узел-opcua переменная не имеет «это» работает как на примере. В 'set' (например, init): this.browseName (например a) и this.nodeId (например, b) недоступны.

ответ

1

Попался,

вам нужно отливать получить и установить свойство, такие функции, как:

addressSpace.addVariable({ 
      componentOf: device, 
      browseName: _vars[i].Tag, 
      dataType: "Double", 
      value: { 
       get: CastGetter(i), 
       set: CastSetter(i) 
      } 
     }); 

с

function CastGetter(index) { 
    return function() { 
     return new opcua.Variant({dataType: opcua.DataType.Double, value: opc_vars[index].Value }); 
    }; 
} 

function CastSetter(index) { 
    return function (variant) { 
     opc_vars[index].Value = parseFloat(variant.value); 
     opc_vars[index].IsSet = true; 
     return opcua.StatusCodes.Good; 
    }; 
} 

вы будете использовать индекс, чтобы получить и установить значение в массиве , функция каста, подобная этой, обеспечит индексом «жестко закодированную» в тех свойствах get и set.