SOEM的simple_test代码分析

发布时间 2023-09-17 21:08:37作者: joke-dream

安装soem

  1. 下载SOEM的源码,点击链接
  2. 下载windows下的插件,winpcap
  3. 安装winpcap,傻瓜式安装
  4. 解压代码包

windows下编译源代码

  1. 使用vs自带的make进行编译,我电脑安装有vs2022:
  2. 打开vs自带的环境控制台,切换到SOEM主站目录下
  3. 创建一个build目录,我们之后编译生成的文件放到这个目录
  4. 切换到build目录下,输入 cmake -G "NMake Makefiles" .., 生成makefile文件
  5. 输入nmake生成demo

源码分析

simple_test

  1. 网卡,ethercat适配器:ec_adapter
    有两个属性:name和desc,名字和描述。
    查看电脑所有的网卡,使用函数:ec_adaptert ec_find_adapters(void)
  2. Ethercat状态机检查:OSAL_THREAD_FUNC ecatcheck(void *lpParam),以线程运行该函数,处理ethercat状态错误的情况
  3. simple_test:EtherCAT简单测试函数
  4. ec_init: EtherCAT初始化,参数是对应的网卡描述
  5. ec_config_init:使用初始化表初始化从站,那就使用TRUE作为参数,其他情况使用FALSE,返回值是找到的从站数量
  6. ec_config_iomap:将所有的pdo映射放入一个缓冲区
  7. dc时钟配置:ec_configdc
  8. 状态请求:ec_statecheck ec_statecheck(0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4); 超时时间是微秒为单位,0表示所有从站,EC_STATE_SAFE_OP表示请求状态
  9. 设置从站状态,发送一次有效的pdo数据,设置周期任务,修改所有从站状态为OP:
  ec_slave[0].state = EC_STATE_OPERATIONAL;
  /* send one valid process data to make outputs in slaves happy*/
  ec_send_processdata();
  ec_receive_processdata(EC_TIMEOUTRET);

  /* start RT thread as periodic MM timer */
  mmResult = timeSetEvent(1, 0, RTthread, 0, TIME_PERIODIC);

  /* request OP state for all slaves */
  ec_writestate(0);
  1. 从站状态的读取:ec_readstate()
  2. 定时器关闭:timeKillEvent(mmResult),mmResult是timeSetEvent的返回值
  3. 修改从站的状态:ec_writestate(slave_id),如果slave_id是0,就表示所有的从站
  4. 关闭主站的socket:ec_close();