試零差云控EtherCAT電機(jī)實(shí)戰(zhàn))
先把結(jié)論放在前面我這套流程跑通的最終形態(tài)是讓一臺(tái)裝了Ubuntu 22.04的工控機(jī)作為IGH主站去識(shí)別、掃描、控制零差云控的EtherCAT驅(qū)控一體電機(jī)同時(shí)保留一臺(tái)Windows機(jī)器上的TwinCAT3作為另一套主站方案兩套方案共用同一臺(tái)電機(jī)、同一根網(wǎng)線在需要的時(shí)候隨時(shí)切換。很多人一聽EtherCAT調(diào)試就默認(rèn)必須用Windows加TwinCAT3實(shí)際上在Linux下用IGHEtherLab開源主站做從站掃描、PDO映射、狀態(tài)機(jī)控制是成本最低、最方便自動(dòng)化腳本化的路線而TwinCAT3的圖形化界面和伺服整定工具又是IGH替代不了的。這篇記錄就是圍繞這個(gè)真實(shí)場(chǎng)景展開的適合正在做機(jī)器人關(guān)節(jié)調(diào)試、自動(dòng)化設(shè)備軸控、或者想把Linux接入EtherCAT體系的朋友參考。零差云控的電機(jī)尤其是eRob系列關(guān)節(jié)模組和驅(qū)控一體機(jī)目前在國(guó)內(nèi)機(jī)器人項(xiàng)目里出現(xiàn)頻率很高它本身支持標(biāo)準(zhǔn)CiA402協(xié)議EtherCAT從站做得也比較規(guī)整這意味著它和IGH、TwinCAT3之間的對(duì)接不需要什么私有協(xié)議認(rèn)準(zhǔn)對(duì)象字典、PDO映射就能玩轉(zhuǎn)。但也正因?yàn)橹虚g隔了一層開源主站網(wǎng)卡、實(shí)時(shí)性、ESI文件、狀態(tài)機(jī)這些坑一個(gè)都不會(huì)少。這篇文章我會(huì)把從環(huán)境準(zhǔn)備到IGH跑通、再到TwinCAT3對(duì)接、最后兩套主站如何和平共處的完整過程都寫出來末尾附上我踩過的問題清單照著抄能省不少時(shí)間。1. 先理清為什么在Ubuntu 22.04下調(diào)EtherCAT會(huì)同時(shí)用到兩個(gè)主站1.1 IGH和TwinCAT3不是競(jìng)品是互補(bǔ)工具很多人一開始會(huì)問既然IGH能控制電機(jī)為什么還要折騰TwinCAT3反過來也一樣既然TwinCAT3那么成熟為什么還要在Ubuntu下編譯IGH我自己的體會(huì)是這兩個(gè)東西根本不是一個(gè)賽道上的工具。IGH是運(yùn)行在Linux內(nèi)核空間的EtherCAT主站它最擅長(zhǎng)的是被腳本調(diào)用、被ROS集成、被塞進(jìn)自動(dòng)化產(chǎn)線做長(zhǎng)時(shí)間穩(wěn)定性測(cè)試。一旦你掌握了ethercat命令行和它的用戶態(tài)接口寫一個(gè)自動(dòng)壓測(cè)腳本、記錄從站狀態(tài)變化、循環(huán)啟停電機(jī)都是幾分鐘的事。而TwinCAT3是倍福的工業(yè)自動(dòng)化平臺(tái)它的價(jià)值在工程化圖形化掃描設(shè)備、自動(dòng)加載ESI、NC軸配置、波形分析、伺服參數(shù)整定再加上PLC編程生態(tài)確實(shí)適合做項(xiàng)目交付和設(shè)備聯(lián)調(diào)。實(shí)際項(xiàng)目里最常見的情況是研發(fā)階段用IGH快速驗(yàn)證電機(jī)好不好使、鏈路穩(wěn)不穩(wěn)定、PDO映射有沒有問題到了現(xiàn)場(chǎng)聯(lián)調(diào)或者給客戶做培訓(xùn)的時(shí)候又得把TwinCAT3搬出來按行業(yè)習(xí)慣完成伺服配置。兩臺(tái)設(shè)備、兩套主站對(duì)應(yīng)同一個(gè)電機(jī)這就逼著你把兩條路都趟一遍。1.2 零差云控電機(jī)為什么適合做這類調(diào)試的樣板零差云控的電機(jī)在國(guó)產(chǎn)機(jī)器人供應(yīng)鏈里算是很典型的EtherCAT從站設(shè)備。它內(nèi)部集成了驅(qū)動(dòng)器支持位置模式、速度模式、力矩模式協(xié)議上走標(biāo)準(zhǔn)CiA402輸出的是位置反饋、速度反饋這些常規(guī)對(duì)象字典。這個(gè)東西的好處在于它的從站信息SII/ESI不是隨便糊弄的你掃描進(jìn)IGH或者TwinCAT3以后看到的信息和你拿到的設(shè)備手冊(cè)能對(duì)上這一點(diǎn)對(duì)調(diào)試來說極其重要。我手里這臺(tái)是零差云控的EtherCAT驅(qū)控一體機(jī)支持24V/48V供電帶增量式編碼器接口控制板上有標(biāo)準(zhǔn)的RJ45 EtherCAT IN/OUT口出線定義相對(duì)清晰。用IGH掃描時(shí)能識(shí)別到廠商ID、產(chǎn)品碼、版本號(hào)后續(xù)配置PDO的時(shí)候也能按照它的XML描述文件去勾選對(duì)象。如果你用其他品牌的國(guó)產(chǎn)伺服流程基本一樣但零差云控這個(gè)型號(hào)是我實(shí)際驗(yàn)證過的寫起來也更有底氣。1.3 我采用的調(diào)試拓?fù)湔{(diào)試環(huán)境分為兩條鏈路鏈路一Ubuntu 22.04工控機(jī)板載Intel網(wǎng)卡運(yùn)行IGH主站網(wǎng)線直連零差云控電機(jī)的EtherCAT IN口。鏈路二Windows筆記本或虛擬機(jī)安裝TwinCAT3通過同一根網(wǎng)線直連同一臺(tái)電機(jī)。為什么不加交換機(jī)EtherCAT雖然物理上是以太網(wǎng)但它不是普通TCP/IP它的報(bào)文轉(zhuǎn)發(fā)依賴從站的硬件處理普通交換機(jī)無法識(shí)別EtherCAT幀甚至可能直接丟包。現(xiàn)場(chǎng)調(diào)試最簡(jiǎn)單可靠的方式就是主站網(wǎng)卡到從站IN口直連如果從站有OUT口可以繼續(xù)串聯(lián)下一臺(tái)但第一臺(tái)必須接主站。所以我的拓?fù)淅餂]有任何交換機(jī)的存在兩臺(tái)電腦只是物理上輪流插網(wǎng)線沒有同時(shí)連接。這里多提一句如果你確實(shí)需要多主站切換建議在從站網(wǎng)口前做一個(gè)手動(dòng)切換開關(guān)或者干脆像我一樣斷電后換線。EtherCAT線纜不支持熱插拔主站和從站上下電順序錯(cuò)了輕則狀態(tài)機(jī)報(bào)錯(cuò)重則SII讀不出來后面我會(huì)專門聊這個(gè)問題。2. 環(huán)境搭建從裸機(jī)Ubuntu 22.04到IGH主站跑起來2.1 系統(tǒng)準(zhǔn)備與編譯依賴IGH本身編譯不會(huì)太苛刻但Ubuntu 22.04默認(rèn)內(nèi)核是5.15需要先裝好Linux頭文件和編譯工具鏈。新系統(tǒng)裝完第一步是換源不然從官方源拉包能等到懷疑人生。我一般習(xí)慣把源換成國(guó)內(nèi)鏡像然后做一次全量升級(jí)避免后面裝依賴時(shí)出現(xiàn)源緩存不一致的問題。sudo apt update sudo apt upgrade -y sudo apt install -y git build-essential autoconf automake libtool pkg-config sudo apt install -y linux-headers-$(uname -r)這里有個(gè)容易忽略的細(xì)節(jié)linux-headers版本必須和當(dāng)前內(nèi)核版本完全一致。如果你先升級(jí)了內(nèi)核但沒重啟或者源里匹配不到對(duì)應(yīng)版本后面make的時(shí)候會(huì)因?yàn)槿鄙賰?nèi)核頭文件報(bào)一堆莫名其妙的錯(cuò)誤。穩(wěn)妥起見裝完依賴后先重啟一次再用uname -r確認(rèn)內(nèi)核版本再去裝headers。如果你是帶桌面環(huán)境的Ubuntu這個(gè)步驟尤其重要因?yàn)樽烂姝h(huán)境重啟后可能還會(huì)觸發(fā)網(wǎng)絡(luò)服務(wù)占用網(wǎng)卡的問題這個(gè)坑后面單獨(dú)說。2.2 編譯安裝IGH主站IGH源碼可以直接從EtherLab的官方Git倉庫拉取常見做法是拉取master分支。嚴(yán)格來說IGH沒有所謂“最新版”的長(zhǎng)期維護(hù)周期我用的是當(dāng)前master分支編譯過程比較順利git clone https://gitlab.com/etherlab.org/ethercat.git cd ethercat ./bootstrap ./configure --prefix/opt/etherlab --enable-generic --disable-8139too make sudo make modules_install install sudo depmodconfigure階段有幾點(diǎn)要理解清楚。--prefix指定安裝目錄我這里選/opt/etherlab后面啟動(dòng)腳本、工具鏈都在這個(gè)目錄里。--enable-generic是啟用通用網(wǎng)卡驅(qū)動(dòng)這個(gè)非常重要IGH雖然自帶e1000e、8139too等專用驅(qū)動(dòng)但新內(nèi)核配新網(wǎng)卡最省事的方式就是讓IGH用generic模式去綁定網(wǎng)卡通用模式犧牲一點(diǎn)實(shí)時(shí)性但兼容性好太多。--disable-8139too是因?yàn)槔鲜?139網(wǎng)卡驅(qū)動(dòng)我已經(jīng)不需要了如果你用的是RTL8139網(wǎng)卡保留這個(gè)選項(xiàng)反而更好。裝完之后IGH不會(huì)自動(dòng)創(chuàng)建服務(wù)需要手動(dòng)把啟動(dòng)腳本和配置文件放到系統(tǒng)對(duì)應(yīng)位置sudo ln -s /opt/etherlab/etc/init.d/ethercat /etc/init.d/ethercat sudo mkdir -p /etc/sysconfig sudo cp /opt/etherlab/etc/sysconfig/ethercat /etc/sysconfig/ethercat然后編輯/etc/sysconfig/ethercat最核心的是兩個(gè)內(nèi)容主站對(duì)應(yīng)的網(wǎng)卡MAC地址以及要加載的網(wǎng)卡驅(qū)動(dòng)模塊。如果你有多個(gè)網(wǎng)卡務(wù)必用明確的MAC地址去指定MASTER0_DEVICE防止系統(tǒng)啟動(dòng)時(shí)網(wǎng)卡順序變化導(dǎo)致IGH綁錯(cuò)設(shè)備。MASTER0_DEVICE00:11:22:33:44:55 DEVICE_MODULESgeneric改完之后啟動(dòng)sudo /etc/init.d/ethercat start sudo dmesg | grep -i ethercat看到?jīng)]有報(bào)錯(cuò)、主站注冊(cè)成功的日志IGH環(huán)境這塊就算跑通了。2.3 實(shí)時(shí)性配置RT內(nèi)核、CPU隔離和NetworkManagerIGH在普通內(nèi)核下也能跑起來但EtherCAT運(yùn)動(dòng)控制對(duì)周期抖動(dòng)是有要求的。我一開始在Ubuntu默認(rèn)內(nèi)核下跑2ms周期位置模式下電機(jī)能轉(zhuǎn)但用示波器看直流母線電壓和電流波形同步性能很差調(diào)到1ms周期以后直接出現(xiàn)偶發(fā)抖動(dòng)。最終解決方案是安裝低延遲內(nèi)核并在GRUB里做CPU隔離。Ubuntu 22.04的倉庫里有l(wèi)inux-lowlatency內(nèi)核包安裝后重啟選擇低延遲內(nèi)核。它雖然不是完整意義的PREEMPT_RT但對(duì)IGH這種依賴內(nèi)核高精度定時(shí)器的應(yīng)用來說提升是立竿見影的。sudo apt install -y linux-lowlatency另外在/etc/default/grub的GRUB_CMDLINE_LINUX里我加了這么幾個(gè)參數(shù)isolcpus2,3 nohz_full2,3 rcu_nocbs2,3意思很簡(jiǎn)單把CPU 2和3從常規(guī)調(diào)度中隔離出來專門給IGH的實(shí)時(shí)線程用。用戶態(tài)控制程序再用pthread_setaffinity_np綁到2或3號(hào)核上中斷和時(shí)間戳回調(diào)的抖動(dòng)會(huì)明顯下降。當(dāng)然這個(gè)配置不是必須的單軸調(diào)試、周期要求不高的情況下不隔離也能用但如果你后面要跑多軸同步或者DC模式這步不能省。2.4 網(wǎng)卡選型與驅(qū)動(dòng)綁定IGH對(duì)網(wǎng)卡的要求比普通以太網(wǎng)苛刻。我踩過的第一個(gè)坑就是拿了一個(gè)USB轉(zhuǎn)RJ45網(wǎng)卡去試結(jié)果驅(qū)動(dòng)加載失敗后來換了板載Intel網(wǎng)卡才順利。IGH主站在Linux下最穩(wěn)妥的網(wǎng)卡是Intel 82574L、I210、I211這些筆記本上常見的Realtek網(wǎng)卡偶爾也能用但需要額外處理。建議先用lspci確認(rèn)一下型號(hào)lspci | grep -i ethernet如果你手頭只有Realtek或者其它非主流網(wǎng)卡也不要急著放棄IGH的generic驅(qū)動(dòng)可以覆蓋很大一部分設(shè)備關(guān)鍵在于驅(qū)動(dòng)綁定成功后這個(gè)網(wǎng)卡就不能再被NetworkManager和普通IP協(xié)議棧占用否則IGH拿不到網(wǎng)卡的所有權(quán)。我實(shí)際的做法是先記下網(wǎng)卡名稱比如enp3s0然后用nmcli把該網(wǎng)卡設(shè)為unmanaged再確認(rèn)系統(tǒng)里沒有其他進(jìn)程在監(jiān)聽這個(gè)接口。加載IGH模塊后用ethercat命令能看到主站狀態(tài)基本就說明網(wǎng)卡綁定成功了。3. 零差云控電機(jī)接入IGH從掃描到OP狀態(tài)機(jī)3.1 用ethercat命令行讓從站現(xiàn)身IGH環(huán)境起來之后第一件事就是掃描總線確認(rèn)能看到從站。這里推薦先用-v參數(shù)看詳細(xì)信息ethercat slaves -v正常會(huì)輸出從站的0號(hào)位置地址、廠商ID、產(chǎn)品碼、版本號(hào)、從站名字以及SII里的信息。這里有個(gè)細(xì)節(jié)如果你掃描結(jié)果為空先別急著重試檢查從站供電是否正常、網(wǎng)線是否插在IN口。零差云控驅(qū)控一體機(jī)的IN和OUT口很容易插反插反之后主站這邊什么設(shè)備都掃不到但普通網(wǎng)卡上的指示燈看著又是亮的這個(gè)假象非常騙人。如果掃描正常你會(huì)看到類似這樣的一行信息具體值以你的實(shí)際設(shè)備為準(zhǔn)0 0:0 PREOP ZeroErr COE Drive ...PREOP說明從站已經(jīng)進(jìn)入預(yù)運(yùn)行狀態(tài)SII信息讀取成功。這時(shí)候可以進(jìn)一步查看從站支持的對(duì)象字典和PDO映射ethercat pdos -v這一步能看到從站從0x1600開始的一系列RxPDO、TxPDO定義這些映射后面在IGH主站XML里需要保持一致。3.2 準(zhǔn)備主站XML與PDO映射IGH不像TwinCAT3那樣圖形化掃描就完事了它需要寫一個(gè)主站XML文件告訴IGH有哪些從站、每個(gè)從站用哪個(gè)PDO、周期多少、DC同步是否啟用。我用的方式是把零差云控的ESI文件轉(zhuǎn)換成IGH需要的信息重點(diǎn)配置域Domain和同步管理器。這里貼一段我實(shí)際用的XML核心片段Master SlaveInfo NameZeroErr Drive VendorId0x000004ec ProductId0x00000001 RevisionNumber0x00010000 SynchronizationInfo SyncSettings Sync1 CycleTime1000 .../ Sync2 CycleTime1000 .../ /SyncSettings SyncManagers SyncManager Index0 .../ SyncManager Index1 .../ SyncManager Index2 .../ /SyncManagers /SynchronizationInfo Pdos RxPdo Index0x1600 Entry Index0x6040 SubIndex0x00/ Entry Index0x607A SubIndex0x00/ Entry Index0x60FF SubIndex0x00/ /RxPdo TxPdo Index0x1A00 Entry Index0x6041 SubIndex0x00/ Entry Index0x6064 SubIndex0x00/ Entry Index0x606C SubIndex0x00/ /TxPdo /Pdos /SlaveInfo /Master這個(gè)XML把RxPDO里的0x6040控制字、0x607A目標(biāo)位置、0x60FF目標(biāo)速度以及TxPDO里的0x6041狀態(tài)字、0x6064實(shí)際位置、0x606C實(shí)際速度都映射了出來。這一步是整個(gè)IGH調(diào)試?yán)镒钜蕾嚱?jīng)驗(yàn)的地方映射太少了覆蓋不了控制需求映射太多又增加總線負(fù)載。單軸位置控制我一般就映射上面這幾個(gè)對(duì)象簡(jiǎn)單夠用。PDO映射完成后還需要在IGH里把主站設(shè)為OP狀態(tài)讓周期數(shù)據(jù)跑起來ethercat state -Op ethercat slaves如果從站能進(jìn)入OP說明PDO映射、SyncManager配置都沒問題電機(jī)雖然沒有轉(zhuǎn)動(dòng)但總線通信已經(jīng)建立了。3.3 配置CiA402控制字并讓電機(jī)真正轉(zhuǎn)起來總線通了不代表電機(jī)能轉(zhuǎn)CiA402狀態(tài)機(jī)還攔著一道。零差云控電機(jī)遵循標(biāo)準(zhǔn)CiA402狀態(tài)機(jī)要經(jīng)過“未就緒→禁止使能→就緒→已使能→運(yùn)行”的遷移。我在IGH下用的是ethercat sdo命令直接寫對(duì)象字典# 設(shè)運(yùn)行模式為位置模式 ethercat sdo -p 0x00 -i 0x6060 0x00 1 # 先切到Ready to switch on ethercat sdo -p 0x00 -i 0x6040 0x00 0x0006 # 切換到Switched on ethercat sdo -p 0x00 -i 0x6040 0x00 0x0007 # 使能運(yùn)行 ethercat sdo -p 0x00 -i 0x6040 0x00 0x000F這幾條命令的0x00是位置地址因?yàn)槲抑挥幸粋€(gè)從站用0即可。如果電機(jī)配置了別名地址要改成對(duì)應(yīng)的從站地址。寫0x6040控制字是EtherCAT伺服調(diào)試的基礎(chǔ)操作關(guān)鍵在于每一步之間稍微等幾十毫秒讓狀態(tài)機(jī)有時(shí)間切換。控制字序列不對(duì)的話從站的狀態(tài)字0x6041會(huì)停留在某個(gè)狀態(tài)不變這時(shí)候通過ethercat sdo讀取0x6041就能判斷卡在哪一步。位置模式下真正讓電機(jī)動(dòng)起來我寫了個(gè)簡(jiǎn)單的用戶態(tài)程序走IGH的rtdm接口周期任務(wù)里更新0x607A目標(biāo)位置。第一個(gè)目標(biāo)位置我設(shè)得很保守比如5000個(gè)脈沖速度限制在額定速度的10%以內(nèi)。沒想到一次就轉(zhuǎn)了熟悉了流程之后后續(xù)調(diào)速度模式、力矩模式都只是換對(duì)象字典的事。4. 換一邊用TwinCAT3對(duì)接同一臺(tái)電機(jī)4.1 為什么正式調(diào)伺服時(shí)TwinCAT3更順手IGH能跑通說明從站、PDO、CiA402這些基礎(chǔ)都沒問題但真到了要精細(xì)調(diào)伺服的階段IGH的文本操作效率就不夠看了。TwinCAT3的圖形化環(huán)境里掃描從站、加載ESI、配置NC軸、綁定PDO都是點(diǎn)幾下鼠標(biāo)的事ScopeView還能實(shí)時(shí)看位置、速度、電流曲線這對(duì)整定PID參數(shù)、觀察跟隨誤差幫助巨大。所以我的實(shí)際流程是IGH負(fù)責(zé)驗(yàn)證鏈路和腳本化測(cè)試TwinCAT3負(fù)責(zé)伺服軸正式交付。兩套方案并不沖突反而是我把EtherCAT協(xié)議棧吃透以后最自然的組合。4.2 在Windows/虛擬機(jī)上讓TwinCAT3找到網(wǎng)卡TwinCAT3官方運(yùn)行在Windows上。如果你有一臺(tái)物理Windows工控機(jī)安裝就很簡(jiǎn)單把網(wǎng)卡驅(qū)動(dòng)換乘TwinCAT的實(shí)時(shí)網(wǎng)卡驅(qū)動(dòng)掃描就能用。但如果你像我一樣只有Ubuntu工控機(jī)臨時(shí)用Windows虛擬機(jī)頂上就要多花點(diǎn)功夫。VMware虛擬機(jī)里默認(rèn)的e1000虛擬網(wǎng)卡TwinCAT3經(jīng)常識(shí)別不了表現(xiàn)為實(shí)時(shí)網(wǎng)卡安裝時(shí)報(bào)錯(cuò)、或者I/O設(shè)備掃描不到。我試下來比較穩(wěn)的方案是在VMware的虛擬機(jī)設(shè)置里把網(wǎng)卡類型改成Intel PRO/1000 MT DesktopVMXNET3在TwinCAT3下兼容性反而不好然后手動(dòng)橋接到物理網(wǎng)卡。如果VMware無法滿足還有一個(gè)更粗暴的辦法就是給虛擬機(jī)直通一塊USB千兆網(wǎng)卡TwinCAT3能直接認(rèn)到物理網(wǎng)卡的芯片型號(hào)不會(huì)報(bào)錯(cuò)。步驟上打開TwinCAT XAE后先點(diǎn)“安裝實(shí)時(shí)驅(qū)動(dòng)”把對(duì)應(yīng)網(wǎng)卡綁定到TwinCAT。這里有個(gè)關(guān)鍵操作必須用管理員身份運(yùn)行Visual Studio和TwinCAT環(huán)境否則驅(qū)動(dòng)綁定會(huì)靜默失敗。綁定成功后再掃描設(shè)備就能看到EtherCAT總線上掛著零差云控從站。4.3 掃描從站、加載ESI、配置軸并點(diǎn)動(dòng)TwinCAT3掃描從站時(shí)第一次接入陌生設(shè)備會(huì)提示找不到設(shè)備描述文件也就是ESI文件。這時(shí)候需要手動(dòng)把零差云控的XML文件復(fù)制到C:\TwinCAT\3.1\Config\Io\EtherCAT\目錄下再重新掃描就能正確識(shí)別設(shè)備類型和PDO對(duì)象。識(shí)別成功以后I/O設(shè)備樹下會(huì)出現(xiàn)設(shè)備展開可以看到Sync Manager和PDO映射。TwinCAT3默認(rèn)可能只映射了一部分對(duì)象但因?yàn)樗袌D形化勾選我習(xí)慣按照IGH里驗(yàn)證過的PDO列表手動(dòng)勾選一遍保持兩套主站的配置一致。NC軸配置里選擇軸類型為EtherCAT勾選CSP周期同步位置模式把0x6060設(shè)為8也就是CSP模式代碼之后在Motion里添加軸啟用并點(diǎn)動(dòng)電機(jī)就能動(dòng)起來。到這里零差云控電機(jī)在IGH和TwinCAT3兩套主站下都已經(jīng)跑通。5. 兩套主站配合的工程經(jīng)驗(yàn)5.1 切換主站的安全流程兩套主站共用一臺(tái)電機(jī)時(shí)最忌諱的就是“熱切換”。EtherCAT總線上一旦主站掉線從站會(huì)檢測(cè)到看門狗超時(shí)立刻進(jìn)入安全狀態(tài)。如果在電機(jī)運(yùn)行狀態(tài)強(qiáng)行拔線輕則驅(qū)動(dòng)器報(bào)錯(cuò)重則導(dǎo)致抱閘邏輯異常甚至讓電機(jī)自由滑行。我的切換流程是先通過主站命令讓電機(jī)停止確認(rèn)轉(zhuǎn)速為0。把從站狀態(tài)降到INIT讓總線完全釋放。斷開當(dāng)前主站與電機(jī)之間的網(wǎng)線。關(guān)閉電機(jī)驅(qū)動(dòng)器供電這一步很關(guān)鍵確保SII重新加載環(huán)境干凈。連接另一臺(tái)主站。給驅(qū)動(dòng)器重新上電等待幾秒讓從站初始化。掃描、使能、繼續(xù)調(diào)試。這套流程看起來繁瑣但能避免90%以上的“莫名其妙問題”。很多人圖省事電機(jī)不斷電直接換線很容易遇到從站掉線、SII讀不出來、狀態(tài)機(jī)卡死等狀況。5.2 把IGH下的配置平移給TwinCAT3IGHz里驗(yàn)證出來的參數(shù)在TwinCAT3里不是白調(diào)的。下面這張表我實(shí)際記錄了兩邊需要保持一致的參數(shù)參數(shù)項(xiàng)目IGH配置位置TwinCAT3配置位置通信周期主站XML CycleTimeEtherCAT設(shè)備同步周期PDO映射主站XML RxPdo/TxPdo設(shè)備下PDO Assignment從站地址ethercat命令行位置地址EtherCAT掃描后的從站拓?fù)溥\(yùn)行模式0x6060對(duì)象NC軸軸類型CSP/CSV控制字0x6040對(duì)象NC軸狀態(tài)控制自動(dòng)生成速度限制0x6081對(duì)象NC軸速度規(guī)劃參數(shù)我最常遇到的問題是PDO映射不一致IGH里映射了0x607A目標(biāo)位置但TwinCAT3默認(rèn)可能映射了0x60FF目標(biāo)速度二者混用會(huì)讓控制指令完全亂套。解決辦法是以IGH里驗(yàn)證過的PDO列表為準(zhǔn)TwinCAT3側(cè)手動(dòng)改成一致的映射然后對(duì)比兩邊的實(shí)際位置反饋和速度反饋是否吻合。5.3 實(shí)際項(xiàng)目中怎么分工經(jīng)過幾次項(xiàng)目打磨我現(xiàn)在對(duì)IGH和TwinCAT3的分工已經(jīng)形成習(xí)慣IGH用在需要自動(dòng)化、批量、回歸測(cè)試的場(chǎng)合。比如讓電機(jī)反復(fù)跑同一個(gè)軌跡跑一晚上看有沒有報(bào)錯(cuò)或者在產(chǎn)線上做從站老化測(cè)試用腳本記錄從站狀態(tài)又或者接入ROS之后做機(jī)器人關(guān)節(jié)測(cè)試IGH天然就有Linux生態(tài)優(yōu)勢(shì)。TwinCAT3則用在需要人機(jī)交互、PLC邏輯、項(xiàng)目交付的場(chǎng)合。比如最終設(shè)備上電后要跟氣缸、傳感器、視覺系統(tǒng)聯(lián)動(dòng)這時(shí)候PLC程序的可靠性和現(xiàn)場(chǎng)可維護(hù)性比IGH強(qiáng)太多另外伺服參數(shù)整定和振動(dòng)分析TwinCAT3的ScopeView比IGH加Python畫圖方便得多。兩邊配合前者幫我快速定位協(xié)議和鏈路的問題后者幫我完成真正的設(shè)備功能確實(shí)比單用任何一套更高效。6. 避坑清單與問題排查實(shí)錄6.1 主站啟動(dòng)失敗的幾個(gè)常見原因IGH啟動(dòng)失敗是我遇到次數(shù)最多的問題。第一個(gè)原因就是NetworkManager搶占網(wǎng)卡。Ubuntu桌面版開機(jī)之后NetworkManager會(huì)自動(dòng)接管所有有線網(wǎng)卡IGH加載模塊時(shí)拿不到網(wǎng)卡控制權(quán)報(bào)“Address already in use”之類的錯(cuò)誤。在/etc/network/interfaces或者用nmcli把網(wǎng)卡設(shè)為unmanaged能解決大部分這類情況。第二個(gè)原因是MAC地址配置錯(cuò)誤。確認(rèn)一下/sys/class/net/enpXsY/address里讀到的MAC和/etc/sysconfig/ethercat里MASTER0_DEVICE寫的是不是完全一致這個(gè)字段不支持大小寫混亂。第三個(gè)原因是內(nèi)核模塊沒加載make modules_install以后有時(shí)候depmod和modprobe的順序不對(duì)導(dǎo)致eth驅(qū)動(dòng)沒掛上這時(shí)重新執(zhí)行一次depmod -a、再重啟IGH服務(wù)就好。6.2 掃描不出從站的排查路徑掃描不到從站我在第3.1節(jié)已經(jīng)提到過IN/OUT口插反的問題這是踩得最實(shí)在的一個(gè)坑。零差云控驅(qū)控一體機(jī)的RJ45口旁邊會(huì)印有IN和OUT標(biāo)識(shí)但有些設(shè)備絲印不明顯如果兩個(gè)口都插過還是掃不到就用網(wǎng)線連接器的金屬?gòu)椘较騺韺?duì)比IN口和OUT口的引腳方向往往不同仔細(xì)看能分辨出來。另一個(gè)常見原因是從站供電不足。驅(qū)控一體機(jī)需要外部24V給控制板供電很多人在Ubuntu工控機(jī)上調(diào)試時(shí)只接了網(wǎng)線忘了給驅(qū)動(dòng)器接供電自然什么都掃不到。EtherCAT從站在INIT階段就要做SII讀取這需要從站自身有電否則Link燈都可能不亮。如果前面都正??梢栽囍謩?dòng)讓主站進(jìn)入INIT再重置ethercat state -I INIT ethercat state -P PREOP有時(shí)候從站卡在某個(gè)異常狀態(tài)重置一遍就能恢復(fù)正常。如果在IGH里偶爾掃到但SII信息亂碼大概率是從站和主站之間地電位不一致這在電機(jī)驅(qū)動(dòng)器接了大功率電源時(shí)更容易出現(xiàn)處理方法是把驅(qū)動(dòng)器、工控機(jī)的GND連到一起共地。6.3 同步和抖動(dòng)問題IGH在OP狀態(tài)跑起來但位置模式里電流和速度波形明顯毛糙多半是周期抖動(dòng)問題。排查方向我按優(yōu)先級(jí)排序先看用的什么內(nèi)核普通內(nèi)核換低延遲內(nèi)核再看有沒有做CPU隔離IGH實(shí)時(shí)線程所在CPU別讓其他進(jìn)程搶然后檢查網(wǎng)卡的電源管理讓ethtool把節(jié)能以太網(wǎng)關(guān)掉最后確認(rèn)驅(qū)動(dòng)器的DC同步是否開啟。ethtool -s enp3s0 wol d ethtool -s enp3s0 autoneg off speed 100 duplex full這里有個(gè)細(xì)節(jié)強(qiáng)制網(wǎng)卡百兆全雙工有時(shí)候反而比千兆更穩(wěn)定EtherCAT的幀長(zhǎng)度和普通IP流不同百兆下IGH處理起來更容易。當(dāng)然這不是絕對(duì)視網(wǎng)卡和IGH版本而定我手頭這塊Intel I210在千兆下也穩(wěn)定但如果你用通用驅(qū)動(dòng)試試百兆全雙工也無妨。6.4 TwinCAT3掃描不到設(shè)備虛擬機(jī)里的TwinCAT3掃描不到設(shè)備90%是網(wǎng)卡驅(qū)動(dòng)問題。TwinCAT3的實(shí)時(shí)網(wǎng)卡驅(qū)動(dòng)只認(rèn)特定芯片VMware虛擬網(wǎng)卡要么換e1000e要么直通USB網(wǎng)卡否則就算掃描也看不到總線。物理機(jī)上也偶爾出現(xiàn)“設(shè)備可見但網(wǎng)卡綁定不成功”這多半是殺毒軟件或Windows防火墻攔截了TwinCAT實(shí)時(shí)驅(qū)動(dòng)把相關(guān)目錄加入白名單用管理員身份重裝實(shí)時(shí)驅(qū)動(dòng)即可。TwinCAT3能掃到設(shè)備但提示Unknown Device那是ESI文件沒裝。把零差云控提供的XML文件放到對(duì)應(yīng)目錄后需要在設(shè)備管理器里對(duì)未知設(shè)備右鍵更新設(shè)備描述或者直接在TwinCAT的掃描過程中選擇“安裝設(shè)備描述”。這個(gè)動(dòng)作容易被忽略因?yàn)門winCAT不會(huì)自動(dòng)讀取目錄下的新XML。6.5 零差云控電機(jī)使能不上的排查清單IGH下用SDO命令使能狀態(tài)字永遠(yuǎn)停在Switched On進(jìn)不了Operation Enabled最常見的原因是控制字跳變太快。CiA402狀態(tài)機(jī)對(duì)狀態(tài)切換是有時(shí)序要求的0x0006、0x0007、0x000F之間至少要等幾十毫秒有些驅(qū)動(dòng)器要求上百毫秒我一開始就是三條命令無間隔執(zhí)行結(jié)果一直卡住。另一個(gè)容易忽略的是急停和抱閘信號(hào)。零差云控這類驅(qū)控一體機(jī)硬件上通常有抱閘控制和急停輸入如果急停信號(hào)被拉低或者抱閘沒有打開使能指令會(huì)一直被驅(qū)動(dòng)器拒絕狀態(tài)字里會(huì)提示對(duì)應(yīng)故障碼。這時(shí)候不要反復(fù)使能先讀0x603F錯(cuò)誤碼再對(duì)照手冊(cè)找具體原因。很多時(shí)候不是EtherCAT的問題而是外圍信號(hào)沒滿足。速度限制和扭矩限制也是必查項(xiàng)。有些驅(qū)動(dòng)器默認(rèn)峰值扭矩限制為0或者速度限制為0導(dǎo)致使能后一給指令就報(bào)跟蹤誤差超限。建議在使能前把0x607F最大扭矩、0x6081輪廓速度、0x6083輪廓加速度設(shè)置成合理的非零值能省不少排查時(shí)間。6.6 避坑速查表現(xiàn)象可能原因處理建議IGH啟動(dòng)報(bào)Address already in useNetworkManager占用網(wǎng)卡將該網(wǎng)卡設(shè)為unmanagedethercat slaves無輸出網(wǎng)口插反、從站沒供電檢查IN口、確認(rèn)驅(qū)動(dòng)板供電SII信息亂碼從站與主站地電位不一致統(tǒng)一共地檢查電源紋波從站狀態(tài)一直PREOP不進(jìn)OPPDO映射不一致或FMMU配置錯(cuò)誤核對(duì)主站XML與ESI的PDO電機(jī)使能失敗控制字跳變太快、急停觸發(fā)逐步寫控制字讀取錯(cuò)誤碼0x603F波形毛糙抖動(dòng)大內(nèi)核非實(shí)時(shí)、CPU未隔離換低延遲內(nèi)核isolcpus隔離TC3掃描不到網(wǎng)卡虛擬機(jī)網(wǎng)卡不受支持換e1000e或直通USB網(wǎng)卡TC3掃到Unknown DeviceESI文件缺失復(fù)制XML到EtherCAT目錄并更新描述電機(jī)一轉(zhuǎn)立即報(bào)跟隨誤差速度/扭矩限制為0預(yù)置0x607F、0x6081等對(duì)象最后再說一點(diǎn)個(gè)人體會(huì)。IGH和TwinCAT3兩邊來回切表面上多了一套工具的學(xué)習(xí)成本實(shí)際上當(dāng)你把從站掃描、PDO映射、CiA402狀態(tài)機(jī)這些底層邏輯搞清楚以后兩套主站就是兩個(gè)殼子里面的東西是一模一樣的。IGH幫你把協(xié)議細(xì)節(jié)逼著你看了個(gè)明白TwinCAT3又幫你在工程效率上補(bǔ)了一大截。如果你卡在“IGH能掃描但電機(jī)不動(dòng)”或者“TwinCAT3掃描不到設(shè)備”這種問題上別急著懷疑設(shè)備和網(wǎng)卡先回看一遍狀態(tài)機(jī)和網(wǎng)卡綁定這兩塊是絕大多數(shù)故障的真正源頭。