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,是存放它第一个子索引的入口描述?
那它子索引的初始化是怎样初始化?
关于对象字典的数据结构如下:
[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,是存放它第一个子索引的入口描述?
那它子索引的初始化是怎样初始化?
相关文章推荐
- eclipse的svn插件连接osc的代码仓库时候报错的解决办法
- leetcode模式匹配算法
- 对通用输入输出GPIO的深入理解
- 在你决定之前,想想你真需要APP?你真的需要网站吗?
- 栈的动态顺序存储表示
- AngularJS过滤器
- python 图片上添加数字源代码
- 使用正则表达式替换字符串中的字符
- 更简单的非递归遍历二叉树的方法
- 期末考试-最大公约数(算法基础 第10周)
- WebRTC源代码探索之旅——多线程篇-6
- 软引用的集合
- JavaScript 中定义函数时用 var foo = function () {} 和 function foo() 的区别
- C语言之可变参数
- storm+kafka:WordCount程序
- Exception in thread "main" java.lang.ClassCastException: $Proxy13
- HTML把内容居中怎么弄
- Android Binder ProcessState & IPCThreadState相关介绍
- maven整合webservice(cxf)的时候可能会出现的问题
- 【智力题】拿硬币(数数字)、游戏