> 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/plc-relay.md).

# PLC リレー

PLC Relay は、PLC タグの読み書き用の HTTP API を提供するエッジコンテナサービスです。Deployment Manager UI でプロトコルを選択し、接続情報を入力し、タグを定義することで設定します。

{% hint style="info" %}
PLC Relay は Enterprise 顧客向けにのみ利用できます。 [Roboflow の営業チームにお問い合わせください](https://roboflow.com/sales) 詳細をご覧ください。
{% endhint %}

## サポートされているプロトコル

PLC Relay サービスを追加または編集するときは、3 つのプロトコルのいずれかを選択します。各プロトコルには独自の接続設定とタグ形式があります。

<table data-header-hidden data-search="false"><thead><tr><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>プロトコル</td><td><code>PLC_DRIVER</code></td><td>PLC</td><td>デフォルトポート</td></tr><tr><td>Allen-Bradley（EtherNet/IP）</td><td><code>allen_bradley</code></td><td>CompactLogix、ControlLogix、Micro800</td><td>44818</td></tr><tr><td>Modbus TCP</td><td><code>modbus</code></td><td>任意の Modbus TCP デバイス</td><td>502</td></tr><tr><td>Siemens S7</td><td><code>siemens_s7</code></td><td>S7-300、S7-400、S7-1200、S7-1500</td><td>102</td></tr></tbody></table>

{% hint style="warning" %}
プロトコルを切り替えると、タグのアドレス形式はプロトコル間で互換性がないため、設定済みのすべてのタグが消去されます。変更を適用する前に UI で確認を求められます。
{% endhint %}

## 接続設定

### PLC アドレス

アドレス形式は選択したプロトコルによって異なります：

* **Allen-Bradley：** IP またはホスト名。必要に応じてその後に `/slot` （例： `192.168.1.100/0`）または完全な CIP ルーティングパスを付けます。
* **Modbus TCP：** IP またはホスト名。必要に応じて `:port` （例： `192.168.1.100:502`を付けます。さらに、32 ビット値には Unit ID（0-255）と Word Order（big または little）が必要です。
* **Siemens S7：** IP またはホスト名。必要に応じて `:port` （例： `192.168.1.100:102`を付けます。さらに、Rack（0-7）と Slot（0-31）が必要です。

### シミュレーションモード

有効にすると、PLC Relay は実際の PLC に接続する代わりにメモリ内シミュレーターを使用します。すべての API 操作は通常どおり動作しますが、値はメモリに保存されます。これはハードウェアなしでのテストに便利です。

## タグ設定

タグは、API 経由でアクセス可能な PLC データポイントを定義します。各タグには名前、データ型、書き込み可否フラグ、および任意の説明があります。

### データ型

| 型      | 説明           | 範囲                             |
| ------ | ------------ | ------------------------------ |
| `BOOL` | 真偽値          | `真` / `偽`                      |
| `INT`  | 16 ビット符号付き整数 | -32,768 〜 32,767               |
| `DINT` | 32 ビット符号付き整数 | -2,147,483,648 〜 2,147,483,647 |
| `REAL` | 32 ビット浮動小数点数 | IEEE 754                       |

### タグ名の形式

{% tabs %}
{% tab title="Allen-Bradley" %}
タグ名は PLC プログラムと一致し、大文字小文字を区別します。

| スタイル         | 例                             |
| ------------ | ----------------------------- |
| 単純           | `TagName`                     |
| プログラムスコープ    | `Program:MainProgram.TagName` |
| 配列要素         | `TagName[0]`                  |
| UDT メンバー     | `MyUDT.Member`                |
| {% endtab %} |                               |

{% tab title="Modbus TCP" %}
形式： `{area}:{address}` ここで address は 0 以上の整数です。

| 領域           | 種類            | アクセス   | 例             |
| ------------ | ------------- | ------ | ------------- |
| `coil`       | BOOL          | 書き込み可  | `coil:0`      |
| `discrete`   | BOOL          | 読み取り専用 | `discrete:5`  |
| `holding`    | INT、DINT、REAL | 書き込み可  | `holding:100` |
| `input`      | INT、DINT、REAL | 読み取り専用 | `input:200`   |
| {% endtab %} |               |        |               |

{% tab title="Siemens S7" %}
データブロック形式： `DB{n}.DB[XWD]{byte}[.{bit}]`

領域形式： `[MIQEA][WD]?{byte}[.{bit}]`

| アドレス            | 型                   | 説明                         |
| --------------- | ------------------- | -------------------------- |
| `DB1.DBX0.0`    | BOOL                | データブロック 1 の byte 0 の bit 0 |
| `DB1.DBW0`      | INT                 | DB1 の 16 ビットワード            |
| `DB1.DBD0`      | DINT または REAL       | DB1 の 32 ビットダブルワード         |
| `M0.0`          | BOOL                | マーカー bit                   |
| `I0.0` / `Q0.0` | BOOL                | プロセス入出力 bit                |
| `MW0` / `MD0`   | INT / DINT または REAL | マーカー ワード / ダブルワード          |

S7-1200/1500 では、TIA Portal で PUT/GET を有効にし、アクセス対象の DB で最適化ブロックアクセスを無効にします。
{% endtab %}
{% endtabs %}

## Web ダッシュボード

PLC Relay には、タグ値をリアルタイムで監視するための組み込み Web ダッシュボードがあります。サービスが起動したら、次の URL でアクセスしてください： `http://<device-ip>:8007`.

ダッシュボードには、次の場所に対話式 Swagger ドキュメントもあります： `/docs` および、次の場所にビジュアル設定ビルダーがあります： `/static/config-builder.html`.

## HTTP API

この API は、HTTP 経由で設定済みのタグを読み書きするため、パイプラインは Allen-Bradley EtherNet/IP、Modbus TCP、Siemens S7 を直接扱わずに PLC データを交換できます。ベース URL は `http://<device-ip>:8007`で、API には認証がありません。See [Services](/deployment/ja/serufuhosuto/enterprise/deployment-manager/services.md#using-the-apis) は、デバイス上のすべてのサービス API に共通するルールを参照してください。

タグは `PLC_TAGS` サービスの環境変数から取得され、API 経由で作成または変更することはできません。書き込めるのは値だけで、かつ書き込み可能として設定されたタグに対してのみです。

### ステータスコードを信じる前に読む

サービスには届いたが PLC で失敗したリクエストは `200`を返します。本文を確認してください：

* `/read` は `value: null` を `error` が入った状態で返します。
* `/write` は `success: false` を `error` が入った状態で返します。
* `/healthz` は `plc_connected: false`.

本来の `4xx` レスポンスはリクエスト自体が誤っていたことを意味します： `404` 未設定のタグに対して、 `403` 読み取り専用に設定されたタグに対して、 `400` 空のバッチ、または書き込みバッチ内の重複タグ名に対して、 `422` 検証に失敗した本文またはクエリパラメータに対して。

### ヘルスと検証

`/healthz` は、アクティブなドライバと、リレーが `ライブ` または `シミュレーション` モードにあるかどうか、そして最新のタグ検証サマリーも報告します。検証では、各設定済みタグを PLC と照合し、次のいずれかとして報告します： `正常`, `見つからない`, `型不一致`、または `未検証`.

{% openapi src="/files/0977fd8d8498b28433b91a8247a7204cf6055ab3" path="/healthz" method="get" %}
[edge-plc-relay.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-bc81a2258bd5eefa9b64b301eac0797c0f01e796%2Fedge-plc-relay.yaml?alt=media)
{% endopenapi %}

PLC プログラムの変更または再接続の後に、検証を再実行してください：

{% openapi src="/files/0977fd8d8498b28433b91a8247a7204cf6055ab3" path="/validate" method="post" %}
[edge-plc-relay.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-bc81a2258bd5eefa9b64b301eac0797c0f01e796%2Fedge-plc-relay.yaml?alt=media)
{% endopenapi %}

### タグ定義

タグ名は、で説明されているアクティブなドライバの形式の PLC アドレスです [タグ名の形式](#tag-name-formats).

{% openapi src="/files/0977fd8d8498b28433b91a8247a7204cf6055ab3" path="/schema" method="get" %}
[edge-plc-relay.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-bc81a2258bd5eefa9b64b301eac0797c0f01e796%2Fedge-plc-relay.yaml?alt=media)
{% endopenapi %}

### 値の読み書き

```bash
curl "http://<device-ip>:8007/read?tag=Station1.CycleCount"

curl -X POST http://<device-ip>:8007/write \\
  -H "Content-Type: application/json" \\
  -d '{"name": "Station1.CycleCount", "value": 42}'
```

{% openapi src="/files/0977fd8d8498b28433b91a8247a7204cf6055ab3" path="/all\_tags" method="get" %}
[edge-plc-relay.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-bc81a2258bd5eefa9b64b301eac0797c0f01e796%2Fedge-plc-relay.yaml?alt=media)
{% endopenapi %}

{% openapi src="/files/0977fd8d8498b28433b91a8247a7204cf6055ab3" path="/read" method="get" %}
[edge-plc-relay.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-bc81a2258bd5eefa9b64b301eac0797c0f01e796%2Fedge-plc-relay.yaml?alt=media)
{% endopenapi %}

{% openapi src="/files/0977fd8d8498b28433b91a8247a7204cf6055ab3" path="/write" method="post" %}
[edge-plc-relay.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-bc81a2258bd5eefa9b64b301eac0797c0f01e796%2Fedge-plc-relay.yaml?alt=media)
{% endopenapi %}

### バッチ操作

どちらのバッチエンドポイントも、何かが実行される前に単位として検証されるため、未知のタグがあると部分結果を返すのではなくリクエスト全体が拒否されます。

`/write_batch` また、同じタグ名が 2 回指定されたバッチも拒否されます。重複した名前で最後の値だけを保持すると、前の書き込みが黙って失われてしまうためです。 `/read_batch` 重複を受け付け、送信順に各エントリごとに 1 つの結果を返します。

検証後に発生した PLC の失敗は、各エントリごとに `write_batch`の `結果`に `success_count` と `error_count` を含めてバッチ全体を要約します。

```bash
curl -X POST http://<device-ip>:8007/read_batch \\
  -H "Content-Type: application/json" \\
  -d '{"tags": ["Station1.PartPresent", "Station1.CycleCount"]}'
```

{% openapi src="/files/0977fd8d8498b28433b91a8247a7204cf6055ab3" path="/read\_batch" method="post" %}
[edge-plc-relay.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-bc81a2258bd5eefa9b64b301eac0797c0f01e796%2Fedge-plc-relay.yaml?alt=media)
{% endopenapi %}

{% openapi src="/files/0977fd8d8498b28433b91a8247a7204cf6055ab3" path="/write\_batch" method="post" %}
[edge-plc-relay.yaml](https://970637113-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoksNmwps1HmYr8TqHDnX%2Fuploads%2Fgit-blob-bc81a2258bd5eefa9b64b301eac0797c0f01e796%2Fedge-plc-relay.yaml?alt=media)
{% endopenapi %}

## CLI

この `plc-cli` ツールは、タグの読み書き用の対話型端末インターフェースを提供します。Web ダッシュボードにアクセスできないときのデバッグや簡単な操作に使用してください。これは、ダッシュボードが使うのと同じ HTTP API に対してコンテナ内で動作するローカルクライアントです。

```bash
docker exec -it plc-relay plc-cli
```

<table data-search="false"><thead><tr><th>キー</th><th>操作</th></tr></thead><tbody><tr><td><code>R</code></td><td>すべてのタグ値を読み取る</td></tr><tr><td><code>T</code></td><td>一覧から選択した単一タグを読み取る</td></tr><tr><td><code>W</code></td><td>書き込み可能なタグから選択したタグを書き込む</td></tr><tr><td><code>S</code></td><td>タグスキーマを表示する</td></tr><tr><td><code>H</code></td><td>詳細なヘルス状態を表示する</td></tr><tr><td><code>V</code></td><td>PLC に対してタグ検証を実行する</td></tr><tr><td><code>Enter</code></td><td>表示を更新する</td></tr><tr><td><code>Q</code></td><td>終了</td></tr></tbody></table>

## 環境変数

Configure モーダルがこれらを自動で書き込みます。手動で管理されたデプロイメントの場合のみ、直接編集してください。参照： [デバイス設定を更新](/deployment/ja/serufuhosuto/enterprise/deployment-manager/making-changes/update-device-configuration.md).

<table data-search="false"><thead><tr><th>変数</th><th>デフォルト</th><th>説明</th></tr></thead><tbody><tr><td><code>PLC_DRIVER</code></td><td>なし</td><td><code>allen_bradley</code>, <code>modbus</code>、または <code>siemens_s7</code></td></tr><tr><td><code>PLC_IP</code></td><td>なし</td><td>選択したドライバの形式の PLC アドレス</td></tr><tr><td><code>PLC_TAGS</code></td><td>なし</td><td>JSON 形式のタグ定義。次の場所にある config builder が <code>/static/config-builder.html</code> これを生成します</td></tr><tr><td><code>SIMULATION_MODE</code></td><td>オフ</td><td>実際の PLC の代わりにメモリ内シミュレーターを使用する</td></tr><tr><td><code>LOG_LEVEL</code></td><td><code>INFO</code></td><td>ログ詳細度： <code>DEBUG</code>, <code>INFO</code>, <code>WARNING</code>、または <code>ERROR</code></td></tr></tbody></table>

ドライバ固有の設定：

<table data-search="false"><thead><tr><th>ドライバ</th><th>変数</th><th>範囲</th><th>デフォルト</th></tr></thead><tbody><tr><td>Modbus</td><td><code>MODBUS_UNIT_ID</code></td><td>0 〜 255</td><td><code>1</code></td></tr><tr><td>Modbus</td><td><code>MODBUS_WORD_ORDER</code></td><td><code>big</code> または <code>little</code></td><td><code>big</code></td></tr><tr><td>Siemens S7</td><td><code>S7_RACK</code></td><td>0 〜 7</td><td><code>0</code></td></tr><tr><td>Siemens S7</td><td><code>S7_SLOT</code></td><td>0 〜 31</td><td><code>1</code></td></tr></tbody></table>

## 接続監視

デバイスページには、現在の接続状態、アクティブなプロトコル、最新のタグ値を表示するライブ PLC Relay ステータスカードがあります。リレーが PLC に到達できない場合、カードには到達不可のバナーが表示されます。

リレーが接続を失ったときに通知を受け取るには、デバイスの「Device Alerts」タブから「PLC Disconnected」アラートを追加してください。参照： [デバイスアラートを設定](/deployment/ja/serufuhosuto/enterprise/deployment-manager/setting-up/set-up-device-alerts.md).

## トラブルシューティング

| 症状                                 | 対処                                                                                  |
| ---------------------------------- | ----------------------------------------------------------------------------------- |
| "PLC not connected"（Allen-Bradley） | PLC アドレス形式（IP/Slot）を確認し、ポート 44818 に到達できることを確認する                                     |
| "PLC not connected"（Modbus）        | IP/ポート（デフォルト 502）を確認し、Unit ID がデバイスと一致することを確認する                                     |
| "PLC not connected"（Siemens S7）    | IP/ポート（デフォルト 102）、rack、slot の値を確認する。S7-1200/1500 では PUT/GET を有効にし、最適化ブロックアクセスを無効にする |
| "Function refused"（Siemens S7）     | TIA Portal で PUT/GET が無効、または対象 DB で最適化ブロックアクセスが有効                                   |
| REAL 値の読み取りが文字化けする（Modbus）         | 逆の Word Order（big と little）を試す                                                      |
| 検証結果が NOT\_FOUND を示す               | 正確なタグ名を PLC プログラムで確認する（大文字小文字を区別）                                                   |
