EtherCAT主站SOEM源码解析----ecx_siiPDO()
1、从站EEPROM的PDO信息
从站EEPROM存储的PDO信息如下如所示:
TxPDO的类型名为50(0x0032),RxPDO的类型名为51(0x0033).
每个PDO占用的EEPROM字节数为8+8*er(er位Entry个数)。
2、读取PDOx信息
SOEM中函数ecx_siiPDO()读取EEPROM中PDO信息并:
(1) 统计每个SM所对应的bit length
(2) 返回bit length的总和。
int ecx_siiPDO(ecx_contextt *context, uint16 slave, ec_eepromPDOt* PDO, uint8 t)
{uint16 a , w, c, e, er, Size;uint8 eectl = context->slavelist[slave].eep_pdi;Size = 0;PDO->nPDO = 0;PDO->Length = 0;PDO->Index[1] = 0;for (c = 0 ; c < EC_MAXSM ; c++) PDO->SMbitsize[c] = 0;if (t > 1)t = 1;PDO->Startpos = ecx_siifind(context, slave, ECT_SII_PDO + t);if (PDO->Startpos > 0){a = PDO->Startpos;w = ecx_siigetbyte(context, slave, a++);w += (ecx_siigetbyte(context, slave, a++) << 8);PDO->Length = w; //PDO信息的字数c = 1;/* traverse through all PDOs */do //每执行一次do循环,a的值会增加8*e+8, c的值会增加4*e+4, e为PDO中的Entry数目{PDO->nPDO++;PDO->Index[PDO->nPDO] = ecx_siigetbyte(context, slave, a++);PDO->Index[PDO->nPDO] += (ecx_siigetbyte(context, slave, a++) << 8);PDO->BitSize[PDO->nPDO] = 0;c++;e = ecx_siigetbyte(context, slave, a++); //entry 数目PDO->SyncM[PDO->nPDO] = ecx_siigetbyte(context, slave, a++); //该PDO属于哪个同步管理器a += 4; //a=8, 跳转到Entry1,每个Entry8个bytesc += 2; //c的单位为字,a的单位为字节if (PDO->SyncM[PDO->nPDO] < EC_MAXSM) /* active and in range SM? */{/* read all entries defined in PDO */for (er = 1; er <= e; er++) //每执行一次for循环,c的值会加4,a的值会加8{c += 4;a += 5;PDO->BitSize[PDO->nPDO] += ecx_siigetbyte(context, slave, a++);a += 2;}PDO->SMbitsize[PDO->SyncM[PDO->nPDO] ] += PDO->BitSize[PDO->nPDO];Size += PDO->BitSize[PDO->nPDO];c++;}else /* PDO deactivated because SM is 0xff or > EC_MAXSM */{c += 4 * e;a += 8 * e;c++;}if (PDO->nPDO >= (EC_MAXEEPDO - 1)){c = PDO->Length; /* limit number of PDO entries in buffer */}}while (c < PDO->Length);}if (eectl){ecx_eeprom2pdi(context, slave); /* if eeprom control was previously pdi then restore */}return (Size);
}
3、EL1014实例
EL1014中EEPROM中存储的TxPDO信息如下:
总共有4个PDO,每个PDO包含1个Entry,每个Entry的bitlen为1,所以调用函数ecx_siiPDO()读取EL1014 PDO信息时,该函数的返回值为4.
EtherCAT主站SOEM源码解析----ecx_siiPDO()相关推荐
- EtherCAT主站SOEM源码解析----分布时钟DC
分布时钟(DC,Dsitributed Clock)可以使所有EtherCAT设备使用相同的系统时间,从而控制各设备任务的同步执行. 1.DC从站 支持分布式时钟的从站称为DC从站,同步原理如下所示: ...
- SOEM 源码解析 ecx_LWR
/* LWR "logical memory write" primitive. Blocking.* 逻辑写(LWR) Logical write 原语 阻塞* @param[i ...
- SOEM 源码解析 ecx_FPWR
/* FPWR "configured address write" primitive. Blocking.* 配置的地址物理写(FPWR) Configured address ...
- SOEM 源码解析 ecx_LRD
/* LRD "logical memory read" primitive. Blocking.* 逻辑读(LRD) Logical read 原语 阻塞* @param[in] ...
- SOEM 源码解析 ecx_FRMW
/* FPRMW "configured address read, multiple write" primitive. Blocking.* 配置的地址物理读多次写(FRMW) ...
- SOEM 源码解析 ecx_set_slaves_to_default
寄存器0x0101 寄存器0x0200 寄存器0x0300 寄存器0x0600 寄存器0x0800 寄存器0x0981 寄存器0x0910 寄存器0x0930 寄存器0x0934 寄存器0x0103 ...
- SOEM 源码解析 ecx_map_sii
/* find SII mapping of slave* 查找从站的 SII 映射* @param[in] context = context struct* 上下文结构体* @param[in] ...
- SOEM 源码解析 ecx_APRD
/* APRD "auto increment address read" primitive. Blocking.* 自增式物理读(APRD) Auto increment ph ...
- SOEM 源码解析 ecx_SDOerror
/* Report SDO error.* 报告SDO错误* @param[in] context = context struct* 上下文结构体* @param[in] Slave = Slave ...
最新文章
- 成功解决ModuleNotFoundError: No module named ‘sklearn.grid_search‘
- haproxy的丰富特性简介
- Boost在Linux和windows下的编译 32位 64位
- 10-多写一个@Autowired导致程序崩了
- Maven开发笔记(四)—— Maven中plugins和pluginManagement
- 微信小程序开发学习笔记001--认识微信小程序,第一个微信小程序
- linux 限速命令,Linux下网卡限速
- 数据分析汇报用这个神器,让他们弃用了Excel和PPT
- 安装Linux系统的一些问题记载
- sql vb xml 换行_VB中文本框换行--------急!!!
- Excel表格打印时不打印标记填充颜色
- 百度、阿里、美团、头条…论剑AI,这里有开发者想知道的未来
- 连载:中国最早的一代官派留学生--留美幼童 (结尾)
- 哪些软件是用C++写的
- 计算机二级讲座宣传语,计算机二级讲座策划书.doc
- Print a rhombus (C++)
- 青铜三人行之青蛙跳台阶
- 织梦 DEDECMS LOOP标签的用法及调用
- Linux服务器运行状况全面监测
- 计算机网络安全漏洞及防范措施论文,浅谈计算机网络安全漏洞及防范措施论文.doc...