EtherCAT主站SOEM源码解析----IOmap
来源:互联网 发布:淘宝极有家是正品吗 编辑:程序博客网 时间:2024/06/05 20:30
SOEM通过函数ec_config_map(&IOmap)完成逻辑地址和物理地址的映射,应用程序需要定义一个数组IOmap,例如:
char IOmap[4096];
完成映射后,应用程序就可以通过读写数组IOmap[]来完成与从站的数据交换。
1、映射关系
SOEM首先将所有从站的输出映射到IOmap[]的开始位置,然后是输入,如下图所示:
2、具体实现
函数ec_config_map(&IOmap)最终会调用/soem/EthercatConfig.c中的以下函数完成映射。
int ecx_config_map_group(ecx_contextt *context, void *pIOmap, uint8 group)
该函数完成主要的功能为:
1. 读取从站EEPROM中的PDO信息,统计需要映射的输入输出长度;
2. 根据步骤1的结果配置从站SM寄存器;
3. 将从站的输出映射到IOmap[],并配置从站FMMU寄存器;
4. 将从站的输入映射到Iomap[],并配置从站FMMU寄存器;
5. 为应用程序提供读写IOmap[]的接口。
具体代码如下:
int ecx_config_map_group(ecx_contextt *context, void *pIOmap, uint8 group){ ...... if ((*(context->slavecount) > 0) && (group < context->maxgroup)) { ...... /* find CoE and SoE mapping of slaves in multiple threads */ for (slave = 1; slave <= *(context->slavecount); slave++) { ...... ecx_map_coe_soe(context, slave); ...... } /* find SII mapping of slave and program SM */ for (slave = 1; slave <= *(context->slavecount); slave++) { if (!group || (group == context->slavelist[slave].group)) { ecx_map_sii(context, slave); //统计需要mapping的输入输出长度,单位为bit ecx_map_sm(context, slave); //配置从站SM寄存器 } } /* do input mapping of slave and program FMMUs */ //源代码注释的bug? 此处input 应为output for (slave = 1; slave <= *(context->slavecount); slave++) { ..... /* program FMMU for output */配置从站FMMU寄存器 ecx_FPWR(context->port, configadr, ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc), sizeof(ec_fmmut), &(context->slavelist[slave].FMMU[FMMUc]), EC_TIMEOUTRET3); ...... //为应用程序提供接口 context->grouplist[group].outputs = pIOmap; context->grouplist[group].Obytes = LogAddr; context->grouplist[group].nsegments = currentsegment + 1; //currentsegment初始值为0 context->grouplist[group].Isegment = currentsegment; context->grouplist[group].Ioffset = segmentsize; /* do input mapping of slave and program FMMUs */ //output mapping? for (slave = 1; slave <= *(context->slavecount); slave++) { ...... /* program FMMU for input */配置从站FMMU寄存器 ecx_FPWR(context->port, configadr, ECT_REG_FMMU0 + (sizeof(ec_fmmut) * FMMUc), sizeof(ec_fmmut), &(context->slavelist[slave].FMMU[FMMUc]), EC_TIMEOUTRET3); ...... } //为应用程序提供接口 context->grouplist[group].IOsegment[currentsegment] = segmentsize; context->grouplist[group].nsegments = currentsegment + 1; context->grouplist[group].inputs = (uint8 *)(pIOmap) + context->grouplist[group].Obytes; context->grouplist[group].Ibytes = LogAddr - context->grouplist[group].Obytes; } return 0;}
3、映射实例
在SOEM 说明文档中有1个IOmap的例子,如下图所示:
http://openethercatsociety.github.io/doc/soem/tutorial_8txt.html
Slave2 EL4001 的1*16bit 输出被映射到逻辑地址的最开始处。
Slave6、7、8、9每个站只有2bit,被映射到一个逻辑地址中。
0 0
- EtherCAT主站SOEM源码解析----IOmap
- EtherCAT主站SOEM源码解析----EEPROM访问
- EtherCAT主站SOEM源码解析----ecx_siiPDO()
- EtherCAT主站SOEM源码解析----Raw Socket
- EtherCAT主站SOEM源码解析----同步管理器SM配置
- EtherCAT主站SOEM源码解析----分布时钟DC
- EtherCAT主站SOEM在Ubuntu上的移植
- 开源Ethercat主站 SOEM和IgH的比较
- 编译SOEM(Simle Open EtherCAT Master)-windows篇
- EtherCAT之对象字典解析
- EtherCAT之对象字典解析
- 1 IgH EtherCAT 主站
- ethercat
- EtherCAT
- IgH EtherCAT Master 源码编译安装
- IgH EtherCAT Master 源码编译安装
- Beckoff的EtherCAT从站代码架构解析
- 倍福提供的EtherCAT从站代码包解析
- UVa 136 Ugly Numbers
- 我学习的开始
- LinearLayout布局中每个控件之间添加分割线
- 1到100的累加
- 7.4.1 Dumping Data in SQL Format with mysqldump
- EtherCAT主站SOEM源码解析----IOmap
- unity接入ShareREC(iOS)SDK --获取录制的包含外部声音的视频路径
- hzwer2015.9.13 NOIP模拟题 explo seq earth[DP][数论][二分][SPFA]
- 如何开发数字货币
- 编程求1!+2!+3!+...+10!的值
- iOS 开发工具(一)
- SQL 数据库 学习 027 查询-10 group by --- 以某字段分组
- Hadoop Mapreduce 浅析
- Java数组