1

node-opcua @ https://github.com/node-opcua/node-opcuaの例では、OPC サーバーに追加された変数ごとにコードを書き直す必要があると述べています。これは、「addressSpace.addVariable()」を呼び出すことで実現されます。 .しかし、1000 個の変数がある場合、それは難しい作業になる可能性があります.最終的には、カスタム ユーザーごとにコードの書き直しが必要になり、面倒になる可能性があります.

opc は、別のカスタム サーバー (OPC ではない) から「タグ」を読み取りました。

この「タグ」を使用して、opc サーバーはそれらをノード「デバイス」に追加する必要があります。

OPC サーバー node-opcua がネットからの変数の get または set を見つけると、正しい変数の get または set を呼び出します。

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

get 関数と set 関数で「this」を使用しようとしたのは運が良かったのですが、get には変数を動的に読み取るために使用できる「this.browseName」(タグ名) プロパティがあり、現在は機能しています。

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

上記のコードで動的変数を使用するための回避策を知っていますか? すべての変数 (タグ) に対して 1 つの get 定義と 1 つの set 定義を含む 1 つの for ループが必要です。これは、マルチプロパティ オブジェクトまたはオブジェクトの配列を読み書きします。レコード配列。

PS:スタックオーバーフローでこれを見つけました:

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

しかし、私の場合、 node-opcua 変数には、例のように機能する「this」がありません。「セット」(init など) 内: this.browseName (a など) と this.nodeId (b など) には到達できません。

4

1 に答える 1

2

ガチャ、

get プロパティと set プロパティを次のような関数としてキャストする必要があります。

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

インデックスを使用して配列の値を取得および設定します。このようなキャスト関数は、これらの取得および設定プロパティで「ハードコード」されるインデックスを提供します。

于 2016-10-16T17:21:02.863 に答える