2016-10-10 1 views
0

Beispiele auf node-opcua @https://github.com/node-opcua/node-opcua sagen, dass ich Code für jede Variable neu an den OPC-Server hinzugefügt werden muss, erreicht dies Aufruf von 'addressSpace.addVariable()' ... Aber wenn ich 1000 Variablen habe, könnte es eine schwierige Aufgabe sein ... und schließlich möchte jeder benutzerdefinierte Benutzer einen Code neu schreiben, es könnte mühsam sein ... also versuche ich es dynamisch zu machen.js werden mit dynamischen Variablen in node-opcua gesetzt

Die opc lesen 'Tags' von einem anderen benutzerdefinierten Server (nicht OPC).

Mit diesen 'Tags' muss der opc Server diese zum Knoten 'device' hinzufügen.

Wenn die OPC-Server-Knoten-opcua ein get oder ein Satz von einer Variablen aus dem Netz kommen zu finden, nennt es die oder die richtigen Variable erhalten:

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); 
    } 

Wie ich sage, dass ich versuchte, das zu verwenden, 'this' in get und set-Funktionen mit einem halben Glück, die get hat eine 'this.browseName' (der Tag Name) -Eigenschaft, die zum dynamischen Lesen meiner Variablen verwendet werden kann und es funktioniert derzeit.

Das Problem ist mit dem Set, in Set 'this.browseName' und 'this.nodeId' nicht vorhanden! Es gibt also einen "undefinierten" Fehler. Es existiert auch nicht in Variantenvariable.

Kennen Sie ein Problem, dynamische Variablen mit dem obigen Code zu verwenden? Ich brauche für alle Variablen (Tags) mit einer get und einer Set-Definitionen einen for-Schleife zu haben, die ein Multi-Property-Objekt oder ein Array von Objekten, wie 1 get und 1 Satz Definitionen lesen und schreiben, die die richtige Variable in einem schreiben Datensatzarray.

PS: Ich fand auf Stack-Überlauf dieses:

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

Aber in meinem Fall Knoten opcua Variable keine 'this' arbeitet wie das Beispiel funktioniert hat. Im 'set' (wie init): this.browseName (wie a) und this.nodeId (wie b) sind nicht erreichbar.

Antwort

1

Gotcha,

Sie wie erhalten und legen Sie die Eigenschaften wie Funktionen werfen müssen:

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

mit

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; 
    }; 
} 

finden Sie einen Index verwenden, zu erhalten und die eingestellten Werte im Array Eine Casting-Funktion wie diese liefert einen Index, der in diesen Eigenschaften "get" und "set" "fest codiert" ist.

Verwandte Themen