您的位置:首页 > 其它

EtherCAT之对象字典解析

2016-06-23 17:30 786 查看
原文地址:http://blog.csdn.net/huangxianxinalice/article/details/10956137

关于对象字典的数据结构如下:

[cpp] view
plain copy

/*///////////////////////////////////////////////////////////////////////////////////////// 

// 

//    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的数据结构如下:

[cpp] view
plain copy

typedef struct MBX_STRUCT_PACKED_START  

{  

    UINT16            DataType;            // 关于索引的数据类型  

    UINT16            ObjFlags;  

    /*对象代码和最大子索引将被人为得设置在对象字典里面,这个值经常以大端模式被创造 */  

    #define    OBJFLAGS_MAXSUBINDEXMASK    0x00FF//最大子索引的掩码  

    #define    OBJFLAGS_MAXSUBINDEXSHIFT   0<span style="white-space:pre">  </span> //最大子索引的偏移  

    #define    OBJFLAGS_OBJCODEMASK        0x0F00//对象的掩码  

    #define    OBJFLAGS_OBJCODESHIFT       8<span style="white-space:pre">  </span> //对象的偏移  

  

    #define    OBJCODE_VAR                 0x07  

    #define    OBJCODE_ARR                 0x08  

    #define    OBJCODE_REC                 0x09  

//        char                Name[];                // rest of mailbox data  

}MBX_STRUCT_PACKED_END  

TSDOINFOOBJDESC;  

代码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入口地址的描述

[cpp] view
plain copy

// 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  

                                              <span style="white-space:pre">    </span>    // Bit 3: Write Access in Pre-Op  

                                            <span style="white-space:pre">  </span>    // Bit 4: Write Access in Safe-Op  

                                          <span style="white-space:pre">    </span>    // Bit 5: Write Access in Op  

                                          <span style="white-space:pre">    </span>    // Bit 6: mappable in RxPDO  

                                          <span style="white-space:pre">    </span>    // Bit 7: mappable in TxPDO  

                                         <span style="white-space:pre"> </span>    // Bit 8: entry will be included in backup  

                                         <span style="white-space:pre"> </span>    // 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_END  

TSDOINFOENTRYDESC;  

代码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,是存放它第一个子索引的入口描述?

那它子索引的初始化是怎样初始化?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: