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
から値が割り当ている.
subindex
= 0x00
*name
= “Max SubIndex”
value
= サブインデックスの数
サブインデックスの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
でオブジェクトディクショナリとして登録する.
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