EthernetIPの話第2回です。今回はRegisterSession()とForward_open()について話ししたいと思います。
こちらは第1話です。
Ethernet/IP#少し話しよ_01 | (soup01.com)
RegisterSession()
OriginatorがRegisterSession()コマンドをTargetに送ってSessionを初期化します。そのコマンドはSend側にはなにSession番号いりません。
Request
Encapsulation Headerは前の記事にも説明しましたのでここで書きません。
こちらはWireshakeからとってたCaptureですね。
Reply
そしてTargetはRegisterSession()のReplyをOriginatorに送信する必要がありますね。
Formatも大したわかりませんので。
こちらはWireshakeのCaptureですね。
StatusがSuccessが帰ってきましたし、Session番号も戻りました。
Session Management
TCP Encapsulation Sessionには主に3つの部分に分けられています。
ーSession確立
ーSessoionを保持する
ーSession閉じる
まずOriginator からTCP OPEN Connectionを開きます。
そしてRegisterSession()コマンドをTargetに送信します。
次はTargetがOriginatorのVersion Supportしてるか、あとOptionsがSupportするか。
そしてTargetから独自のSession番号を振り付け、RegisterSession()のReplyを返します。
そしてOriginatorやTargetにもConnectionを切断することができ、切断するときにUnRegisterSession() Commandを送信します。
以下の原因でSessionがなくなる可能性があります:
-Originator・TargetがTCP Connectionを閉じました
-Originator・TargetがUnRegisterSession() Commandを送信
-TCP Connectionが障害発生した
TCP ConnectionはConnectionベースのProtocolで片方がConnectionをなくしたら、反対側にも同じくConnectionをCloseする必要があります。
もしMessageは時間内届けたの返事来なければエラーだと認識しConnectionを閉じます。なので、TCP ConnectionではMessageの送受信から通信状態を検知しますね。
そしてTCPにはKeep-alive processをSuppportします。アプリケーションでそのKeep-alive processを有効することによって、アプリケーション内で一定時間にMessage交換なくてもTCPがKeep-alive Messageを送信し、Replyの状態を判断します。
Forward open()
Forward Open リクエストはアプリケーションのConnecitonセットアップを実装できます。そのリクエストにはNetwork Connection とRequested packaget intervals(RPI)の2部分になり、O->TとT->Oの二方向があり、O->TはOriginator to Targetで、T->OはTarget to Originatorです。
そのForward open()はCIP Common Industrial ProtocolとCIP Connection Manager二つに分けられます。
CIP Connection ManagerにはServiesとCommand Specific Data2つにさらに分けます。
Services はServices CodeといまRequestか、Responseどっちかを振り分けます。
Services Code=0x54はForward Open です。
そしてWireshakeのところに値=0なので、Requestになります。
Command Specific Data
そしてこっちらはCIP Connection Managerの構造ですね。
Priority Time_Tick
Priority Fieldsは必ず0にしてください。Time TickはTime out の値になります。
下図だけTime_Tickは0x11で、実際CIPの仕様書ではTime per Tick=8になります。
そしてTimeout値の計算は2**Time Out Value x Time_out_Ticksになります。
Time-out Ticks
こちらはTime-outのベース時間です。
下図だとTime-out Ticksは250msです。
なので2**8 x 250の計算になります。
O->T ConnectionID/ T->O ConnectionID
Connection IDですが、Codesysのどこかを参照してるか少しわかりませんね~
Connection Serial Number
すいません、そのConnection Serial Numberも見つかりません…
Originator VendorID
Identity Object Instance #1,attribute #1に参照します。
下図だと0x0505です。
その0505はCodesysの1285に対象します。
Originator Serial Number
Identity Object Instance #1,attribute #6に参照します。
Connection Timeout Multiplier
0=x4、1=x8、2=x16のような与えを設定します。なのでCodesysでRPIのTimeout MultiplierIを設定するときは4,8,16のように設定できます。
Codesysだと以下の設定項目に対応します。
O->T RPI/T->O RPI
Originator>TargetのTimeout です。
O->T Connection Parameters/T->O Connection Parameter
Trigger Typeなどのパラメタの設定エリアです。
Codesysだと以下の場所に参照します。
Network Connection Parameters
Mappingはこのようになります。
Connection Size(Bytes)
T->OやO->Tのデータ交換するときに最大のBufferサイズです。
Fixed/Variables
0=Fixed、1=Variablesです。
Fixedが設定した場合、データ交換のSizeはConnection Size Parameter値に固定されています。
Variablesが設定した場合、毎回データ交換のサイズも可変で、でもConnection Sizeに超えないようになっています。
Priority
00=Low
01=High
10=Scheduled
11=Urgent
Connection Type
00=Null
01=Multicast
10=Point To Point
11=Reserved
Null
Network ConnectionをOpenしない。
Multicast
Network ConnectionがMultiple ConnectionをOpenし、、マルチConsumersからデータ受信できるようになIPアドレスを使用します」。
Point To Point
いわゆる1:1のConnectionです。
Redundant Owner
1=1つ以上のOwnerで同期接続できるようになる
0=Exclusive Owner・Input Only・Listen Onlyだけ
Transport class and Trigger
データ交換のTigger・通信Classを定義するエリアですね。
Connection Path Size/Connection Path
最後はConnection Pathです。
Connection Path Sizeは何WordのデータがそのConnection Path入ってるかを示しています。Connection Pathの内容はWireshakeでみてくださいー
最後
はーい、お疲れ様です。ここまで書いちゃったら疲れました。
もしなにか質問あれば、メール・コメント・Twitterなどでもどうぞ!
Twitterのご相談:@3threes2
メールのご相談:soup01threes*gmail.com (*を@に)
Youtube Channel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ