コンテンツにスキップ

opcua

Since v8.0.75

opcuaモジュールは、JSHアプリケーションからOPC UAサーバーを読み書きするクライアントAPIを提供します。

Client

OPC UAクライアントオブジェクトです。

作成
new Client(options)
  • 戻り値: Client
  • optionsを省略すると、例外(missing client options)が発生します。
オプション
オプション既定値説明
endpointstring""OPC UAサーバーのエンドポイント(opc.tcp://host:port
readRetryIntervalnumber100(100ms未満の場合は100に補正)read()の再試行間隔(ミリ秒)
messageSecurityModenumberMessageSecurityMode.Noneセキュリティモード。MessageSecurityModeを参照
使用例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const ua = require("opcua");
const nodes = [
    "ns=1;s=NoPermVariable",
    "ns=1;s=ReadWriteVariable",
    "ns=1;s=ReadOnlyVariable",
    "ns=1;s=NoAccessVariable",
];

let client;
try {
    client = new ua.Client({ endpoint: "opc.tcp://localhost:4840" });
    const values = client.read({
        nodes,
        timestampsToReturn: ua.TimestampsToReturn.Both,
    });
    values.forEach((v, idx) => {
        console.println(nodes[idx], v.status, v.statusCode, v.value, v.type);
    });
} catch (e) {
    console.println("Error:", e);
} finally {
    if (client !== undefined) client.close();
}

close()

クライアント接続を閉じます。

構文
close()
  • 戻り値: 成功時はnull

read()

指定したノード一覧の値を読み取ります。

構文
read(readRequest)
パラメーター
戻り値

エラー時の動作:

  • nodesがない場合や空の場合は、例外が発生します。

write()

1つ以上のノード値を書き込みます。

構文
write(...writeRequest)
パラメーター
戻り値

エラー時の動作:

  • 引数がない場合は例外(missing argument
使用例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
const ua = require("opcua");

let client;
try {
    client = new ua.Client({ endpoint: "opc.tcp://localhost:4840" });

    let rsp = client.read({ nodes: ["ns=1;s=rw_bool", "ns=1;s=rw_int32"] });
    console.println("read response:", rsp[0].value, rsp[1].value);

    rsp = client.write(
        { node: "ns=1;s=rw_bool", value: false },
        { node: "ns=1;s=rw_int32", value: 1234 },
    );
    console.println("write response error:", rsp.error, ", results:", rsp.results);

    rsp = client.read({ nodes: ["ns=1;s=rw_bool", "ns=1;s=rw_int32"] });
    console.println("read response:", rsp[0].value, rsp[1].value);
} catch (e) {
    console.println("Error:", e);
} finally {
    if (client !== undefined) client.close();
}

browse()

1つ以上のノードの参照を検索します。

構文
browse(browseRequest)
パラメーター
戻り値

エラー時の動作:

  • nodesがない場合や空の場合は、例外が発生します。
使用例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
const ua = require("opcua");

let client;
try {
    client = new ua.Client({ endpoint: "opc.tcp://localhost:4840" });
    const results = client.browse({
        nodes: ["ns=1;i=85"],
        nodeClassMask: ua.NodeClass.Variable,
        requestedMaxReferencesPerNode: 2,
    });

    console.println("continuationPoint:", results[0].continuationPoint);
    results[0].references.forEach((ref) => {
        console.println(ref.browseName, ref.nodeId, ref.nodeClass);
    });
} catch (e) {
    console.println("Error:", e);
} finally {
    if (client !== undefined) client.close();
}

browseNext()

browse()またはbrowseNext()が返した継続ポイントを使って、次のページを取得します。

構文
browseNext(browseNextRequest)
パラメーター
戻り値

エラー時の動作:

  • continuationPointsがない場合や空の場合は、例外が発生します。
使用例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const ua = require("opcua");

let client;
try {
    client = new ua.Client({ endpoint: "opc.tcp://localhost:4840" });

    let results = client.browse({
        nodes: ["ns=1;i=85"],
        nodeClassMask: ua.NodeClass.Variable,
        requestedMaxReferencesPerNode: 2,
    });

    while (results[0].continuationPoint) {
        results = client.browseNext({
            continuationPoints: [results[0].continuationPoint],
        });
        results[0].references.forEach((ref) => {
            console.println(ref.browseName, ref.nodeId, ref.nodeClass);
        });
    }
} catch (e) {
    console.println("Error:", e);
} finally {
    if (client !== undefined) client.close();
}

children()

指定したノードの直接の子参照を返します。

構文
children(childrenRequest)
パラメーター
戻り値

エラー時の動作:

  • nodeがない場合や空の場合は、例外が発生します。
使用例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const ua = require("opcua");

let client;
try {
    client = new ua.Client({ endpoint: "opc.tcp://localhost:4840" });
    const refs = client.children({
        node: "ns=1;i=85",
        nodeClassMask: ua.NodeClass.Variable,
    });

    refs.forEach((ref) => {
        console.println(ref.browseName, ref.nodeId, ref.nodeClass);
    });
} catch (e) {
    console.println("Error:", e);
} finally {
    if (client !== undefined) client.close();
}

ReadRequest

プロパティ既定値説明
nodesstring[]読み取るOPC UAノードIDの一覧
maxAgenumber0許容するキャッシュの経過時間(ミリ秒)
timestampsToReturnnumberTimestampsToReturn.Neitherタイムスタンプの返却方針

ReadResult

プロパティ説明
statusnumberOPC UAステータスコード(uint32
statusTextstring状態テキスト
statusCodestringステータスコード名(例:StatusGood
valueany読み取った値
typestring値の型名(例:BooleanInt32Double
sourceTimestampnumberソースタイムスタンプ(Unixエポックミリ秒)
serverTimestampnumberサーバータイムスタンプ(Unixエポックミリ秒)

WriteRequest

プロパティ説明
nodestring書き込み先のノードID
valueany書き込む値

WriteResult

プロパティ説明
errorError|nullリクエスト処理のエラー
timestampnumberレスポンスタイムスタンプ(Unixエポックミリ秒)
requestHandlenumberOPC UAリクエストハンドル
serviceResultnumberOPC UAサービスの結果コード
stringTablestring[]OPC UA文字列テーブル
resultsnumber[]ノードごとのステータスコードの配列

BrowseRequest

プロパティ既定値説明
nodesstring[]検索するOPC UAノードIDの一覧
browseDirectionnumberBrowseDirection.Forward検索方向
referenceTypeIdstringすべての参照追跡する参照型のノードID
includeSubtypesbooleantruereferenceTypeIdのサブタイプを含めるかどうか
nodeClassMasknumber0含めるノードクラスのビットマスク
resultMasknumberBrowseResultMask.All返すフィールドのビットマスク
requestedMaxReferencesPerNodenumber0サーバーがページ分割して返す、ノードごとの最大参照数のヒント

BrowseNextRequest

プロパティ既定値説明
continuationPointsstring[]browse()またはbrowseNext()が返したbase64形式の継続ポイントの一覧
releaseContinuationPointsbooleanfalse次の参照を要求せずに、サーバー側の継続ポイントを解放するかどうか

BrowseResult

プロパティ説明
statusnumberOPC UAステータスコード(uint32
statusTextstring状態テキスト
continuationPointstringbase64形式の継続ポイント。次のページがない場合は空文字列
referencesobject[]BrowseReferenceの配列

BrowseReference

プロパティ説明
referenceTypeIdstring参照型のノードID
isForwardboolean順方向の参照かどうか
nodeIdstring対象のノードID
browseNamestringブラウズ名
displayNamestring表示名
nodeClassnumberOPC UAノードクラスの値
typeDefinitionstring型定義のノードID

ChildrenRequest

プロパティ説明
nodestring親ノードID
nodeClassMasknumber含めるノードクラスのビットマスク

ChildrenResult

プロパティ説明
referenceTypeIdstring参照型のノードID
isForwardboolean順方向の参照かどうか
nodeIdstring子ノードID
browseNamestringブラウズ名
displayNamestring表示名
nodeClassnumberOPC UAノードクラスの値
typeDefinitionstring型定義のノードID

BrowseDirection

  • BrowseDirection.Forward
  • BrowseDirection.Inverse
  • BrowseDirection.Both
  • BrowseDirection.Invalid

NodeClass

  • NodeClass.Unspecified
  • NodeClass.Object
  • NodeClass.Variable
  • NodeClass.Method
  • NodeClass.ObjectType
  • NodeClass.VariableType
  • NodeClass.ReferenceType
  • NodeClass.DataType
  • NodeClass.View

BrowseResultMask

  • BrowseResultMask.None
  • BrowseResultMask.ReferenceTypeId
  • BrowseResultMask.IsForward
  • BrowseResultMask.NodeClass
  • BrowseResultMask.BrowseName
  • BrowseResultMask.DisplayName
  • BrowseResultMask.TypeDefinition
  • BrowseResultMask.All
  • BrowseResultMask.ReferenceTypeInfo
  • BrowseResultMask.TargetInfo

MessageSecurityMode

  • MessageSecurityMode.None
  • MessageSecurityMode.Sign
  • MessageSecurityMode.SignAndEncrypt
  • MessageSecurityMode.Invalid

TimestampsToReturn

  • TimestampsToReturn.Source
  • TimestampsToReturn.Server
  • TimestampsToReturn.Both
  • TimestampsToReturn.Neither
  • TimestampsToReturn.Invalid

OPCUAクライアント

この例は、OPC UAサーバーに接続してシステムメトリクスを読み取り、データベースに保存する収集プログラムを実装します。

処理の流れ

  1. OPC UA連携:opcuaモジュールでopc.tcp://localhost:4840サーバーに接続し、sys_cpusys_memload1などのノード値を取得します。
  2. 定期収集:setInterval()で10秒ごとにデータを読み取ります。
  3. データの取り込み:収集した値を、EXAMPLEテーブルのnametimevalue列に保存します。

データ収集プログラム

スクリプトをopcua-client.jsとして保存し、JSHターミナルでバックグラウンド実行してください。

jsh / > opcua-client
jsh / > ps
┌──────┬──────┬──────┬──────────────────┬────────┐ 
│  PID │ PPID │ USER │ NAME             │ UPTIME │ 
├──────┼──────┼──────┼──────────────────┼────────┤ 
│ 1044 │ 1    │ sys  │ /opcua-client.js │ 13s    │ 
│ 1045 │ 1025 │ sys  │ ps               │ 0s     │ 
└──────┴──────┴──────┴──────────────────┴────────┘ 
  • opcua-client.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
opcua = require("opcua");
process = require("process");
machcli = require("machcli");

const nodes = [
    "ns=1;s=sys_cpu",
    "ns=1;s=sys_mem",
    "ns=1;s=load1",
    "ns=1;s=load5",
    "ns=1;s=load15",
];
const tags = [
    "sys_cpu", "sys_mem", "sys_load1", "sys_load5", "sys_load15"
];
const dbConf = { host: '127.0.0.1', port: 5656, user: 'sys', password: 'manager' };
const sqlText = `INSERT INTO EXAMPLE (name,time,value) values(?,?,?)`;
const uaClient = new opcua.Client({ endpoint: "opc.tcp://localhost:4840" });
process.addShutdownHook(()=>{
    uaClient.close();
});
setInterval(()=>{
    const ts = process.now();
    const vs = uaClient.read({
        nodes: nodes,
        timestampsToReturn: opcua.TimestampsToReturn.Both
    });
    var dbClient, conn;
    try {
        dbClient = new machcli.Client(dbConf);
        conn = dbClient.connect();
        vs.forEach((v, idx) => {
            if( v.value !== null ) {
                conn.exec(sqlText, tags[idx], ts, v.value);
            }
        })
    } catch (e) {
        console.println("Error:", e.message);
    } finally {
        conn && conn.close();
        dbClient && dbClient.close();
    }
}, 10*1000);

シミュレーターサーバー

opcua-client.jsをテストするには、必要なシステムメトリクスのノードを提供するOPC UAサーバーが必要です。 実環境がない場合は、以下のリポジトリが提供するシミュレーターを使用してください。 sys_cpusys_memload1load5load15などのサンプルデータを提供し、収集と可視化の流れを検証できます。

設定方法は、リポジトリの手順に従ってください。

https://github.com/machbase/neo-server/tree/main/jsh/native/opcua/test_server

シミュレーターを起動してからopcua-client.jsを実行すると、OPC UAクライアントが接続してデータを収集します。

最終更新日