Ethernet/IPについての第10話です。今回はLarge Forward Openについて話します。検証デバイスはCodesys(Scanner)とキーエンス(KV8000)になります。
さ、FAを楽しもう!

Reference Link
http://soup01.com/ja/?s=Ethernet%2FIP+%E8%A9%B1%E3%81%97%E3%82%88
Large Forward Open?
Connection Manager クラスは、I/O 接続および明示的メッセージング接続に関連する内部リソースを割り当て、管理します。Connection Manager クラスによって生成される具体的なインスタンスは、接続インスタンスまたは接続オブジェクトと呼ばれます。
→今回KV8000で構築したTagは1448 Byteなので、Large_Forward_Openを使用する必要があります。
サービスコード | 実装要否:Class | 実装要否:Instance | サービス名 | 説明 |
|---|---|---|---|---|
0x4E | 該当なし | 条件付き | Forward_Close | コネクションを切断する |
0x54 | 該当なし | 条件付き | Forward_Open | コネクションを確立する。最大データサイズ 511 byte |
0x5B | 該当なし | 任意 | Large_Forward_Open | コネクションを確立する。最大データサイズ 65,535 byte |
注意1 Large Forward Open本当の意味
Large Forward Openの Large は、Ethernetの1パケットを64 KBにするという意味ではなく、CIP Connectionとして指定できるConnection Sizeを大きくするという意味です。
構造上の大きな違いはここです。
Forward Openの場合:
O→T Network Connection Parameters : 16 bit
|
|---|
Large Forward Openの場合:
O→T Network Connection Parameters : 32 bit
|
|---|
Forward_Open および Large_Forward_Open には、2 組のネットワーク接続パラメータがあります。1 つは OT ネットワーク接続用、もう 1 つは TO ネットワーク接続用です。
Forward_Open 内の各ネットワーク接続パラメータセットは、次の図に示すフィールドを含む単一の 16 ビットワードとして提供する必要があります。もう一回Forward Openを見てみますと:
ビット | パラメータ | 意味 |
|---|---|---|
15 | Redundant Owner | 冗長オーナー |
14–13 | Connection Type | コネクションタイプ |
12–10 | Reserved | 予約領域 |
9 | Priority | 優先度 |
8 | Fixed / Variable | 固定長 / 可変長 |
7–0 | Connection Size (in bytes) | コネクションサイズ(バイト単位) |
Large_Forward_Open 内の各ネットワーク接続パラメータセットは、次の図に示すフィールドを含む単一の 32 ビットワードとして提供する必要があります。
ビット | パラメータ | 和訳 |
|---|---|---|
31 | Redundant Owner | 冗長オーナー |
30–29 | Connection Type | コネクションタイプ |
28 | Reserved | 予約領域 |
27–26 | Priority | 優先度 |
25 | Fixed / Variable | 固定長 / 可変長 |
24–16 | Reserved | 予約領域 |
15–0 | Connection Size (in bytes) | コネクションサイズ(バイト単位) |
注意2 Large Forward OpenはImplicit I/O専用ではない
Class 1 I/OでもClass 3 Connected Explicit Messagingでも使えます。ちなみに、「Large Forward Openなら必ず64 KB近く使える」わけではありません。 プロトコル上の表現能力とは別に、実際の最大のConnection SizeはScanner/Adapter側の実装・バッファ・製品仕様に制限されます。

Implementation
ここから検証プロジェクトを作成しましょう。

今回の記事で選定したEthernet/IP AdapterがKV8000であり、キーエンスの通信仕様からみると1444 Byteまで対応できるということなので。

Ethernet/IP ScannerをCodesysに選定するには、Codesys のCODESYS EtherNet/IP Scanner SLデータシートからLarge Forward Openが確認できたからです。

EDS File Download
下図のLinkからKV8000のEDS FILEをDownloadしてください。

KV Studio
最初にキーエンスのKV8000から構築します。

Ethernet/IP 設定
KV Studioを起動し、KV8000右クリックし→Ethernet/IP Settingクリックします。

KV-8000を選び→右クリックしTag Settingをクリックします。

Instance通信の場合
Instance通信の場合はTag Nameを適当に設定し、Instance IDのCheckboxを入れ、最後はInstance IDを入力すればOKです。また、InstanceのサイズはSize(word)から設定しましょう。

Tag通信の場合
次はTag通信の設定です。Tag Nameを入力し、Size(word)を最大724ワードにします。それを設定すればKV8000が自動的にLarge Forward Openに切り替わります。

Codesys
次はCodesys側を構築します。

EDSインポート
Tools→Device Repositoryをクリックします。

Installをクリックします。

先程DownloadしたEDS FILEをインストールしましょう。

Done!

Ethernet インタフェース追加
Deviceを右クリック→Add Deviceします。

Etherent Adapter→EthernetをクリックしEthernet インタフェースを追加します。

Ethernet/IP Scanner追加
次はEthernet インタフェースを右クリック→Add Deviceします。

Ethernet/IP Scannerを選び→Add Deviceします。

Add Ethernet Adapter
KV8000をEthernet/IP ネットワークに追加します。

IP設定
KV8000のIPアドレスを設定します。

Connection追加
次はConnection Tabを開き、Add Connectionをクリックします。

接続の追加画面が表示されます。

Tag通信接続追加
Tag通信を追加したい場合は、Predefined connectionをInput Only(Tag Type)を選択し、Symoblic nameをKV Stuidoに設定したTag名を入力し→サイズを1448 Bytesにします。

Done!Tag通信の接続が追加されました。

次は先程Tag通信の変数を追加するためにAssemblesをクリックします。

T–>OにあるAddボタンをクリックします。

Input Dataを選び→Nameに変数名を設定し、最後はCount欄を1448に設定すれば1448個のBYTE変数が宣言されます。

Done!

Ethernet/IP I/O Mappingにて先程の操作の結果を確認できます。

Instance接続変更
次は既存のInstance接続設定を変更しましょう。Input Only(ID type)を選び→Edit Connectionをクリックします。

ここでデータサイズなどを実際のKV8000接続設定に合わせましょう。

Instance接続追加
次はInstance接続を追加しましょう。下図のAdd connectonボタンをクリックします。

Predefined connectionをInput Only(ID Type)を選択し、データサイズを設定し→OKします。

最後はProduced Assembly IDを変更しましょう。先程追加したInstance接続を選び→Configuration DataにあるProduced Assembly IDをKV8000に合わせて設定しましょう。

Generic接続追加
次はCodesysでGeneric接続を追加し、KV8000とEthernet/IPを接続します。先程と同じく”Add Connection”をクリックします。

接続設定画面からGeneric connectionを選び→User-defined pathを選択します。最後はConnection PathにKV8000と接続するEIP Pathを入力します。

今回の例では20 04 24 01 2C FE 2C 66 を設定します。最後の66はInstance番号102になります。

Done!

ダウンロード
最後はプロジェクトをCPUにダウンロードしましょう。
結果
WiresharkからTag通信のLarge Forward Openリクエストとリスポンスを確認できました。

Ethernet/IP接続がたくさん存在してる場合、T->OのNetwork Connection IDからPackageをFilterすればよいんです。

WiresharもCIPIOメッセージも確認できました。

コラボ1 Connection IDでFilterする
最初に監視したいEthernet/IP 接続IDをFilterしてきます。

先程確認したNetwork IDを使用し、下記のコマンドでCapatureをFilterしましょう。
cip.connid == 0x029ce0f6 |
|---|

コラボ2 パケット間の時間?
次はEthernet/IPのCIP IO メッセージの2つの時間差を確認しましょう。
Frame 461 : 1.817412270
|
|---|
↓
差 = 0.009710130 sec ≒ 9.71 ms

また、
507 → 554
1.837111800 – 1.827122400
= 9.9894 ms
554 → 600
1.847082100 – 1.837111800
= 9.9703 ms
600 → 646
1.857114300 – 1.847082100
= 10.0322 ms
646 → 692
1.867058700 – 1.857114300
= 9.9444 ms
なので、この Connection ID = 0x029CE0F6 の T→O CIP I/Oはほぼ10 ms周期です。
つまりこのConnectionのT→O RPI ≒ 10,000 µs(10 ms)になっています。