今回の記事ではBeckhoff TwinCATからCoE Objectにアクセスする方法を紹介します。よろしくお願いします。
COE?
EtherCATには周期通信のPDO(Process Data Objects)通信と非同期通信のMailbox通信があります。CoE=CANopen-over-EtherCATで、Mailbox通信のプロトコルで任意のタイミングでスレーブ内のオブジェクトへアクセスできます。
PDO通信と比べるとCoEに対応したEtherCATスレーブをつかいMailBox通信より、制御Dataのほかに細かい情報など(モジュール設定・Device ID)にアクセスできます。
CoEはCANOPENに基づいて作られたもので、そのIndexとSubIndexもCANOPENと同じです。(たとえば0x1000はデバイスタイプ、0x1008はデバイス名)
こちらはCoEの構造です。
Standard CANOpen Frame
SDO Services
CoE通信はType2/Type3に分けられていて、Type2=SDOリクエスト、Type3=SDOリスボンになります。
Function Block
次は今回の記事で使用するFunction Blockや必要なNetId・Index・SubIndexをの探し方を紹介します。
NetId?
NetIdはTwinCATからEtherCATをクリックします。
EtherCATのTabからNetIdが確認でき、Function BlockのNetIdが必要なのはその変数です。
Index?
次はIndexです。今回使用するのはFestoのCPX-AP-I-EC-M12ですが、どんなEtherCAT Slaveも同じです。COEデータを操作したいSlaveをダブルクリックします。
CoE-OnlineのTabを開きますと、Index値が確認できます。
たとえばCPX-AP-I-EC-M12のIndexは9000になります。
SubIndex?
そしてSubIndexは01・03・05のように表示されています。
FB_EcCoESdoWrite
こちらのFBを使用するとCoE MailBox ProtocolからCoE Objectの現在値を書き込みすることが可能です。
VAR_INPUT
Name | Data Type | Description |
sNetId | T_AmsNetId | EtherCAT MasterのNetID |
nSlaveAddr | UINT | EtherCAT Slaveのアドレス |
nSubIndex | BYTE | アクセスするSubIndex |
nIndex | WORD | アクセスするIndex |
pSrcBuf | PVOID | 書き込むの変数Memory Offset |
cbBufLen | UDINT | 書き込むの変数Memory Size |
bExecute | BOOL | 立ち上げ信号で実行 |
tTimeout | TIME := DEFAULT_ADS_TIMEOUT | コマンドのTimeout設定時間 |
VAR_OUTPUT
Name | Data Type | Description |
bBusy | BOOL | Function Block実行中 |
bError | BOOL | Function Blockエラーあり |
nErrId | UDINT | エラー情報 |
FB_EcCoeSdoRead
こちらのFBを使用するとCoE MailBox ProtocolからCoE Objectを読み取ることが可能です。
VAR_INPUT
Name | Data Type | Description |
sNetId | T_AmsNetId | EtherCAT MasterのNetID |
nSlaveAddr | UINT | EtherCAT Slaveのアドレス |
nSubIndex | BYTE | アクセスするSubIndex |
nIndex | WORD | アクセスするIndex |
pDstBuf | PVOID | 読み込まれたデータ格納の変数Memory Offset |
cbBufLen | UDINT | 読み込まれたデータ格納の変数Memory Size |
bExecute | BOOL | 立ち上げ信号で実行 |
tTimeout | TIME := DEFAULT_ADS_TIMEOUT | コマンドのTimeout設定時間 |
VAR_OUTPUT
Name | Data Type | Description |
bBusy | BOOL | Function Block実行中 |
bError | BOOL | Function Blockエラーあり |
nErrId | UDINT | エラー情報 |
Implementation
こちらは今回実装するExampleになります。EtherCAT SlaveはFestoのCPX-AP-I-EC-M12を使用します。
Program
こちらはMainプログラムです。難しいことなく、FB_EcCoESdoWriteとFB_EcCoESdoReadを呼び出してCoE Objectを操作するだけです。
PROGRAM MAIN VAR fb_coe_write : FB_EcCoESdoWrite; // Function Block for writing in CoE fb_coe_read : FB_EcCoESdoRead; // Function Block for reading from CoE sNetId :T_AmsNetID:=’169.254.141.157.2.1′; nSlaveAddr :UINT:=1001; startRead : BOOL := FALSE; // Sign for start reading strData :STRING; bStartWrite :BOOL; uin8Data :USINT; END_VAR fb_coe_read( sNetId:=sNetId ,nSlaveAddr:=nSlaveAddr ,nSubIndex:=0 ,nIndex:=16#1008 ,pDstBuf:=ADR(strData) ,cbBufLen:=SIZEOF(strData) ,bExecute:=startRead ); fb_coe_write( sNetId:=sNetId ,nSlaveAddr:=nSlaveAddr ,nSubIndex:=16#0B ,nIndex:=16#2001 ,pSrcBuf:=ADR(uin8Data) ,cbBufLen:=SIZEOF(uin8Data) ,bExecute:=bStartWrite ); |
FB_EcCoESdoReadのFBで渡すパラメータInde=1008、SubIndex=0はCoEのDevice Name Objectになります。
FB_EcCoESdoWriteのFBで渡すパラメータIndex=16#2001、SubIndex=16#0BはCoEのDevice のIO-Link デバイスPort1設定になります。
Result
FB_EcCoESdoReadのbExecuteを実行すると、CPX−AP-I-EC-M12の返答が来ました。それはFestoのDevice Nameです。
FB_EcCoESdoWriteのbExecuteを実行する、Index2001のSubIndex 0BはいまIOL_MANUALになります。
WiresharkのPacketsからはFPWRのコマンドで(2)のPacketsが見つかるはずです。
そのPacketsはType=CoEです。
CoEのTypeはSDO ReqつまりTwinCATからFestoのCPX-APIモジュールにCoE Objectリクエスト送信する意味になります。
Index=1008、SubIndex=0でつまりDevice NameのDictionaryになります。
そしてFestoのCPX-APIモジュールから返答が帰って来ます。
Headerは同じくCoEで、今度はモジュールからの返答なので、SDO Res(3)になります。
そしてFestoのCPX-APIモジュールからの返答データも確認できます、
TwinCATからCoEのWriteリクエストも同じです。
Index 0x2001,0x0bにもData=2を書き込んでいることが確認できます。