Ethernet/IPについての第6話です。今回はClass/Instance/Attributeのついて話したいとおもいます。ではその前にまずExplicit messagingとImplicit (I/O data)のMessageをもう一度説明しましょう。
EtherNet/IPは2種類のメッセージがありそれは低優先度・頻度低い・通信確率用のexplicit messages(Unconnected messaging)と頻度高い・優先度高い・IO Data用のImplicit Message(Connected messaging)です。
Explicit messagingとImplicit (I/O data)のMessage Connectionは最初にも紹介しましたが、今回はまずもう一度復習していきたいと思います。Explicit messaging(TCP)はPoint-to-Pointの関係で2つのNodeをRequest・Responseの形でやり取りします。そのようなConnectionはNetworkデバイスの検索などで使われています。Implicit (I/O data・UDP)はPoint-to-PointやmulticastのConnectionもあるアプリケーションベースのIO Dataです。
Configuration
Class Code
ここで少し先みせたClass Codeの役割を説明します。
CIP Objectに各ClassありClassごとに違うデータが入っています。下図のように、Message RounterはClass 0x02、IdnetityはClass 0x01、TCP/InterfaceはClass 0xF5、AssemblyはClass 0x04、Connection ManagerはClass 0x06です。すべてのClass Codeは16進数の数値でOPDVA協会がそれらのClasss Codeを管理します。ですが、一部のClass Code範囲はメーカー定義できるので詳細は各メーカーの取説をやCIPの仕様書を参考にしてください。
Identity Object:01Hex
このObjectではVendor IDやVersionなどデバイスの情報を提供するとServicesをリセットする機能を持っています。
Message Router Object:02Hex
このObjectではMessagesの接続点を提供します。Client(Explicit messagingやImplicit Messageing)はこのMessageのServicesを通じて他のObjectにアクセスします。
Assembly Object:04 Hex
このObjectはIO Dataを構築します。みなさんが使ってるInput Only などはこのObjectのことです。
Connection Manager Object:06 Hex
デバイスと接続するときのFW_OpenやFW_Closeを管理しています。ConnectとUnconnectionもSupportします。
TCPIP Object:F5 Hex
IP・デバイス名・DHCP設定などを管理するObjectです。
Ethernet Link Object:F6 Hex
Ethernet水準の設定を管理するObjectです。(Speed・Port…)
Attribute
ClassだけではConnectionを成り立たないので、次は2つ目のAttributeについて説明しますね。AttributesはClass AttributeとInstance Attributeの2種類があります。
Class Attribute
Class AttributeはGlobalなScopeで該当するClassの属性を取得できます。CIPではそのClass Instanceが”0”という指定値があります。
Example
では、実際AdapterにUnconnectionメッセージを送って、Class 0x01 Identity ObjectのClass Attributeを取得してみます。
(次の記事ではCodesysからメッセージを送るプログラムを紹介しますので、心配しないでください。)
Serviceは次の文章で説明します。いますべてのAttributeをとり、InstanceとAttributeも0という特殊値を入れます。
ResponseのPacktes見ると、正常Codeと4つのAttributesが戻りましたね。
それはRevision・Max Instnace・Maximum ID Number Class Attributes・Maximum ID Number Instance Attributesです。
Instance Attributes
Instance Attributeは各Objectの各Instanceが独自もってるものです。各Instance番号はSupportするAttributeが違いますので、SupportしてないAttributeが要求されたらNot Supported (General Status code 0x14) が戻ります。
それでもInstanceってなに?ってピンと来ないかもしれませんね。以下の図をみてください。IOConnectionでは直接AssemblyののAttribute#3をアクセスすることができ、他のAttribute#1,2はAssmebly0x04を経由してアクセスしています。もちろん単一のConnectionで複数のAttributeにもアクセス可能です。
ここで、Classが一つだけでInstanceは複数ありますね。つまり、ClassはObjectの設計図で、InstanceたちはそのObjectの設計図に沿って生成されたもので(もしFunction BlockやOOPのプログラムなどができる人ならわかると思います。)、ConnectionがアクセスするのはそのClassから生成されたInstance番号です。
なんかどこかで聞いた話があると思いませんか?Connectionを構築するとき、Class ID・Instance ID・Attribute IDを入力するところがあるとおぼえていますか。
ClassID=16#4,Instance ID=16#64,Attribute ID=16#3。
つまりClass 4のInstance 16#64のAttribute#3にアクセスするってことです。
つい先、Class ID 16#4 にはAttribute#3は直接アクセスできると言いましたので、Connection Pathもそのまま20 04 2C 64 2C 65になりますね。
O->TのAttribute IDを16#4に変えますと、Connection Pathも20 04 2C 64 30 04 2C 65になります。30=Attribute ID指定で、04はそのAttribute#4のことです。
Example-1 Get all Attribute From Object 01Hex
01HexのClassをGet all Attributeします。
返事のPackets見ますと、Attribute,2,3,4,5,6,7,8,9,10が含まれてる返事が来ましたね、
すべてのAttributeを説明するのは面倒なので、Atrribute1,2,3を取り出してAdapterの情報と比較します。
Example-2
次のExampleではClass4 Instance 101 Attribute 3のデータをGet all Attributeで取ります。
つまりAdapterのIO Outputデータを取得してみます。
Packetsからみますと、同じIO DataなのにConnected MessageではないのでTCPを使用していますね。
でもConnection Pathは20 04 24 65 30 03=Class 4 Instance 101 Attribute3ですね。
Packetsの返事を見るとデータも返って来ましたね。
CodesysのUser Programでは0番目と31番目のデータをずっと加算と減算します。
Services
つまりコマンドですね。ここでいくつか使えそうなコマンドを紹介します。
0x01 Get Attributes all
該当するClassのInstanceのAttributesをすべて取得します。
0x02 Set Attributes all
該当するClassのInstanceのAttributesをすべて上書きします。
0x0E Get Attributes Single
該当するClassのInstanceの指定Attributesを取得します。
0x10 Set Attributes Single
該当するClassのInstanceの指定Attributesを上書きします。
コメント
いままさにCodesysでExplicit通信の実装をしていたため、このシリーズの記事にすごく助けられています。次回の記事も楽しみにしています。ちなみに、Get/Set Attributes SingleではAssembly単位の書き込みに限定されていますが、Assembly内のパラメータ単位で読み書きできたりってしないのでしょうか?
Blogをお読みいただいき、ありがとうございます!
その言葉聞くだけでやりがいがありました。
多分できると思いますので、少しお待ち下さい。
次はCodesysやBeckhoffからのその機能の関数紹介しようと
考えています。
そのあとはEDS Fileの紹介の予定です。
どうぞよろしくお願いしますね。
返信いただきありがとうございます。
パラメータ単位の読み書きができる可能性があるならすごい楽しみです!
記事の更新、楽しみに待っています!
いいえ、こちらこそ貴重なFeedbackがありがとうございます。
自分もまだEthernet/ipが勉強中なので、もし具体的になり実装したいとかを教えていただければ、(EIPにかぎらず)
そのあたりも深く掘ります。
100%できるとまだ言えないが 汗。
もしTwitterやメールなどConnectしてくれれば、また詳しい話い色々できると思います。
あとすいません、パラメタを書き込むのは01、02、0E、10以外のServiceの認識だとあっていますか?
よろしくお願いします。
gomamenotesさんがよければぜひTwitterやメールなどでお話できれば幸いです。(当方ネットワーク関係は初心者なのでgomamenotesさんに有益な話ができるかは怪しいですが・・・)
記事主さんには私のメールアドレスはわかるのでしょうか?もしわかるようでしたらお手数ですがメールいただけますとTwitterのアカウントを共有できます。
パラメータを書き込むのは上記以外のServiceだとは思っていますが、いかんせんその4つがメジャーなのか、調べても他のServiceはヒットしませんでした・・・
こちらのメールから声かけてみますね。
ありがとうございます!
自分も経験浅いなので、ぜひよろしくおねがいします。
確かにそれ以外Supportするメーカがいますが、まだ出会ったことありません。。。