EtherCAT

SOES

SOESの管理している関数にvoid cbgetinputs(), void cbsetoutputs()がある.ここで書き込むデータの更新処理をすればいい?

ecat_slv.h

/**
 * This function is called when to get input values
 */
void cb_get_inputs();
 
/**
* This function is called when to set outputs values
 */
void cb_set_outputs();

SDOのオブジェクトの定義

CC_PACKED_BEGIN
typedef struct CC_PACKED
{
   uint16_t subindex;    // 8bitのサブインデックス
   uint16_t datatype;    // データ型
   uint16_t bitlength;   // データ長
   uint16_t flags;    // データ属性
   const char *name;   // データ名
   uint32_t value;       // 数値
   void *data;    // 文字列
} _objd;
CC_PACKED_END


インデックスには,数値もしくは文字列が格納される.bitlengthにはその変数の型の大きさ(8,16,32,…),文字列の場合はその文字列の大きさ(asciiで1文字8bit×文字の数)が入る.
オブジェクトにサブインデックスが存在するものがある. サブインデックスは0x01から値が割り当ている.

サブインデックスの0x00はたいてい以下の様になる.

static const char acName1C12_00[] = "Max SubIndex";
{0x00, DTYPE_UNSIGNED8, 8, ATYPE_RO, acName1C12_00, 1, NULL},

例えば0x1C12には“Sync Manager 2 PDO Assignment”というオブジェクトが割り当てられており,そのサブインデックスは

const _objd SDO1C12[] =
{
  {0x00, DTYPE_UNSIGNED8, 8, ATYPE_RO, acName1C12_00, 1, NULL},
  {0x01, DTYPE_UNSIGNED16, 16, ATYPE_RO, acName1C12_01, 0x1600, NULL},
};

と定義する. サブインデックスが存在しないオブジェクトは,subindex = 0x00として中身を定義する.
_objdで定義したオブジェクトを_objectlistでオブジェクトディクショナリとして登録する.

Object Dictionary

SOESのチュートリアルで示されているオブジェクトディクショナリの割当,CanOpenDS301に準拠

Index Object
0x0000 未使(予約済み)
0x001-0x025F Static data types
Complex data types
Manufacturer-specific complex data types
Device profile specific data types
0x0260-0x0FFF 未使(予約済み)
0x10000-0x1FFF 通信プロファイル領域
0x2000-0x5FFF メーカ固有のプロファイル領域
0x6000-0x9FFF 標準化されたデバイスプロファイル領域
0xA000-0xAFFF 標準化されたインターフェースプロファイル領域
0xC000-0xCFFF 未使(予約済み)

Object Dictionaryの0x6000~から定義されている標準化されたデバイス(インターフェース)プロファイル領域という部分にCiA4xxで定められた割当がされるということのようだ.
RxPDO, 0x1600 - 0x17FF
TxPDO, 0x1A00 - 0x1BFF