EtherCAT#少し話しよ_02

今回の記事では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

NameData TypeDescription
sNetIdT_AmsNetIdEtherCAT MasterのNetID
nSlaveAddrUINTEtherCAT Slaveのアドレス
nSubIndexBYTEアクセスするSubIndex
nIndexWORDアクセスするIndex
pSrcBufPVOID書き込むの変数Memory Offset
cbBufLenUDINT書き込むの変数Memory Size
bExecuteBOOL立ち上げ信号で実行
tTimeoutTIME := DEFAULT_ADS_TIMEOUTコマンドのTimeout設定時間

VAR_OUTPUT

NameData TypeDescription
bBusyBOOLFunction Block実行中
bErrorBOOLFunction Blockエラーあり
nErrIdUDINTエラー情報

FB_EcCoeSdoRead

こちらのFBを使用するとCoE MailBox ProtocolからCoE Objectを読み取ることが可能です。

VAR_INPUT

NameData TypeDescription
sNetIdT_AmsNetIdEtherCAT MasterのNetID
nSlaveAddrUINTEtherCAT Slaveのアドレス
nSubIndexBYTEアクセスするSubIndex
nIndexWORDアクセスするIndex
pDstBufPVOID読み込まれたデータ格納の変数Memory Offset
cbBufLenUDINT読み込まれたデータ格納の変数Memory Size
bExecuteBOOL立ち上げ信号で実行
tTimeoutTIME := DEFAULT_ADS_TIMEOUTコマンドのTimeout設定時間

VAR_OUTPUT

NameData TypeDescription
bBusyBOOLFunction Block実行中
bErrorBOOLFunction Blockエラーあり
nErrIdUDINTエラー情報

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を書き込んでいることが確認できます。

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする