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,是存放它第一个子索引的入口描述?
那它子索引的初始化是怎样初始化?
- EtherCAT之对象字典解析
- EtherCAT之对象字典解析
- 解析url成字典对象
- ethercat
- EtherCAT
- xmc4300 ethercat 学习之路
- EtherCAT之Lan9252调试笔记
- EtherCAT主站SOEM源码解析----EEPROM访问
- EtherCAT主站SOEM源码解析----ecx_siiPDO()
- EtherCAT主站SOEM源码解析----IOmap
- EtherCAT主站SOEM源码解析----Raw Socket
- LinuxCNC+EtherCAT(4)之LinuxCNC overview
- 字典解析
- 将url的查询参数解析成字典对象
- 将url的查询参数解析成字典对象
- 将url的查询参数解析成字典对象
- Beckoff的EtherCAT从站代码架构解析
- 倍福提供的EtherCAT从站代码包解析
- js综合应用简单的表格统计
- android系统资源更换-语言切换或配置改变
- centos6.2下配置nfs
- java公司面试题与答案详解
- 科技创新如何让汽车变得更“智能”?
- EtherCAT之对象字典解析
- 使用Jdbc连接Oracle数据库
- yii路由器
- Java高新技术-JDK1.5总结-----黑马程序员
- 2013校作息时间表暂存
- jquery选择器
- 搬走ERP代理商肩上的“三座大山”
- android 的依赖注入技术 RoboGuice
- 国内公有云对比(1.6)- 功能篇总结