> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/deployment/ja/serufuhosuto/enterprise/deployment-manager/services/opc-ua-server.md).

# OPC UA サーバー

OPC UA（Open Platform Communications Unified Architecture）は、デバイス、PLC、SCADA システム間でデータを交換するための産業用通信プロトコルです。OPC UA Server はエッジコンテナーサービスで、デバイス上のタグを公開し、産業用クライアントが推論結果を読み取り、値を書き戻せるようにします。

Deployment Manager の Configuration タブでタグ、フォルダー、サーバー設定を定義し、その後 OPC UA クライアントをデバイスに向けます。

{% hint style="info" %}
OPC UA Server は Enterprise 顧客専用です。 [Roboflow の営業チームにお問い合わせください](https://roboflow.com/sales) 詳細をご確認いただくためです。
{% endhint %}

## 接続の詳細

置き換えてください `<device-ip>` を、Deployment Manager のデバイスページに表示される IP アドレスに。

<table data-search="false"><thead><tr><th>用途</th><th>アドレス</th></tr></thead><tbody><tr><td>OPC UA エンドポイント</td><td><code>opc.tcp://&#x3C;device-ip>:4840/opcua/server</code></td></tr><tr><td>Web UI と REST API</td><td><code>http://&#x3C;device-ip>:8092</code></td></tr></tbody></table>

<table data-search="false"><thead><tr><th>ポート</th><th>プロトコル</th><th>用途</th></tr></thead><tbody><tr><td>4840</td><td>OPC UA バイナリ</td><td>産業用クライアント接続（PLC、SCADA）</td></tr><tr><td>8092</td><td>HTTP</td><td>Web UI、REST API、ドキュメント</td></tr></tbody></table>

## 構成ソース

Configure モーダル上部の「Configuration Source」トグルは、タグとフォルダーの構成元を制御します。デバイス上で有効なのは常に 1 つのソースだけです。

<table data-search="false"><thead><tr><th>ソース</th><th>保存先</th><th>次のような場合に使用</th></tr></thead><tbody><tr><td>「Web UI」</td><td><code>OPCUA_CONFIG</code></td><td>モーダル内でタグ、フォルダー、サーバー設定をその場で定義したい場合に使います。これがデフォルトです。</td></tr><tr><td>「File」</td><td><code>OPCUA_CONFIG_FILE</code></td><td>設定が環境変数には大きすぎる場合、たとえば数千個のタグを持つデプロイメントなどです。サーバーにデバイス上のパスを指定します（例: <code>/data/opcua-config.json</code>).</td></tr></tbody></table>

「File」モードでは、起動時にファイルが存在し、読み取り可能で、空でないことをサーバーが検証し、そのいずれかを満たさない場合は明示的なログエントリを出して起動に失敗します。 `OPCUA_CONFIG_FILE` が優先されます `OPCUA_CONFIG`.

ソースを切り替えると、モーダルを開いている間はインラインの値とファイルパスの両方が保持されます。保存時には選ばなかった方のソースが消去されるため、2 つの変数のうち実際に設定されるのは 1 つだけです。「File」モードでは、サービスカードにインラインのタグ一覧の代わりに設定済みのファイルパスが表示されます。

## サーバー設定

<table data-search="false"><thead><tr><th>設定</th><th>説明</th></tr></thead><tbody><tr><td>「Server Name」</td><td>ネットワークを閲覧するクライアントに表示される、サーバーインスタンスの人間が読める名前。</td></tr><tr><td>「Namespace URI」</td><td>タグが登録されるサーバーの名前空間を識別する一意の URI。既定値は <code>http://opcua.roboflow.run</code>.</td></tr><tr><td>「Max Sessions」</td><td>同時に接続できる OPC UA クライアント数。既定値は <code>200</code>.</td></tr></tbody></table>

各クライアントは 1 セッションを保持します。これには、タグを書き込む各推論ポッドや各 SCADA 接続も含まれます。クラッシュしたクライアントのセッションは、サーバーがタイムアウトさせたときにのみ解放されるため、稼働中のクライアント数より多くのセッションが稼働サイトで保持されることがあります。上限に達すると、それ以降のクライアントは `BadTooManySessions` で拒否され、タグの更新も止まります。サイトが既定より多くの同時クライアントを運用する場合は、この値を増やしてください。モーダルで設定するとサーバー設定に書き込まれ、 `OPCUA_MAX_SESSIONS` は、手動管理されたデプロイメントではデバイスごとに上書きできます。

## フォルダーとタグ

フォルダーはタグを階層構造に整理します。各フォルダーには名前と任意の説明があり、OPC UA のアドレス空間ではノードとして表示されるため、クライアントはタグを参照して見つけられます。タグはフォルダーに属することも、ルートレベルに置くこともできます。

タグはサーバーが公開するデータポイントを定義します。各タグには次のフィールドがあります。

<table data-search="false"><thead><tr><th>フィールド</th><th>説明</th></tr></thead><tbody><tr><td>「Display Name」</td><td>OPC UA クライアントに表示される、人間が読める名前。</td></tr><tr><td>「Browse Name」</td><td>アドレス空間で使用されるプログラム的な識別子。表示名から生成されます。</td></tr><tr><td>「Data Type」</td><td>そのタグが保持する値の型。</td></tr><tr><td>「Access Level」</td><td>そのタグが <code>ReadWrite</code> または <code>ReadOnly</code>.</td></tr><tr><td>「Folder」</td><td>そのタグが属するフォルダー。未割り当ての場合は Root。</td></tr><tr><td>「Initial Value」</td><td>サーバー起動時の開始値。データ型に対して検証されます。</td></tr><tr><td>「Description」</td><td>そのタグの用途を説明する任意のラベル。</td></tr></tbody></table>

### データ型

<table data-search="false"><thead><tr><th>型</th><th>説明</th><th>例</th></tr></thead><tbody><tr><td><code>Boolean</code></td><td>真または偽</td><td><code>true</code></td></tr><tr><td><code>Int32</code></td><td>32 ビット符号付き整数</td><td><code>42</code></td></tr><tr><td><code>Float</code></td><td>32 ビット浮動小数点数</td><td><code>3.14</code></td></tr><tr><td><code>Double</code></td><td>64 ビット浮動小数点数</td><td><code>3.14159265359</code></td></tr><tr><td><code>String</code></td><td>UTF-8 テキスト</td><td><code>実行中</code></td></tr><tr><td><code>DateTime</code></td><td>ISO 8601 タイムスタンプ</td><td><code>2024-01-15T10:30:00Z</code></td></tr></tbody></table>

これらは Configure モーダルで選択できる型です。手書きの構成ファイルでは `Int16`, `UInt16`、および `UInt32`、これらをサーバーが受け付けます。

### アクセスレベル

`ReadWrite` タグは、REST API、CLI、Web UI と同様に、OPC UA クライアントから読み書きできます。制御出力、設定値、ユーザーが調整できる値に使用します。

`ReadOnly` タグは OPC UA クライアントからの書き込みを `BadNotWritable`で拒否します。REST API、CLI、Web UI はアクセスレベルに関係なく値を更新できるので、 `ReadOnly` を、センサー値、計算された出力、そしてデバイスだけが生成すべきシステム状態に使用してください。

### 任意の制約

数値型は許容範囲を制限するための「Min Value」と「Max Value」に加え、説明用の単位ラベル（例: °C、PSI、RPM）として「Engineering Units」をサポートします。文字列型は文字数上限のための「Max Length」をサポートします。

## 認証

サーバーは既定で SecurityPolicy None を使用し、匿名接続を許可します。Configure モーダルで「Require authentication」をオンにすると、すべてのクライアントにユーザー名とパスワードを要求します。

トグルがオンのときは、ユーザー名とパスワードの両方を指定する必要があります。パスワードは保存前に bcrypt でハッシュ化されるため、元の値は保存されず、後で取得することもできません。既存のサーバーのパスワードを変更するには、Configure モーダルで新しいパスワードを入力します。現在のパスワードを維持するには、フィールドを空欄のままにします。トグルをオフにすると匿名アクセスに戻ります。

認証情報は 2 つの環境変数として保存され、必ず両方を同時に設定するか、両方とも未設定のままにする必要があります。

<table data-search="false"><thead><tr><th>変数</th><th>説明</th></tr></thead><tbody><tr><td><code>OPCUA_USERNAME</code></td><td>クライアント認証用のプレーンテキストのユーザー名。</td></tr><tr><td><code>OPCUA_PASSWORD_HASH</code></td><td>ソルトラウンド 10 の bcrypt ハッシュ。先頭は <code>$2b$10$</code>.</td></tr></tbody></table>

{% hint style="warning" %}
環境変数を編集するのではなく、Configure モーダルから認証情報を設定してください。モーダルが bcrypt ハッシュを生成してくれるので、 `OPCUA_PASSWORD_HASH` を手動で設定する場合は、外部で有効なハッシュを作成する必要があります。
{% endhint %}

## タグレポート

サーバーはスケジュールに従ってタグを Roboflow にレポートできるため、現地に行かなくても何を公開しているか確認できます。これは Configure モーダルの「Tag Reporting」セクションで設定します。

<table data-search="false"><thead><tr><th>設定</th><th>説明</th></tr></thead><tbody><tr><td>「Send periodic tag reports」</td><td>レポート送信のオン・オフを切り替えます。既定ではオンです。</td></tr><tr><td>「Include tag values」</td><td>各タグの現在値を送信します。オフにするとタグ数のみを送信します。既定ではオンです。</td></tr><tr><td>「Reporting Interval」</td><td>レポート間の秒数。既定値は 60 です。</td></tr></tbody></table>

これらの設定は環境変数として保存され、サーバーは起動時に読み込みます。

<table data-search="false"><thead><tr><th>変数</th><th>デフォルト</th><th>説明</th></tr></thead><tbody><tr><td><code>OPCUA_SNAPSHOT_INTERVAL_SECONDS</code></td><td><code>60</code></td><td>レポート間の秒数。 <code>0</code> レポート送信をオフにします。</td></tr><tr><td><code>OPCUA_SNAPSHOT_INCLUDE_VALUES</code></td><td><code>true</code></td><td><code>false</code> タグ数のみを送信します。</td></tr><tr><td><code>OPCUA_SNAPSHOT_TTL_SECONDS</code></td><td>算出値</td><td>レポートが最新として保持される時間。モーダルはこれを間隔から算出し、保存するたびに書き直します。</td></tr></tbody></table>

サーバーが受け付けない値が指定されると、既定値にフォールバックするのではなくレポート送信がオフになります。そのため、 টাইポがあるとレポートは停止します。デバイスページでは、そのようなデバイスはレポートしていないものとして表示されます。

これらの変数のいずれかが参照設定（`{$ref}`）になっている場合、モーダルはレポート設定を編集できず、保存時もそのまま残します。フォームからレポートを管理するには、参照をリテラル値に置き換えてください。

{% hint style="warning" %}
「Include tag values」は周期レポートにのみ適用されます。サーバーはタグ値の変更を引き続きコンテナーのログに書き込み、Roboflow はそれを別途収集します。
{% endhint %}

## 監視

デバイスページには、接続中のクライアント数、「Max Sessions」に対する使用中セッション数、そして最新のタグレポートを表示する OPC UA のライブステータスカードが表示されます。タグレポートより古いイメージ上のデバイスでは、レポートの代わりにその旨が表示されます。

サーバーがセッション上限に達して新しいクライアントを拒否すると、カードにはセッション数、上限、そして拒否されたクライアント数を示すバナーが表示されます。これについてメールを受け取るには、デバイスの「Device Alerts」タブから「OPC UA Refusing Clients」アラートを追加し、最初に何分間の拒否を許可するかを設定してください。参照: [デバイスアラートを設定](/deployment/ja/serufuhosuto/enterprise/deployment-manager/setting-up/set-up-device-alerts.md).

## Web インターフェース

サーバーは次の場所に Web インターフェースを提供します `http://<device-ip>:8092`.

<table data-search="false"><thead><tr><th>ページ</th><th>パス</th><th>内容</th></tr></thead><tbody><tr><td>ダッシュボード</td><td><code>/</code></td><td>現在値付きで構成済みの全タグを 2 秒ごとに更新して表示します。アクセスレベルに関係なく、どのタグの値も編集ダイアログから編集できます。</td></tr><tr><td>ドキュメント</td><td><code>/docs.html</code></td><td>サーバーガイド、設定形式のリファレンス、トラブルシューティングの注意事項。</td></tr><tr><td>API エクスプローラー</td><td><code>/api/docs</code></td><td>エンドポイントのテストやリクエスト／レスポンススキーマの確認ができる、対話型の Swagger UI。</td></tr></tbody></table>

## HTTP API

REST API は、タグ値とサーバー情報にプログラムからアクセスする手段を提供します。すべてのエンドポイントは JSON を返します。ベース URL は `http://<device-ip>:8092/api`です。 [サービス](/deployment/ja/serufuhosuto/enterprise/deployment-manager/services.md#using-the-apis) すべてのオンデバイスサービス API に共通するルールについては

{% hint style="warning" %}
HTTP API は認証なしです。 `OPCUA_USERNAME` および `OPCUA_PASSWORD_HASH` は、ポート 8092 ではなくポート 4840 の OPC UA バイナリエンドポイントを保護します。ポート 8092 に到達できるものは、どのタグにも書き込めます。
{% endhint %}

タグ構造は実行時に不変です。タグとフォルダーは `OPCUA_CONFIG` 環境変数、または次で指定されたファイルから取得されます `OPCUA_CONFIG_FILE` 大規模な構成向けであり、この API では作成、変更、削除はできません。書き込めるのは値だけです。

### タグ値の読み書き

`accessLevel` はこの API ではなく OPC UA プロトコルを制御します。 `ReadOnly` とマークされたタグは、OPC UA クライアントからの書き込みを `BadNotWritable` で拒否しますが、ここでは書き込み可能なままです。これにより、パイプラインが産業用クライアントが読み取るだけにすべきセンサー値を公開できます。

```bash
curl http://<device-ip>:8092/api/tags

curl -X PUT http://<device-ip>:8092/api/tags/tag_temperature/value \\
  -H "Content-Type: application/json" \\
  -d '{"value": 25.5}'
```

{% openapi src="/files/a9718340faace7402aaf905281c791254fa8fddb" path="/tags" method="get" %}
[edge-opcua-server.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-21a215712d389ded373872b7a4e970e80be2c5fa%2Fedge-opcua-server.yaml?alt=media)
{% endopenapi %}

{% openapi src="/files/a9718340faace7402aaf905281c791254fa8fddb" path="/tags/{id}" method="get" %}
[edge-opcua-server.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-21a215712d389ded373872b7a4e970e80be2c5fa%2Fedge-opcua-server.yaml?alt=media)
{% endopenapi %}

{% openapi src="/files/a9718340faace7402aaf905281c791254fa8fddb" path="/tags/{id}/value" method="put" %}
[edge-opcua-server.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-21a215712d389ded373872b7a4e970e80be2c5fa%2Fedge-opcua-server.yaml?alt=media)
{% endopenapi %}

書き込みは `400` で拒否されます。値が欠けている場合、型がタグの `dataType`と一致しない場合、または設定された `minValue`, `maxValue`、または `maxLength`の範囲外にある場合です。存在しないタグへの書き込みも `400`を返し、 `404`. `GET /tags/{id}` は `404`を返すため、不明なタグと不正な値を区別したい場合に使ってください。

### 設定エンドポイント

実行中の構成を読み取り専用で確認でき、書き込み前にタグ ID とその制約を見つけるのに役立ちます。

{% openapi src="/files/a9718340faace7402aaf905281c791254fa8fddb" path="/config" method="get" %}
[edge-opcua-server.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-21a215712d389ded373872b7a4e970e80be2c5fa%2Fedge-opcua-server.yaml?alt=media)
{% endopenapi %}

{% openapi src="/files/a9718340faace7402aaf905281c791254fa8fddb" path="/config/folders" method="get" %}
[edge-opcua-server.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-21a215712d389ded373872b7a4e970e80be2c5fa%2Fedge-opcua-server.yaml?alt=media)
{% endopenapi %}

### セッションと正常性

いったん `maxSessions` に達すると、それ以降のクライアントは `BadTooManySessions`で拒否されるため、 `sessionCount` と `maxSessions` を比較して余裕を確認します。

1 つの `200` からの `/subscriptions` セッション一覧が空で、 `maxSessions` が省略されている場合は、OPC UA サーバーが起動していないことを意味します。ウォームアップではなく停止として扱ってください。エンドポイントが何らかの応答を返すなら、起動はすでに完了しているか失敗しています。次で確認してください `/health`、これが返す `status: "unhealthy"` および `opcuaServer: "stopped"`.

`maxSessions` この場合はゼロ化されず省略されます。そうすることで、 `maxSessions - sessionCount` を計算する利用者が、未知の上限を満杯として読み違えないようにします。

{% openapi src="/files/a9718340faace7402aaf905281c791254fa8fddb" path="/subscriptions" method="get" %}
[edge-opcua-server.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-21a215712d389ded373872b7a4e970e80be2c5fa%2Fedge-opcua-server.yaml?alt=media)
{% endopenapi %}

{% hint style="info" %}
`/subscriptions` が仕様にない場合、そのデバイスは次で提供します `/api/openapi.json`。このルートは常に有効であり、ここでドキュメント化されています。
{% endhint %}

`/health` を返します `200` OPC UA サーバーが起動しているかどうかにかかわらず。確認するのは `status` および `opcuaServer` ではなくステータスコードです。

{% openapi src="/files/a9718340faace7402aaf905281c791254fa8fddb" path="/health" method="get" %}
[edge-opcua-server.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-21a215712d389ded373872b7a4e970e80be2c5fa%2Fedge-opcua-server.yaml?alt=media)
{% endopenapi %}

## CLI

この `opcua-cli` ツールは、Web UI に到達できないときに、デバッグ、スクリプト、簡単なタグ操作のためのターミナルアクセスをサーバーに提供します。

```bash
docker exec -it opcua-server opcua-cli
```

```bash
docker exec opcua-server opcua-cli <command>
```

<table data-search="false"><thead><tr><th>コマンド</th><th>説明</th></tr></thead><tbody><tr><td><code>list</code>, <code>ls</code></td><td>現在値付きで全タグを一覧表示</td></tr><tr><td><code>read &#x3C;tag></code></td><td>特定のタグ値を読み取る</td></tr><tr><td><code>write &#x3C;tag> &#x3C;value></code></td><td>タグに値を書き込む</td></tr><tr><td><code>status</code></td><td>サーバーの正常性と稼働時間を表示</td></tr><tr><td><code>clients</code></td><td>接続中の OPC UA クライアントを一覧表示</td></tr><tr><td><code>clients --detailed</code></td><td>サブスクリプション詳細付きでクライアントを一覧表示</td></tr><tr><td><code>export</code></td><td>構成を JSON としてエクスポート</td></tr></tbody></table>

```bash
docker exec opcua-server opcua-cli read Temperature
docker exec opcua-server opcua-cli write Temperature 25.5
docker exec opcua-server opcua-cli clients --detailed
```

## ロギング

設定 `LOG_LEVEL` をサービス側で設定して、詳細度を制御します。 [デバイス構成を更新](/deployment/ja/serufuhosuto/enterprise/deployment-manager/making-changes/update-device-configuration.md) サービスの環境変数をどこで編集するかは [デバイスログを表示](/deployment/ja/serufuhosuto/enterprise/deployment-manager/monitoring/view-device-logs.md) を参照して出力を読み取ってください。

<table data-search="false"><thead><tr><th>レベル</th><th>説明</th></tr></thead><tbody><tr><td><code>DEBUG</code></td><td>詳細な診断情報</td></tr><tr><td><code>INFO</code></td><td>一般的な運用メッセージ（デフォルト）</td></tr><tr><td><code>WARN</code></td><td>動作を停止しない潜在的な問題</td></tr><tr><td><code>ERROR</code></td><td>機能に影響するエラー</td></tr></tbody></table>

値は大文字小文字を区別せず、認識されない値はフォールバックします `INFO`.
