在Windows环境下使用SOEM进行EtherCAT开发——准备篇
Dawn Hill 结丹

[toc]

写在前面

很久前就听说过EtherCAT,还专门看了通信协议,什么协议栈,什么状态机,什么数据字典,什么1060,什么PDO,什么SDO的,但是一直很懵圈。原因我总结了一下,抱着文档抱着书本,不行啊!

我能搞到EtherCAT的Slave,也就是从站,所以我就想,我自己学学开发EtherCAT主站,发发命令,接收命令,读读反馈信息,这不就摸索一下就会了吗。

然后我就查,首先收费的肯定排除了。那倍福相关的东西就被我屏蔽掉了。然后眼前就浮现出了IGH和SOEM。因为我发现某产品用的IGH,所以我IGH折腾了挺长时间(当然是业余折腾,不影响工作和陪儿子玩),在Linux系统中编译,居然有教程里说补实时补丁,我Linux系统里还有好多别的东西呢,我这个就是试试啊,万一整崩溃了,可亏了,不打补丁,然后稀里糊涂的编过了,也一直没拿从站试,试也没想好怎么试,感觉太难了。然后就过了好久。

最近用了一个EtherCAT的驱动器,编码器总有问题,总要清错,是在不爱拆开插USB清错了,连上一根网线,几条命令就搞定的话该有多好,于是今天又想到了还有一个选项,可以在Windows环境下用SOEM。

其实我连SOEM全称还说不对呢。

正式开始准备

准备环境

首先在百度上正经的搜了一下SOEM,第一个弹出来的应该就是官方网站了。据我的经验靠谱的资料还是靠官方,官方搞不懂搜CSDN,资料太少再谷歌,毕竟翻墙一次不容易,要点好几下。
image
打开果断再点一下主站相关内容SOEM (Simle Open EtherCAT Master),在这里我注意到了SOEM的全称。

这个页面告诉我们,SOEM是用c语言写的EtherCAT主站库,它的目的是学而用,所有人都可以通过研究源码来理解EtherCAT主站是如何与从站进行交互的。在Windows系统中使用SOEM需要具备以下条件。

  • Windows2000 - Windows 7 (8 not tested, might work).
  • VC compiler (others might work, just not tested).
  • One (or two if in redundant mode) 100Mb/s NIC that can connect to a RAW socket.
  • WinPcap installed.

第一项我就不符合,我Win10啊,咋整,重装系统?不行。再往下看吧。VC编译器,这个可以,现成的。第三个不知道是啥玩意儿,好像是网卡,是不是能插网线就可以,不知道,继续吧。WinPcap这个肯定是个软件,我一搜,找到了。这种东西一定要去官网下,找到合适自己的版本。不然你就等着折腾吧。按照某些所谓的教程,一步接着一步来,都不知道自己在干啥。

编译源码

源码地址要去官方地方找:https://github.com/OpenEtherCATsociety/SOEM
我下的压缩包,然后解压,发现里面有个CMakeLists.txt文件,不错,感觉好熟悉。
于是,我打开了神奇的CMake 3.15.3 简单配置了一下。

image

自然而然地点击了Configure之后又点击了Generate。

然后打开了前几天新安的Visual Studio 2019 免费版。找到生成的工程文件,SOEM.sln,整个过程特别熟悉:生成(B)->批生成(T)…->勾上ALL_BUILD->点击生成(B),不大一会儿就完事了。如果想看看都生成了啥可以点一下INSTALL,就能在一个提前设置好的地方看到生成的可执行程序、lib文件、头文件了。估计以后会用得到。

简单的测试

代码编译好了之后咋用呢?简单的测试不简单啊!

我回到了SOEM主站介绍的网页,看到了特别亲切的一个词Tutorial,它就在正文第一行,怎么刚才没看见,选择性眼盲啊。打开一看,哇!感觉从基础到专业的内容都有了。开啃吧。

SOEM是一个为用户应用程序提供发送和接收EtherCAT帧的方法库。它为应用程序提供下列方法:

  • 通过SOEM发送和接收数据来读写“过程数据”
  • 保持本地IO数据与全局IO映射同步
  • 检测SOEM报告的错误
  • 管理SOEM报告的错误

好像第三第四条就是我想要的,当然前两条要是也能学会就更好了。

下面几节将展示一些关于如何启动和运行SOEM的基本示例,以及如何使用过程数据和检查错误。由于所有代码都是应用程序或全局变量的本地代码,所以可以在可能的情况下进行调整和优化。

哇,基本示例,好激动。

下面的示例展示了如何添加由启动代码调用的主函数。在这个例子中,main的唯一目的是生成一个执行SOEM的新任务。

1
2
3
4
int main (void)
{
rprintp("SOEM (Simple Open EtherCAT Master)\nSimple test\n");
task_spawn ("simpletest", simpletest, 9, 8192, NULL);

这是个什么玩意儿?这也叫例子?rprintp是啥啊?task_spawn任务启动?难道这是伪代码?“simpletest”,这个我好像看到过哦?继续看吧……懵……
下面讲SOEM配置了,Configuration嘛。
在应用程序启动之后,我们需要设置NIC作为EtherCAT以太网接口。在一个简单的设置中,我们调用ec_init(ifname),如果SOEM支持电缆冗余,我们调用ec_init_redundant,它将打开第二个端口作为备份。如果您在nicdrv.c中选择了一个专用NIC,则可以将ifname赋值为NULL进行发送。如果成功,它将返回>0的值。
1
2
/* initialise SOEM, bind socket to ifname */
if (ec_init(ifname) > 0)

ヾ(≧O≦)〃嗷~,这一段,信息量太大。NIC是啥?查了一下,network interface controller,网络接口控制器,又叫网络适配器,也就是网卡。要设置网卡,咋设置?用ec_init(ifname)设置,那这个ifname就顺理成章的是网卡咯?这玩意儿的值咋给啊?

你们猜文档后面会说不,我猜不会,所以我查别的去了。

在CSDN上查到了两篇博客

image image

神人就是多啊。

这个函数主要是初始化SOEM,将网卡和socket绑定起来。其中ifname是个const char*类型的字符串,可以运行slaveinfo.c来获取。比如我的电脑就是:
\Device\NPF_{9A10D941-1301-4A51-A856-024B1399EA32}

不过我发现他俩文字中电脑的NIC一样的,但是第一个图片里的好像不是,不过无所谓了,反正能搞到NIC了。

打开我们刚才编译的那个工程文件,把slaveinfo设为默认启动程序,像这样

image

然后就启动啊,看到了啥没?眼睛要是快的话是能看到的,不过我估计大部分人看不到。我在return(0)的前面加了一条getchar(),然后我这慢眼神终于看清了。这个过程写起来简单,对于那么快就懵的我,还是历经波折的。

image

找到了就快启动simpletest测试一下吧,好激动啊。
网口连上EtherCAT从站,

1
simple_test.exe \Device\NPF_{727D913F-23BC-421F-A071-7F597A7026B4}

结果来啦,成功找到了从站。

image

我觉得到了这一步,我说的话它就能听见了,它说的我也能看见了。懂不懂另说。

先来看看它说了啥。

  • 它说它找到了一个一个从站,没错啊,我就连了一个!太好了还给我配置好了。
  • 它说从站映射了,从站状态是SAFE_OP,大写字母第一眼没看懂,就是安全运行状态呗。
    这里涉及到一个词状态机,具体内容这个博客说的特别清楚
  • 接着是从站IO信息,大概是有几个分段,每个分段多长吧。
  • 接着是一些从站的输入输出数据,workcounter有三个,每个从站有一个输入、两个输出(还不是很清楚原因)。
  • 然后是从站的输出和输入数据和时间值。

后面预告

关于EtherCAT的内容,粗略了解之后其实应该系统的学习一下,最好有个学习指导材料啥的,最近找到一个加泰罗尼亚理工大学一个机器人实验室的网站有介绍EtherCAT的wiki,可以接下来研究学习一下。
https://sir.upc.edu/wikis/roblab/index.php/Development/Ethercat


image

 打赏作者
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量