# Rockwell EtherNet/IP

> EtherNet/IP で Allen-Bradley のコントローラーにつなぎます。ControlLogix、CompactLogix、PLC-5、SLC 500、MicroLogix、Micro800 と、そのタグのアドレス、データ型、ネットワークの機器検出。

**Rockwell EtherNet/IP** のドライバーは、EtherNet/IP で Allen-Bradley / Rockwell のコントローラーと話します。ControlLogix と CompactLogix のコントローラーは Logix のプロジェクトで宣言されたコントローラータグの名前で、Micro800 はグローバル変数の名前で、PLC-5、SLC 500、MicroLogix はデータファイルアドレスで値を指します。レジスターの割り付けは関係ありません。[Connector](connector) の Rockwell EtherNet/IP のドライバーの下に機器を追加し、その**コントローラーファミリー**を選んでください。パネルは、そのファミリーが使う項目だけを見せます。

## コントローラーファミリー {#controller-families}

機器の**コントローラーファミリー**が、コントローラーへの届き方と、そのタグのアドレスの書き方を決めます。

| コントローラーファミリー | コントローラー | タグのアドレス | スロット |
| --- | --- | --- | --- |
| **ControlLogix / CompactLogix** | ControlLogix、CompactLogix | **コントローラータグ**、タグの名前 | あり |
| **PLC-5** | イーサネットのポートを持つ PLC-5（PLC-5/20E、/40E、/80E） | **データファイルアドレス**、たとえば `N7:0` | なし |
| **SLC 500** | SLC 5/05 | **データファイルアドレス** | なし |
| **MicroLogix** | MicroLogix 1100 と 1400、ほかは 1761-NET-ENI 経由 | **データファイルアドレス** | なし |
| **Micro800** | Micro820、Micro850、Micro870 | **コントローラータグ**、グローバル変数の名前 | なし |

既定は ControlLogix / CompactLogix で、この項目ができる前に作られた機器もこれにあたるため、これまでとまったく同じように読みます。バックプレーンを通ってスロットで届くのは ControlLogix と CompactLogix のコントローラーだけです。ほかのファミリーは自分のイーサネットのポートで答えるので、その機器には**スロット**の項目がありません。機器検出はコントローラーの身元からファミリーを読み取るので、見つかったコントローラーはファミリーが選ばれた状態で届きます。

## 接続 {#connection}

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **ホスト** | コントローラーのイーサネットのポートの IP アドレスかホスト名。 | 空 |
| **コントローラーファミリー** | コントローラーが属するファミリーです。下の項目と、タグのアドレスの書き方を決めます。 | ControlLogix / CompactLogix |
| **スロット** | ControlLogix / CompactLogix のみ。コントローラーが挿さっているシャーシの位置で、0 から数えます。 | 0 |
| **読み出し周期（ms）** | 上書きしないタグに対する、機器全体の読み取りの周期。 | 1,000 |

ポートの項目はありません。EtherNet/IP は標準の TCP ポート 44818 を使います。CIP の経路はバックプレーンと**スロット**なので、シャーシのどこに挿さっているコントローラーにも届きます。検出されたコントローラーはスロット 0 から始まるので、この項目で直します。ラックの項目はありません。CIP の経路はラック番号を運ばないからです。要求は 10 秒でタイムアウトします。機器の見出しは、組み立てられた接続先を見せます。たとえば `eip://192.168.0.10:0` で、アドレスのあとの数字がスロットです。

ほかのファミリーのコントローラーはスロットを持たず、見出しは代わりにファミリーを示します。たとえば `eip://192.168.0.20?family=slc500` です。

各タグは自分の**読み出し周期（ms）**を持てます。タグの値が 0 のときは、機器の周期に戻ります。

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

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

| 項目 | 意味 | 受け付ける値 | 既定 |
| --- | --- | --- | --- |
| **コントローラータグ** | コントローラーで宣言されているとおりのタグの名前。必須です。 | 自由記述 | 空 |
| **タグ内のオフセット（バイト単位。BOOL はビット単位）** | そのタグのデータの中で値がある位置です。バイトの位置、ブール値のタグではビットの位置になります。 | 0～255 | 0 |

このドライバーは、名指しされたコントローラータグを開き、そのデータの中の指定した位置から値を取り出します。単純な基本型のタグでは、オフセットは 0 のままです。オフセットがあるから、1 つのコントローラータグが複数のチャネルを受け持てます。構造体の先頭の DINT はオフセット 0、その 4 バイト後の REAL はオフセット 4 で、ブール値のタグではオフセットがバイトではなくビットを数えます。

| 読みたいもの | コントローラータグ | オフセット | データ型 |
| --- | --- | --- | --- |
| コントローラー範囲の DINT `Counter` | `Counter` | 0 | Int32 |
| `Main` の中のプログラム範囲の DINT | `Program:Main.Counter` | 0 | Int32 |
| REAL の配列の要素 `Temps[2]` | `Temps[2]` | 0 | Float |
| BOOL の配列の要素 `Flags[5]` | `Flags[5]` | 0 | Boolean |
| 構造体 `Recipe` の中の 2 つ目の DINT | `Recipe` | 4 | Int32 |
| `Flags` のデータのビット 3 | `Flags` | 3 | Boolean |

BOOL の配列では、添字はコントローラーの 32 ビットのワードではなく BOOL を指します。`Flags[5]` は番号 5 の BOOL で、ビットのオフセットは指定した BOOL から数えるので、`Flags[5]` にオフセット 2 なら番号 7 の BOOL です。

名前はピリオドも含めて丸ごとコントローラーに届き、同じタグの読み取りと書き込みは同じ場所に届きます。だから `Program:Main.Counter` のようなプログラム範囲の名前が働きます。ピリオドでつないだメンバーの経路（`MyUdt.Member`）は、コントローラーがそのメンバーを名前で公開している場合に、コントローラーが解決します。公開していない場合は、コントローラー範囲の元のタグを名指しして、バイトのオフセットでその中に届いてください。こちらは必ず働きます。「信号源」のカードの読み取り専用の**取得元のアドレス（バス上）**の行が、編集しているそばから組み立てられたアドレスを見せます。

Micro800 も同じように、`Level` のようなグローバル変数の名前でアドレスを取ります。名指しするプログラム範囲のタグはありません。

### データファイルアドレス {#data-file-addresses}

PLC-5、SLC 500、MicroLogix のタグは、**データファイルアドレス**という 1 つの項目でアドレスを取ります。ファイルの文字と番号、コロン、要素の順に書き、そのあとにピリオドに続けてメンバーを、またはスラッシュに続けてビットを付けます。オフセットの項目はありません。アドレスが要素、メンバー、ビットを自分で示すからです。この項目は、ドライバーが読めないアドレスを入力のそばから拒否し、その理由を示します。

| ファイル | 例 | 読むもの | データ型 |
| --- | --- | --- | --- |
| 整数（N） | `N7:0`、`N7:0/15` | 16 ビットのワード、またはそのビットの 1 つ | Int16 か UInt16。ビットなら Boolean |
| ビット（B） | `B3:0`、`B3:0/2` | 16 ビットのワード、またはそのビットの 1 つ | Int16 か UInt16。ビットなら Boolean |
| 浮動小数点（F） | `F8:1` | 32 ビットの浮動小数点の値 | Float |
| 倍長整数（L） | `L9:0` | 32 ビットの整数 | Int32 か UInt32 |
| タイマー（T） | `T4:0.ACC`、`T4:0.PRE`、`T4:0.DN` | ACC か PRE、またはビットの EN、TT、DN | Int16 か UInt16。ビットなら Boolean |
| カウンター（C） | `C5:0.ACC`、`C5:0.PRE`、`C5:0.DN` | ACC か PRE、またはビットの CU、CD、DN、OV、UN | Int16 か UInt16。ビットなら Boolean |
| コントロール（R） | `R6:0.LEN`、`R6:0.POS` | LEN か POS | Int16 か UInt16 |
| ステータス（S） | `S:1`、`S:1/15` | ステータスファイルのワード、またはそのビットの 1 つ | Int16 か UInt16。ビットなら Boolean |
| 入力（I）、出力（O） | `I:0`、`I:0/1`、`O:0/1` | 入力または出力のイメージのワード、またはそのビットの 1 つ | Int16 か UInt16。ビットなら Boolean |

選べる**データ型**はファイルに従います。タグの型を持たないファイルのアドレスを入力すると、型はそのファイルの型に変わります。ステータス、入力、出力のファイルは、プログラミングソフトウェアが書くように番号を省いて書けます。ドライバーはそれを `S2:1`、`I1:0/1`、`O0:0/1` として送り、**取得元のアドレス（バス上）**の行がそれを見せます。入力や出力のアドレスでは、要素はイメージの中のワードの位置です。MicroLogix の内蔵入力は `I:0/0` から始まります。タイマー、カウンター、コントロールの要素は、そのメンバーのどれかを通して読み、丸ごとは読みません。文字列、ASCII、BCD、メッセージ、PID のファイルは読みません。PLC-5 は入出力を 8 進数で番号付けしますが、ドライバーはこの番号付けを読まないため、その I と O のファイルは拒否されます。そうした値は、プログラムがコピーするデータファイルを通して読んでください。ファイルがあるかどうかは読んで初めて分かります。コントローラーが持っていないファイル（N9 のない `N9:0`）は、そのタグの最初の読み取りからエラーとして読まれ、機器のほかのタグは読み続けます。

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

CIP の基本型は、すべてタグの**データ型**として使えます。

| データ型 | CIP の型 | 大きさ |
| --- | --- | --- |
| Boolean | BOOL | ビットの位置での 1 ビット |
| SByte | SINT | 1 バイト |
| Byte | USINT | 1 バイト |
| Int16 | INT | 2 バイト |
| UInt16 | UINT | 2 バイト |
| Int32 | DINT | 4 バイト |
| UInt32 | UDINT | 4 バイト |
| Int64 | LINT | 8 バイト |
| UInt64 | ULINT | 8 バイト |
| Float | REAL | 4 バイト |
| Double | LREAL | 8 バイト |

構造体と UDT には対応しません。読み書きできるのは上の基本型だけで、その中のメンバーに届くためにバイトのオフセットがあります。文字列が選択肢にないのは意図したものです。Logix の STRING は基本型ではなく、長さと 82 バイトの配列でできた構造体であり、このドライバーは読むことも書くこともできません。バス上のバイト順は CIP 自身のリトルエンディアンで、自動的に扱われます。バイト順の選択肢はありません。

PLC-5、SLC 500、MicroLogix では、型は代わりにデータファイルに従います。上のデータファイルアドレスの表のとおりです。

## 書き込み {#writes}

**アクセス**が読み書きか書き込みのみのタグは書き込めます。書き込みは頼まれた値だけを送り、その隣にあるものは何も送りません。そのため、同じ瞬間にコントローラーで変わったビットやメンバーが、少し前の値に戻されることはありません。

| タグが指すもの | 書き込みが送るもの |
| --- | --- |
| 基本型のタグ全体（オフセット 0 で、タグ自体の大きさ）、または BOOL のタグ | その値を、そのタグへ |
| 整数のタグのビット（`Flags`、オフセット 3、Boolean） | そのビットだけを `Flags.3` として。コントローラーはその場でビットを変え、ほかのビットはそのままにします |
| BOOL の配列の要素（`Flags[5]`、Boolean） | その BOOL だけを、配列の最初のワードのビット 5（`Flags[0].5`）として。コントローラーはその場で変え、ワードのほかの BOOL はそのままにします |
| 構造体の中の値（`Recipe`、オフセット 4） | そのメンバーだけを名前で（`Recipe.Speed`）。名前はコントローラーが公開する構造体の定義から見つけます |

タグの残りの部分まで書き戻さなければできない書き込みは拒否され、その理由にはアドレスが示されます。基本型のタグの一部（DINT のオフセット 2 にある Int16）、REAL のビット、構造体のどのメンバーも値の大きさでそのオフセットから始まっていない場合がそれにあたります。その場合は、値をそれ自体の名前で指定してください。たとえば `Recipe.Speed` をオフセット 0 で指定します。ドライバーは、タグの書き込みがどこに届くかを最初の書き込みのときに調べ、機器がつながっている間はそれを覚えておきます。新しいタグは読み取りのみから始まります。

データファイルアドレスは、名前のとおりに書き込みます。ワード、浮動小数点の値、メンバーは丸ごと書き、ビット（`B3:0/2`、`T4:0.DN`）はそれだけを書きます。コントローラーはそのビットをその場で変え、ワードのほかのビットはそのままにします。

## 機器検出 {#discovery}

Connector の機器検出のボタンは、**このコンピューターがつながっているすべてのネットワーク**に CIP の List Identity の要求を同報し、新しい答えのないまま 10 秒たつまで聞き続けます。動いているあいだ、スキャンはそのネットワークを名指しするので、結果が 0 でも、問いが実際にどこへ行ったのかが分かります。仮想機械、WSL、VPN の仮想アダプターを持つステーションは、操作する人が思っているよりネットワークが多いことがよくあり、候補がそのうちの 1 つから届くこともあります。

要求を運べないインターフェースは飛ばされます。上がっていないもの、ループバックとトンネルのアダプター、そして DHCP に誰も答えなかったためにインターフェースが自分で付けたアドレス（169.254.x.x）です。候補の機器になるのは、コントローラー自身の身元の答えである応答だけで、`eip://` にそのアドレスをつないだ名前が付きます。EtherNet/IP のポートで答えるほかのものは無視され、そのことが診断ログに残ります。Omron のコントローラーも同じ要求に答えますが、これも外され、診断ログに専用の行が残ります。NJ、NX、NY のコントローラーは、代わりに [Omron](driver-omron#discovery) のドライバーのスキャンが出します。続けてスキャンは、候補ごとにコントローラー範囲のタグの一覧を読み、その基本型のタグを候補のチャネルとして、いずれもオフセット 0 で出します。基本型の配列は、その型で最初の要素として出します（`Temps[0]`、2 次元なら `Grid[0,0]`）。BOOL の配列は、最初の BOOL の Boolean として出します（`Flags[0]`）。

機器検出は、このドライバーが読み出せないものを捨てます。構造体と UDT のタグ（Logix の STRING を含みます）は落とされ、`Program:`、`Task:`、`Map:` の項目は飛ばされます。このコンピューターがつながっていないネットワーク上のコントローラーは、同報に答えません。手で追加してください。ほかの型のタグ（システム型など）も出さず、そのことが診断ログに残ります。

コントローラーが答える身元にはカタログ番号が入っていて、それがファミリーを示します。PLC-5、SLC 500、MicroLogix、Micro800 は、ファミリーが選ばれ、アドレスにもそれが示された状態で届きます（`eip://192.168.0.20?family=micrologix`）。PLC-5、SLC 500、MicroLogix はタグの一覧を公開しないので、候補のチャネルなしで届き、タグはデータファイルアドレスで入力します。Micro800 のタグの一覧は Logix と同じように読みます。

すでにある Logix または Micro800 のコントローラーは、自分のページからタグの一覧を読み直せます。「タグ」のカードの見出しにある**タグ検出**は、まだタグがないコントローラーのタグだけを、大文字と小文字を区別せずに名前で比べて出します。データファイルのコントローラーには読む一覧がなく、タグ検出は出ません（[機器のタグを検出する](connector-discovery#discovering-a-devices-tags)を参照）。

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

- コントローラーへの要求はどれも 10 秒でタイムアウトし、機器検出の待ち受けは無音が 10 秒続くと閉じます。
- ドライバーはコントローラーのタグを一度だけ開き、機器がつながっているあいだは開いたままにします。ですから何十ものタグを持つコントローラーは、すでに開いてあるセッションの上で読まれ、読み取りのたびに開いては閉じることはありません。失敗した読み取りは自分のタグを手放し、次の読み取りが名前でもう一度開きます。
- Logix のプロジェクトでタグの名前を変えると、そのチャネルは黙って壊れます。そのタグは、設定した名前がふたたび一致するまで品質が悪いものとして読まれます。
