基于STM32H743芯片和SOEM的EtherCAT主站源码

发布时间 2023-03-31 08:51:34作者: 27699885

STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码 提供配套CUBE工程
SOEM协议栈使用1.3.1版本。
可配套NUCLEO-H743ZI开发板使用。
支持DC同步。
可配合汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B/A6B和欧姆龙G5系列驱动器使用,或提供想适配的驱动器型号

 

 

目录

目录 1

1 引言 2

1.1 编写目的 2

1.2 参考资料 2

2 源码梳理 3

2.1 文件功能说明 3

2.2 基础知识 3

2.2.1 寻址方式 3

2.3 底层驱动移植 4

2.3.1 定时器移植 4

2.3.2 网卡驱动移植 4

2.4 函数说明 5

2.4.1 EE访问过程 5

2.4.2 ec_config_init 6

2.4.3 ec_config_map 7

2.5 分布时钟 8

2.5.1 解决计数时刻不一致的问题 8

2.5.2 计算传输延时 8

2.5.3 ESC 时间控制环以及漂移补偿 8

3 伺服适配 10

3.1 汇川IS620N 10

3.2 欧姆龙G5 11

3.3 松下A5B 11

引言

编写目的

  • 记录SOEM学习过程
  • 看是否能用在实际工程中

参考资料

  • SOEM-1.3.1源码

源码梳理

文件功能说明

名称 主要功能
ethercatbase.c 基本EtherCAT功能函数,主要包含的是一些EtherCAT通信服务命令函数以及EtherCAT数据帧组成的函数
ethercatcoe.c CoE(CAN over EtherCAT)模块,包含的是应用层CoE协议相关的一些结构体和数据操作函数
ethercatconfig.c EtherCAT主站配置模块,包含的是EtherCAT主站对从站的基本配置函数
ethercatconfiglist.h 此文件包含的是一个列表,里面包含了一些已知产品参数的EtherCAT从站
ethercatdc.c EtherCAT分布时钟功能,包含了EtherCAT分布时钟(Distributed Clock)相关配置的函数
ethercatmain.c EtherCAT主要功能模块,包含了EtherCAT初始化、状态设置和读取、邮箱数据通信、从站EEPROM操作、从站信息接口SII读和过程数据交换等函数。以及定义ec_slave[],所有从站信息都在这个结构体中
ethercatprint.c 将EtherCAT错误转换成可读信息模块,SDO中止信息和应用层状态代码用于传递从站信息给用户应用层,所以这个文件里函数的主要功能是将二进制码转换成可读的文本信息
ethercattype.c 此文件主要是一些新的类型定义和宏定义,使用这些可以给具体的应用程序带来优化和便利
nicdrv.c EtherCAT原始套接字驱动,主要包含了使用网卡NIC和socket通信来发送数据帧的函数
osal.c 定时器配置模块,主要包含了一些定时器设置和延时等函数
oshw.c 此文件中包含的函数主要用来识别现在这台机器上现有的网卡信息
simple_test.c 此文件是根据自己所需的EtherCAT主站开发所编写的程序,通过各种配置,数据发送和读取

基础知识

寻址方式

顺序寻址 主站按照物理连接的先后顺序进行寻址,一般用在主机刚刚启动时
设置寻址 主站按照设置给每个从站的地址进行寻址,1001、1002……
逻辑寻址 主站将每个从站的地址映射到一个虚拟的4G缓存区,进行寻址(这种寻址比较实用、方便)。逻辑寻址的管理有从站的FMMU进行管理,FMMU将本地内存映射到主机设置的4G内存中的一块区域中。主站可以通过逻辑地址方便的读取任一从站的内存。
广播寻址  

底层驱动移植

定时器移植

  • 底层驱动需要开启一个周期性定时器,一来作为SOEM主站的时间基准,二来作为与从站PDO数据交换的周期,如125us、250us、500us、1000us。
  • 定时器定时时长通过宏定义PDI_DC_CYCLE定义,默认为1000000ns(1ms),这个根据实际应用修改。
  • 设置定时器时有个技巧,系统时钟分频后,定时器每个tick的时间是250ns,这个跟调节每次PDO数据交互有关,这个非常关键

  • SOEM系统本地时间用一个结构体表示,表示系统上电后执行了多长时间。
  • 系统产生一个1ms定时中断,每次中断usec+=1000,如果usec超过1000000(1s)则sec+=1, usec-=1000

D:\XXX\SOEM\外快\1ms定时中断.png

网卡驱动移植

  • 网卡驱动是移植的重点
  • ecx_outframe函数完成数据发送,这块要根据自己的硬件平台适配

D:\XXX\SOEM\成功的工程\网卡发送驱动.png

  • ecx_recvpkt函数完成网口数据接收,这块要根据自己的硬件平台适配

函数说明

EE访问过程

 

  • 有明确地址的直接通过ecx_readeeprom1()和ecx_readeeprom2()访问
  • 后面的category需要通过ecx_siifind函数找到对应的EE起始地址,然后通过地址偏移的方式ecx_siigetbyte访问EE

读的一般步骤为:

  1. 读取EEPROM控制/状态寄存器0x0502:0x0503的内容,确认EEPROM没有处于Busy状态
  2. 向0x0502:0x0503写入读控制命令,写入的值为0x0100,向0x0504:0x0507写入需要读的EEPROM地址
  3. 重复步骤(1)
  4. 从寄存器0x0508:0x050F中读取对应EEPROM地址的内容

读取一次SOEM主站需要发送4帧数据。

步骤(1)和(2)在SOEM源码中对应的实现函数为ecx_readeeprom1()。

步骤(3)和(4)在SOEM源码中对应的实现函数为ecx_readeeprom2()。

ec_config_init

  • 获取连接的从站个数,获取从站的信息并将从站的信息填充到ec_slave结构体

 

ec_config_map

  • SOEM通过函数ec_config_map(&IOmap)完成逻辑地址和物理地址的映射,应用程序需要定义一个数组IOmap,完成映射后,应用程序就可以通过读写数组IOmap[]来完成与从站的数据交换。

https://img-blog.csdn.net/20161017131102591

  • 首先获取每一个从站的RXPDO和TXPOD对应的字节数,两个函数可以实现这个功能
ecx_map_coe_soe->

 

ecx_readPDOmap

这个函数通过读取1C00h对象的值(代表四个SM的类型),得到1C12和1C13对应的1600和1A00,进而得到1600和1A00对应的子索引个数,然后分别读取子索引1……N(60400010 60600008),得到累计长度
ecx_map_sii 当上面那个函数失败后就会通过这个函数完成,主要是通过读取从站EE中category pdo完成
  • 然后配置SYNCManager寄存器
  • 最后通过FMMU映射地址,实际上就是将从站数据和IOmap中的一块区域关联上

分布时钟

  • https://blog.csdn.net/ethercat_i7/article/details/52858758
  • 所谓时钟同步,是指所有从站间时钟同步,即各从站的系统标准时间相同:在同一时刻,各个从站报的时钟数值都相同(系统时间相同)。当然,严格意义上的时钟同步是不存在的,只能在一定精度上达到时钟同步, EtherCAT 上的时钟同步是远远低于 1 微秒的,实践中可以做到几个ns。

解决计数时刻不一致的问题

  • 通过函数ec_configdc实现
  •  在计算时间偏差Toffset(n)和传输延时之前,主站需要发送一个广播命令BWR,写所有从站端口0的接收时间寄存器0x0900,将所有从站捕捉数据帧第一个前导位到达每个端口的本地时间保存到寄存器0x0900~0x090F, 每个端口使用4个字节。
  • 读取数据帧处理单元接收时间,与主站的系统时间比较,差值作为Toffset(n)写入从站寄存器0x0920

  • SOEM只在初始化时使从站时间同步主站时间,若要运行后使主从时间同步,需要定期修正主站时间或从站时间。

计算传输延时

  • 通过函数ec_configdc实现,计算传输延时并写入从站寄存器0x0928

ESC 时间控制环以及漂移补偿

  • 在运行过程中,主站使用命令FRMW读取第一个DC从站的时间并写入到后续DC从站,达到时间同步的目的。
  • 除了保证所有从站间时钟同步,还要保证主站的数据发送中断相对于SYNC中断有一个固定的时间差,以保证在CSP模式时的稳定。通过函数ec_sync实现,使用了PI调节算法。补偿完毕后1ms定时中断相对于同步中断时间差稳定在490us左右,抖动16us.

伺服适配

汇川IS620N

  • 需要特别注意的是IS620N伺服需要在PRE-OP状态下配置DC

D:\SOEM\外快\IS620N初始化.png

  • 直接扫描驱动器时得到的PDO映射比较简单,初始化时将PDO映射初始化成最复杂的一组PDO映射(1704h+1B02h)。这样所有的模式都可以通过PDO方式操作了。

欧姆龙G5

  • 显示区的拨码开关用于设置从站地址,00是控制器配置,01-99按拨码开关的配置

D:\SOEM\外快\欧姆龙驱动配置.png

  • 控制字要遵循状态机6-7-15
  • 使用默认PDO映射组就可以(1701和1B01那一组)
  • 电机编码器分辨率1048576
  • 在PRE-OP阶段配置DC,要不然报警90

松下A5B

  • 控制字要遵循状态机6-7-15
  • 电机编码器分辨率131072
  • 使用默认PDO映射1600h和1A00h
  • 伺服支持FREERUN和DC两种模式

源码使用

  • 双击ctb.printf1.0.0.pack进行安装,支持串口1打印消息