SOES
SOESの管理している関数にvoid cb_get_inputs(), void cb_set_outputs()がある.ここで書き込むデータの更新処理をすればいい?
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でオブジェクトディクショナリとして登録する.
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