こちらは今回の記事の構成です。TwinCAT3はTF6280を使用しEthernet/IP Adapterを立ち上げ、Ethernet/IP Scanner側はKeyence KV8000でEthernet/IP Networkを構築します。
よろしくおねがいします。
Reference Link
http://soup01.com/ja/category/protocol/ethernet-ip/
http://soup01.com/ja/category/beckhoff/
Implementation
TwinCAT3 Side
まずはTwinCAT3側を設定します。
Add PLC
PLC>Add New Itemします。
PLCを追加し、中のPOUを開きます。
Ethernet/IP AdapterのProcess IO 変数を追加します。
そしてプログラムはBufferに転送するようにします。TwinCAT3もProcess IOの変数を使わないと更新しませんので。
Add Ethernet/IP AdapterIP
次はEthernet/IP Adapterを追加します。I/O>Devices>Add New Itemします。
EtherNet/IP>EtherNet/IP Adpaterを選び>OKします。
Ethernet/IP使用するEthernet Interfaceを選び>OKします。
それでEthernet/IP Adapterが追加されました。
Ethernet Adapter
AdapterのTabを開き、設定したInterfaceが正しいかを再確認しましょう。
Sync Task
次はSync Taskを開きます。つまりEthernet/IP Adapterの更新Taskを設定できます。
Special Sync Taskを選択し>Create new I/O Taskします。
Taskを入れてOkします。
Cycle Ticksを設定します。今回は128msにしますね。
Add a Connection Point
先程追加したEthernet/IP Adapter>右クリック>Add New Itemします。
TC EtherNet/IP Slaveを選び>OKします。
Connection Pointが追加されました。
Adapter virtual IP
Box1をダブルクリックします。
SettingsのTabを開き、8000:21,8000:22のIP addressとNetwork Maskを設定してください。このIPは実際いまのConnection PointのIPアドレスになります。
ではConfigurationに合わせて設定しましょう。
Append IO Assembly
次はConnection PointのAssemblyを追加します。Box1を右クリック>Append IO Assemblyします。
Assembly1が追加されました。
展開するとInputsとOutpus 項目も出てきます。
Insert Inputs
ではまず入力点から設定します。Inputs右クリック>Add New Itemします。
32 Bytesを設定したいので、BYTESを選び>Multipleを32入力し、OKします。
Inputに32個の変数が追加されました。
Try to Add the Array!
でも同じTypeの変数は扱うにはたまに面倒なこともありますので、先の変数追加画面に実はCreate Array Typeというボタンがあります。
このボタンをクリックすると、クリックしたとき選択したData Typeを何個を作成する配列を設定できます。ここで0と47を入力するとつまり0…47のByte配列になります。
設定終わったらOKします。
Nameのところに変数を入れて、OKします。
配列が作成しました。
Add Ouput
次は出力側です。Outputs>Add New Itemします。
先ほど一回ARRAY[0..47]OF BYTEを作成したことがあるので、そのまま配列のTypeを選び>OKします。
出力側も作成されました。
入力と同じくARRAY[0..47]OF BYTEになります。
Build
Build>Build SolutionでProjectをコンパイルします。
Link Input Variables
Assembly IOのInputをUser ProgramとLinkします。
Inputsをクリックします。
ArrayBytesを右クリック>Change Linkします。
User Programに先ほど定義したAT %I*の変数がここで選択できるようになります。
[X]のところでXがついてるであればもLink完成です。
Link Output
Assembly IOのOutputsをUser ProgramとLinkします。
Outputsをクリックします。
ArrayBytesを右クリック>Change Linkします。
User Programに先ほど定義したAT %Q*の変数がここで選択できるようになります。
[X]のところでXがついてるであればもLink完成です。
Export EDS
最後はEDS FileをExportします。Box1>右クリック>Export EDS Fileします。
TwinCAT3でEDSを生成するとき、実は2つのOptionsがあります。
YESだとこのEDS Fileはいまのプロジェクトの情報に沿って作成するか、
NOだとこのEDS Fileは自由にConfigsできるようになるか。
今回はYesで、いまのプロジェクトの情報に沿って作成します。
EDS Fileの保存先を設定します。
よし、これでOKです。
Download
最後はActivvate ConfigurationでプロジェクトをRuntimeにDownloadします。
OKします。
もしライセンスが足りない場合、ライセンス生成してくださいというPopupが出てきます。
YESでライセンスを生成しましょう。
同じ文字を入れて>Okします。
OKでTwinCAT3を再起動します。
歯車のICONは緑に変わり、つまりRuntimeもRun状態になっています。
Login
LoginでプログラムをDownloadします。
Yesします。
Start it!
Startボタンでアプリケーションを起動すれば完成です。
KV8000 Side
TwinCAT3 Ethernet/IP Adapter側が終わったところで、次はキーエンスのKV8000 でScanner側を構築します。Unit Configuration>KV-8000>Ethernet/IP R3000 DM1000のところをクリックします。
Auto Configurationするか?Manualするかと聞かれます。Auto ConfigurationだとNetworkにあるEthernet/IP機器を自動Scanし吸い上げます。Manualの場合は手動で設定します。今回の記事ではManual、つまり手動から設定します。
いまはEthernet/IP Settings画面が表示されています。
Cofigure Scanner
ScannerのIPを設定します。KV-8000をダブルクリックします。
右側にScanner Settings>IP addressを設定できます。
Configurationに合わせて192.168.3.45を設定します。
Register EDS
次はEDS Fileを登録します。
Ethernet/IP Unit>Unit List>右クリック>Register EDS Fileをクリックします。
TwinCAT3からExportされたEDS Fileを選び>Openします。
機器のICONが見つかりませんが、どうしますかって聞かれます。
Use default iconを選び>OKします。
Unit listからTwinCAT3 Ethernet/IP Adapterが追加されました。
Insert in your network
次はTwinCAT3のAdapterをEthernet/IP ネットワークに追加します。
追加されたBox1(TC Ethernet/IP Slave)をダブルクリックします。
Node addressは触らなくて良いので、IP Addressは先程TwinCAT3に合わせて設定しましょう。
右側にあるUnit settingsにAdapterの詳しい情報を設定できます。
次はAdapterの隣にある-ボタンをクリックするとInとOutのアドレスが表示されます。
IN_129は入力でW00-19まで、OUT_130は出力でW1A-33までになります。
What is W?
WはLink Regisiterの意味でCPUが通信でデータ交換するとき、キーエンスのCPUではデータをW Devicesに格納します。Wは16BitデバイスでLink DeviceのCountは16Hexになります。例えば、先ほどの設定だと入力は00-19ですね。
つまりデバイスはW00,W01,W02,W03…W09までです。でもW09の次はW10ではなくW0A,W0B,W0C,W0D,W0E,W0Fで、そしてW10になります。
少し違和感があるかもしれませんが慣れるしかありません。
Connection Settings
各Connectionに更に詳しい設定ができます。Settings>Connection settingsをクリックします。
各ConnectionのRPIやConnection TypeやInstance番号を設定できます。
例えばTwinCAT3と接続する際にExclusiv OwnerやInput OnlyやListen Onlyを設定できます。
Finish it
最後はClose the setup windowのICONでEthernet/IP Settings画面を閉じます。
そしてExit from the Unit EditorでUnit Editorを閉じます。
YesでHardware configurationを保存します。
Download
設定が終わったらKV StudioからMonitor/Simulartor>Transfer to PLC -> Monitor modeでプロジェクトを転送します。
しばらく待ちます…
転送Itemをすべて選択し、Executeします。
しばらく待ちます…OKです。
Result-1 Cannot Connect..
では実際接続状態を見てみます。KV StudioでEditorのDrop ListからMonitorを切り替えます。ツールをMonitor Modeに切り替えます。
でもBox1(TwinCAT3)の隣はぐるぐるのICONになり…
しばらくすると、KV-8000とBox1(TwinCAT3)も赤いXがついてます。つまり通信できないですね。
KV StudioからCommon ErrorのPop-upが出てきて、Detailから更に詳しい情報が見えます。
Cyclic IO 通信に問題ありますというメッセージですね。つまりBox1(TwinCAT3)と通信できないことを示しています。
Why?
WiresharkからPackageを見てみます。CIP Filterをかけると、192.168.2.252(TwinCAT3)が192.168.2.45(KV8000)にエラーの返答がきたとわかります。
そのPackageを展開すると、Service Request 0x54、Status Connection failureで、General Status=0x1、 Addition status=0x0111がエラーの中身です。
What is 0x54 and General Status=0x1,Additional Status=0x1111?
0x54=Forwad_Open
まず0x54はForwad_Openのリクエスト(最大511Bytes)です。Ethernet/IPがScannerとAdapterがIOデータを交換始まるまえにまずForwad_OpenのリクエストでScannerから接続のリクエストを送り、Adapter側がそれらの接続パラメタが正しいかどうかをCheckします。
つまり、いまはScanner側が設定したAdapterの接続情報に誤りがあり、TwinCAT3側が接続を拒否しました。
General Status=0x1,Additional Status=0x1111
もう一度Packageを見ますと、General Status=0x1 Additional Status=0x1111がAdapter(つまりTwinCAT3)から返答がきました。CIPの仕様書によりますと、その返答はRPI Not Supportedのエラーだと示しています。RPI No Supportedを解決する前、まずRPIを簡単に説明します。
RPI=Requested Packet Intervalでは、ConnectionのOriginatorが書きと読みに対してPacket要求時間(つまり更新Cycle)を提供します。そのRPIはms単位で設定し、32Bit整数になります。話に戻りますと、RPI Not SupportedはつまりTwinCAT3側がキーエンスのForwad_Openに対してそのRPI設定のパラメータがSupportしてないことを示しています。
*実はGeneral Status 0x01、 Extended Status 0x0112のエラーメッセージもあり、RPI値が受け付けませんという意味です。
Let’s Fix it!
KV Studioを戻し、先Connection Settingsを開き、RPIを確認してみます。
いまPRI(Communication cycle)は64.0msになっていますね。
TwinCAT3側を開くと更新するTaskeipはCycle ticksは128msになります。つまりTwinCAT3側は128msで一回Ethernet/IP Adapterの制御を処理するのに対して、KV8000から64ms CycleでPackage更新要求だと設定しました。それは繋がりませんね。
Cycle ticksを32msに変更します。
TwinCAT3とKV8000も修正後のProjectをCPUにDownloadしてください。
Result-2
KV8000 Side
KV Studioからもう一度Monitor Modeに切り替えます。
Box1(TwinCAT3)のICONは緑になっています!
TwinCAT3 Side
TwinCAT3側も見てみます。Device1>Inputs>Devstateをクリックします。
現在値は0なら正常だと示しています。
更にBox1>Inptus>Stateも確認します。
こちらも現在値が0、つまりエラーなじです。
WiresharkからみるとCIP I/O Packageがありましたね!
Summary
最後に説明をまとめましょう。
IP
KV Stuido側で設定するEthernet/IP AdapterのIPは、TwinCAT3側のIndex 8000:21とIndex 8000:22に合わせてください。
Assembly
次は細かい設定になりますが、
ピンク色はAssembly番号、TwinCAT3側のIndex8000:01です。
赤色はInput Instance番号、TwinCAT3側のIndex8000:04です。
緑色はInput InstanceのByte数、TwinCAT3側のIndex8000:05です。
オレンジ色はOutput Instance番号、TwinCAT3側のIndex8000:06です。
黄色はOutput InstanceのByte数、TwinCAT3側のIndex8000:07です。
Bonus
ここからは少しBonusです。先程通信はWiresharkから確認しましたが、実際本当にデータしたいかをみたいですね。ではTwinCAT3とKV8000両方とも簡単なプログラムを作成しましょう。
KV8000
Define Variable
KV Stuido>Variableをクリックします。
ここで変数を定義します。Variable NameはわかりやすいArrayDataFromTwinCATで、Data TypeをARRAY、配列に変更します。
Data typeはUINTで、Array Sizeは26にします。
Assigned devicesはW00に設定します。
画面の下のSet device name W00 to W019、つまり配列のアドレスはどこまで占有するかのことです。
これで変数を定義しました。
Insert Program
次はプログラムを作成します。
Edit>Insert Box scriptします。
CR2006を追加します。どうやらそのCR2006は1秒のClock Pulseだそうです。
Script Boxに1をPlusとマイナス1のプログラムを作成します。
*注意するのはKeyenceのScriptはIEC61131-3のSTと文法が違います。
Compile
Convert>Convertでプログラムをコンパイルし、CPUにプロジェクトをDownloadしてください。
TwinCAT3
次はTwinCAT3側ですね。
Add Library
ReferenceからCCA Memoryライブラリを追加します。このライブラリは三菱のBMOVのようなメモリ操作できる関数が入っています。
Program
まずはVAR内で必要な変数を定義します。
MEM.MemMoveはメモリのまとめ転送する関数です。TwinCAT3側はByte定義しましたが、KV8000側ではWORD単位なので、書き込みたいの与えをTemp変数に移動し、MEM.MemMove関数でBlock Moveします。
pSoureは転送元でpDestinationは転送先、pはPointerつまり変数のメモリアドレスです。ADR()関数を使用すれば取れますので深く考える必要がありません。
Result
Value1、Value2はKV8000からの与えなのでずっと加算されています。
KV Studioからみてみましょう。Box1(TwinCAT3)をクリックします。
該当するConnectionが現在値を一覧できます。
W02とW019は最初の2Byteと最後の2Byteで、ちゃんと転送しましたね!
Box Scriptで右クリック>Registration monitor windowをクリックします。
そのBoxに使われている変数の現在値も一覧できます。