<style id="7i3y3"></style>

      <sub id="7i3y3"><i id="7i3y3"></i></sub>

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al
        首頁 新聞 工控搜 論壇 廠商論壇 產品 方案 廠商 人才 文摘 下載 展覽
        中華工控網首頁
          P L C | 變頻器與傳動 | 傳感器 | 現場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
          D C S | 工業以太網 | 現場總線 | 顯示調節儀表 | 數據采集 | 數傳測控 | 工業安全
          電 源 | 嵌入式系統 | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
        運動控制卡周期上報實時數據IO狀態之C++篇
        深圳市正運動技術有限公司
        收藏本文     查看收藏

        本文導讀

        今天,正運動小助手為大家分享一下運動控制卡周期上報,通過提前設置經常讀取的參數主動周期上報,可以減少PC主動輪詢的時間。此次介紹將以ECI2A18B為例,主要講解如何使用C++編程語言來進行周期上報函數的編寫和功能的開發。

        01 ECI2A18B控制卡硬件介紹

        ECI2A18B經濟型多軸運動控制卡是一款脈沖型、模塊化的網絡型運動控制卡。控制卡本身最多支持10軸,用以實現直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸、機械手指令等簡單的軌跡控制需求;采用優化的網絡通訊協議可以實現實時的運動控制。

        ECI2A18B.png

        ECI2A18B控制卡功能特點:

        (1)本身支持6差分脈沖軸+4單端脈沖軸運動控制,最多可擴展至12軸運動控制。

        (2)脈沖輸出模式:脈沖/方向或雙脈沖。

        (3)AXIS接口支持編碼器位置測量,可以配置為手輪輸入模式。

        (4)專用的手輪輸入接口。

        (5)每軸最大輸出脈沖頻率10MHz。

        (6)通過CAN總線,最多可擴展到256個隔離輸入口和256個隔離輸出口。

        (7)軸正負限位信號口/原點信號口可以隨意配置到任何輸入口。

        (8)通用數字輸出口最大輸出電流可達500mA,可直接驅動部分電磁閥。

        (9)RS232接口、以太網接口、CAN接口。

        (10)支持最多達12軸直線插補、任意圓弧插補、螺旋插補。

        (11)支持點位運動、電子凸輪、直線插補、圓弧插補、連續插補運動、機械手指令。

        (12)支持Basic多文件多任務編程。

        (13)多種程序加密手段,保護客戶的知識產權。

        ECI2A18B接線圖.png

        接口定義:

        ECI2A18B接口圖.png

        ECI2000系列經濟型多軸運動控制卡可用于電子半導體設備(檢測類設備、組裝類設備、鎖附類設備、焊錫機)、點膠設備和流水線等12軸以內脈沖應用場合。

        控制器支持windows、linux、Mac、Android、wince各種操作系統下的開發,提供vc、c#、vb.net、labview等各種環境的dll庫,如下圖。上位機軟件編程參考《ZMotion PC函數庫編程手冊》。

        API.png

        02 為什么要進行周期上報,作用是什么?

        1、當PC主動輪詢的次數過多時,可能會導致以下問題

        (1)消耗系統資源

        輪詢會使系統資源消耗增加,無論是任務輪詢或定時器輪詢,都會消耗系統的部分資源。在多用戶或者資源受限的環境里,這極有可能致使系統性能下滑。

        (2)浪費CPU資源

        只要是輪詢都會造成CPU資源的浪費。這是因為輪詢會會在系統內不間斷的運行,不論當前設備的狀態是否有改變。實際上,設備的諸多狀態并不經常改變,輪詢空轉只會無端消耗CPU的時間。

        (3)影響電源管理

        向PC報告外圍設備次數增多會使功耗提高,這可能縮短電池壽命或增加能源消耗,從而影響電源管理。

        (4)降低響應速度

        如果輪詢頻率過高,系統響應其他任務的速度或許會變慢。造成原因是由于CPU會不間斷的輪詢當前狀態,從而響應處理其他計算或與用戶交互任務會減慢。

        (5)網絡負載增加

        若輪詢涉及網絡通信,輪詢請求過多就可能加大網絡負載,造成網絡擁堵或者延遲加劇。

        (6)服務器壓力增大

        在客戶端服務器架構里,要是頻繁進行輪詢請求,就可能給服務器帶來壓力。主要集中在在服務器資源不足時,也許會使服務質量降低或者出現請求超時的情況。

        2、多種獲取方式對于程序運行占比的區別:

        在探討單條獲取、多條獲取以及周期性獲取對程序運行產生的影響時,我們需要考量這些操作的特性以及它們對程序整體性能可能存在的潛在影響。

        (1)單條獲取

        單條獲取即程序每次僅處理一個單獨的數據項。此方式簡單直接,然而處理大量數據時效率不高,因為每次操作都會有上下文切換與資源管理方面的開銷。此時,程序運行時間主要耗費在數據處理上。

        (2)多條獲取

        多條獲取意味著同時處理多個數據項。在現代計算機系統里,常借助多線程或者并發技術達成這一操作,這樣做能大幅提升數據處理的吞吐量。不過,多線程雖有好處,卻可能被鎖爭、內存競爭和上下文切換等問題所抵消。所以,多條獲取也許會縮短單個數據項處理的相對運行時間,但總體運行時間能否減少取決于多線程優化的成效。

        (3)周期性獲取

        周期獲取即按照固定的時間間隔重復開展數據獲取操作。在諸如實時監控系統、定時任務這類需要定期更新數據狀態的應用場景中較為常見。其運行時間占比由任務的周期性和每個周期內實際工作量決定。若周期性任務負載較輕,則對程序整體運行時間影響不大。

        應用場合:

        在實際應用里,具體的應用場景、數據特性以及性能要求決定了選擇何種數據獲取策略。比如,若程序要對單個事件快速響應,單條獲取或許更合適;要是旨在使數據處理速度最大化,多條獲取可能更有利;而對于那些需要定期保持數據新鮮度的應用而言,周期性獲取則不可或缺。

        03 新建MFC項目并添加函數庫

        1、首先打開Visual Studio 2022,點擊創建新項目。

        步驟1.png

        2、選擇開發語言為“Visual C++”和程序類型“MFC應用程序”。

        步驟2.png

        3、點擊下一步即可。

        步驟3.png

        4、選擇類型為“基于對話框”,下一步或者完成。

        步驟4.png

        5、前往正運動官網下載PC函數庫,路徑如下(本文采用64位函數庫為例)。

        (1)進入官網,選擇支持與服務,打開下載中心選擇庫文件,就能找到所有的PC函數庫。

        步驟5.png

        (2)點擊下載Windows C++(64位),可按需求另存為想要保存的路徑下。

        步驟6.png

        (3)函數庫另存為具體路徑如下。

        步驟7.png

        6、將廠商提供的C++庫文件和相關頭文件復制到新建的項目里。

        步驟8.png

        7、在項目中添加靜態庫和相關頭文件。

        (1)先右擊項目文件,接著依次選擇:“添加”→“現有項”。

        步驟9.png

        (2)在彈出的窗口中依次添加靜態庫和相關頭文件。

        步驟10.png

        8、聲明用到的頭文件和定義控制器連接句柄。

        步驟11.png

        至此項目新建完成,可進行MFC項目開發。

        04 查看PC函數手冊,熟悉相關函數接口

        1、PC函數手冊也可以在正運動官網“支持與服務”→“下載中心”→“編程手冊”中找到。

        下載方式.png

        2、鏈接控制器,獲取鏈接句柄。

        指令.png

        3、控制器自動上報相關指令。

        指令1.png

        4、讀取數字輸入輸出相關指令。

        指令2.png

        5、讀取Modbus寄存器相關指令。

        指令3.png

        05 MFC實現軸的周期上報

        1、例程界面如下。

        例程界面.png

        2、通過下拉控件選擇連接控制器/控制卡連接方式。

        BOOL CTest_CycleUpDlg::OnInitDialog()
        {
            CDialogEx::OnInitDialog();
           // 將“關于...”菜單項添加到系統菜單中。
           // IDM_ABOUTBOX 必須在系統命令范圍內。
           ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
           ASSERT(IDM_ABOUTBOX < 0xF000);
           CMenu* pSysMenu = GetSystemMenu(FALSE);
           if(pSysMenu != NULL)
           {
                BOOL bNameValid;
                CString strAboutMenu;
                bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
                ASSERT(bNameValid);
                if(!strAboutMenu.IsEmpty())
                {
                    pSysMenu->AppendMenu(MF_SEPARATOR);
                    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,strAboutMenu);
                }
            }
            // 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
            // 執行此操作
            SetIcon(m_hIcon, TRUE);      // 設置大圖標
            SetIcon(m_hIcon, FALSE);    // 設置小圖標
            // TODO: 在此添加額外的初始化代碼
            GetDlgItem(IDC_COMBO2)->SetWindowTextA("網口\n");
            CComboBox   *connetList;
            connetList = (CComboBox *)GetDlgItem(IDC_COMBO2);
            connetList->AddString(_T("網口\n"));
            connetList->AddString(_T("LOCAL\n"));
            connetList->AddString(_T("PCI\n"));
            connetList->AddString(_T("串口\n"));
            return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
        }

        3、自動搜索IP。

        void CTest_CycleUpDlg::OnCbnDropdownCombo1()
        {
            char Buffer[256];
            CTest_CycleUpDlg* pDlg = (CTest_CycleUpDlg*)AfxGetMainWnd();
            GetDlgItemText(IDC_COMBO2,Buffer,256);
            Buffer[255] = '\0';
            if(0==strcmp(Buffer,"串口\n"))
            {
                Com_SCAN(pDlg);
            }
            else if(0==strcmp(Buffer,"網口\n"))
            {
                IP_SCAN(pDlg);
            }
            else if(0==strcmp(Buffer,"PCI\n"))
            {
                PCI_SCAN(pDlg);
            }
            else if(0==strcmp(Buffer,"LOCAL\n"))
            {
                CComboBox   *m_pEthList;
                m_pEthList = (CComboBox *)GetDlgItem(IDC_COMBO1);
                m_pEthList->ResetContent();
                m_pEthList->AddString(_T("LOCAL1\n"));
            }else
            {
                CString str;
                MessageBox("請選擇正確的鏈接類型!");
                return;
            }
            return;
        }

        1.png

        4、開啟上報。

        開啟上報.png

        //開啟關閉上報
        void CTest_CycleUpDlg::OnBnClickedCheckStart()
        {
            if(NULL == G_ZmcHandle)
            {
                MessageBox(_T("控制器未連接"));
                return;
            }
            CString tempstr;
            UpdateData(true);
            int iret = 0;
            if(m_If_StartUp)        //開啟上報
            {
                GetCycleStr();
                iret = ZAux_CycleUpEnable(G_ZmcHandle,m_CyclePort,m_CycleTime,Str_CycleCmd);
                if(ERR_SUCCESS != iret)
                {
                    tempstr.Format("周期上報打開失敗!錯誤碼:%d 命令:%s\r\n",iret,Str_CycleCmd);
                    AppendTextOut(tempstr);
                    return;
                }
                tempstr.Format("周期上報開始!命令:%s\r\n",Str_CycleCmd);
                AppendTextOut(tempstr);
                ifirsttimeus = GetTickCount();
                SetTimer(1,1,NULL);
            }
            else
            {
                m_CycleCount = ZAux_CycleUpGetRecvTimes(G_ZmcHandle,m_CyclePort);
                iret = ZAux_CycleUpDisable(G_ZmcHandle,m_CyclePort);
                if(ERR_SUCCESS != iret)
                {
                    tempstr.Format("周期上報關閉失敗!錯誤碼:%d \r\n",iret);
                    AppendTextOut(tempstr);
                    return;
                }
                tempstr.Format("周期上報關閉-上報用時:%dms, 上報次數:%d ,平均時間:%.3fms\r\n",(GetTickCount() - ifirsttimeus),m_CycleCount,(float)(GetTickCount() - ifirsttimeus)/m_CycleCount);
                AppendTextOut(tempstr);
                KillTimer(1);
            }

        5、選擇獲取參數類型和起始地址及數量。

        選擇獲取參數數據類型.png

        //獲取上報參數
        void CTest_CycleUpDlg::GetCycleStr()
        {
          memset(Str_CycleCmd,0,sizeof(Str_CycleCmd));
          CString TempString = "";
          int ilen = 0;
          if(m_CycleParaEnAble[0])
          {
            switch(m_CyclePara[0])
            {
              case 0:    //AXISSTATUS
                  TempString.Format("AXISSTATUS(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]);
                  break;
              case 1:    //DPOS
                  TempString.Format("DPOS(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]);
                  break;
              case 2:    //IDLE
                  TempString.Format("IDLE(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]);
                  break;
              case 3:    //IN
                  TempString.Format("IN(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]);
                  break;
              case 4:    //MODBUS_REG
                  TempString.Format("MODBUS_REG(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]);
                  break;
              case 5:    //MPOS
                  TempString.Format("MPOS(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]);
                  break;
              case 6:    //OP
                  TempString.Format("OP(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]);
                  break;
              case 7:    //TABLE
                  TempString.Format("TABLE(%d,%d),",m_CycleParaStart[0],m_CycleParaNum[0]);
                  break;
              default:
                 break;
            }
          }
          ilen += TempString.GetLength();
          memcpy(Str_CycleCmd,TempString.GetBuffer(0),TempString.GetLength()*sizeof(TCHAR));
          if(m_CycleParaEnAble[1])
          {
            switch(m_CyclePara[1])
            {
              case 0:    //AXISSTATUS
                  TempString.Format("AXISSTATUS(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]);
                  break;
              case 1:    //DPOS
                  TempString.Format("DPOS(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]);
                  break;
              case 2:    //IDLE
                  TempString.Format("IDLE(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]);
                  break;
              case 3:    //IN
                  TempString.Format("IN(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]);
                  break;
              case 4:    //MODBUS_REG
                  TempString.Format("MODBUS_REG(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]);
                  break;
              case 5:    //MPOS
                  TempString.Format("MPOS(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]);
                  break;
              case 6:    //OP
                  TempString.Format("OP(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]);
                  break;
              case 7:    //TABLE
                  TempString.Format("TABLE(%d,%d),",m_CycleParaStart[1],m_CycleParaNum[1]);
                  break;
              default:
                  break;
            }
          }
          if((ilen + TempString.GetLength()) < 1000)
          {
            memcpy(&Str_CycleCmd[ilen],TempString.GetBuffer(0),TempString.GetLength()*sizeof(TCHAR));
            ilen += TempString.GetLength();
          }
          if(m_CycleParaEnAble[2])
          {
            switch(m_CyclePara[2])
            {
              case 0:    //AXISSTATUS
                  TempString.Format("AXISSTATUS(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]);
                  break;
              case 1:         //DPOS
                  TempString.Format("DPOS(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]);
                  break;
              case 2:    //IDLE
                  TempString.Format("IDLE(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]);
                  break;
              case 3:    //IN
                  TempString.Format("IN(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]);
                  break;
              case 4:    //MODBUS_REG
                  TempString.Format("MODBUS_REG(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]);
                  break;
              case 5:    //MPOS
                  TempString.Format("MPOS(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]);
                  break;
              case 6:    //OP
                  TempString.Format("OP(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]);
                  break;
              case 7:    //TABLE
                  TempString.Format("TABLE(%d,%d)",m_CycleParaStart[2],m_CycleParaNum[2]);
                  break;
              default:
                 break;
            }
          }
          if((ilen + TempString.GetLength()) < 1000)
          {
              memcpy(&Str_CycleCmd[ilen],TempString.GetBuffer(0),TempString.GetLength()*sizeof(TCHAR));
              ilen += TempString.GetLength();
          }
        }

        6、獲取上報結果并輸出。

        獲取上報結果.png

        //獲取上報結果
        void CTest_CycleUpDlg::GetCycleInfo()
        {
            CString ParaString = "";
            CString TempString = "";
            CString ShowString = "";
            int iret = 0;
            int ival = 0;
            for(int inum=0;inum<3;inum++)
            {
                ShowString ="";
                if(m_CycleParaEnAble[inum])
                {
                    switch(m_CyclePara[inum])
                    {
                        case 0:        //AXISSTATUS
                            ParaString = "AXISSTATUS";
                            break;
                        case 1:        //DPOS
                                ParaString = "DPOS";
                            break;
                        case 2:        //IDLE
                                ParaString = "IDLE";
                            break;
                        case 3:        //IN
                              ParaString = "IN";
                            break;
                        case 4:        //MODBUS_REG
                            ParaString = "MODBUS_REG";
                            break;
                        case 5:        //MPOS
                              ParaString = "MPOS";
                            break;
                        case 6:        //OP
                              ParaString = "OP";
                            break;
                        case 7:        //TABLE
                              ParaString = "TABLE";
                            break;
                        default:
                            break;
                    }
                    ShowString += ParaString;
                    for(int i =0;i<m_CycleParaNum[inum];i++ )
                    {
                        iret = ZAux_CycleUpReadBuffInt(G_ZmcHandle,m_CyclePort,ParaString,m_CycleParaStart[inum] +i,&ival);        //獲取周期上報信息
                        if(ERR_SUCCESS != iret)
                        {
                            MessageBox(_T("周期上報讀取失敗!"));
                            return;
                        }
                        TempString.Format(" %d",ival);
                        ShowString +=TempString;
                    }
                    ShowString +="\r\n";
                    AppendTextOut(ShowString);
                }
            }
        }

        7、強制上報一次。

        //強制上報一次
        void CTest_CycleUpDlg::OnBnClickedBtnCycleup()
        {
            if(NULL == G_ZmcHandle)
            {
                MessageBox(_T("控制器未連接"));
                return;
            }
            UpdateData(true);
            int iret = ZAux_CycleUpForceOnce(G_ZmcHandle, m_CyclePort);
            if(ERR_SUCCESS != iret)
            {
                MessageBox(_T("周期上報刷新失敗!"));
                return;
            }
        }

        8、使用正運動RTSys軟件輸出窗口和軸參數窗口方便直接的觀察到我們周期上報的數值。

        軸參數.png

        9、上位機讀取周期上報的值并輸入在文本框。

        讀取周期上報值.png

        10、可以點擊下拉框選擇其他參數或更改起始地址及數量讀取不同區域數據。

        其他參數.png

        11、周期上報獲取信息和單次獲取信息的比較。

        信息比較.png

        12、視頻教程。

        視頻教程可點擊→“如何通過周期上報實時獲取io狀態等信息之C++篇”查看。


         

        完整代碼獲取地址

        二維碼.png



         

        本次,正運動運動控制卡周期上報實時數據IO狀態之C++篇就分享到這里。

        更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。

        本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。

        二維碼.png



         

        正運動技術專注于運動控制技術研究和通用運動控制軟硬件產品的研發,是國家級高新技術企業。正運動技術匯集了來自華為、中興等公司的優秀人才,在堅持自主創新的同時,積極聯合各大高校協同運動控制基礎技術的研究,是國內工控領域發展最快的企業之一,也是國內少有、完整掌握運動控制核心技術和實時工控軟件平臺技術的企業。主要業務有:運動控制卡_運動控制器_EtherCAT運動控制卡_EtherCAT控制器_運動控制系統_視覺控制器__運動控制PLC_運動控制_機器人控制器_視覺定位_XPCIe/XPCI系列運動控制卡等。


         

        狀 態: 離線

        公司簡介
        產品目錄

        公司名稱: 深圳市正運動技術有限公司
        聯 系 人: 戴德弟
        電  話: 0755-32976042
        傳  真: 0755-2606 6955
        地  址: 深圳市寶安區西鄉洲石路陽光工業園A1棟5樓
        郵  編: 518100
        主  頁:
         
        該廠商相關技術文摘:
        強實時運動控制內核MotionRT750(十):運動控制中的微調軌跡動態補償
        機器視覺運動控制一體機在大功率共模電感多面AI外觀缺陷檢測應用
        MotionRT750 SoftMotion:XPCIE1032H超高速運動控制卡在AOI檢測設備上的應用
        強實時運動控制內核MotionRT750(九):內置C語言的自定義機械手模型實現
        NEPCON ASIA 2025:解鎖行業新機遇,我們在深圳等您
        開放式激光振鏡運動控制器在旋轉飛行打標中的應用
        強實時運動控制內核MotionRT750(八):us級高速交互之LabVIEW,為智能裝備提速
        液態點膠密封解決方案,柔性升級,密封更可靠!
        柔性機械手視覺供料解決方案,提升無序分揀效率!
        【2025上海工博會】正運動展位智造未來(二)
        【2025上海工博會】正運動展位智造未來(一)
        【2025上海工博會】機器視覺運動控制一體機應用預覽(三)
        更多文摘...
        立即發送詢問信息在線聯系該技術文摘廠商:
        用戶名: 密碼: 免費注冊為中華工控網會員
        請留下您的有效聯系方式,以方便我們及時與您聯絡

        關于我們 | 聯系我們 | 廣告服務 | 本站動態 | 友情鏈接 | 法律聲明 | 不良信息舉報
        工控網客服熱線:0755-86369299
        版權所有 中華工控網 Copyright©2022 Gkong.com, All Rights Reserved

        主站蜘蛛池模板: 国产女主播免费在线观看| 亚洲暴爽av天天爽日日碰| 久久精品国产99久久6| 又黄又硬又湿又刺激视频免费| 中文字幕网伦射乱中文| 久青草视频在线免费观看| 亚洲一区二区三区18禁| 男人扒开添女人下部免费视频| 欧美极品色午夜在线视频| 99久久免费国产精品| 94人妻少妇偷人精品| 小13箩利洗澡无码视频免费网站 | 狠狠色噜噜狠狠狠狠av不卡| 久久久久久久波多野结衣高潮| 亚洲精品美女一区二区| 日韩国产精品中文字幕| 久久免费观看归女高潮特黄| 老司机午夜精品视频资源| 97国产精品视频在线观看| 蜜臀av在线一区二区三区 | 亚洲精品成人片在线观看精品字幕| 在线观看成人年视频免费| 精品一区二区成人精品| 草草浮力影院| 69天堂人成无码麻豆免费视频 | 无码无套少妇毛多18p| 色秀网在线观看视频免费| 一区二区三区四区四色av| 国产精品熟女乱色一区二区 | AV人摸人人人澡人人超碰| 亚洲国产精品自在拍在线播放蜜臀| 久久久久久人妻一区二区无码Av| 亚洲另类丝袜综合网| 91精品免费久久久| a级国产乱理伦片在线观看al| 国产91麻豆免费观看| 亚洲精国产一区二区三区| 中文人成影院| 伊人激情一区二区三区av| 国产精品中文字幕久久| 99国产精品自在自在久久|