EtherCAT主站SOEM源码解析----ecx_siiPDO()

本文介绍了从站EEPROM中PDO信息的存储方式及其读取方法,并通过EL1014实例展示了如何使用SOEM中的ecx_siiPDO()函数来统计每个同步管理器所对应的bitlength,最终返回bitlength的总和。

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个bytes
         c += 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(Simple Open Source EtherCAT Master)移植到 MCU(微控制器)上的过程中,需要遵循一系列步骤和注意事项,以确保系统的稳定性和实时性。以下是移植过程中的关键步骤与建议: ### 三、移植过程中的关键步骤与注意事项 #### 1. 适配系统时钟 系统时钟是确保 EtherCAT 主站运行稳定的关键因素之一。MCU 的系统时钟频率应与 EtherCAT 通信周期相匹配,通常为 1ms 或更短。在初始化阶段,应配置系统时钟并确保其精度[^1]。 #### 2. 配置 SysTick 定时器 在裸机环境下,SysTick 定时器通常用于实现周期性中断,以驱动 EtherCAT 的数据处理。为了保证 EtherCAT 数据的实时处理,应将 SysTick 的中断优先级设置为最高级别。示例代码如下: ```c void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); /* USER CODE BEGIN SysTick_IRQn 1 */ ecat_loop(); /* USER CODE END SysTick_IRQn 1 */ } void ecat_loop(void) { ecx_send_processdata(); ecx_receive_processdata(EC_TIMEOUTRET); } ``` 上述代码中,`ecx_send_processdata()` 和 `ecx_receive_processdata()` 是 SOEM 提供的用于发送和接收 EtherCAT 过程数据的接口。通过在 SysTick 中断中调用这些函数,可以实现周期性地处理 EtherCAT 数据流[^1]。 #### 3. 初始化网络接口 EtherCAT 主站需要通过以太网接口与从站设备通信。在 MCU 上,需要配置 MAC 控制器,并确保其支持 EtherCAT 的帧格式和传输速率。通常需要使用专用的以太网 PHY 芯片,并配置为全双工模式。 #### 4. 配置内存管理 SOEM 在运行过程中需要动态分配内存,用于存储从站信息、数据缓冲区等。在 MCU 上,由于内存资源有限,应合理配置堆栈大小,并考虑使用静态内存分配策略以提高稳定性。 #### 5. 实现底层硬件抽象层(HAL) SOEM 提供了硬件抽象层(HAL)接口,用于与底层硬件交互。在移植过程中,需要根据 MCU 的具体型号,实现以下功能: - 网络数据收发(`ec_send` 和 `ec_recv`) - 时间戳管理(`ec_gettime`) - 内存操作(`ec_malloc`、`ec_free`) #### 6. 实时操作系统(RTOS)适配(可选) 如果使用 RTOS(如 FreeRTOS、ThreadX),应将 EtherCAT 主站任务设置为高优先级任务,并确保其调度周期与 EtherCAT 的通信周期一致。此外,应合理配置任务栈大小,避免栈溢出。 #### 7. 调试与测试 移植完成后,需对 EtherCAT 主站进行充分的调试与测试,包括: - 从站设备识别与配置 - 过程数据收发的准确性 - 系统在高负载下的稳定性 - 异常情况下的恢复能力 可通过 SOEM 提供的命令行工具或调试接口进行诊断与日志输出。 ###
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值