EtherCAT之对象字典解析

关于对象字典的数据结构如下:
/*/
//
//    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_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入口地址的描述

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

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



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值