EtherCAT之对象字典解析

来源:互联网 发布:照片flash制作软件 编辑:程序博客网 时间:2024/06/05 16:50
关于对象字典的数据结构如下:
/*/////////////////////////////////////////////////////////////////////////////////////////////    Object dictionary entry structure*/typedef struct OBJ_ENTRY{#if !STATIC_OBJECT_DIC    struct OBJ_ENTRY                      *pPrev;                    //previous entry(object) in the object dictionary list    struct OBJ_ENTRY                      *pNext;                    //next entry(object) in the object dictionary list#endif //#if !STATIC_OBJECT_DIC    UINT16                                Index;    TSDOINFOOBJDESC                       ObjDesc;    OBJCONST TSDOINFOENTRYDESC OBJMEM     *pEntryDesc;    OBJCONST UCHAR OBJMEM                 *pName;    void MBXMEM                           *pVarPtr;    UINT8 (* Read)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess );    UINT8 (* Write)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess );    UINT16                                 NonVolatileOffset;}TOBJECT;

代码1

对象字典的对象的数据结构是采用链表的形式,组成整个对象字典。

其中,在对象里面定义了索引,对象的描述,SDO入口指针的描述,对象字典的名称,变量的指针,还定义了读和写两个虚函数

ObjDesc的数据结构如下:

typedef struct MBX_STRUCT_PACKED_START{    UINT16            DataType;            // 关于索引的数据类型    UINT16            ObjFlags;    /*对象代码和最大子索引将被人为得设置在对象字典里面,这个值经常以大端模式被创造 */    #define    OBJFLAGS_MAXSUBINDEXMASK    0x00FF//最大子索引的掩码    #define    OBJFLAGS_MAXSUBINDEXSHIFT   0 //最大子索引的偏移    #define    OBJFLAGS_OBJCODEMASK        0x0F00//对象的掩码    #define    OBJFLAGS_OBJCODESHIFT       8 //对象的偏移    #define    OBJCODE_VAR                 0x07    #define    OBJCODE_ARR                 0x08    #define    OBJCODE_REC                 0x09//        char                Name[];                // rest of mailbox data}MBX_STRUCT_PACKED_ENDTSDOINFOOBJDESC;
代码2
其中,对于OBJCODE里面这三个宏定义OBJCODE_VAR  OBJCODE_ARR  OBJCODE_REC(请问这三个宏定义分别代表着哪三种情况)

从字面上的意思来说,OBJCODE的变量,OBJCODE的队列,OBJCODE的记录

OBJCODE通过函数  

 UINT8 objCode = (pObjEntry->ObjDesc.ObjFlags & OBJFLAGS_OBJCODEMASK) >> OBJFLAGS_OBJCODESHIFT;

最后,得出的是OBJCODE的类别

如果是变量的话,就return 0;

如果是对象的队列和记录得话,则可以得出OBJCODE的偏移量

如果对象字典object code的类别得出是OBJCODE的队列的时候,得出对象字典的入口地址是&pObjEntry->pEntryDesc[1];

如果,是OBJCODE_REC的时候,得出的对象字典的入口地址是&pObjEntryDesc[i];

Obj_Desc的作用是为了找到关于对象的描述


SDO入口地址的描述

// SDO Information / Entry Description:typedef struct MBX_STRUCT_PACKED_START{    UINT16                DataType;                // 关于索引的数据类型    UINT16                BitLength;    UINT16                ObjAccess;                // Bit 0: Read Access in Pre-Op                                                    // Bit 1: Read Access in Safe-Op                                                    // Bit 2: Read Access in Op                                                  // Bit 3: Write Access in Pre-Op                                                // Bit 4: Write Access in Safe-Op                                              // Bit 5: Write Access in Op                                              // Bit 6: mappable in RxPDO                                              // Bit 7: mappable in TxPDO                                             // Bit 8: entry will be included in backup                                             // Bit 9: entry will be included in settings        #define    ACCESS_READWRITE             0x003F        #define    ACCESS_READ                  0x0007        #define    ACCESS_READ_PREOP            0x0001        #define    ACCESS_READ_SAFEOP           0x0002        #define    ACCESS_READ_OP               0x0004        #define    ACCESS_WRITE                 0x0038        #define    ACCESS_WRITE_PREOP           0x0008        #define    ACCESS_WRITE_SAFEOP          0x0010        #define    ACCESS_WRITE_OP              0x0020        #define    OBJACCESS_NOPDOMAPPING       0x0000        #define    OBJACCESS_RXPDOMAPPING       0x0040        #define    OBJACCESS_TXPDOMAPPING       0x0080        #define    OBJACCESS_BACKUP             0x0100        #define    OBJACCESS_SETTINGS           0x0200        #define    OBJACCESS_SAFEINPUTS         0x0400        #define    OBJACCESS_SAFEOUTPUTS        0x0800        #define    OBJACCESS_SAFEPARAMETER      0x1000//        UINT16            UnitType;                // optional if bit3 of valueInfo//        UINT8                DefaultValue[];        // optional if bit4 of valueInfo//        UINT8                MinValue[];            // optional if bit5 of valueInfo//        UINT8                MaxValue[];            // optional if bit6 of valueInfo//        char                Desc[];                 // rest of mailbox data}MBX_STRUCT_PACKED_ENDTSDOINFOENTRYDESC;
代码3

算法:
    for (i = 1; i <= subindex; i++)
    {
        /* get the entry description获得入口描述 */
        if (objCode == OBJCODE_ARR)
            pEntry = &pObjEntry->pEntryDesc[1];
        else
            pEntry = &pObjEntry->pEntryDesc[i];

这里根据子索引数找到相关的入口地址

其中,pObjEntry->pEntryDesc (见代码1),是定义了一个指针,指针类型是TSDOINFOENTRYDESC的结构体。那里上面的代码是指向它相邻的一个结构体的pEntryDesc吗?那这个pEntryDesc,是存放它第一个子索引的入口描述?

那它子索引的初始化是怎样初始化?



原创粉丝点击