今回の記事ではBeckhoffのEL6224のIOLINK Terminalを使用しEtherCAT経由でIOLINKデバイスのデータを取ります。記事内で使用したIO−LINKデバイスはKeyence社のLR TB2000とContrinex社のIDWE-M12MM-NMS-A0になります。
よろしくおねがいします。
EL6224?
IO-LinkターミナルEL6224は、最大4台のIO-Linkデバイスの接続を可能にするデバイスです。接続先はアクチュエーター、センサー、またはその両方を組み合わせることも可能です。EL6224ターミナルは、EtherCATマスターを介してパラメータ化され設定を行います。IO-Linkは、フィールドバスレベルとセンサーレベルの間のデータリングとして設計され、
パラメータ化された情報はIO-Link接続を介して双方向に交換できます。
IO-Link接続を介してパラメータ化情報を双方向に交換することができます。
サービスデータを持つIO-Linkデバイスのパラメータ化は、TwinCATからADS経由で行うか、統合されたIO-Linkコンフィギュレーションツールを使って行うことができる。
接続されたIO-Linkデバイスと必要に応じて通信し、デバイスをパラメータ化し、必要に応じて動作モードを変更します。
Layout
こちらはEL6224のLayoutになります。
IO-Link basics
IO-Linkは、インテリジェントなセンサやアクチュエータをオートメーションシステムに接続するための通信システムである。
IEC 61131-9 標準では、IO-Link を “Single-drop digital communication interface for small sensors and actuators” (SDCI) という名称で規定しています。
電気的な接続データと通信プロトコルの両方が標準化され、IO-Link仕様書にまとめられている。
IO-Link システムではIO-Link マスタと 1 つ以上の IO-Link デバイス、つまりセンサやアクチュエータで構成されます。IO-Link マスタは、上位コントローラへのインタフェースを提供し、接続された IO-Link デバイスとの通信を制御します。ベッコフEL6224/EJ6224 IO-Linkマスターターミナルには、4つのIO-Linkポートがあります。それぞれに1台のIO-Linkデバイスを接続することができます。下図のように、IO-Linkはフィールドバスではなく、Point to Point 接続です。
今回使用するBeckhoff EL6224は IO-Linkマスターの開発には、IO-Link仕様1.1が適用されます。
Be careful!
IO-Link デバイスは、EL6224の 24 V 電源から供給する必要があり、別電源を使用すると IO-Link ポートが損傷することがあります。
Establishment of IO Link communication
こちらはIO-Link通信の確立Flowです。IO-Link Portが自動Scanするときこのシーケンスに沿って接続します。
Wakeup Pulse
IO-Link デバイスがEL6224のPortに接続されている場合、マスターは通信の確立をトライするため、定義された信号レベル(ウェイクアップパルス)はデバイスに、”これからUARTバイトを送信しますよ!”の信号を送ります。
Baud Rate
IOLINK MasterはすべてのBaud rateを実行し、その中に最も速いBaud rateから通信を開始します。(COM3=230kbaud)。IOLINK SlaveがStep-1のWake up pulseにに応答したとき、接続が成功したことになります。
Communication Parameter Exchange
次はIOLINK MasterがSlaveの基本パラメータ:
- ベンダーID
- デバイスID
- プロセスデータ長
- テレグラムタイプ
- サイクルタイム
を読み取り、現在の構成と比較します。
Errors in Configuration
機器に接続できなかった・または保存したパラメータが読み込んだパラメータと異なる場合、エラーを出力します。
if Configuration incorrect..?
保存したパラメータと読み取ったパラメータが異なる場合、IO-Link デバイスは PREOP 状態に変わります。
IO-Link device specification is V1.1
IO-Link デバイスの仕様が V1.1 の場合、パラメータサーバを実行します。IO-Linkデバイスが V1.0 の場合、デバイスは直接 OP に変更されます。
Finally
最後にサイクルタイムが書き込まれ、デバイスはOP二移行します。IO-LinkマスターはIO-LINKデバイスと周期でデータを交換する。
Between TwinCAT..
Beckhoff EL6224 IO-Linkマスタターミナルは、2つのサービスに分かれています。
- 接続されたIO-Linkデバイスとの関係でIO-Linkマスタで接続
- PLC TwinCATマスタとの関係でEtherCATスレーブの接続
基本的には、Cyclic とAcyclicデータが交換されます。
- CyclicのProcess データはPDOs経由します
- AcyclicデータはAoE を経由しアクセスします
- Eventは、システムマネージャーの履歴で表示されます。
Implementation
Wiring
こちらはEL6224のTerminalとIO Linkデバイスの配線図です。
Configuration
Add EtherCAT Master
I/O>Devices>Add New Itemで新しいデバイスを追加します。
EtherCAT>EtherCAT Masterを選び>Okします。
いま接続してるEtherCAT NetworkのLAN CARDを選び>Okします。
Add EL6224
TwinCATからEtherCATのSlaveを追加するにはManual方法やAuto-Scanの2種類のやり方があります。
Scan
次はEtherCAT Master>右クリック>ScanでEtherCAT Slaveを検索します。
もしプロジェクトのHardware configurationと実機のConfigurationが異なる場合、TwinCATがその差分を確認することができます。今回はCopu Allで実機のConfigurationをプロジェクトと同期します。
Done!
EL6224がEtherCAT ネットワークに追加されました。
Configurate EL6224
EL6224の設定を行います。
Port1
IO-LINKのTabを開きます。この画面で各Portの設定を行うことができます。
最初にIODD Finderを開いてみましょう。
自分のIPCはいまインターネットと繋がっていませんが、この画面から直接IODD Fileを検索しプロジェクトにインストールできます。
Ports1を選び右クリック>Create Deviceから新規IOLINKデバイスを手動で作成します。
Create Deviceの画面が表示されます。
Vendor NameやIDはわかりやすい名前に設定し、Process lengthはIn 16Bitに設定します。
Port1sにIO-LINKデバイスが作成されました。
先程作成したIO-LINKデバイスを右クリック>Settingsを開きます。
Check VendorIDとCheck DeviceIDのCheckBOXを外し、Communication modeをCommunicationに選択すればOkです。
EL6224モジュールにIO-Link Port1が自動的に追加され、中に2BytesのProcess dataが定義されました。
Port4
Port4にも同じ方法でContrinex社のIdwe-m12mm-nms-a0 IO-LINKデバイスを追加します。
In=32bit、Output=8Bitで、Min Cycle timeは8.0ms設定します。
Add PLC
PLC>右クリック>Add New Itemします。
Standard PLC Project>Addで新しいPLCプロジェクトを追加します。
Program
FB_EL6751_Basic
こちらのFunction BlockはEL6224 モジュールのDeviceStateInputs変数と紐つけます。
DeviceStateInputsは各Portsの状態を取得できます。
FUNCTION_BLOCK FB_EL6224_Basic IMPLEMENTS ITF_EL6224_Basic VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR DeviceStatesInputs AT %I*:ARRAY[1..4]OF USINT; END_VAR |
METH_Port_OK
こちらのMethodはiPortの番号をパラメータとして受け取り、現在状態は3であればTrueを戻します(IO Link Port正常)
METHOD METH_Port_OK : BOOL VAR_INPUT iPort : INT; END_VAR METH_Port_OK:=FALSE; CASE iPort OF 1..4: METH_Port_OK:=DeviceStatesInputs[iPort] = 3; END_CASE |
FB_LR_TB2000
Keyence社のLR-TB2000用のFunction Blockを作成します。
iPortOKというのはPortは正常通信してるかを外部からの入力パラメータです。
FUNCTION_BLOCK FB_LR_TB2000 IMPLEMENTS ITF_LR_TB2000 VAR_INPUT iPortOK :BOOL; END_VAR VAR_OUTPUT END_VAR VAR Inputs AT %I*:INT; Data :INT; END_VAR |
METH_Update
Update Methodを呼び出さない限り、IO-LINKデータが更新しません。
METHOD METH_Update : BOOL Data:=0; IF Prop_Enable THEN Data:=Inputs; END_IF; |
Prop_Distance:GET
IOLink Portが通信OKであれば、2Bytesの距離データを更新します。
PROPERTY Prop_Distance : INT Prop_Distance:=0; IF Prop_Enable THEN Prop_Distance:=Data; END_IF |
FB_IDWE_M12MM_NMS_A0
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイス用のFunction Blockを作成します。
FUNCTION_BLOCK FB_IDWE_M12MM_NMS_A0 IMPLEMENTS ITF_IDWE_M12MM_NMS_A0 VAR_INPUT iPortOK :BOOL; END_VAR VAR_OUTPUT END_VAR VAR //Link to Process Data input AT %I*:DINT; output AT %Q*:BYTE; END_VAR VAR StatusWord :BYTE; ScalingValue :BYTE; MesurementValue :INT; InputBuffer :ARRAY[0..3]OF BYTE; END_VAR |
METH_Disable
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスを無効化するMethodです。
METHOD METH_Disable : BOOL VAR_INPUT iTrigger : BOOL; END_VAR output.0:=iTrigger; |
METH_Update
IOLink Portが通信OKであれば、4Bytesの処理データを更新します。
METHOD METH_Update : BOOL StatusWord:=0; ScalingValue:=0; MesurementValue:=0; IF Prop_Enable THEN MEMMOVE( ADR(InputBuffer) ,ADR(input) ,n:=4 ); MEMMOVE( ADR(StatusWord) ,ADR(InputBuffer) ,n:=1 ); MEMMOVE( ADR(ScalingValue) ,ADR(InputBuffer[1]) ,n:=1 ); MEMMOVE( ADR(MesurementValue) ,ADR(InputBuffer[2]) ,n:=2 ); END_IF |
Prop_ALR:GET
Prop_ALR:=Prop_ALR1 OR Prop_ALR2 OR Prop_ALR3 ; |
Prop_ALR1:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのALR1信号を取得します。
PROPERTY Prop_ALR1 : BOOL VAR _Statusword:BYTE; END_VAR _Statusword:=Prop_StatusWord; Prop_ALR1:=_Statusword.5; |
Prop_ALR2:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのALR2信号を取得します。
PROPERTY Prop_ALR2 : BOOL VAR _Statusword:BYTE; END_VAR _Statusword:=Prop_StatusWord; Prop_ALR2:=_Statusword.6; |
Prop_ALR3:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのALR3信号を取得します。
PROPERTY Prop_ALR3 : BOOL VAR _Statusword:BYTE; END_VAR _Statusword:=Prop_StatusWord; Prop_ALR3:=_Statusword.7; |
Prop_Enable:GET
PROPERTY Prop_Enable : BOOL Prop_Enable:=iPortOK; |
Prop_MeasurementValue:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのMeasurementValueを取得します。
PROPERTY Prop_MeasurementValue : INT Prop_MeasurementValue:=MesurementValue; |
Prop_OSS1:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのOSS1信号を取得します。
PROPERTY Prop_OSS1 : BOOL VAR _Statusword:BYTE;END_VAR _Statusword:=Prop_StatusWord; Prop_OSS1:=_Statusword.0; |
Prop_OSS2:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのOSS2信号を取得します。
PROPERTY Prop_OSS2 : BOOL VAR _Statusword:BYTE; END_VAR _Statusword:=Prop_StatusWord; Prop_OSS2:=_Statusword.1; |
Prop_ScalingValue:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのScaling Valueを取得します。
PROPERTY Prop_ScalingValue : BYTE Prop_ScalingValue:=ScalingValue; |
Prop_StatusWord:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのByte0 Status データを取得します。
PROPERTY Prop_StatusWord : BYTE Prop_StatusWord:=StatusWord; |
Prop_Tss:GET
Contrinex社のIDWE_M12MM_NMS_A0 IOLINK デバイスのTSS信号を取得します。
PROPERTY Prop_Tss : BOOL VAR _Statusword:BYTE; END_VAR _Statusword:=Prop_StatusWord; Prop_Tss:=_Statusword.2; |
MAIN
各PortのIOLINK デバイスやEL6224のデータを取ります。
PROGRAM MAIN VAR Port4 :FB_IDWE_M12MM_NMS_A0; Port1 :FB_LR_TB2000; EL6751 :FB_EL6751_Basic; MeasureValue:INT; ScalingValue:BYTE; ALR1,ALR2,ALR3,OSS1,OSS2,TSS:BOOL; Distance:INT; END_VAR Port1.iPortOK:=EL6751.METH_Port_OK(1); Port4.iPortOK:=EL6751.METH_Port_OK(4); Port1.METH_Update(); Port4.METH_Update(); Distance:=Port1.Prop_Distance; MeasureValue:=Port4.Prop_MeasurementValue; ALR1:=Port4.Prop_ALR1; ALR2:=Port4.Prop_ALR2; ALR3:=Port4.Prop_ALR3; OSS1:=Port4.Prop_OSS1; OSS2:=Port4.Prop_OSS2; TSS:=Port4.Prop_TSS; ScalingValue:=Port4.Prop_ScalingValue; |
Result
Done!EL6224 TerminalからPort1とPort4のIOLINKデータが取れましたね!
Download
下記のLinkからSample プロジェクトをDownloadしてください。
https://github.com/soup01Threes/TwinCAT3/blob/main/Project_EL6224_Part1.tnzip