亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

QT集成SOEM實現(xiàn)EtherCAT主站:從編譯到運動控制實戰(zhàn)

QT集成SOEM實現(xiàn)EtherCAT主站:從編譯到運動控制實戰(zhàn) 1. 為什么是QT加SOEM一個老牌主站庫的二次生命力做嵌入式上位機開發(fā)這些年我踩過不少協(xié)議棧的坑最后在EtherCAT主站這個方向上SOEMSimple Open EtherCAT Master是我目前最推薦用來搭配QT做上位機的一套組合。原因很簡單SOEM是開源庫代碼量適中移植性極強而且它不依賴Linux內(nèi)核補丁——這意味著你可以輕松地在Windows、Linux、甚至RTOS上跑起來而QT恰好又是跨平臺界面開發(fā)的首選兩者配合起來幾乎是無縫銜接。先說一個很多人容易混淆的點EtherCAT主站協(xié)議棧和從站協(xié)議棧完全是兩碼事。從站一般由從站控制器ESC硬件來完成比如LAN9252、AX58100這類芯片芯片出廠就固化了EtherCAT從站協(xié)議的處理邏輯你不用去碰協(xié)議棧的底層。而主站這邊就不一樣了主站的任務(wù)是生成報文、管理從站狀態(tài)機、處理分布式時鐘、維護過程數(shù)據(jù)映射這些邏輯全部要跑在CPU上所以主站的“協(xié)議?!焙脡闹苯記Q定了整個運動控制系統(tǒng)的實時性和穩(wěn)定性。SOEM最初是由德國的一家自動化公司貢獻給開源社區(qū)的后來被納入了IgH的生態(tài)體系??赡苡腥藭柤热籌gHEtherLab那么有名為什么不去用IgH我的實測體會是IgH功能雖然全但它是基于Linux內(nèi)核模塊實現(xiàn)的驅(qū)動模型復雜編譯和加載都要在內(nèi)核態(tài)完成而且每次內(nèi)核升級都要重新編譯這對很多做產(chǎn)品的人來說是件很頭疼的事情。SOEM則完全是用戶態(tài)的庫API簡潔編譯出來就是一個靜態(tài)庫或者動態(tài)庫QT工程里直接引用就行開發(fā)效率高得多。還有一點很關(guān)鍵SOEM對嵌入式平臺的適配相當好。我試過STM32MP1、i.MX8M Plus、瑞薩RZ/G2L這些平臺SOEM都能很好地跑起來。對于需要做HMI人機界面的項目比如點膠機、貼片機、機器人控制柜QT畫界面SOEM跑實時通信這套架構(gòu)在生產(chǎn)線上已經(jīng)經(jīng)過了大量驗證。這篇文章我就從頭到尾梳理一遍從庫的編譯到QT工程的集成再到實際應(yīng)用中的關(guān)鍵細節(jié)和踩坑記錄幫助大家少走彎路。2. SOEM主站協(xié)議庫的架構(gòu)與核心機制2.1 主站協(xié)議棧的分層思想理解SOEM之前先得理解EtherCAT主站協(xié)議棧的層次劃分。EtherCAT的通信模型其實很簡潔主站發(fā)送一個以太網(wǎng)幀幀里面串聯(lián)了所有從站的數(shù)據(jù)每個從站從幀中提取自己的輸出數(shù)據(jù)同時把輸入數(shù)據(jù)插入到幀的相應(yīng)位置然后幀繼續(xù)傳給下一個從站。整個過程是“飛讀飛寫”也就是所謂的過程數(shù)據(jù)Process Data交換。SOEM的核心代碼主要分為這幾個層次底層套接字層負責原始以太網(wǎng)幀的收發(fā)在Linux下走的是AF_PACKET協(xié)議族在Windows下走的是WinPcap/Npcap庫這一層是平臺相關(guān)的。鏈路層抽象SOEM通過ecx_setup系列函數(shù)來初始化網(wǎng)卡和從站掃描真正把以太網(wǎng)幀封裝成EtherCAT報文。應(yīng)用層接口這一層是我們最常碰到的包括狀態(tài)機管理郵箱通信、狀態(tài)轉(zhuǎn)換、過程數(shù)據(jù)映射、分布式時鐘等。在SOEM中有一個全局的結(jié)構(gòu)體ecx_context它把整個主站運行狀態(tài)都封裝在里面。對于多線程應(yīng)用SOEM允許你創(chuàng)建多個ecx_context實例從而實現(xiàn)多主站并行——比如一個主站控制關(guān)節(jié)伺服另一個主站控制IO模塊這在復雜機器人系統(tǒng)里非常實用。2.2 SOEM與IGH的定位差異很多人一上來就會問SOEM和IGH到底選哪個我個人的結(jié)論是如果追求絕對最高的實時性并且團隊有Linux內(nèi)核開發(fā)能力項目周期長那IGH確實可以做得很極致。如果追求快速落地、跨平臺、嵌入式友好尤其是要搭配QT做上位機/觸控屏那么SOEM絕對是性價比最高的選擇。IGH把主站做成內(nèi)核模塊實時性確實是用戶態(tài)方案比不了的但付出的代價是調(diào)試困難、移植麻煩、GUI集成費勁。SOEM走的是用戶態(tài)雖然實時性上限略低但通過配合PREEMPT_RT補丁或者綁定CPU核心CPU Affinity在百微秒級別的周期控制中完全夠用。對于絕大多數(shù)使用EtherCAT的場景——伺服周期1ms、4ms、甚至8ms都常見——SOEM的性能毫無壓力。2.3 狀態(tài)機與通信流程EtherCAT通信的核心是狀態(tài)機從站設(shè)備在上電之后要依次經(jīng)過Init、Pre-Operational、Safe-Operational、Operational四個狀態(tài)主站負責驅(qū)動這些狀態(tài)轉(zhuǎn)換。SOEM的API封裝了這些狀態(tài)轉(zhuǎn)換ec_statechange檢查狀態(tài)變化ec_writestate讓從站切換到目標狀態(tài)ec_readstate讀取所有從站的當前狀態(tài)每一個狀態(tài)都有各自允許的通信服務(wù)Init只能進行寄存器讀寫用來獲取從站信息。Pre-Op郵箱通信開啟可以配置PDO映射、加載Coe對象字典。Safe-Op過程數(shù)據(jù)開始刷新但此時從站不輸出只處理輸入。Op完全運行狀態(tài)輸出有效伺服使能。我在調(diào)試時習慣寫一個狀態(tài)機等待函數(shù)在切換狀態(tài)之后輪詢所有從站是否都到了預期狀態(tài)如果超時就把錯誤寄存器讀出來這樣能快速定位從站配置的問題。3. 從零開始編譯SOEM庫3.1 源碼準備與CMake構(gòu)建SOEM的源碼托管在GitHub上倉庫地址是OpenEtherCATsociety/SOEM。建議不要直接下載master分支的代碼而是選擇一個穩(wěn)定的release標簽版本目前我常用的是1.4.0版本這個版本在ARM平臺和x86平臺上的測試都比較充分。源碼下載回來之后解壓到本地目錄SOEM本身采用CMake構(gòu)建系統(tǒng)這也是它能輕松集成到QT工程的前提之一。在Linux平臺下構(gòu)建過程很簡單mkdir build cd build cmake .. make sudo make install但這里有幾個細節(jié)需要注意。默認的CMake配置會生成動態(tài)庫和示例程序如果你想得到一個精簡的靜態(tài)庫用于嵌入式平臺可以在cmake時加上參數(shù)cmake -DBUILD_SHARED_LIBSOFF -DSOEM_BUILD_TESTSOFF -DSOEM_BUILD_EXAMPLESOFF ..這樣得到的就是一個純凈的libsoem.a靜態(tài)庫體積很小適合直接丟到嵌入式ARM的交叉編譯工具鏈里面去鏈接。SOEM支持兩種構(gòu)建方式一種是在主機上編譯然后通過交叉編譯工具鏈重新構(gòu)建另一種是直接把SOEM源碼加入QT工程一并編譯。對于產(chǎn)品化項目我更推薦后者理由后面細說。3.2 Windows平臺上的編譯特殊性Windows平臺下編譯SOEM會比Linux多一些步驟。SOEM的底層套接字在Windows上依賴WinPcap或Npcap的SDK原因在于EtherCAT主站需要自己構(gòu)造以太網(wǎng)幀的MAC地址和EtherType0x88A4標準的Windows Socket API是干不了這件事的必須借助Npcap的底層抓包接口。你需要先安裝Npcap并勾選“安裝SDK”的選項然后在CMake配置時指定Npcap SDK的路徑。如果直接用QT的MinGW工具鏈要特別留意Npcap SDK和MinGW的兼容性。實測下來MSVC2019配合Npcap是最穩(wěn)定的組合MinGW環(huán)境下偶爾會出現(xiàn)頭文件找不到的情況解決辦法是手動把Npcap的Include目錄和Lib目錄加進工程文件。3.3 引入QT工程的兩種姿勢把SOEM用到QT工程中主要有兩種方式。第一種是把SOEM編譯成靜態(tài)庫然后在QT的.pro文件里通過LIBS 來引用。這種方式的優(yōu)點是工程結(jié)構(gòu)清晰QT只負責界面和業(yè)務(wù)邏輯SOEM作為獨立的庫存在缺點是當你想修改SOEM源碼時需要單獨編譯庫。第二種方式是把SOEM的全部源文件soem/目錄下直接加入到QT工程中參與整體編譯。這種方式對源碼的調(diào)試非常方便打斷點直接就能進入SOEM的內(nèi)部函數(shù)對于想深入學習EtherCAT主站協(xié)議的人來說特別有價值。我自己的項目就采用的第二種方式在.pro文件里添加INCLUDEPATH $$PWD/soem/soem SOURCES \ $$PWD/soem/soem/ethercat.c \ $$PWD/soem/soem/ethercatcoe.c \ $$PWD/soem/soem/ethercatdc.c \ $$PWD/soem/soem/ethercatfoe.c \ $$PWD/soem/soem/ethercatmain.c \ $$PWD/soem/soem/ethercatprint.c \ $$PWD/soem/soem/ethercatsoe.c \ $$PWD/soem/soem/osal/osal.c \ $$PWD/soem/soem/osal/osal_win32.c注意文件列表要根據(jù)平臺調(diào)整Windows下需要osal_win32.cLinux下則需要osal_linux.c。另外Npcap的依賴也要加進去win32 { INCLUDEPATH C:/Program Files/Npcap LIBS -LC:/Program Files/Npcap/Lib -lwpcap -lPacket }直接參與編譯還有一個好處是可以用上QT的構(gòu)建套件Kit比如你在Qt Creator里配置了交叉編譯套件那么SOEM也會跟著交叉編譯到目標平臺完全不用手動維護交叉編譯鏈的環(huán)境變量。4. 核心API應(yīng)用實戰(zhàn)主站掃描、配置與過程數(shù)據(jù)交換4.1 初始化網(wǎng)卡與從站掃描無論多復雜的EtherCAT系統(tǒng)起步操作都是類似的打開網(wǎng)卡、掃描總線、獲取從站信息。SOEM提供了一個極其實用的API以下是典型的初始化流程#include ethercat.h #include QDebug char IOmap[4096]; int slaveCount 0; bool setupEtherCAT(const QString ifname) { // 打開網(wǎng)卡返回套接字句柄 if (ec_init(ifname.toLocal8Bit().data()) 0) { qCritical() Failed to initialize NIC: ifname; return false; } qInfo() NIC initialized: ifname; // 掃描總線上所有從站 slaveCount ec_config_init(FALSE); if (slaveCount 0) { qCritical() No slaves found on the bus.; return false; } qInfo() Total slaves: slaveCount; // 配置過程數(shù)據(jù)映射 int result ec_config_map(IOmap); if (result 0) { qCritical() PDO mapping failed.; return false; } qInfo() PDO mapping done, bytes used: result; // 請求切換到OP狀態(tài) ec_slave[0].state EC_STATE_OPERATIONAL; ec_writestate(0); return true; }這里有幾個關(guān)鍵點。ec_config_init(TRUE)中的參數(shù)表示是否使用保留地址reserved address進行配置一般設(shè)為FALSE即可。掃描完成后總線上的每個從站信息會填充到全局數(shù)組ec_slave[]中每個元素的eep_id、eep_man、eep_rev這些字段存儲的就是從站的Vendor ID、Product ID等信息。ec_config_map(IOmap)這個函數(shù)是理解EtherCAT從站映射的關(guān)鍵它會為每個從站計算PDO的映射關(guān)系返回所有從站輸出和輸入數(shù)據(jù)占用的總字節(jié)數(shù)。IOmap這個緩沖區(qū)就是你接下來讀寫過程數(shù)據(jù)的“舞臺”。4.2 理解Vendor ID與從站配置的坑在調(diào)試新從站時很多人會遇到一個“詭異”現(xiàn)象從站明明被掃描到了但狀態(tài)始終切不到OP。這時大概率是從站的配置信息不完整尤其是FMMU映射出了問題。FMMUFieldbus Memory Management Unit是EtherCAT從站內(nèi)部用來把過程數(shù)據(jù)映射到本地地址的機制SOEM在ec_config_map時會按EEPROM里的配置自動設(shè)置但是如果從站的EEPROM沒有燒錄或者配置錯誤映射就會失敗。這時可以用SOEM提供的工具函數(shù)讀取從站的EEPROM信息qDebug() Slave i Vendor: hex ec_slave[i].eep_man Product: hex ec_slave[i].eep_id Revision: hex ec_slave[i].eep_rev;通常從站出廠時廠商會把這些信息寫好。但如果是自己開發(fā)的從站比如基于LAN9252或者AX58100的板子在初次調(diào)試時就要特別留意很多從站不支持自動配置FMMU必須在上位機中顯式地設(shè)置PDO的映射參數(shù)。這種情況下光靠SOEM的自動映射是不夠的你可能需要直接操作ESC寄存器來手動配置。一個我非常推薦的做法是在正式控制邏輯之前先打印所有從站的輸入輸出長度和映射地址確認每個從站占用的IOmap偏移是否正確for (int i 1; i slaveCount; i) { qDebug() Slave i InputStart: ec_slave[i].Istart OutputStart: ec_slave[i].Ostart InputBits: ec_slave[i].Ibits OutputBits: ec_slave[i].Obits; }這個過程能幫你發(fā)現(xiàn)在后續(xù)訪問過程數(shù)據(jù)時該把指針指向哪個偏移位置尤其是總線上有多個不同類型的從站時這一步絕不能省。4.3 過程數(shù)據(jù)的讀寫PDO映射完成之后我們就可以通過IOmap來讀寫數(shù)據(jù)了。SOEM的思想是把所有從站的輸入輸出緊湊排列在一段連續(xù)的內(nèi)存中然后由協(xié)處理器和主站代碼通過指針來操作。為了方便管理我在實際項目中會為每個從站定義一個結(jié)構(gòu)體再把這些結(jié)構(gòu)體按映射順序重疊到IOmap中。比如常見的伺服驅(qū)動器通常使用CiA402協(xié)議控制字Controlword、狀態(tài)字Statusword、目標位置Target Position和實際位置Actual Position這些對象都是標準化的于是我可以這樣定義typedef struct { uint16_t controlword; int32_t target_position; int32_t target_velocity; uint16_t mode_of_operation; } ServoOutput_t; typedef struct { uint16_t statusword; int32_t actual_position; int32_t actual_velocity; uint16_t mode_of_operation_display; } ServoInput_t; ServoOutput_t* servoOut[16]; ServoInput_t* servoIn[16]; // 在配置完成后按每個從站的IOmap偏移綁定地址 for (int i 1; i slaveCount; i) { servoOut[i] (ServoOutput_t*)(IOmap ec_slave[i].Ostart); servoIn[i] (ServoInput_t*)(IOmap ec_slave[i].Istart); }這樣綁定之后讀寫過程數(shù)據(jù)就成了結(jié)構(gòu)體成員訪問那么簡單。比如要讓1號伺服進入位置模式并開始運動我只需要servoOut[1]-controlword 0x000F; servoOut[1]-mode_of_operation 0x01; // CSP模式 servoOut[1]-target_position 100000; // 單位取決于電子齒輪比然后調(diào)用ec_send_processdata()和ec_receive_processdata(0)把這一幀數(shù)據(jù)發(fā)送出去。這里要特別強調(diào)一個細節(jié)SOEM的ec_send_processdata()和ec_receive_processdata(0)必須成對調(diào)用并且建議在一個獨立的實時線程中以固定周期循環(huán)調(diào)用。發(fā)送函數(shù)構(gòu)造報文接收函數(shù)解析從站反饋兩者的間隔通常在幾十微秒以內(nèi)超時會返回EC_ERR。為了監(jiān)控通信質(zhì)量我習慣在接收之后檢查返回值如果在連續(xù)多個周期內(nèi)返回錯誤就觸發(fā)報警。4.4 從站狀態(tài)切換的狀態(tài)機封裝從站從啟動到進入OP狀態(tài)中間要經(jīng)歷多次狀態(tài)切換每一次切換都要給從站留出足夠的時間去處理郵箱通信和PDO配置。SOEM官方示例中的方式比較初級只是簡單地把目標狀態(tài)寫進ec_slave[0].state然后調(diào)用ec_writestate而實際項目中每臺從站的狀態(tài)切換速度不一樣尤其是一些復雜的伺服驅(qū)動器可能需要幾百毫秒才能完成參數(shù)初始化。因此我在QT工程里封裝了一個帶超時管理的狀態(tài)切換函數(shù)bool waitForState(int slaveIndex, uint16_t targetState, int timeoutMs) { QElapsedTimer timer; timer.start(); while (timer.elapsed() timeoutMs) { ec_slave[slaveIndex].state targetState; ec_writestate(slaveIndex); // 讀取實際狀態(tài) ec_readstate(); uint16_t actual ec_slave[slaveIndex].state; // 檢查是否到達目標狀態(tài) if (actual targetState) { return true; } // 如果從站報錯讀取AL狀態(tài)碼 if (actual EC_STATE_ERROR) { uint16_t alStatusCode ec_slave[slaveIndex].ALstatuscode; qWarning() Slave slaveIndex error, AL status code: hex alStatusCode; return false; } QThread::msleep(10); } qWarning() Slave slaveIndex state timeout; return false; }從站無法進入OP狀態(tài)時SOEM會在ec_slave[i].ALstatuscode中給出具體原因常見的有AL狀態(tài)碼含義處理建議0x0012無效的郵箱配置檢查SMSyncManager配置0x0013無效的PDO映射檢查PDO映射并重新配置0x0014同步錯誤檢查DC時鐘配置0x001E從站本地錯誤查看從站手冊確認錯誤來源有了這個等待函數(shù)切OP之前的流程就清晰可查了先切Pre-Op然后寫入PDO映射再切Safe-Op最后切Op。每一層都能驗證。5. 分布式時鐘與同步讓多軸動得整齊劃一5.1 為什么需要同步EtherCAT最吸引人的地方之一就是它的分布式時鐘Distributed Clock簡稱DC。如果沒有DC同步總線上每個從站都是按照各自的晶振節(jié)拍來采樣和輸出晶振的頻率誤差雖然不大但累積到一定時間就會導致軸與軸之間出現(xiàn)明顯的偏移。在高精度的運動控制場合這種時間偏差會直接表現(xiàn)為軌跡跟隨的抖動。DC的原理簡單來說就是第一個具有DC功能的從站作為參考時鐘主站周期性發(fā)送時鐘同步報文其他從站讀取參考時鐘的時間戳并通過本地時鐘補償算法來校準自身的本地時間。這樣一來所有從站的采樣時刻就對齊到了同一個時間基準上。SOEM對DC的支持很到位在ec_config_map之后只需要調(diào)用以下幾個函數(shù)就可以完成DC初始化ec_configdc();這個函數(shù)會自動檢測從站的DC能力并對有DC功能的從站進行時鐘同步設(shè)置。如果總線上混合了有DC和無DC的從站SOEM會以第一個支持DC的從站的時鐘作為參考也就是所謂的SYNC0事件由DC0來觸發(fā)。5.2 周期同步與SYNC信號在實際項目中伺服驅(qū)動器的位置環(huán)、速度環(huán)甚至電流環(huán)都需要依賴從站的SYNC事件來觸發(fā)。SYNC事件是DC時鐘在到達預設(shè)時刻時生成的硬件中斷信號驅(qū)動內(nèi)部的數(shù)字信號處理器DSP會響應(yīng)這個中斷進行采樣和計算。也就是說周期控制的精度直接取決于DC同步鏈路的質(zhì)量和SYNC信號周期的設(shè)置。在SOEM中可以通過ec_dcsync0來設(shè)置SYNC0的周期和偏移// slaveIndex為參考從站索引 // cycleTimeNs為周期時間單位是納秒 // shiftTimeNs為偏移時間 ec_dcsync0(slaveIndex, TRUE, cycleTimeNs, shiftTimeNs);例如對于1ms的控制周期ec_dcsync0(1, TRUE, 1000000, 0);這里有一個心得SYNC0的偏移時間不要一律設(shè)置為0。在總線上有多個從站時如果所有從站都在同一個時間點觸發(fā)SYNC可能會造成總線上瞬時電流峰值過大尤其在伺服驅(qū)動器的使能瞬間。通常我會把偏移時間錯開幾十微秒讓各驅(qū)動器的采樣點稍微錯開能有效減少總線上的干擾。5.3 DC同步誤差的觀察與調(diào)優(yōu)怎么判斷DC同步是否正常一個可行的辦法是循環(huán)讀取參考從站的時鐘時間戳和本地從站的系統(tǒng)時間計算時間偏差。SOEM提供了ec_dcreg相關(guān)的寄存器讀取函數(shù)可以讀取從站的0x092CSystem Time寄存器和0x0920Receive Time寄存器實時打印偏差。我在調(diào)試時發(fā)現(xiàn)當DC同步正常時時間偏差一般能穩(wěn)定在幾百納秒以內(nèi)如果偏差出現(xiàn)毫秒級的漂移那就要檢查參考時鐘從站的選擇是否正確或者從站之間的線纜連接是不是接觸不良。還有一點容易被忽略如果總線上有非DC能力的從站它的報文轉(zhuǎn)發(fā)延遲會對DC同步產(chǎn)生可見的影響這種情況下盡量把DC參考點設(shè)在離主站最近的DC從站上或者調(diào)整DC偏移參數(shù)來補償。同步是所有運動控制系統(tǒng)的生命線SOEM在這塊已經(jīng)封裝得很好但用戶必須理解這些參數(shù)的含義才能合理使用。切忌直接復制網(wǎng)上的參數(shù)不同品牌伺服、不同拓撲結(jié)構(gòu)最優(yōu)配置是不同的。6. 基于QT的完整應(yīng)用框架設(shè)計6.1 界面線程與實時線程如何協(xié)作很多初次接觸QT結(jié)合EtherCAT的人最容易犯的錯誤就是把通信直接塞進GUI線程。QT的GUI線程運行著事件循環(huán)一旦被長時間阻塞界面就會卡死這是絕對不可接受的。正確做法是把EtherCAT周期通信放在一個單獨的實時線程中用信號槽機制與界面線程通信。在設(shè)計這個框架時我會把功能分成三層界面層負責顯示狀態(tài)、接收用戶輸入比如目標位置、速度完全不接觸任何EtherCAT API??刂茖右粋€獨立的QThread運行周期通信循環(huán)調(diào)用SOEM的收發(fā)函數(shù)并維護一個簡化的狀態(tài)機。數(shù)據(jù)層定義好控制指令和反饋數(shù)據(jù)的結(jié)構(gòu)體用互斥鎖或者隊列在控制層和界面層之間傳遞數(shù)據(jù)。對于運動控制系統(tǒng)我通常定義一個EtherCATWorker類繼承自QObject并把它移動到QThread中執(zhí)行class EtherCATWorker : public QObject { Q_OBJECT public: explicit EtherCATWorker(QObject* parent nullptr); public slots: void start(); void stop(); void setTargetPosition(int axis, int32_t pos); signals: void statusUpdated(const QString status); void positionUpdated(int axis, int32_t pos); void errorOccurred(const QString error); private: void cycleLoop(); bool runningFlag; };start()插槽里執(zhí)行前面說到的初始化和狀態(tài)切換然后進入一個while循環(huán)以QElapsedTimer控制周期節(jié)拍在循環(huán)內(nèi)部調(diào)用ec_send_processdata和ec_receive_processdata。這里有個性能細節(jié)周期循環(huán)中不要使用QThread::msleep()來粗略延時因為它的精度不足以支撐1ms以下的控制周期而且受系統(tǒng)調(diào)度影響很大。更可靠的做法是使用QElapsedTimer做自旋等待或者干脆加上std::this_thread::sleep_for(std::chrono::microseconds(...))配合高精度定時器。如果是在Linux平臺還可以配合timerfd或者clock_nanosleep這些實時接口。6.2 跨線程數(shù)據(jù)傳遞不丟不重在EtherCATWorker中更新的伺服位置、狀態(tài)字等數(shù)據(jù)界面需要實時刷新。直接用普通成員變量跨線程讀寫有數(shù)據(jù)競爭的風險用QT信號槽傳輸又可能出現(xiàn)高頻下的丟包或延遲。我的做法是在Worker內(nèi)部用三個環(huán)形緩沖區(qū)分別存儲位置、狀態(tài)和報警數(shù)據(jù)界面線程按需取用用QMutex保護讀寫指針。void EtherCATWorker::cycleLoop() { while (runningFlag) { // 等待周期節(jié)拍 // 發(fā)起過程數(shù)據(jù)交換 ec_send_processdata(); int wkc ec_receive_processdata(0); // 讀取各從站的反饋 for (int i 1; i slaveCount; i) { int32_t pos servoIn[i]-actual_position; uint16_t status servoIn[i]-statusword; mutex.lock(); posBuffer[i] pos; statusBuffer[i] status; mutex.unlock(); } // 向界面發(fā)信號刷新的通知 emit dataRefreshed(); // 周期節(jié)拍控制 } }界面端的刷新槽函數(shù)只需要加鎖拷貝數(shù)據(jù)然后更新控件即可。這樣的設(shè)計下不管界面刷新頻率快慢底層通信都不會受到影響。當然有人會說直接用emit positionUpdated(axis,pos)不是更簡單嗎在軸數(shù)少、通信周期慢的場景下確實夠用但是在16軸甚至32軸、1ms周期的系統(tǒng)里高頻信號的發(fā)射和槽函數(shù)的調(diào)用會引入不必要的線程切換開銷。環(huán)形緩沖區(qū)加通知信號的方案在這類場景下明顯更穩(wěn)。6.3 日志記錄與在線升級產(chǎn)品化的系統(tǒng)不能只跑通就完事。我們需要日志來追蹤異常需要OTA升級能力來修復現(xiàn)場問題。SOEM的FOEFile over EtherCAT協(xié)議可以在EtherCAT總線上傳輸文件最常見的就是給從站升級固件。SOEM提供了ec_foe_write和ec_foe_read函數(shù)使用起來很直接uint32_t err ec_FOEwrite(1, filename, password, buffer, size, timeout);返回值為0代表成功非0值則是從站返回的錯誤碼。在給伺服驅(qū)動器升級固件時注意事項比較多升級前必須確保從站處于Pre-Op狀態(tài)過程數(shù)據(jù)交換要暫停升級期間不要斷電??偩€上多個從站升級時務(wù)必一臺上完再切下一臺絕不能“并發(fā)”。日志方面QT的qInstallMessageHandler可以把運行日志同時輸出到控制臺、文件和網(wǎng)絡(luò)配合SOEM的通信錯誤返回值記錄這樣現(xiàn)場如果出了問題能快速定位是通信鏈路問題還是控制邏輯問題。我見過太多項目因為缺少日志現(xiàn)場調(diào)試像大海撈針一樣。7. 實戰(zhàn)中的常見問題與排查技巧7.1 網(wǎng)卡選型與實時性優(yōu)化SOEM跑不好很多時候問題不出在協(xié)議棧本身而是網(wǎng)卡選錯了。EtherCAT主站對網(wǎng)卡的要求非常嚴格網(wǎng)卡必須支持接收所有以太網(wǎng)幀混雜模式并且發(fā)送和接收的時間戳越精確越好。普通消費級USB網(wǎng)卡是絕對不可用的延遲大還不穩(wěn)定。目前做EtherCAT主站最常用的方案是Intel的I210、I211以及部分瑞昱的千兆網(wǎng)卡芯片。I210因為支持硬件時間戳在DC同步精度要求高的場合幾乎是首選。英特爾的I210網(wǎng)卡成本不算高很多工控主板也直接板載。在Linux下可以通過ethtool -i查看網(wǎng)卡驅(qū)動如果是igb驅(qū)動那基本上就沒問題了。為了提高通信穩(wěn)定性我還會做以下幾個優(yōu)化在多核處理器上把EtherCAT線程綁定到獨立CPU核心避免線程被系統(tǒng)調(diào)度到其他核上。在Linux下使用chrt命令把實時線程設(shè)為SCHED_FIFO優(yōu)先級保證周期調(diào)度的確定性。關(guān)閉網(wǎng)卡的節(jié)能模式、中斷合并Interrupt Moderation盡量降低報文延遲。這些優(yōu)化看似不起眼但對系統(tǒng)的長期穩(wěn)定運行非常關(guān)鍵。7.2 總線掉線、丟幀與從站超時EtherCAT總線上最怕的就是掉從站。運行中一旦某個從站斷線主站發(fā)出的幀就無法正常返回所有從站過程數(shù)據(jù)都可能失效。SOEM的ec_receive_processdata返回值是“工作計數(shù)器”Working Counter的總和通過檢查它可以判斷這一幀通信是否成功。我封裝過一個檢查函數(shù)bool checkWorkingCounter(int expectedWkc) { int wkc ec_receive_processdata(0); if (wkc expectedWkc) { qWarning() WKC mismatch, expected: expectedWkc actual: wkc; // 可以在這里記錄是哪一幀、哪個從站失聯(lián) return false; } return true; }如果報文丟失頻繁首要懷疑點就是網(wǎng)線接頭。EtherCAT要求使用屏蔽雙絞線至少Cat5e且屏蔽層要良好接地。很多現(xiàn)場問題最終都查出來是網(wǎng)線壓接不合格這一段我踩過很多次。總線末端必須接上終結(jié)電阻否則信號反射會導致通信不穩(wěn)定。7.3 從站EEPROM異?;謴瓦€有一種常見的現(xiàn)場故障從站的EEPROM損壞或者數(shù)據(jù)被意外改寫導致SOEM掃描時上報錯誤的從站信息甚至根本掃描不到。針對這種情況SOEM提供了寄存器級的訪問接口可以強制讀寫EEPROM。在實際操作中只要從站的ESC芯片本身沒有損壞就可以通過ec_escread和ec_escrwrite直接訪問EEPROM接口恢復出廠配置。不過要注意裸操作EEPROM風險較大如果誤改了廠商區(qū)域的數(shù)據(jù)從站可能無法正常運行。最穩(wěn)妥的方式是聯(lián)系從站廠商獲取原廠配置工具而不是自行修復?,F(xiàn)場應(yīng)急時可以把錯誤從站隔離然后重新掃描其他從站至少保證單站故障不拖垮整條線。7.4 QT串口界面卡死與崩潰最后聊一個很常見的QT層面的坑。很多人在用QT開發(fā)監(jiān)控界面時習慣在槽函數(shù)里直接更新表格控件比如QTableWidget的行列變化。但如果數(shù)據(jù)刷新頻率太高控件頻繁重建內(nèi)存碎片化會導致界面越來越卡甚至直接崩潰。我建議的做法是在界面上使用模型/視圖架構(gòu)Model/View預先分配足夠大的表格數(shù)據(jù)模型刷新時只更新數(shù)據(jù)而不重建控件。對于大量波形類數(shù)據(jù)的監(jiān)控建議用QCustomPlot或QCharts的增量刷新模式而不是整個圖重繪。如果界面線程和EtherCAT線程之間通過信號槽傳遞高頻數(shù)據(jù)記得用Qt::DirectConnection連接方式并且信號參數(shù)用const QByteArray這種隱式共享類型減少拷貝開銷。8. 一個完整的起步項目單軸伺服的點動控制為了讓大家把前面的知識串起來我給出一個最簡單的完整示例QT界面上放一個按鈕和一個進度條按下按鈕后1號伺服以固定速度運行到指定位置。8.1 界面與業(yè)務(wù)邏輯分離界面很簡單一個QPushButton用于觸發(fā)運動一個QLabel顯示當前位置。整個QT工程的關(guān)鍵代碼集中在Worker線程。void MainWindow::on_startButton_clicked() { if (worker nullptr) { worker new EtherCATWorker(); thread new QThread(); worker-moveToThread(thread); connect(thread, QThread::started, worker, EtherCATWorker::start); connect(worker, EtherCATWorker::positionUpdated, this, MainWindow::updatePosition); connect(worker, EtherCATWorker::statusUpdated, this, MainWindow::updateStatus); connect(worker, EtherCATWorker::errorOccurred, this, MainWindow::showError); thread-start(); } // 發(fā)一個位置指令 worker-setTargetPosition(1, 50000); }EtherCATWorker::start()先初始化SOEM成功之后進入周期循環(huán)。設(shè)置目標位置時注意給數(shù)據(jù)加鎖void EtherCATWorker::setTargetPosition(int axis, int32_t pos) { QMutexLocker locker(cmdMutex); targetPositionMap[axis] pos; }然后在周期循環(huán)里讀取這個目標位置并寫入PDOint32_t pos; { QMutexLocker locker(cmdMutex); pos targetPositionMap[1]; } servoOut[1]-target_position pos; servoOut[1]-controlword 0x000F;這樣單軸點動控制的骨架就出來了。8.2 防止誤觸發(fā)的安全邏輯控制類軟件里“防止誤觸發(fā)”是必須考慮的功能。我在按鈕槽函數(shù)里加入了一個鎖定機制只有從站狀態(tài)都正常、伺服使能成功、急停信號未觸發(fā)時按鈕才有效。bool MainWindow::checkSystemReady() { if (isEmergencyStop) { showError(Emergency stop active!); return false; } if (!worker-isOperational()) { showError(EtherCAT not in OP state); return false; } return true; }很多初學者在調(diào)試時會忽略急停信號。實際上EtherCAT的AL狀態(tài)機和急停邏輯是兩回事——急停信號通常通過硬接線接入IO模塊或者伺服驅(qū)動器的STOSafe Torque Off端子軟件層面只能檢測和報警不能替代硬件的安全功能。這一點必須提醒大家安全回路的設(shè)計一定不要依賴上位機軟件這是人命關(guān)天的事情不能有任何僥幸心理。8.3 從簡單到復雜的演進路線如果你是從零開始接觸這套架構(gòu)我建議的路徑是先跑通官方示例simple_test再用QT封裝一個單軸點動然后擴展成多軸聯(lián)動最后加入DC同步和FOE升級。不要一上來就追求大而全否則出了Bug你根本不知道是協(xié)議棧的問題還是自己代碼的問題。單軸跑通之后再嘗試在兩臺伺服上做同步運動對比DC同步開啟和關(guān)閉時的曲線差異。有了實際的實驗數(shù)據(jù)你對EtherCAT的同步機制才會有真正的體感。9. 個人經(jīng)驗總結(jié)寫這篇文章的時候我回想這幾年在EtherCAT主站上走過的彎路最想傳達的一點是SOEM雖然叫“Simple”但它的內(nèi)部機制并不簡單只是把復雜性封裝得比較友好而已。真正用好的關(guān)鍵還是要把EtherCAT的協(xié)議原理和從站的行為摸透。QT加SOEM這套組合在目前的開源生態(tài)里可以說是“能打”的。QT負責跨平臺的界面、豐富的控件庫和完善的調(diào)試工具SOEM提供輕量、高效、可嵌入的EtherCAT主站能力兩者疊加無論是做實驗室原型還是量產(chǎn)設(shè)備都有足夠的底子。最后分享一個很小的技巧在開發(fā)和調(diào)試階段把SOEM的調(diào)試打印打開能看到每個從站的寄存器讀寫過程對理解協(xié)議和排查問題幫助極大。SOEM在編譯時用DEBUG宏來控制這些輸出QT工程中可以在.pro里加一句DEFINES DEBUG來啟用。等你在實際項目中積累了自己的工具函數(shù)庫和模板工程之后開發(fā)效率會飛躍一個臺階。希望這篇實戰(zhàn)指南能幫你把QT加SOEM的框架從編譯到落地完整搭建起來少踩一些我當年踩過的坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久有码视频| 国产精品第一区第一页| 999熟女精品| 亚洲精品视频在线| 国产尤物AV尤物在线观看不卡| 久久激情视频| 高跟伊人julia ann| 日本大片日本一区二区免费高清| 在线一道啪| 91精品91久久久久77777俄罗斯老妇姓x| 天天舔九色婷婷| 五月天啪啪| 日本高清_区二区三区| 欧美性色网| 青青青在线高清视频在线一二三四区| 亚洲激情深爱文学小说网站| 色制服丝袜夫妻av一区| 人妻黑丝袜电影| 区一在线观看| 亚洲情色一区二区三区| 中国黑人三级片网站上区| 久草久热| 99色骚| 欧美中文字幕男人天堂久久精品| 婷婷五月天AV| 天天综合日韩网| 五月丁香综合激情| 九九热九九热| 国产极品久久久| 美女黄页| 无码99| 97综合在线观看| 开心五月深爱五月| 大香蕉在线视频重口味毛片在线| 亚洲色9| 亚洲丝袜天堂| 亚洲区限制级| 中国的操老妇女| 白丝少妇一区二区| 欧美激情 亚洲色图| 色香91| 玖玖爱伊人玖玖爱| 99久在线精品99re8| 亚洲天堂资源| 亚洲无码?第一页| 操屄日韩| 久99| 884t在线| 91天天爽| 少妇高潮流水av免费| 99e久久国产精品| 亚洲中文国际强奸字幕| 人人操AV| 91美女在线视频| 夜夜国产一区| 午夜在线播放| 国产又猛又粗又爽又黄| 久99热| 超碰亚洲97| 熟女一区二区| KK色在线影院| 精品性爱| 久久极品一区二区| 色五月天AV| 日本精品九九九| 97久久久久| 国产日韩精品suv| 国产美女在线精品免费看| 亚洲欧洲自拍图片专区满春格 | 丁香六月天| 久久久久免费少妇| 大但人体久久久久| 女欧美一区二三区| 91欧美少妇| 亚洲狠狠入| 久久久新亚洲AV| 青草草免费网站av| 五月丁香啪啪啪| 中文字幕视频2区| 欧美精品,四区。五区| 久久久久9999| 日本三级韩三级99久久| 久久久久久久久久久久黄色 | 超碰97久久观看| 农村少妇久久久久久久| 亚欧无码在线| AV一二区| juliaann欧美丝袜办公室| 情趣丝袜无码操逼视频| 99超级碰免费视频| 国产精品大屁股999| 91狠狠| 国产日本久久免费精品| 传媒免费一区二区三区| 乱伦熟女专区| 亚洲乱色视频一区、二区在线| 一区二区三区色综合| 国产精品乱码久久| 亚码激情| 中国少妇啪啪视频| 久久精品人体AV| 久久 久久国内精品亚洲| 屌逼传媒| 国产成人精品网站| 日韩欧美字幕亚洲一区二区| 神马久久久久久久久久久久| 一起草在线视频| 亚洲欧美精品福利在线| 欧洲亚洲人人爽爽视频| 国产高清无码一区三区二区| 夜夜国产一区| 免费的黄片有限公司| 啊啊啊啊嗯嗯嗯用力好爽| 少好三P| 操逼逼福利视频| 18禁久极品美女久久哦哟呀!| 午夜精品久久久| 亚洲色图激情小说| 亚洲欧美情色| 五月婷婷激情| 99热在线观看| 久久综合精品一区二区三区| 婷婷五月天激情网| 久久中文字幕人妻熟av女蜜柚| 国产 热久久久久国产精品| 亚洲精品国产精品乱码不卡| 国产精品分类在线观看| 青青伊人久久| 亚洲色欲天天人妻无码系列专区| 青久久| 日本在线不卡v二区| 亚洲91网站| 久操凹凸视频| 久久久久久久久久久精| 草草影院在线视频| 免费αⅴ在线观看| 超碰碰小说97| 色色无码| 人人性爱视频免费| 999 久久久| 天堂中文资源在线bt| 色九九综合AV| 婷婷久草一区二区三区| 国产无码一二三区| 国产精品精品系列在线观看| 国产男女无套97| 岛国激情视频在线观看| 91狠狠狠| 国产熟女精品区| 国产一区二区在线电影| 综合第一页| 91老熟女逼| 人人看欧美性爱| a啊啊啊啊啊啊啊啊一区二区| 国产怡红院| 性做久久久久久久| 五月婷亚洲精品天堂| aaa淫乱视频| 国人欧美精品一区二区| 2017天天操| 91中文精品日韩欧美在线| 大香蕉一线视频| 天堂性色| 欧美,亚洲,日韩,v,天堂,手机在线观看| 熟女乱伦二区| 色色福利| 成人精品久久久午夜福利| 男人的天堂久久狠| 91在线美女| 岛国激情视频软件| 中文字幕99999| 啊啊啊啊好疼视频| 中文有码第五页| 日本国产成人亚洲精品无码| 色综合V| 久久风骚城市人| 夜夜騷av、一區二區| 久久久精品成人国产| 操b在线观看| 久久精品电影在线| 亚洲少妇激情一区二区三区| 午夜欧美J进J出白浆流出久久久| 69精品在线| 啪一啪免费视频| 欧美后入| 91精品网站| 一二三卡欧美日韩人妻免费精品| 99国产精品免费| 日本福利社| 69精品久久久久中文字幕| 日韩成人性日韩成人性爱视频在线免费观看 | 另类小说五月天| 亚洲第一精品在线视频| 收看日本人日bb| 97色综合中文网| 夜夜嗨一区二区三区直播内容| 久久少妇人妻| 欧美大片天天看| 欧亚不卡| 久久久999国产精品| 亚洲色丰满少妇高潮| 欧美九九99久久精品| 久久久久国产无av| 亚洲五月婷婷| 九九99精品视频在线观看| 美女操逼福利视频| 狠狠色噜噜狠狠狠狠狠色综合久久 | 黄页| 欧美Ⅴ性爱| 天天躁日日躁狠狠躁| 91天天综合日韩欧美| 丰满人妻-区二区三区免费看| 九九九热精品| 久超碰这里只有精品| www. 男人天堂成人在线| laoshunv91| 97精品国产手机| 美腿丝袜偷拍亚洲欧美| 欧美夜色| 亚洲 欧美 综合 91| 国产在线精品电影观看| 中文字幕日韩精品一区二区三区| 天天摸夜夜摸| 内射中出日韩在线观看视频| 亚洲春色激情小说| AV高清一区| 久久伊人在线五区| 金典av| 啊啊啊男女| 97神马久久| 搡老熟女免费视频| 成年人一级黄色毛片大全在线观看| 性在久久久久久| 日本污ww视频网站| 欧美中出| 国产精品一级特黄aaa大片在线观看| 久久精品国产99精品亚洲蜜... | 超碰综合97在线| 熟女熟妇一区二区三四区| 91精品人妻一区二区三区蜜桃| 综合久久9| 亚洲国产91精品一区二区久久| 亚洲精品国产熟女| 校园春色之综合网| 97精品在线| 亚洲在线91| 九九精品无码专区免费| 日本亚洲熟女视频| 久艹99| 久久精品人妻一区| 全球成人中文在线| 久久久久久久少妇| 99精品无码| 男人天堂网址| 图片区小说区| 男人的天堂色偷偷青青草视频婷婷网| 最近二区三区视频大全| 亚洲欧洲综合视频在线| 精品人妻一区二区乱码一区二区| 91美| 色久综合| 欧美综合传媒| 秋霞久久亚洲精品成人| 久久女人视频| 丝袜美腿操av| 操逼1区| 日本美女性生活久久久久久久| 午夜乱轮操逼视频免费看| ?亚洲伊人伊成久久人综合网| 天综合网| 好爽视频在线观看视频| 你懂得91| 欧美久久久| 欧洲性爱无码区| 美女自卫慰黄网站免费| 1二区9| 久久精品国产亚洲AV先锋| 曰韩av中文字幕专区| 伊人伊人LD| 蜜臀无码视频在线观看| 色五月婷婷麻豆在| 久久亚洲一区女同性恋中文字幕| 婷婷中文网| 天天综合网入口~91| 97视频在线免费观看| 国产在线精品偷| 先锋音影AV| 国产精品午夜福利亚洲综合网| 天天操天天插| 亚洲自拍小说| 一区二区三区在线资源| 精品无码少妇| 1024人妻| 狠狠干91| 国产成人久久久精品免费AV| 色婷婷基地| 国产精品久久久久久久久久久久久久久| 夜夜欢天天干| 激激五月| 天天影视色香欲综合网小说| 夜夜爽爽爽| 婷婷五月色| 欧美日韩制服| 92福利社视频| 性饥渴少妇av无码毛片| 最新精品久久蜜桃| 国产伦乱91| 欧美日韩制服| 肥臀熟女福利视频一区二区| 日逼视频日本| 精品人妻一区二区蜜桃视频| 伊人AAA| 91东北熟女| 欧美综合色站| 精品国产丝袜一区二区三区乱码| 久久久9 9 9精品| 婷婷丁香五月综合| 天天插网| 9久久美女首页| 日本一区二区成人在线| 欧美性色网| 99re95| 久久久久9| 极品色综合| 天天香香欲综合| 国产女同视频在线播放| 天天碰久久入| 麻豆性爱视频在线播放| 蜜乳AV一区二区三区四| 国产精品网址| 208天天久久九九九| 无码色| 中文字幕乱在线伦视频中文字幕乱码在线 | 豆花视频操逼网址| 欧美一区二区| 日韩免费三级黄片电影| 欧美亚洲清纯| 99精品伊人| 99热在线播放| 国产美女高潮叫床视频| 日韩欧美福利视频看看| 青青草原香蕉日本Ap| 2001天天操| 性色av网站| 91香蕉国产尤物视频| 91爱看| 92福利社视频| 色综合网1| 日韩性爱啪啪视频| 天天综合站| 欧美色图天堂网m| 美女黄频a美女大全免费皮| 2024黄色视频| 久久精品超碰| 九九久久国产精品怡红院| 嗯嗯啊啊用力视频免费| 不卡超碰护士AV在线免费播放| 午夜福利免费福利视频| 手机在线播放国产福利| 国产偷拍网站| 日躁天天爽爽| 亚洲熟女人妻中文字幕一区二区| 中文字幕精品亚洲熟女| 韩国女主播青草在线| 欧美黄页在线| 人妻激情偷乱视频一区二区三区 | 少妇啪啪自拍| 国产怡红院| 激情综合五月| 久久久精品成人国产| 欧美18 在线观看| 欧美啪啪色吧在线| 国产传媒av天美传媒在线| 女人18精品一区二区三区| 欧美综合制服在线| 欧美精品久久| 美女天天干| 日日嗷| 欧美综合传媒| 久久精品人妻一区二区三区| 精品9999| 午夜一区| 九九九九九精品视频| 加勒比无码毛片| 久久9精品网站| wuyechaopeng| 97久久久久| 久草电影网| 91色夜| 色与欲影视| 欧美日韩在线小说| 五月天婷婷在线看| ji熟女.com| 丰满人妻无码一区二区三区| 99性爱在线观看| 久久一区二区三区入口| 天堂种子在线www网资源| 日韩一级片在线看| 五月婷婷激情综合| 色一射色一射| 亚洲色悠悠久久88| 超碰9 7女人| 97美日韩视频| 天天看精品动漫视频一区| 国产av激情无码久久天堂| 嗯……啊…嗯嗯…啊…好舒服| 爱射综合| 久草在| 91n.欧美| 又大又大又大又粗爽高潮观看 | 欧美色色色| 人妻少妇蜜桃视频欧美一区| 天美一二三在线观看Av| 欧美 日韩第一性色| 果冻传媒A片麻豆熟妇人妻| 色妇综合网| 波多野结衣之双飞调教在线播放| 啪啪免费| 78综合网| 免费99精品国产自在在线| 91亚洲图片| 日韩欧美大片免费高清啪啪| 黄色一级视| 青青草视频久久| 久久中日麻豆| 99999国产| 18禁网站在线播放| 91爱综合| 国产精品高朝久久久久久久| 日本一区二区中文字幕久久| 精品v日韩欧美国产| 色婷婷丁香五月| 午夜欧美神马久久久久| 亚洲自拍97| 99re公开精品免费视频| 东京日日夜夜| 国产熟女自拍| 天天日天天搞天天干| 五月婷婷综合在线| 97超碰超欧美。| 欧美91精品国产自产| 操逼逼福利视频| 思思热一热婷婷热一热| 96国产污污污丝袜| 欧美成人性爱视频在线播放| 久久亚洲av成人无码国产| 夜夜嗷嗷一区二区| 欧美激情一区| 一区二区你上我| 九九免费影片| 日韩国产成人自拍视频| 上床不卡网站| 亚洲巨爆乳一区二区三区四季网| 99热自拍| 蜜臀99久久精品久久久久久| 日韩激情啪啪| 色偷偷2020免费视频播放| 超碰在线观看av不卡| 久久久久久亚洲精品中文字幕人妻| 9九九国产| 夜间福利片1000无码| 久草资源在线视频官方总站日韩丝袜美腿 | 一二三卡欧美日韩人妻免费精品| 日韩综合成人免费视频| 欧美香蕉视xxx| 国产毛片片精品天天看视频| 六六久久日韩不卡| 精品久久久久综合无码| 久99| 69精品| 久久久久久久久久久六六| 亚洲交性| 天天操女人| 欧美狠狠干| 内射中出日韩在线观看视频| 日韩啊V| 色婷婷国产精品一区在线观看| 欧美日韩性爱视屏免费看了| 加勒比色99999| 亚洲中文一区二区三区视频| 91痴汉| 欧美国产日韩高清在线| 超碰99在线| 9九九九九视频在线观看| www亚洲欧美| 99re3这里只有精品| 9久在线视频只有精品| 色女99一级片在线观看| 97资源视频| 神马久久69| 全免费a敌肛交毛片免费| 亚洲se电影| 九九久久综合| 2024黄色视频| 中文日韩欧美熟| 狠狠色婷婷7777久| 欧美色女人| 啊啊好多水| 福利伊人玖玖国产| 欧美双插| 国产精品天干天干综合网麻豆| 精品一区二区人妖| 天天综合网~91| 台湾大香蕉99热| 美女黄频a美女大全免费皮| 熟妇色99| 激情五月天校园春色网| 天天干少妇| 国产又黄又爽又刺激久久久久久| 一本大道久| 日本午夜福利视频| 亚欧性爱在线无码| 日欧操屄| 日韩久射综合| 欧美天堂超碰97| 激情综合五月天| 99老司机精品视频在线观看| 欧日韩一二三f区| 国语对白露脸XXXXXX| 碰超人人在线一区二区三区| 中文字幕 码 自拍 视频 区| av在线一区二区三区| 欧美性夜| 超碰在线第一页| 大稥蕉免费视频这里只有精品| 精品国产人成在线| 国产精品白领在线观看 | 国产精品日韩在线一区| 久久久久99精品成人片蜜臀| Aa东京男人的天堂| 97超久碰| 伊人五月天青青草婷婷| 国产成人综合网| www.大香| 日韩一级性爱无码| 97碰| 酒色综合网| 亚洲,欧美,综合网| 色悠久久久av| 金典av| 男人天堂久久日韩| 久久久99久9| 香蕉婷婷| 成人国产精品三级A片| 思思热在线cao| 久久黄片国产一区二区| 91P0RNY大屁股人妻| 超碰碰97资源站| 中文字幕熟女人妻丝袜丝| 内射黑丝袜| 成人熟女区| 玖玖资源中文字幕制服丝袜| 中文字幕少妇色| 中文字幕精品丝袜| 久久av色| 国产传媒一区日韩| 区二区亚洲婷| 精品久久久不卡一区二区| 久久综合女优| 亚洲色香| av天堂天堂av日韩| 久久国产乱子伦精品免费女人| 日韩在线欧美精品一区二区| 强奸乱伦免费网站| 美国一区二区三区视频| 欧美性爱1080p| 口爆吞精在线观看| 久久AV无码网址| 久9视频| 久久久一级| 日韩在线视频1234| 成人网欧美风情| 狠狠图片青青草| B049AV在线播放| 日韩 女同 综合| 黑人精品欧美一区二区蜜桃| 夜夜欢天天干| 欧美呦呦性爱| 入口操逼网站| 久久99热这里只频精品6学生| 视频二区美腿丝袜制服人妻欧美| 嗯嗯嗯啊啊啊在线免费观看| 传媒免费一区二区三区| 99re在线视频这里只有精品| 国产路线专区| 操逼视频色| 亚欧性爱ab| 丁香五月社区| 日韩精品99久久久久久中文字幕| 中精品一区二区三区| 巨乳特殊服务按摩| 人人操人人舒服| 国产呦精品一区二区三区下载| 在线只有精品| 久久m| 欧美午夜熟妇黑人精品91| 亚州综合色| 无码黑人精品一区二区三区三| 伊人五月天| 中文字幕视频2区| 乱色老一区二区三区的观看方式 | 东北女人av| 在线情色电影 91大 | 免费观看的av| 亚洲成人性爱网站在线播放| 日韩午夜啪啪视频| 91久久18禁| 98久久超碰| 欧美天天干| 区日韩亚洲乱码av电影| 国产精品乱码久久久、久久| 国产在线综合福利网站| 国产乱伦一二三区| 后入式在线免费观看60秒| 青青五月天| 久久一区二区高清免费| 真实高潮91| 国产麻豆91欧美一区二区久久婷婷国产精品 | 在线观看不卡一区二区三区| 99九九精品| 啊啊啊要高潮了| 久操视频在线观看| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 国产亚洲精品久久久久小| 激情99| 久久99久久99精品天美传媒棢·纸:. | 国产一区二区啪啪视频| 久久久久亚洲一区女同性恋中文字幕| 亚洲情色欧美| 日本在线一二| 国产乱码久久久| 国产一区在线免费播放| 97bbn| 婷婷av在线中文字幕| 920日本午夜免费| 亚洲色图片区| 四虎影院成年人片| 天天影视91看看| 首页中文字幕中文字幕免费| 97频视在线| 亚洲国产av中文字幕久久| 熟妇人妻一区二区 | 欧美九九99久久精品| 97日韩| 爱爱动态120秒| 亚洲色图欧洲| 男人亚洲91首页在线| 校园春色亚洲色图| 日韩AV一区二区三区四四| 可乐操亚洲蜜911| 亚洲一区中文字幕一区| 91日韩网站| 狠狠色丁香| 亚洲人久久久久日| 久操B网| 久久精品国产精品一区| 97在线欧洲| 人人摸.人人色| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 91福利网在线观看| 亚洲乱色视频一区、二区在线| 五十路熟女人妻一区二区在线观看 | 日韩激情视频| 国产精品69人妻无码久久久| 亚洲午夜蜜臀| 桃色五月天| 大象AV在线| 久久精品一区| 福利视频一区二区微拍| 免费视频观看60秒| 97超碰69| 啪啪AV导航| 欧美综合色图片| 91在线美女| 日韩亚洲中文有码视频| 性欧美| 在线女人91| 日本狂喷奶水在线播放212| 激情小说亚洲视频| 男人的天堂网免费| 亚洲国产欧美一区二区潘金莲 | 亚洲高清无码在线桃色| 午夜九九九九九九| 物尤视频一区二区| 精品超碰国产| 色网站导航大全| 久湿久久| 久久久久久久 九九九九九九九| 国产人妖的免费的视频| 色九九久九九| www.高清无码诱惑一区.com| 色婷视频| 高清一区AV无码| AV女优男人的天堂| 好舒服视频| 天天看综合网| 手机在线看片免费人成视频| 极品国产内射| av橘色网站| 人妻一区久久二区三区色播| 大香蕉综合| 翔田千里AⅤHD无码| 日韩无码第3页| 极品粉嫩少妇视频| 麻豆60秒| 日韩性爱小视频在线观看| 美女91网站| 国产精品一区二区麻豆| 国产青视频| 青青草九九九九九| 亚洲高清无码免费观看视频| 乱伦a片视频| 少妇综合| 无码粉嫩白虎一线天b区| 六月婷婷一区二区三区| 超碰 另类 欧美| 首页亚洲国产高跟丝袜诱惑视频| 亚洲暴力强奸AV| 老司机深夜18禁污污网站| 天美传媒AV在线| 亚洲另类色综合网站| 国产一区二区三区久久精品太古里| 嗯啊不要在线| 色吧综合网| 日本色色色视频| 亚洲国产精品99久久久| 家庭乱伦麻豆| 91丝袜在线观看| 久久女人| 天天干18禁| 怡红院久久老司机| 99热欧美| 东京热毛片调教| 99热这里只有精品1| 九九九九九九九| 欧美日韩人妻少妇 一区二区三区| 国产精品色哟哟| 久久夜色一区二区| 少妇一区二区三区在线观看| 欧美老熟另类| 欧美综合加勒比在线| 亚洲精品久| 亚州操操穴网| 婷婷色香| 超碰97最新人妻| 一区,二区,三区视频| 国产精品在线网站| 日韩中文9| 亚洲se电影| 日韩91网| 天天噜| 又粗又长又大国产不卡| 亚洲欧美高清无码| 日韩免费高清大片在线| 日韩精品一区二区日韩| 国产亚洲日韩在线三区黑人| 欧亚乱色熟女一区二区| 操逼逼无码| 丁香五月天啪啪| 亚洲AV无码天美传媒一区| 日韩熟女精品无码专区一区二区| 国产美脚女优尤物在线观看| 99国产精品免费| 91男同| 少妇精品| 精品久久久久久AV无码| 亚洲第2页| 国产激情片在线观看| 久久久人妻| 97大色网| 中文字幕色AV| 久久97| 亚洲一区二区三区中文字幕| 午夜精品探花| 国产精品对白内射| 亚洲性猛| 亚洲色宗合| 艹精品| 婷婷九月色| 国产AV天美| 熟女熟妇一区二区三区视频| 人妻熟女字幕一区二区| 九九九精品一区二区无码| 探花激情视频| 国产精品爆乳懂色蜜乳| 亚洲色91| 啪啪视频免费在线观看| 日韩欧无码一区二区三区免费不卡| 日韩人妻有码免费视频| 超碰国产在线| 色九九九九| 新怡红院| 日韩激情小说一区二区| 亚洲色图91欧美日韩| 91欧美综合在线| 97干色| 人人爱人人操人人性| 人人喜人人妻| 国产自偷| 超碰在线观看av不卡| 青青网三级视频| 中文精品少妇天堂| 欧美五十路熟| 97超碰色五月| 99少妇内射| 日韩av一级黄片| 秋霞男人网| 人人妻人人爱人人玩| 国内毛片国产专区二| 精品人妻一区二区免费蜜桃| 亚洲色婷婷综合久久久久中文| 制度丝袜99| 国产性感骚丝袜在线| 97超碰精品图片| 亚洲成a人在线观看久| 美女淫穴| 欧美一级黄色免费专区| 日韩精品 资源| 快播久久人人aV| 永久免费发布性爱网| 欧美另类自拍 | 欧美成人午夜免费福利785| 久久久久久久久久久久黄色 | 亚洲久热| 亚洲欧美综合网| 国产视频不卡在线观看| 成人黄页| 亚洲无码免费看| 最新中文字幕av| www.亚洲黄色| 亚洲熟女综合| 你懂的在线观看区国产| 午夜精品99久久久久传媒| 亚洲色图A| 五月婷婷六月色| 人妻第一页| 天天日天天爽| 麻豆亚洲AV成人无码久久精品| 午夜一区| 九九九久久久W精品| 啪啪一区| 天天综合-91入口| 麻豆亚洲Av成人无码一区精品| 男人的天堂va在线| 久久久人体| 亚洲国产另类在线中文| 久久25| 久久日韩精品一区二区| 久久香蕉超碰97国产精品 | 亚洲男人的天堂网| 久久久久国产精品喷潮免费观看臀| 亚洲精品 欧美精品| 国产69精品久久久久99尤物| 熟女露脸激情自拍视频| 免费黄色片子| 国产福利合集| 东北老女人的激情视频| 国产福利在线视频网站| 中文字幕在线第二页| 国产欧美一区激情交| 日韩色香| 国产亚洲欧洲在线观看| 懂色天天爱天天日天天射天天澡| 91熟女.com| 丁香五月婷婷啪啪| 中文乱码字字幕在线第5页| 另类av天堂| 性色av网站| 成人小电影网站tex| 91 国产丝袜在线放观看| 国产野战露脸在线播放| 999久久芭蕾| 旡码电影特区| 逼逼逼逼操操操操操操操操操午夜剧场 | 大香蕉78| 综合av影片| 加勒比大香蕉视频在线| 国产在线观看91精品一区| 亚洲影视第一页| 九九无码久久精品视频| 成人激情无码在线视频| 国产一区在线看| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲天堂欧美| 九九亚洲色在线观看| 91 手机在线播放 绯色| 日韩人妻播放| 成年无码动漫av片无尽在线 | 成人自拍三级在线观看| 亚洲第二页| 欧美在线l亚洲| 91一区二区| 国产成人手机视频激情| 一区二区高清视频| 超碰综合97在线| 国产AV天美| www五月| AV网站高清无码在线观看| 中欧人妻丝袜中文字幕| 久久久96精品| 蜜臀99999| 97超碰美国| 九九无码视频| 国产美女裸体秘 永久无遮挡| www欧美91| 97操综合| 少妇色综合| 天天综合欧美综合| 亚洲91极品| 狠狠色婷婷7777久| 日韩欧美tv一区二区在线观看| 毛片久久| 少妇色| 96久久久久久久| 91熟女视频网| 呦女网站| 夜夜操中文字幕| 亚洲情色图片区| 国产夜夜操| 久久久久无码| 日韩人妻精品久久久久| 国产亚洲国产超碰| 亚洲蜜桃V妇女| 亚洲无吗在线视频| 美国一区二区三区视频| 亚洲成aⅴ人片不卡无码| 97久久精品| 亚洲超碰97| 天天噜| 91色花堂| 九九热AV| 探花视频免费观看国产专区| 国产精品操| 久久精品一区二区| 国产后入| 热思思免费视频| 翔田千里A片一区二区| 亚洲色天| 波多野结衣AV无码一区| 青青操网| 天天懆天天日| av天堂天堂av日韩| 乱伦av麻豆| 郑州宾馆老熟女露脸啪啪| 中文字幕一区二区韩| 亚洲成a人片在线观看中文!!!| 操逼视频亚洲| 操屄不卡视频| 99激情视频| 久久久久骚| 色五月av| 999精品久久久久久久| 亚洲欧美天堂| 国产91亚洲精品一区二区三区| 国产兽交视频在线播放| 萌白酱自拍视频| 不卡啪啪视频| 亚洲精品 大香蕉| 夜夜操91744565| 亚洲综合性网址| 91亚洲丝袜熟女| 亚洲色图欧美色图另类图片| 成人免费视瓶| 中国国国产一级特黄毛片| www.色综合| 嗯啊免费视频| 夜夜嗨绯色| 蜜桃传媒视频第一区入口在线看| 欧美色另类| 中文字幕乱码人妻二区三区| 一,爱啪啪,在线免费视频| 91久久婷婷| 射欧美综合| yazhouzaixian| 91狠狠综合网| 极品尤物自安慰| 激情文学网伊人| 9久久美女首页| 78m成人视线| 国产亚洲精品A在线观看下载| 久久一级无码精品毛片6| 欧美少妇熟女| 啊啊啊啊啊啊啊网址在线观看| www亚洲欧美| 国产99精品一区二区三区免费| 婷婷五月色| 欧洲精品网| 99热在线播放| 欧美人妻精品一区二区| 天美AV片| 欧美黑人日韩少妇色情| 欧美人黑A片无码免视费| 人人摸人人摸人人干| 黄页大片在线观看| 福利天天都操| 色欲av一区二区三区蜜芽| 五月综合视频| 黑人干亚洲| 亚洲国产成人精品999| 99久久婷婷| 蜜臀av中文字幕| 自拍内地三级在线观看| 色婷婷六月| 中出在线视频| 欧美黄色大片在线观看| www.91色综合| 亚洲图片视频小说| 狠狠中文字幕| 欧洲性爱无码区| 大香蕉黄色一区| 久久美国毛片| 草莓精品视频在线免费观看| 懂色综合久久久| 精品夜夜澡人妻无码AV| 亚洲人妻中文高清| 亚洲欧美setu| 青娱乐国产剧情av一区| 五月天婷婷小说| 啊啊在线| 中文字幕成人理论在线| 97AV在线免费观看| 黄片免费视频2019| 亚洲男人的天堂一区二区| 国产99999| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 亚洲精品97p| 51一区二区三区| 9长久久精品| 亚欧免费| 97天天操天天干| 国产多人在线观看视频| 国产人伦精品一区二区三区| 97干97色| 91蜜臀在线久久久久| 青青草国产欧美非洲黑人| AV 少妇 人妻 偷拍| 色五月av| 久久久久久亚洲精品不卡人乳| 操一对老熟妇爽上天视频| 丁香色色网| 春色91| 蜜臀av一区二区三区免费观看| 日韩99999| 亚洲 欧美 91| 明星性猛交ⅹxxx乱大交| 色呦呦、国产精品| 久久久国产av美女私房| laoshunv91| 在线综合色| 久久久久深夜无码| 色色综合网站| 国产日韩久久| 91人妻丝袜无码| 国产强奸乱伦xd| 亚洲综合骚逼| 亚洲熟女av日韩熟女| 91精品人妻一品二品三品| 91视频国品一二三区| 欧美国产精品久久九九| 区二区亚洲婷| 亚洲午夜福利视频| 一区二区视频在看| 日韩内射视频| 老熟女乱子伦中文字幕一区二区| 丰满人妻一区| 人人操av| 日韩欧洲操屄视频| 丝袜色综合| 亚洲性爱高潮影院| 91大神精品长腿在线观看网站| 97色涩| www.激情| 四虎午夜影院| 国产自产22区| 国产又粗又又黄又猛| 被男人吃奶很爽的毛片| 日本亚欧爱爱| 久草综合京东| 国产成人手机视频激情| 伊人麻豆传媒| 97爱b| 丁香五月天啪啪| 韩三级a视频在线观看 | 天天爽天天操| 在线无码视频| 91性网| 亚洲国内精品成人不卡| 九月色婷婷| 人人潮人人摸| 97亚洲在线| 熟女AV一区| 欧美亚州手机在线| 影音先锋视频在线| 国产路线专区| 亚洲精品97中文字幕| 亚洲色图激情小说| 中国一区二区亚洲人妻| 天天澡天天爽日日AV| 色五月AV在线| 青苹果影院男人的天堂| 337p大胆噜噜噜噜噜91Av| 天天日天天搞天天干| 欧美精品黑人猛交高潮| 熟女网站最新| 精品久久久av| 丁香色色网| 强奸乱伦Av网| 日韩无码视频黄色| 78精品| 国产精品97超碰| 色超碰综合| 亚洲伊人久久精品狠狠在线| 99久久网站| 亚洲系列第一页| 黑人美精品 A片| 久久久久国产精品久久久| 91天天综合在线| 偷拍片久久| 国产亚洲色婷婷99精品91| 偷拍 亚洲| 中文字幕在线观看丝袜| 日韩女模中文造逼| 日本天天操| 亚洲国产精品99久久久| 九九综合九九综合| 97久久国产| 欧美亚州综合网图片| 综合天天。| x97av| 偷拍五区| 久久综合久色欧美综合狠狠 | 人妻夜夜爽天天爽三区麻豆AV网站| 91操熟女视频| 天天影视91看看| 天天干夜夜| 激情内射| 超碰97极品9| av2014 日韩在线中文字幕| 超碰97人人乐| 91痴汉| 清纯唯美综合| 超碰97 线线 在现| 97伊人网| 丰满人妻一区二区三区色-百度| 日本加勒比无码专区| 超碰九区| 国产一区二区二区按摩精品啪视频| 国产深喉视频一区二区| 青青草国产欧美非洲黑人| 亚洲丝袜综合| 超碰97色| 国产福利电影| 一级黄色视频网| 久久国内| 婷婷综合网站| 欧美日韩色图片| 秋霞男人网| 91综合国产精品| 欧美高潮| 久久久久成人网|