本文由RT-Thread论坛用户@lg28870983原创发布:https://club.rt-thread.org/ask/article/160414965e80294e.html

1.背景

最近计划DIY一个EtherCAT控制器,一直在看资料和选型,初步定了NUC980的方案,主要是看中NUC980的RAM比较大,采购还算方便(最近缺芯,大家都懂)。

选定硬件之后,NUC980跑什么系统呢?从以往经验来看,ARM9一般跑linux比较多,资源也好找,同时官方提供BSP。但这次任务有点特殊,EtherCAT对实时性要求比较高,linux不是最合适的。结合MCU开发经验,就准备上个RTOS,以前M3和M4的芯片,主要用FreeRTOS,最近也开始用RT-Thread。新唐官方也推出了NUC980的RT-Thread版BSP,对开发者非常友好,最终决定了NUC980+RT-Thread的方案。

刚好最近官方有个DIY项目官方活动,就报了名。

2.EtherCAT主站软件方案

EtherCAT本身还是比较复杂的,我们就不自己造轮子了,考虑用开源方案,毕竟硬件成本这么低,商用方案是真的用不起啊!
现在开源主站主要就两种,SOEM和IGH(相关的资料网上很多,这儿就不展开了),IGH只支持linux,所以只能选SOME,最新版本是SOEM1.4,本次移植就基于该版本。

3. 移植过程

3.1 RT-Thread 下载
本次移植基于最新发布的release4.1.0, 这个可以到github下载,最近Gitee也更新了。移植EtherCAT之前,首先把Nuvoton的BSP跑起来。这个参考官方的文档就可以了。

3.2 Some移植
下载soem-1.4.0,将整个目录放在rt-thread项目里,下图是我的目录,供参考
在some-1.4.0及其子目录中需要手工编辑SConscript脚本,这儿就不展开了。后续我把源码打包发上来。

Some移植主要是三个文件 osal.c,oshw.c和nicdrv.c。
osal.c 主要是微秒及的延时和定时函数;
oshw.c 主要是网络端和本机端数据的大小端转换;
nicdrv.c 主要是网络数据收发。

Some已经给出了很多操作系统移植,我的移植是基于rtk,这个是嵌入式系统,和我们的开发环境最接近。

3.2.1 osal.c移植
主要内容是实现osal_usleep和osal_gettimeofday两个函数。
我开始思路是自定义一个定时器用于EtherCAT,当时用了Timer4。等实现差不多了,发现系统时钟用的是Timer5,很多地方功能重复。最终和系统共用Timer5,省了个Timer,代码也简化了不少。下面就是改动过的相关代码,osal_timer_init这个初始化函数要在启动EhterCAT功能之前调用。

static rt_uint32_t us_ticks;void osal_timer_init(void)
{rt_uint32_t cmp = ETIMER_GetCompareData(5);us_ticks = 1 * cmp / (1000000 / RT_TICK_PER_SECOND);rt_kprintf("rt-thread hwtimer5 1us = %d ticks\n", us_ticks);
}int osal_usleep (uint32 usec)
{//udelay(usec);/*ajustment for precision*///usec -= usec / 4080;usec -= usec / 1500;/*rt_hw_us_delay work for a delay less than 16us*/do{if(usec>=1000){rt_hw_us_delay(1000);usec -= 1000;}else{rt_hw_us_delay(usec);usec = 0;}}while(usec>0);return 0;
}int osal_gettimeofday(struct timeval *tv, struct timezone *tz)
{
//   return gettimeofday(tv, tz);RT_ASSERT (tv != NULL);rt_uint32_t timer_tick,rt_tick;rt_base_t level = rt_hw_interrupt_disable();timer_tick = ETIMER_GetCounter(5);rt_tick = rt_tick_get();rt_hw_interrupt_enable(level);tv->tv_sec = rt_tick/1000;tv->tv_usec = (rt_tick % 1000)*1000 + timer_tick / us_ticks;return 0;
}

3.2.2 oshw.c移植
不需做什么工作。

3.2.3 nicdrv.c移植
主要修改就是调用自己的网络发送和接收函数,我把它们命名为net_send和net_recv。这两个函数最好的实现是直接操作网卡(或者叫emac),我现在的实现参考了tcpdump的方法,在协议栈中加钩子(hook)实现,这样对原来系统影响最小,网口除了EtherCAT,还可以当正常的网口用。

ecx_setupnic函数中创建mutex(这个按照rt-thread格式改一下即可),安装网络钩子
ecx_closenic函数中删除mutex,卸载网络钩子。

3.2.4 net_hook.c实现

主要实现EtherCAT数据帧收发,中间加了个环形缓冲区用于接收。具体原理就是在网卡加个钩子函数,有数据来的时候先经过钩子函数,我们把EtherCAT数据帧截住,不传给原来的lwip协议栈;如果要发送数据,就直接调用发送函数,绕过lwip协议栈。这样也不影响lwip协议栈工作。

具体实现见附件。

3.2.5 some基本功能测试

采用官方的slave_info测试代码,测试主要分为时钟测试和soem EtherCAT协议栈基本功能测试。在终端中输入 soem_test + 回车即可。
我接了一个汇川IS620N驱动器,下面是输出的部分内容:

Slave:1Name:IS620NOutput size: 96bitsInput size: 224bitsState: 4Delay: 0[ns]Has DC: 1DCParentport:0Activeports:1.0.0.0Configured address: 1001Man: 00100000 ID: 000c0108 Rev: 00010001SM0 A:1000 L: 128 F:00010026 Type:1SM1 A:1400 L: 128 F:00010022 Type:2SM2 A:1800 L:  12 F:00010064 Type:3SM3 A:1c00 L:  28 F:00010020 Type:4FMMU0 Ls:00000000 Ll:  12 Lsb:0 Leb:7 Ps:1800 Psb:0 Ty:02 Act:01FMMU1 Ls:0000000c Ll:  28 Lsb:0 Leb:7 Ps:1c00 Psb:0 Ty:01 Act:01FMMUfunc 0:1 1:2 2:0 3:0MBX length wr: 128 rd: 128 MBX protocols : 04CoE details: 0d FoE details: 00 EoE details: 00 SoE details: 00Ebus current: 0[mA]only LRD/LWR:0

4. 运动控制测试

基础工作做好以后,我们就能真正的控制电机运行了。在控制电机运行之前,还需要了解CIA402相关的规范,启动伺服需要按照规范要求,按顺序来。

程序主要流程如下,具体代码见附件。

a)初始化时钟 osal_timer_init
b)初始化网卡ec_init
c)等待进入INIT态

d)初始化驱动器(is620n)ec_config_init
e)DC配置

f)申请并等待进入Pre-OP态
g)配置过程数据TxPDO/RxPDO(自定义函数process_data_config)
h)配置FMMU ec_config_map

i)申请并等待进入Safe-OP态

j)设置CSP模式
k)发送和接收过程数据1次,触发SLAVE
l)申请并等待进入OP态

m)进入过程数据收发循环

在进入数据数据收发循环后,按次序发送控制字启动伺服(6040h发送6,7和15),然后就可以不断发送新的控制位置让电机转起来了!

5. 总结

整个移植过程还是充满了挑战,主要也是因为今年才开始接触EtherCAT,很多概念是边学边用,网上也参考了不少同学的帖子。很多人反应汇川的伺服用SOEM驱动DC同步模式总是有问题,确实遇到了很多奇奇怪怪的问题。经过这两个月的折腾,总算开了个头,基础打好了。

下一步可优化的就是现在的网络移植改用直接操作emac,这样可以减少网络抖动。

附件程序里还参考本站贴子移植了uffs文件系统,编译如果有问题,可能还需要下载uffs、ramdisk、optparse和netutils包。

链接: https://pan.baidu.com/s/1uWbiUfzX1R061OJQ5LG6OQ?pwd=wdtt
提取码: wdtt

SOEM已经提交PR #1260,等待通过。有问题可通过本帖留言或邮件联系我,大家一起改进。

NUC980 DIY项目大挑战 - EtherCAT实现相关推荐

  1. Html5 Egret游戏开发 成语大挑战(二)干净的eui项目和资源准备

    Html5 Egret游戏开发 成语大挑战(二)干净的eui项目和资源准备 现在我们使用egret来起步开发一个名叫<成语大挑战>的小游戏,关于egret的开发环境就不在这里啰嗦了,直接去 ...

  2. 苹果首任AI总监Ruslan Salakhutdinov:如何应对深度学习的两大挑战?(附视频)

    虽然用AI算法可以解决很多问题,但当前还是面临很多局限性和挑战.卡内基梅隆大学教授.苹果首任AI总监Ruslan Salakhutdino认为,当前面对的挑战主要分为以下四大类: 1) 自然语言理解与 ...

  3. 微软亚洲研究院刘铁岩博士:迎接深度学习的“大”挑战(一)

    微软亚洲研究院刘铁岩博士:迎接深度学习的"大"挑战(一) 所属栏目: 科技资讯    发布时间: 2017-03-11 14:42:10   文章来源:雷锋网   阅读:2674 ...

  4. 区块链应用落地的6大挑战

    都说现在是区块链时代,但是我们生活中用到的区块链应用其实是屈指可数,甚至大部分普通大众完全没有接触到区块链相关应用.区块链时代来临已经有一段时间了,国家的鼓励.各行业巨头的布局也早都开展起来了,那为什 ...

  5. 2021年全球知名开源项目大更新

    下面简单回顾 2021 年一些带来较大变化和影响的项目更新信息. PHP 8.1.0 正式发布 枚举,只读属性,First-class 可调用语法,新的初始化器,纯交集类型,Never 返回类型,Fi ...

  6. 机器学习九大挑战(转载)

    人工智能(AI)的未来令人充满期待,但目前却存在着一些问题,而且往往和道德伦理相关.机器学习在哪些方面让我们感到震惊?你能骗过一台机器吗?如果能,难度有多大?<终结者>里的Skynet(天 ...

  7. Html5 Egret游戏开发 成语大挑战(五)界面切换和数据处理

    Html5 Egret游戏开发 成语大挑战(五)界面切换和数据处理 经过前面的制作,使用Egret的Wing很快完成了开始界面和选关卡界面,下面通常来说就是游戏界面,但此时界面切换和关卡数据还没有准备 ...

  8. CSDN产品公告第3期:博客数据统计功能上线,OFFER大挑战等你来!

    各位小主,咱们又见面了!在前两期的公告中,CSDN产品组已感受到大家对我们深沉的爱,再此谢谢大家的褒贬.服务好每一位用户,是我们一直不变的初心. 在过去一周,开发在产品的鞭策下,又带来了哪些功能呢? ...

  9. Html5 Egret游戏开发 成语大挑战(一)开篇

    最近接触了Egret白鹭引擎,感觉非常好用,提供了各种各样的开发工具让开发者和设计者更加便捷,并且基于typescript语言开发省去了很多学习成本,对于我们这种掉微软坑许久的童鞋来说,确实很有吸引力 ...

  10. Html5 Egret游戏开发 成语大挑战(八)一般性二级页面处理

    Html5 Egret游戏开发 成语大挑战(八)一般性二级页面处理 在游戏中,我们一般会有各种各样的二级页面,比如游戏暂停界面或者游戏结束界面,这些界面组成了对玩家交互主要手段,在游戏开发中,对于这些 ...

最新文章

  1. python3 uuid模块
  2. 苍狼敏捷方法核心 v1
  3. Node.js 启动调试方式
  4. 题目一:给出一个n,代表有从1到n的数字[1,2,3,··· n],问可以构成多少种二叉搜索树?...
  5. python网络爬虫_一篇文章教会你利用Python网络爬虫获取穷游攻略
  6. 解决pip2安装不成功的问题
  7. python batch_size_Python config.batch_size方法代码示例
  8. L1-012 计算指数 (5 分)—团体程序设计天梯赛
  9. 无线打印机服务器如何使用,普通打印机如何变身无线打印?
  10. 建立正确的目标收益率
  11. 随机排列与八卦太极的联系
  12. k8s安装nfs-subdir-external-provisioner插件
  13. PayPal账户遭大规模冻结!跨境卖家如何自救?
  14. 面稀土,战码家(二)
  15. Android中3D gallary的实现
  16. 分布式系统和分布式数据库系统(介绍篇)
  17. 北京Uber优步司机奖励政策(12月31日)
  18. PHP域名权重查询接口源码
  19. android好还是华为好,这三款华为手机值得推荐,不只是贵的就是好的
  20. 《白帽子讲WEB安全》学习笔记之第9章 认证与会话管理

热门文章

  1. ibm x5服务器系统重装,IBM 3850 X5 Server安装Windows 2003步骤说明
  2. Keil 5安装教程
  3. holtek c语言,合泰单片机c语言教程
  4. sqlserver200864位下载_Microsoft SQL Server 2008 R2 官方简体中文正式版下载
  5. 2008 r2 server sql 中文版补丁_sql server 2008 r2 sp2
  6. Linux chmod 命令 设置权限
  7. 维护通讯录的方法及群组通讯录 管理平台
  8. 30套最实用JAVA学习视频教程合集 2012
  9. jquery ajax 详细教程视频,jquery ajax 视频教程
  10. poi导出excel 损坏_poi导出excel解决方法