1.背景
2.EtherCAT主站軟件方案
3.1 RT-Thread 下載
本次移植基于最新發(fā)布的release4.1.0, 這個(gè)可以到github下載,最近Gitee也更新了。移植EtherCAT之前,首先把Nuvoton的BSP跑起來(lái)。這個(gè)參考官方的文檔就可以了。
3.2 Some移植
下載soem-1.4.0,將整個(gè)目錄放在rt-thread項(xiàng)目里,下圖是我的目錄,供參考
在some-1.4.0及其子目錄中需要手工編輯SConscript腳本,這兒就不展開(kāi)了。后續(xù)我把源碼打包發(fā)上來(lái)。
Some移植主要是三個(gè)文件 osal.c,oshw.c和nicdrv.c。
osal.c 主要是微秒及的延時(shí)和定時(shí)函數(shù);
oshw.c 主要是網(wǎng)絡(luò)端和本機(jī)端數(shù)據(jù)的大小端轉(zhuǎn)換;
nicdrv.c 主要是網(wǎng)絡(luò)數(shù)據(jù)收發(fā)。
Some已經(jīng)給出了很多操作系統(tǒng)移植,我的移植是基于rtk,這個(gè)是嵌入式系統(tǒng),和我們的開(kāi)發(fā)環(huán)境最接近。
3.2.1 osal.c移植
主要內(nèi)容是實(shí)現(xiàn)osal_usleep和osal_gettimeofday兩個(gè)函數(shù)。
我開(kāi)始思路是自定義一個(gè)定時(shí)器用于EtherCAT,當(dāng)時(shí)用了Timer4。等實(shí)現(xiàn)差不多了,發(fā)現(xiàn)系統(tǒng)時(shí)鐘用的是Timer5,很多地方功能重復(fù)。最終和系統(tǒng)共用Timer5,省了個(gè)Timer,代碼也簡(jiǎn)化了不少。下面就是改動(dòng)過(guò)的相關(guān)代碼,osal_timer_init這個(gè)初始化函數(shù)要在啟動(dòng)EhterCAT功能之前調(diào)用。
1staticrt_uint32_tus_ticks;
2voidosal_timer_init(void)
3{
4rt_uint32_tcmp=ETIMER_GetCompareData(5);
5us_ticks=1*cmp/(1000000/RT_TICK_PER_SECOND);
6rt_kprintf("rt-threadhwtimer51us=%dticks
",us_ticks);
7}
8intosal_usleep(uint32usec)
9{
10//udelay(usec);
11/*ajustmentforprecision*/
12//usec-=usec/4080;
13usec-=usec/1500;
14/*rt_hw_us_delayworkforadelaylessthan16us*/
15do{
16if(usec>=1000)
17{
18rt_hw_us_delay(1000);
19usec-=1000;
20}else{
21rt_hw_us_delay(usec);
22usec=0;
23}
24}while(usec>0);
25return0;
26}
27intosal_gettimeofday(structtimeval*tv,structtimezone*tz)
28{
29//returngettimeofday(tv,tz);
30RT_ASSERT(tv!=NULL);
31rt_uint32_ttimer_tick,rt_tick;
32rt_base_tlevel=rt_hw_interrupt_disable();
33timer_tick=ETIMER_GetCounter(5);
34rt_tick=rt_tick_get();
35rt_hw_interrupt_enable(level);
36tv->tv_sec=rt_tick/1000;
37tv->tv_usec=(rt_tick%1000)*1000+timer_tick/us_ticks;
38return0;
39}
3.2.2 oshw.c移植
不需做什么工作。
3.2.3 nicdrv.c移植
主要修改就是調(diào)用自己的網(wǎng)絡(luò)發(fā)送和接收函數(shù),我把它們命名為net_send和net_recv。這兩個(gè)函數(shù)最好的實(shí)現(xiàn)是直接操作網(wǎng)卡(或者叫emac),我現(xiàn)在的實(shí)現(xiàn)參考了tcpdump的方法,在協(xié)議棧中加鉤子(hook)實(shí)現(xiàn),這樣對(duì)原來(lái)系統(tǒng)影響最小,網(wǎng)口除了EtherCAT,還可以當(dāng)正常的網(wǎng)口用。
ecx_setupnic函數(shù)中創(chuàng)建mutex(這個(gè)按照rt-thread格式改一下即可),安裝網(wǎng)絡(luò)鉤子
ecx_closenic函數(shù)中刪除mutex,卸載網(wǎng)絡(luò)鉤子。
3.2.4 net_hook.c實(shí)現(xiàn)
主要實(shí)現(xiàn)EtherCAT數(shù)據(jù)幀收發(fā),中間加了個(gè)環(huán)形緩沖區(qū)用于接收。具體原理就是在網(wǎng)卡加個(gè)鉤子函數(shù),有數(shù)據(jù)來(lái)的時(shí)候先經(jīng)過(guò)鉤子函數(shù),我們把EtherCAT數(shù)據(jù)幀截住,不傳給原來(lái)的lwip協(xié)議棧;如果要發(fā)送數(shù)據(jù),就直接調(diào)用發(fā)送函數(shù),繞過(guò)lwip協(xié)議棧。這樣也不影響lwip協(xié)議棧工作。
具體實(shí)現(xiàn)見(jiàn)附件。
3.2.5 some基本功能測(cè)試
采用官方的slave_info測(cè)試代碼,測(cè)試主要分為時(shí)鐘測(cè)試和soem EtherCAT協(xié)議?;竟δ軠y(cè)試。在終端中輸入 soem_test + 回車(chē)即可。
我接了一個(gè)匯川IS620N驅(qū)動(dòng)器,下面是輸出的部分內(nèi)容:
1Slave:1
2Name:IS620N
3Outputsize:96bits
4Inputsize:224bits
5State:4
6Delay:0[ns]
7HasDC:1
8DCParentport:0
9Activeports:1.0.0.0
10Configuredaddress:1001
11Man:00100000ID:000c0108Rev:00010001
12SM0A:1000L:128F:00010026Type:1
13SM1A:1400L:128F:00010022Type:2
14SM2A:1800L:12F:00010064Type:3
15SM3A:1c00L:28F:00010020Type:4
16FMMU0Ls:00000000Ll:12Lsb:0Leb:7Ps:1800Psb:0Ty:02Act:01
17FMMU1Ls:0000000cLl:28Lsb:0Leb:7Ps:1c00Psb:0Ty:01Act:01
18FMMUfunc0:11:22:03:0
19MBXlengthwr:128rd:128MBXprotocols:04
20CoEdetails:0dFoEdetails:00EoEdetails:00SoEdetails:00
21Ebuscurrent:0[mA]
22onlyLRD/LWR:0
4. 運(yùn)動(dòng)控制測(cè)試
基礎(chǔ)工作做好以后,我們就能真正的控制電機(jī)運(yùn)行了。在控制電機(jī)運(yùn)行之前,還需要了解CIA402相關(guān)的規(guī)范,啟動(dòng)伺服需要按照規(guī)范要求,按順序來(lái)。
程序主要流程如下,具體代碼見(jiàn)附件。
a)初始化時(shí)鐘 osal_timer_init
b)初始化網(wǎng)卡ec_init
c)等待進(jìn)入INIT態(tài)
d)初始化驅(qū)動(dòng)器(is620n)ec_config_init
e)DC配置
f)申請(qǐng)并等待進(jìn)入Pre-OP態(tài)
g)配置過(guò)程數(shù)據(jù)TxPDO/RxPDO(自定義函數(shù)process_data_config)
h)配置FMMU ec_config_map
i)申請(qǐng)并等待進(jìn)入Safe-OP態(tài)
j)設(shè)置CSP模式
k)發(fā)送和接收過(guò)程數(shù)據(jù)1次,觸發(fā)SLAVE
l)申請(qǐng)并等待進(jìn)入OP態(tài)
m)進(jìn)入過(guò)程數(shù)據(jù)收發(fā)循環(huán)
在進(jìn)入數(shù)據(jù)數(shù)據(jù)收發(fā)循環(huán)后,按次序發(fā)送控制字啟動(dòng)伺服(6040h發(fā)送6,7和15),然后就可以不斷發(fā)送新的控制位置讓電機(jī)轉(zhuǎn)起來(lái)了!
5. 總結(jié)
版權(quán)聲明:本文為RT-Thread論壇用戶(hù)「lg28870983」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
https://club.rt-thread.org/ask/article/160414965e80294e.html
———————End———————
你可以添加微信:rtthread2020 為好友,注明:公司+姓名,拉進(jìn)RT-Thread官方微信交流群!
愛(ài)我就給我點(diǎn)在看
點(diǎn)擊閱讀原文
原文標(biāo)題:NUC980 DIY項(xiàng)目大挑戰(zhàn) - EtherCAT實(shí)現(xiàn)
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
RT-Thread
+關(guān)注
關(guān)注
32文章
1406瀏覽量
41903
原文標(biāo)題:NUC980 DIY項(xiàng)目大挑戰(zhàn) - EtherCAT實(shí)現(xiàn)
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
打破協(xié)議壁壘,CAN轉(zhuǎn)EtherCAT連接工業(yè)相機(jī)秒變跨國(guó)CP”!
讓電磁閥“聽(tīng)懂”EtherCAT:耐達(dá)訊CAN轉(zhuǎn)EtherCAT網(wǎng)關(guān)
基于米爾安路飛龍派FPGA FPSoC+移植SOEM實(shí)現(xiàn)EtherCAT主站控制功能

CAN轉(zhuǎn)EtherCAT網(wǎng)關(guān)在食品機(jī)械領(lǐng)域的應(yīng)用

PROFINET到EtherCAT主站協(xié)議轉(zhuǎn)換網(wǎng)關(guān)的工程實(shí)現(xiàn)指引

PROFINET轉(zhuǎn)EtherCAT網(wǎng)關(guān)的基礎(chǔ)原理應(yīng)用
為工業(yè)通信架起一座高效、穩(wěn)定的橋梁!疆鴻智能Ethercat轉(zhuǎn)TCP/IP解決方案應(yīng)運(yùn)而生!
突破性技術(shù):制藥凍干機(jī)實(shí)現(xiàn)EtherCAT與Profinet網(wǎng)關(guān)模塊無(wú)縫監(jiān)控集成


DIY項(xiàng)目中常用的端子類(lèi)型
科技綻放-EtherCAT轉(zhuǎn)Profinet網(wǎng)關(guān)智能連接項(xiàng)目


舵機(jī)技術(shù)新紀(jì)元:解鎖DIY項(xiàng)目的無(wú)限可能
基于Sitara平臺(tái)的EtherCAT主從站實(shí)現(xiàn)

評(píng)論