对于提供一块本地内存给EtherCAT主站,它应该可以作为一个对象被处理
一个数据对象被唯一地定义有下面的特征
1、本地内存(6.1是本地内存的定义)
2、入口的描述(6.2 是入口地址的描述)
3、数据对象名称(6.3 是数据对象名称的描述)
4、数据对象的描述(6.4是数据对象的描述)
所有数据对象的描述被收集在一个框架上,即是对象字典。这个对象字典展现了给EtherCAT主站的接口。在这一段里,我们把所有的对象字典分类成三种不同的类型,分别是VARIBLE,ARRAY和RECORD。对于VARIABLE的数据对象仅仅包括一个基本数据类型作为对象。ARRAY的数据对象把不同的基本数据类型的集合作为对象。对于RECORD的数据对象暴扣多种不同的基本数据类型作为对象。
在下一章,数据对象的特征进一步被描述,通过分析SSC的例子。
6.1 本地内存的定义
根据对象(VARIABLE,ARRAY和RECORD)来为本地内存分配数据对象
在大部分情况对象代码VARIABLE的情况下,如果希望的对象大小等于平台定义的数据类型,通过定义一个变量来分配VARIABLE的内存。
例子:定义一个本地内存(对象代码VARIABLE)
UINT32 u32VarObject;
其它两种对象(ARRAY和RECORD)将被定义成数据结构的形式。它包括一个8位的变量作为第一个成员(Subindex0),它包含了最高的子索引(最后一个对象的入口)
在SSC里,Subindex0将经常被定义为16位的变量因为,字节对齐的原因
typedef struct{
UINT16 u16SubIndex0;
UINT32 aEntries[4];
} _ARR_OBJ_DEF;
_ARR_OBJ_DEF ArrObj;
Define local memory(Object Code RECORD)
typedef struct{
UINT16 u16SubIndex0;
UINT8 u8FirstEntry;
UINT32 u32SecondEntry;
INT16 i16ThirdEntry;
} _REC_OBJ_DEF;
_REC_OBJ_DEF RecObj;
6.2 入口的描述
一个单一的入口描述是在TSDOINFOENTRYDESC里定义的。一个对象的所有入口描述是在一个队列里被引用的。在数据对象ARRAY的情况下,只要第一个入口是需要被描述的。
TSDOINFOENTRYDESC 成员变量
DataType unsigned 16bit 在【REF2】中定义的基本数据类型的索引
BitLength unsigned 16bit 数据对象的长度
ObjAccess unsigned 16bit bit 0:在Pre-Op在读接口
bit1:在Safe-Op读接口
bit2:在Op读接口
bit3:Pre-Op写接口
bit4:Safe-Op写接口
bit5:Op写接口
bit6:映射使能RxPDO
bit7:映射使能TxPDO
bit8:backup入口
bit9:settings入口
bit10:安全入口
bit11:安全出口
bit12:安全参数
对象描述
TSDOINFOENTRYDESC VarObjectEntryDesc =
{ DEFTYPE_UNSIGNED32,0x20,(ACCESS_READ|OBJACCESS_TXPDOMAPPING)};
Object description(Object Code ARRAY)
TSDOINFOENTRYDESC ArrObjEntryDesc[] = {
{DEFTYPE_UNSIGNED8,0x08,ACCESS_READ},
{DEFTYPE_UNSIGNED32,0x20,ACCESS_READ};
}
Note:The object entry only describes the Subindex0 and one entry because all entries are equal.
TSDOINFOENTRYDESC RecObjEntryDesc[]={
{DEFTYPE_UNSIGNED8,0X08,ACCESS_READ},
{DEFTYPE_UNSIGNED8,0X08,ACCESS_WRITE_PREOP},
{DEFTYPE_UNSIGNED32,0X20,(ACCESS_WRITE|OBJACCESS_RXPDOMAPPING)},
{DEFTYPE_INTEGER16,0X10,ACCESS_WRITE}
};
6.3 对象的名字
数据对象的名字是一个ASCII编码的名字。数据对象的名字VARIABLE和ARRAY是被一个名字描述包括“\0”.
如果数据对象的名字是RECORD,每个入口(除了Subindex0)被描述。在两个名字之间队列“\000”需要被添加。
UCHAR VarObjName [] = 'Test var obj";
UCHAR ArrObjName [] = "Array Obj";
UCHAR RecObjName[] = "Record Obj \000First Entry \000 Second Entry \000Third Entry \000\377";
6.4 数据对象的描述
数据对象的描述包含了所有的对象特性进去一个类型TOBJECT的数据结构。OBJECT里的成员变量包括下表
Example:Object dictionary entry description(Object Code VARIABLE)
TOBJECT VarObj_ODEntryDesc = {0x6000,{DEFTYPE_UNSIGNED32, 0|(OBJCODE_VAR<<8), &VarObjectEntryDesc,VarObjName,&u32VarObject,NULL,NULL,0x0000}}
TOBJECT ArrObj_ODEntryDesc = {0x9000,{DEFTYPE_UNSIGNED32,5 | (OBJCODE_ARR<<8)},ArrObjEntryDesc,ArrObjName,&ArrObj,NULL,NULL,0x0000};
6.5 索引范围
在SSC里面用到的基本索引范围如下
索引范围 描述
0x0000-0x0FFF 数据类型区
0x1000-01FFF 通信区
0x1600-0x19FF RXPDO映射区
0x1A00-0x1BFF RXPDO映射区
0x1c10-0x1C2f 同步管理器 PDO的分配
0x1C30-0x1C2F 同步管理器的参数
0x2000-0x5FFF 制造商的特殊区
0x6000-0x6FFF 输入区
0x7000-0x7FFF 输出区
0x8000-0x8FFF 配置区
0x9000-0x9FFF 信息区
0xA000-0xAFFF 诊断区
0xB000-0xBFFF 服务转移区
0xC000-0xEFFF 保持区
0xF000-0xFFF 设备区
在EL9800应用的对象的索引,根据模块设备简介,被应用的EL9800的应用层对象。
如下图
6.6 应用实例
6.6.1 每一个Enum对象的定义应该在范围为0x800-0x0FFF的范围内。一个Enum定义的内容是在【2】里面定义的。
每一个enum的值是一个4字节的无符号整型和一个名字。4字节的无符号整型是Byte灵活编码的。
“\058 = 5*8 + 8 =48 = 0x30 ”
CHAR sEnum0801_Value00[ ]= "\000\000\000\000Startup";
CHAR sEnum0801_Value01[ ]= "\001\000\000\000Running";
CHAR sEnum0801_Value02[ ]= "\012\000\000\000End";
CHAR *apEnum0801 [ ]={ sEnum0801_Value00, sEnum0801_Value01,sEnum0801_Value02};
OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x0801 [ ] =
{{DEFTYPE_UNSIGNED8, 8,ACCESS_READ | OBJACCESS_NOPDOMAPPING},
{DEFTYPE_OCTETSTRING, 8*SIZEOF(sEnum0801_Value00),ACCESS_READ|OBJACCESS_NOPDOMAPPING},
{DEFTYPE_OCTETSTRING,8*SIZEOF(sEnum0801_Value01),ACCESS_READ|OBJACCESS_NOPDOMAPPING}};
Define Object dictionary entry:ENUM Object
{NULL,NULL,0x0801,{DEFTYPE_ENUM,0x03|(OBJCODE_REC << 8)},asEntryDesc0x0801,0,apEnum0801},
Define New Object(using ENUM)
OBJCONST TSDOINFOENTRYDESC OBJMEM sEntryDesc0x2001 = {0x801,0x20,ACCESS_READ};