安装soem
windows下编译源代码
- 使用vs自带的make进行编译,我电脑安装有vs2022:
- 打开vs自带的环境控制台,切换到SOEM主站目录下
- 创建一个build目录,我们之后编译生成的文件放到这个目录
- 切换到build目录下,输入
cmake -G "NMake Makefiles" ..
, 生成makefile文件 - 输入
nmake
生成demo
源码分析
simple_test
- 网卡,ethercat适配器:ec_adapter
有两个属性:name和desc,名字和描述。
查看电脑所有的网卡,使用函数:ec_adaptert ec_find_adapters(void)
- Ethercat状态机检查:
OSAL_THREAD_FUNC ecatcheck(void *lpParam)
,以线程运行该函数,处理ethercat状态错误的情况 - simple_test:EtherCAT简单测试函数
- ec_init: EtherCAT初始化,参数是对应的网卡描述
- ec_config_init:使用初始化表初始化从站,那就使用TRUE作为参数,其他情况使用FALSE,返回值是找到的从站数量
- ec_config_iomap:将所有的pdo映射放入一个缓冲区
- dc时钟配置:ec_configdc
- 状态请求:ec_statecheck
ec_statecheck(0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4);
超时时间是微秒为单位,0表示所有从站,EC_STATE_SAFE_OP表示请求状态 - 设置从站状态,发送一次有效的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);
- 从站状态的读取:
ec_readstate()
- 定时器关闭:
timeKillEvent(mmResult)
,mmResult是timeSetEvent的返回值 - 修改从站的状态:ec_writestate(slave_id),如果slave_id是0,就表示所有的从站
- 关闭主站的socket:
ec_close();