# Beckhoff ADS

> ADS/AMS で Beckhoff TwinCAT の PLC につなぎます。AMS の経路、ランタイムのポート、シンボルのパス、読み取り長。

**Beckhoff ADS** のドライバーは、AMS の経路に載る TwinCAT の自動化のプロトコル、ADS で Beckhoff TwinCAT の PLC と話します。値は PLC のプログラムの中のシンボルのパスで指すので、入力するものは TwinCAT のプロジェクトが宣言しているそのままです。[Connector](connector) の Beckhoff ADS のドライバーの下に機器を追加してください。パネルは、このプロトコルが使う項目だけを見せます。

## 接続 {#connection}

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **ホスト** | PLC の IP アドレス。その AMS ネット ID は、このアドレスから `{ip}.1.1` として導かれます。 **PLC の AMS ネット ID** で指定しない限り、PLC の AMS ネット ID はこのアドレスに `.1.1` を続けたものです。名前で書いたときは、先にその IPv4 アドレスに解決します。 | 空 |
| **ポート** | 相手のランタイムの AMS のポート。851 は TwinCAT 3 の PLC ランタイム 1 で、それ以降の TwinCAT 3 のランタイムは、そこから順に上がります（852、853、…）。欄が空のときは 851 が灰色で表示され、そのランタイムが使われます。0 で保存された機器も同じように表示されます。 | 851 |
| **ローカル IP（AMS）** | このステーション自身の IP アドレスで、そこから AMS ネット ID が `{ip}.1.1` として導かれます。PLC に設定した AMS の経路と一致している必要があります。欄が空のときは、PLC に届くネットワーク上でのこのステーションのアドレスを使い、それを灰色で表示します。欄に値を入力すると、そちらが使われます。 | 空 |
| **PLC の AMS ネット ID** | PLC 自身の AMS ネット ID。ID が IP アドレスに `.1.1` を続けたものではない PLC のためのものです。0 から 255 までの 6 つの数をドットで区切って書き、TwinCAT XAE の **SYSTEM > Routes** の **NetId Management** タブにある **Target NetId** と同じにします。欄が空のときはホストの IPv4 アドレスに `.1.1` を続けたものを使い、灰色で表示します。AMS ネット ID になっていない値のときは、機器は切断されたままで、何を書けばよいかを伝えます。 | 空 |
| **読み出し周期（ms）** | 上書きしないタグに対する、機器全体の読み取りの周期。 | 1,000 |

機器の見出しは、組み立てられた接続先を見せます。たとえば `ads://192.168.0.1:192.168.0.50:851`（ローカル IP、PLC の IP、AMS のポート）です。各タグは自分の**読み出し周期（ms）**を持てます。タグの値が 0 のときは、機器の周期に戻ります。

ADS は、PLC が AMS の経路を持っているステーションにしか答えません。どの経路をどこに追加するかは[PLC の準備](#prepare-the-plc)にあります。

## PLC の準備 {#prepare-the-plc}

TwinCAT の PLC は、AMS ルーターが経路を持っているステーションにだけ ADS で答えます。経路がないと、ルーターは TCP ポート 48898 で接続を受け入れたあと、それを閉じるか、まったく答えません。そのため、ネットワークの経路に問題がなくても接続は失敗します。このステーションへの静的な経路を、PLC に一度だけ追加してください。

| TwinCAT の Add Route ダイアログの項目 | 値 |
| --- | --- |
| 名前：**Route Name (Target)** | 任意の名前。お知らせはこのステーションのコンピューター名を提案します。 |
| ネット ID：**AmsNetId** | このステーションのアドレスに `.1.1` を続けたもので、ドライバーが**ローカル IP（AMS）**から導くものと一致します。 |
| トランスポート：**Transport Type** | トランスポート `TCP_IP` |
| アドレス：**Address Info** | このステーションのアドレス。**IP Address** を選びます。 |
| 経路の種類：**Target Route** と **Remote Route** | `Static` と `None` |

TwinCAT XAE でターゲットシステムとして PLC を選び、**SYSTEM > Routes** の **Static Routes** タブを開いて Add を押します。PLC 自身のデスクトップでは、通知領域の TwinCAT アイコンから **Router > Edit Routes** で同じ一覧が開きます。

アドレスは、PLC に届くネットワーク上でのこのステーションのアドレスです。ネットワークカードが何枚もあるコンピューターはカードごとにアドレスを持ち、経路はそこに書いたアドレスにしか効きません。**ローカル IP（AMS）**が空の間、ドライバーは Windows が PLC に届くときに通るカードのアドレスを使い、欄はそれを灰色で表示します。経路に書くのはそのアドレスです。欄に値を入力するとそちらが使われるので、経路にもその値を書きます。

PLC のルーターが経路がないためにステーションを断ると、機器のページはドライバーのエラーの代わりにお知らせでそれを伝えます。追加するばかりになった経路（その名前、このステーションの AMS ネット ID、そのアドレス、トランスポート。それぞれにコピーのボタンが付きます）と、TwinCAT でそれを追加する場所です。PLC が答えるとお知らせはひとりでに消え、ジャーナルとエージェントも同じ経路を読みます。接続を拒むポートや黙ったままのポートは、経路がないのではなく、そのとおりのこととして伝えられます。

ステーションは PLC を AMS ネット ID で呼び、PLC のルーターは自分の ID あての呼びかけにしか答えません。そのため、ステーションの使う ID と AMS ネット ID が違う PLC もまったく答えず、経路がないときとまったく同じに見えます。PLC に経路がすでにあるのに答えないときは、TwinCAT XAE の **SYSTEM > Routes** の **NetId Management** タブで **Target NetId** を確かめ、それを **PLC の AMS ネット ID** に入力してください。お知らせは、ステーションが使っている ID を示します。

## アドレス指定 {#addressing}

Beckhoff のタグは、タグの「信号源」のカードの 2 つの項目でアドレスを取ります。

| 項目 | 意味 | 受け付ける値 | 既定 |
| --- | --- | --- | --- |
| **シンボル** | PLC のプログラムの中の変数のシンボルのパス。必須です。 | 自由記述、たとえば `MAIN.fValue` | 空 |
| **読み取る長さ（バイト。空欄なら自動）** | 1 回の読み取りで運ぶバイト数。空欄ならデータ型から大きさを決めます。 | 1 以上、または空欄 | 空欄 |

シンボルのパスは、TwinCAT が見せているそのままです。プログラムの変数は `MAIN.fValue`、グローバル変数リストは `GVL.MachineSpeed` や `GVL_Settings.rSetpoint` のようになります。ドライバーは PLC 上でシンボルを名前から解決し、その生のバイトを読みます。自動の読み取り長は次のとおりです。

| データ型 | 自動の読み取り長 |
| --- | --- |
| Boolean | 1 バイト |
| Int32 | 4 バイト |
| Float | 4 バイト |
| String | 16 バイト |

16 文字より長い文字列では、宣言した大きさに届くよう**読み取り長**を設定してください（TwinCAT の `STRING(80)` には文字に 80 バイト必要です）。「信号源」のカードの読み取り専用の**取得元のアドレス（バス上）**の行が、編集しているそばから組み立てられたアドレスを見せます。

PLC が拒否した読み取り（PLC が持っていないシンボルや、読み取りを許していないシンボルの読み取りなど）では、タグは値のないままになり、タグの理由に ADS のエラーコードとその意味が出ます。たとえば `ADS error 0x710 (no symbol by that name)` です。接続はそのまま保たれ、ほかのタグは読み続けます。理由は、PLC が答えた次の読み取りで消えます。

## データ型 {#data-types}

**データ型**の選択肢には、このドライバーが扱う 4 つの型が出ます。

| データ型 | PLC 側の対応 | 備考 |
| --- | --- | --- |
| Boolean | BOOL | 1 バイト。0 でなければ true |
| Int32 | DINT | PLC に合わせたリトルエンディアン |
| Float | REAL | PLC に合わせたリトルエンディアン |
| String | STRING | 読み取りの中身の、最初の NUL までの文字 |

バイト順は PLC 自身のリトルエンディアンで、自動的に扱われます。バイト順の選択肢はありません。文字列の読み取りは、返ってきた中身を最初の NUL の終端まで解釈するので、短い文字列の後ろの詰め物が値に混じることはありません。ほかの TwinCAT の幅（INT、LREAL、WORD、…）は出ません。そういう変数をここで読むには、PLC のプログラムで上の 4 つの型のどれかとして公開してください。

## 書き込み {#writes}

**アクセス**が読み書きか書き込みのみのタグは書き込めます。書き込みは同じシンボルを解決し、その値のバイトを書きます。ブール値は 1 バイト、Int32 と Float は 4 バイトです。文字列の書き込みは、そのタグの**読み取り長**の全体を置きます。前に文字の UTF-8 のバイトを、その後ろに 0 を並べるので、長い文字列の上に短い文字列を書くと値が丸ごと置き換わり、古いものは何も残りません。宣言した長さに収まらない文字は、切り詰められるのではなく、長さを診断ログに残して拒否されます。新しいタグは読み取りのみから始まります。

PLC が拒否した書き込み（書き込みを許していないシンボルへの書き込みなど）は、ADS のエラーコードとその意味を付けて拒否として返ります。たとえば `ADS error 0x704 (the symbol may not be written)` です。接続はそのまま保たれます。

## 機器検出 {#discovery}

このドライバーの ADS には同報による機器検出がないので、Connector は機器検出のボタンを出しません。機器とそのシンボルは手で追加してください。

## 知っておくとよいこと {#good-to-know}

- 最初の接続が失敗する理由としていちばん多いのは AMS の経路です。PLC 側の経路の AMS ネット ID は、ステーションの IP に `.1.1` を続けたものでなければならず、機器のページが追加する経路をまるごと示します。
- ドライバーは接続ごとに各シンボルのハンドルを PLC に一度だけ求め、接続が閉じるときにハンドルを返します。PLC へのダウンロードのあと、PLC がもう受け付けないハンドルは次の読み取りで取り替えられるので、タグは新しいプログラムのもとで読み続けます。ダウンロードで名前が変わったり消えたりしたシンボルでは、名前がふたたび一致するまで、そのタグは `ADS error 0x710 (no symbol by that name)` を付けて値のないままになります。
- 届かない PLC があっても起動時の損はありません。機器は背後で再試行を続け、接続がつながるまでそのタグは品質が悪いものとして読まれます。
