2016-10-10 10 views
0

node-opcua @https://github.com/node-opcua/node-opcuaの例では、OPCサーバに追加されたすべての変数のコードを書き直す必要があると言われていますが、これは 'addressSpace.addVariableしかし、もし私が1000の変数を持っているのなら、それは難しい作業かもしれません。そして最終的に各カスタムユーザはコードを書き直したいと思うかもしれません。面倒かもしれません...だから私はそれを動的にやろうとしています。jsはnode-opcuaの動的変数で設定されます

opcは、別のカスタムサーバー(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には変数を動的に読み取るために使用できる 'this.browseName'(タグ名)プロパティがあり、現在動作しています。

問題はセットで、 'this.browseName'と 'this.nodeId'が存在しません。したがって、「未定義」エラーが発生します。バリアント変数にも存在しません。

上記のコードで動的変数を使用する場合の回避策をご存知ですか?私は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

ガッチャ、

あなたのような機能として取得および設定のプロパティをキャストする必要があります。あなたが取得し、配列に値を設定するためにインデックスを使用します

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

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

このようなキャスト関数は、getおよびsetプロパティで "ハードコードされる"ためのインデックスを提供します。

関連する問題