<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 | 機柜箱體殼體 | 低壓電器 | 機器視覺
        全國產EtherCAT運動控制邊緣控制器(二):統一的上位機API接口
        深圳市正運動技術有限公司
        收藏本文     查看收藏

        上節課程我們介紹了全國產EtherCAT運動控制邊緣控制器ZMC432H的硬件接口與功能,本節課程我們主要講解一下正運動API函數封裝原理以及自定義API封裝例程。

        一、功能簡介

        全國產EtherCAT運動控制邊緣控制器ZMC432H是正運動的一款軟硬件全國產自主可控,運動控制接口兼容EtherCAT總線和脈沖型的獨立式運動控制器,最多支持32軸運動控制,同時支持正運動遠程HMI功能,能提供網絡組態顯示,可實時監控和調整參數配置。

        統一的API接口.png

        ZMC432H具備豐富的硬件接口和控制功能模塊,能實現高效穩定的運動控制和實時數據采集,以滿足工業控制協同工業互聯網的應用需求。

        ZMC432H內置了Linux系統,可以使用本地的LOCAL接口進行連接,可以做到更快速的指令交互,單條指令與多條指令一次性交互時間為40us左右。

        企業微信截圖_20230817090923.png

        ZMC432H視頻介紹:

        二、統一的API接口

        企業微信截圖_20230817090941.png

        所有的控制器和控制卡均使用同一套API函數,均支持C、C++、C#、LabVIEW、Python、Delphi等開發語言,支持VC6.0、VB6.0、Qt、.Net等平臺,支持Windows、Linux、WinCE、iMac等操作系統。

        各個開發語言都有各自所對應的函數庫,所調用的API均一致,這大大提高了可移植性。各個開發語言庫的調用方式可參考“ZMotion PC函數庫編程手冊 V2.1.1”。

        文檔參考路徑:光盤資料\04PC函數\Zmotion PC函數庫編程手冊及例程源碼。

        企業微信截圖_20230817091000.png

        以下為各個功能部分API指令一覽表;

        1、控制器連接
        企業微信截圖_20230817091014.png

        2、控制器信息獲取
        企業微信截圖_20230817091025.png

        3、基本軸參數設置
        企業微信截圖_20230817091040.png

        4、基本運動控制
        企業微信截圖_20230817091054.png

        5、VR寄存器
        企業微信截圖_20230817091106.png

        6、Table寄存器

        企業微信截圖_20230817091117.png

        7、Modbus寄存器
        企業微信截圖_20230817091128.png

        8、Flash/文件讀寫
        企業微信截圖_20230817091137.png

        更多API接口詳情可以參考“ZMotion PC函數庫編程手冊 V2.1.1”。

        企業微信截圖_20230817091152.png

        三、在線命令的機制

        ZAux_Execute或ZAux_DirectCommand可對Basic指令進行封裝。如果使用到沒有封裝的命令或者想封裝自己的函數,可以通過ZAux_Execute發送或ZAux_DirectCommand,或是參照已有代碼修改增加相應的函數。

        發送字符串命令有兩種方式,緩沖方式和直接方式 。具體如圖所示:

        企業微信截圖_20230817091221.png

        直接方式:直接執行單個變量/數組/參數相關命令,此時所有傳遞的參數必須是具體的數值,不能是表達式;

        緩沖方式:可以執行所有命令,并支持表達式作為參數,但是速度慢一些;

        以zmcaux.cpp中對已封裝的設置運動速度的函數ZAux_Direct_SetSpeed()與獲取當前編碼器反饋位置的函數ZAux_Direct_GetMpos為例。

        程序如下:

        #include "zmotion.h" 
        #include "zauxdll2.h" 
        int ZAux_Direct_SetSpeed(ZMC_HANDLE handle, int iaxis, float fValue) 
        { 
            char cmdbuff[2048]; 
            char cmdbuffAck[2048]; 
            if (iaxis> MAX_AXIS_AUX) //MAX_AXIS_AUX為zuaxdll2.h中定義的宏,zuaxdll2.h為正運動庫頭文件
            { 
                return ERR_AUX_PARAERR; 
            } 
            sprintf(cmdbuff,"SPEED(%d)=%f",iaxis,fValue);//生成對應命令的字符串 
            ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048); 
        }
        int ZAux_Direct_GetMpos(ZMC_HANDLE handle, int iaxis, float fValue) 
        { 
            char cmdbuff[2048]; 
            char cmdbuffAck[2048]; 
            if (iaxis> MAX_AXIS_AUX) 
            { 
                return ERR_AUX_PARAERR; 
            } 
            sprintf(cmdbuff,"MPOS(%d)=%f",iaxis,fValue);//生成對應命令的字符串 
            ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048); 
        }

        四、自定義API封裝介紹及例程

        1、自定義API封裝

        自定義封裝API的原理實際上是利用了在線命令的機制,上位機生成由各種ZBASIC指令來達到自己想要的功能。

        ZAux庫便是直接利用ZBASIC命令通過ZAux_Execute方式或ZAux_DirectCommand方式發送到控制器上,相應函數可以參考ZBASIC手冊對應的命令介紹。

        ZAux庫是完全開源庫,源代碼皆可從官網下載,可以在源代碼中添加用戶自定義的函數,用戶也可以新增庫進行封裝。

        2、實用封裝例程

        (1)直接獲取多種類型數據

        用戶若想要獲取多種數據,如軸的命令位置,軸的反饋位置,板卡上的 IO點等等,往往都是通過多種單獨獨立的函數獲取不同的數據,這樣堆積,會導致讀寫次數的上位,導致程序的卡頓。

        為了提升一個上位程序讀取控制器數據的速度,往往可以通過自定義一個函數,快速的把數據傳輸到上位程序上面來,而不是通過多次循環來獲取不同類型的數據。

        例:假設有一個簡易的三軸平臺,需要讀取軸0,軸1,軸2的命令位置,反饋位置,以及控制器板卡上的輸入口0,輸入口32,輸出口0,輸出口33,以及三個軸的狀態。

        1c1e253b-cc85-4c75-a5e7-ca99fb10e1ab.png

        獲取數據程序如下:

        // test1.cpp : 定義控制臺應用程序的入口點。
        #include "stdafx.h"
        #include #include "zmotion.h"
        #include "zauxdll2.h"
        void commandCheckHandler(const char *command, int ret)
        {
            if (ret)//非0則失敗
            {
                printf("%s fail!return code is %d\n", command, ret);
            }
        }
        /*************************************************************
        Description: //我的自定義直接獲取數據函數
        Input:       //handle          卡鏈接
                     iaxisNum          軸的總數量
                     iaxislist         軸號列表
                     fDposlist         輸出的命令位置值
                     fMposlist         輸出的反饋位置值
                     iAxisstatuslist   輸出的軸狀態位置值,按位對應
                     startIn           要獲取起始的IN編號
                     endIn             要獲取結束的IN編號
                     iIn               輸出的IN狀態,按位對應
                     startOut          要獲取起始的OUT編號
                     endOut            要獲取結束的OUT編號
                     iOut              輸出的OUT狀態,按位對應
        Output:      //
        Return:      //錯誤碼
        *************************************************************/
        int  Demo_Direct_MyGetData(ZMC_HANDLE handle,int iaxisNum, int* iaxislist, float* fDposlist,float* fMposlist,int32* iAxisstatuslist,int startIn , int endIn,int *iIn,int startOut , int endOut,int *iOut) 
        {
            char cmdbuff[2048];
            char  tempbuff[2048];
            char cmdbuffAck[20480];
            //若傳進來的地址為空,則退出
            if(NULL == iaxislist || NULL == fDposlist || NULL == fMposlist ||  NULL == iAxisstatuslist || NULL == iIn || NULL == iOut)
            {
                return  ERR_AUX_PARAERR;
            }
            //若傳進來的結束編號小于起始編碼,則退出
            if ((endIn<startIn)  ||  (endOut<startOut))
            {
                return  ERR_AUX_PARAERR;
            }
            int ret=0;
            int i;
            //生成命令
            sprintf(cmdbuff, "?");
            //拼接DPOS
            for (i=0;i1000)
                {
                    return  ERR_AUX_PARAERR;  //參數錯誤,字符串拼接過長
                }
            }
            //拼接MPOS
            for (i=0;i1000)
                {
                    return  ERR_AUX_PARAERR;  //參數錯誤,字符串拼接過長
                }
            }
            //拼接AXISSTATUS
            for (i=0;i1000)
                {
                    return  ERR_AUX_PARAERR;  //參數錯誤,字符串拼接過長
                }
            }
            int32 ostart,istart,iend,oend;    //一次最多32個
            bool addflag;
            addflag=false;
            int32 temp;    //一次最多32個
            int32 temp2;    //一次最多32個
            temp=endIn-startIn+1;
            if (temp%32 == 0)
            {
                temp=temp/32;
            } 
            else
            {
                temp=temp/32+1;
            }
            //拼接IN
            for (i=0;iendIn)
                {
                    iend=endIn;
                }
                //生成命令
                sprintf(tempbuff, "IN(%d,%d),", istart,iend);
                strcat(cmdbuff, tempbuff);//字符串拼接
                if (strlen(cmdbuff)>1000)
                {
                    return ERR_AUX_PARAERR ;  //參數錯誤,字符串拼接過長
                }
            }
            temp2=endOut-startOut+1;
            if (temp2%32 == 0)
            {
                temp2=temp2/32;
            } 
            else
            {
                temp2=temp2/32+1;
            }
            //拼接OUT
            for (i=0;iendOut)
                {
                    oend=endOut;
                }
                //生成命令
                sprintf(tempbuff, "OUT(%d,%d)", ostart,oend);
                strcat(cmdbuff, tempbuff);//字符串拼接
                if (i1000)
                {
                    return  ERR_AUX_PARAERR;  //參數錯誤,字符串拼接過長
                }
            }
            printf("拼接的字符串:\n",cmdbuff);
            printf("%s\n",cmdbuff);
            ret=ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048);
            if(ERR_OK != ret)
            {
                return ret;
            }
            //printf("%s\n",cmdbuffAck);
            //printf("%d\n",strlen(cmdbuffAck));
            //
            if(0 == strlen(cmdbuffAck))
            {
                return ERR_NOACK;
            }
            float ftempbuff[200];
            int itempbuff[200];
            ZAux_TransStringtoFloat(cmdbuffAck,iaxisNum*2,ftempbuff);//字符串轉換為浮點數
            //DPOS輸出
            for(i=0;i<iaxisNum;i++)
            {
                //printf("%f\n",ftempbuff[i]);
                fDposlist[i]=ftempbuff[i];
            }
            //MPOS輸出
            for(i=0;i<iaxisNum;i++)
            {
                //printf("%f\n",ftempbuff[i+iaxisNum]);
                fMposlist[i]=ftempbuff[i+iaxisNum];
            }
            ZAux_TransStringtoInt(cmdbuffAck,iaxisNum*3+temp2+temp,itempbuff);//字符串轉換為整形
            //AXISSTATUS輸出
            for(i=0;i<iaxisNum;i++)
            {
                //printf("%d\n",itempbuff[i+iaxisNum*2]);
                iAxisstatuslist[i]=itempbuff[i+iaxisNum*2];
            }
            //IN輸出
            for(i=0;i<temp;i++)
            {
                //printf("%d\n",itempbuff[i+iaxisNum*3]);
                iIn[i]=itempbuff[i+iaxisNum*3];
            }
            //OUT輸出
            for(i=0;i<temp2;i++)
            {
                //printf("%d\n",itempbuff[i+iaxisNum*3+temp]);
                iOut[i]=itempbuff[i+iaxisNum*3+temp];
            }
            return ERR_OK;
        }
        int _tmain(int argc, _TCHAR* argv[])
        {
            char *ip_addr = (char *)"127.0.0.1";               //控制器IP地址
            ZMC_HANDLE handle = NULL;                   //連接句柄
            int ret = ZAux_OpenEth(ip_addr, &handle);   //連接控制器
            if (ERR_SUCCESS != ret)
            {
                printf("控制器連接失敗!\n");
                handle = NULL;
                Sleep(2000);
                return -1; 
            }
            printf("控制器連接成功!\n");
            int axis[4]={0,1,2,4};
            float d_dpos[4];
            float d_mpos[4];
            int32 d_axis_status[4];
            int d_in[10];
            int d_out[10];
            ret=Demo_Direct_MyGetData(handle,3,axis,d_dpos,d_mpos,d_axis_status,0,32,d_in,0,33,d_out);
            int i;
            printf("獲取到的軸命令位置:\n");
            for (i=0;i<3;i++)
            {
                printf("\t軸%d :%f",i,d_dpos[i]);
            }
            printf("\n");
            printf("獲取到的軸反饋位置:\n");
            for (i=0;i<3;i++)
            {
                printf("\t軸%d :%f",i,d_mpos[i]);
            }
            printf("\n");
            printf("獲取到的軸狀態(按位對應):\n");
            for (i=0;i<3;i++)
            {
                printf("\t軸%d :%d",i,d_axis_status[i]);
            }
            printf("\n");
            printf("獲取到的輸入口狀態:\n");
            int j=0;
            int tempval;
            for (i=0;i0) )
                {
                    j++;
                }
                //轉換成位
                tempval=d_in[j]>>(i-32*j);
                printf("    IN(%d):%d",i,tempval &(0x01));
                if (((i%8)==0)&&(i>0) )
                {
                    printf("\n");
                }
            }
            printf("\n");
            printf("獲取到的輸出口狀態:\n");
            j=0;
            for (i=0;i0) )
                {
                    j++;
                }
                //轉換成位
                tempval=d_out[j]>>(i-32*j);
                printf("    OUT(%d):%d",i,tempval &(0x01));
                if (((i%8)==0)&&(i>0) )
                {
                    printf("\n");
                }
            }
            printf("\n");
            Sleep(20000);
            ret = ZAux_Close(handle);    //關閉連接
            commandCheckHandler("ZAux_Close", ret) ;//判斷指令是否執行成功
            printf("connection closed!\n");
            handle = NULL;
            return 0;
        }

        (2)一行命令執行多條不同類型緩沖指令

        一般點膠行業、木工行業用的較多的是連續軌跡,連續軌跡之間有插入緩沖輸出,如果把運動和連續軌跡分開發送的話,難免會有局限性,可以通過自己單獨封裝運動函數,來達到一行命令執行多個函數的效果。

        例: 假設控制一個XY兩軸平臺,從坐標點(0,0),(100,0)(輸出口0輸出50ms) → (100,100)(輸出口0輸出50ms) → (0,100)(輸出口0輸出50ms) → (0,0)(輸出口0輸出50ms)的軌跡,則可以通過自己封裝,用一條函數,快速發送下去。

        一行命令執行多個函數程序如下:

        // test1.cpp : 定義控制臺應用程序的入口點。
        //
        #include "stdafx.h"
        #include #include "zmotion.h"
        #include "zauxdll2.h"
        void commandCheckHandler(const char *command, int ret)
        {
            if (ret)//非0則失敗
            {
                printf("%s fail!return code is %d\n", command, ret);
            }
        }
        /*************************************************************
        Description: //我的自定義運動函數
        Input:       //handle      卡鏈接
                     iMoveLen      填寫的運動長度
                     iaxisNum      參與運動總軸數
                     iaxislist     軸號列表
                     fPoslist      距離列表
                     iout          緩沖輸出口
                     outlist       緩沖輸出列表(每條運動,決定是否輸出,0為不輸出,1為在運動后輸出)
                     outtime       緩沖輸出時間
        Output:      //
        Return:      //錯誤碼
        *************************************************************/
        int  Demo_Direct_MyMoveABS(ZMC_HANDLE handle,int iMoveLen,int iaxisNum, int* iaxislist, float* fPoslist,int iout,int *outlist,int outtime) 
        {
            char cmdbuff[2048];
            char  tempbuff[2048];
            char cmdbuffAck[20480];
            //若傳進來的地址為空,則退出
            int ret=0;
            int i;
            //先讀取剩余直線緩沖
            int iBuffLen = 0;
            ret = ZAux_Direct_GetRemain_LineBuffer(handle,iaxislist[0],&iBuffLen);
            if(iBuffLen <= iMoveLen*2)
            {
                return 1002;      //運動緩沖不夠
            }
            //生成命令
            sprintf(cmdbuff, "BASE(");
            //拼接運動軸列表
            for (i=0;i1000)
                {
                    return  ERR_AUX_PARAERR;  //參數錯誤,字符串拼接過長
                }
            }
            sprintf(tempbuff,"%d)\n",iaxislist[i]);//生成對應命令的字符串
            strcat(cmdbuff,tempbuff);
            //拼接運動
            for (i=0;i1000)
            {
                return  ERR_AUX_PARAERR;  //參數錯誤,字符串拼接過長
            }
            ret=ZAux_DirectCommand(handle,cmdbuff,cmdbuffAck,2048);
            return ret;
        }
        int _tmain(int argc, _TCHAR* argv[])
        {
            char *ip_addr = (char *)"127.0.0.1";               //控制器IP地址
            ZMC_HANDLE handle = NULL;                   //連接句柄
            int ret = ZAux_OpenEth(ip_addr, &handle);   //連接控制器
            if (ERR_SUCCESS != ret)
            {
                printf("控制器連接失敗!\n");
                handle = NULL;
                Sleep(2000);
                return -1; 
            }
            printf("控制器連接成功!\n");
            ret =ZAux_Direct_SetAtype(handle,0,1);//設置軸0軸類型為1
            commandCheckHandler("ZAux_Direct_SetAtype", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetAtype(handle,1,1);//設置軸1軸類型為1
            commandCheckHandler("ZAux_Direct_SetAtype", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetUnits(handle,0,100);//設置軸0脈沖當量為100
            commandCheckHandler("ZAux_Direct_SetUnits", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetUnits(handle,1,100);//設置軸1脈沖當量為100
            commandCheckHandler("ZAux_Direct_SetUnits", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetAccel(handle,0,500);//設置軸0加速度
            commandCheckHandler("ZAux_Direct_SetAccel", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetAccel(handle,1,500);//設置軸1加速度
            commandCheckHandler("ZAux_Direct_SetAccel", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetDecel(handle,0,500);//設置軸0減速度
            commandCheckHandler("ZAux_Direct_SetDecel", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetDecel(handle,1,500);//設置軸1減速度
            commandCheckHandler("ZAux_Direct_SetDecel", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetDpos(handle,0,0);//設置軸0 DPOS清0
            commandCheckHandler("ZAux_Direct_SetDpos", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetDpos(handle,1,0);//設置軸1 DPOS清0
            commandCheckHandler("ZAux_Direct_SetDpos", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetSpeed(handle,0,100);//設置軸0速度
            commandCheckHandler("ZAux_Direct_SetDecel", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetSpeed(handle,1,100);//設置軸1速度
            commandCheckHandler("ZAux_Direct_SetDecel", ret) ;//判斷指令是否執行成功
            ret =ZAux_Direct_SetMerge(handle,0,1);//設置開啟連續插補(開啟主軸的即可,如軸0,軸1插補,軸0為主軸,主軸號取決于連續插補運動指令軸列表的第一個軸號)
            int axis[2]={0,1};
            float POS[12]={0,0,0,100,100,100,100,0,0,0};
            int otlist[5]={0,1,1,1,1};
            ZAux_Trigger(handle);//觸發示波器
            ret = Demo_Direct_MyMoveABS(handle,5,2,axis,POS,0,otlist,50);//
            commandCheckHandler("Demo_Direct_MyMoveABS", ret) ;//判斷指令是否執行成功
            Sleep(20000);
            ret = ZAux_Close(handle);    //關閉連接
            commandCheckHandler("ZAux_Close", ret) ;//判斷指令是否執行成功
            printf("connection closed!\n");
            handle = NULL;
            return 0;
        }
        

        企業微信截圖_20230817091309.png

        企業微信截圖_20230817091322.png

        3、例程講解

        完整代碼獲取地址

        8B814CE228114CDA46E59DCB3EA9DDDB.png

        本次,正運動技術全國產EtherCAT運動控制邊緣控制器(二):統一的上位機API接口,就分享到這里 。

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

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

        正運動技術專注于運動控制技術研究和通用運動控制軟硬件產品的研發,是國家級高新技術企業。正運動技術匯集了來自華為、中興等公司的優秀人才,在堅持自主創新的同時,積極聯合各大高校協同運動控制基礎技術的研究,是國內工控領域發展最快的企業之一,也是國內少有、完整掌握運動控制核心技術和實時工控軟件平臺技術的企業。主要業務有:運動控制卡_運動控制器_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免费| 亚洲国产精品男人的天堂| 日韩精品亚洲专区在线观看| 极品少妇无套内射视频| 亚洲 一区二区 在线| 亚洲精品在线二区三区| 精品一区二区三区在线播放视频 | 精品国产一区二区三区2021| 人妻(高h)| 欧美在线天堂| 欧美午夜一区| 国模粉嫩小泬视频在线观看| 亚洲国产精品综合久久网络| 久久国产精品不只是精品| 伊人天天久大香线蕉av色| h无码精品3d动漫在线观看| 亚洲天堂精品一区二区| 国产小视频一区二区三区| 色成年激情久久综合国产| 热久久美女精品天天吊色| 国产精品.com| 强d乱码中文字幕熟女1000部| 在线观看成人av天堂不卡| 亚洲精品麻豆一区二区| 亚欧乱色国产精品免费九库| 欧美成人精品手机在线| 中文字幕va一区二区三区 | 亚洲色大成网站WWW永久麻豆| 一级内射片在线网站观看视频| 太粗太深了太紧太爽了动态图男男| 亚洲国产欧美在线观看片| 欧美日韩视频综合一区无弹窗| 国产成人自拍小视频在线| 欧洲熟妇色自偷自拍另类| 国产一区日韩二区三区| 精品国产福利久久久| 亚洲欧美日韩在线码 | 区一区二区三区中文字幕| 国产av一区二区不卡| 国产成人精品日本亚洲专区6 | 国产色悠悠视频在线观看|