<nobr id="zkazv"></nobr>

      午夜精品一区二区三区成人,中文字幕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(七):us級高速交互之Qt,為智能裝備提速
      【2025上海工博會】高速高精運動控制卡應用預覽(一)
      強實時運動控制內核MotionRT750(六):us級高速交互之C++,為智能裝備提速
      解鎖光未來!9月 CIOE 2025,正運動邀您相聚深圳,共赴光電盛宴!
      機器視覺運動控制一體機在線路板跟隨灌膠上的應用
      強實時運動控制內核MotionRT750(五):EtherCAT總線冗余讓生產制造更可靠
      深圳·EelE智博會:智控賦能,驅動未來制造
      機器視覺運動控制一體機在喇叭跟隨點膠上的應用
      強實時運動控制內核MotionRT750(四):高速貼裝應用中的拱形運動
      聚焦深圳國際電子展 | 正運動攜熱門產品和方案!等您來體驗!
      超高速EtherCAT實時運動控制卡在高速半導體固晶機上的應用
      強實時運動控制內核MotionRT750(三):us級高速交互之C#,為智能裝備提速
      更多文摘...
      立即發送詢問信息在線聯系該技術文摘廠商:
      用戶名: 密碼: 免費注冊為中華工控網會員
      請留下您的有效聯系方式,以方便我們及時與您聯絡

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

      主站蜘蛛池模板: 日夜啪啪一区二区三区| 午夜毛片精彩毛片| 国产99在线 | 免费| 国产福利酱国产一区二区| 亚洲一区二区日韩综合久久| 日韩丝袜欧美人妻制服| 人人妻人人澡人人爽人人精品av | 99热精品毛片全部国产无缓冲| 狠狠色丁香婷婷综合尤物| 蜜臀av午夜精品福利| 日韩精品国内国产一区二| 午夜精品一区二区三区成人| 中文字幕国产精品一二区| 99热门精品一区二区三区无码| 一区二区三区四区五区自拍| 午夜av高清在线观看| 国产乱妇乱子视频在播放| 在线A毛片免费视频观看| 天堂а√在线中文在线| 99网友自拍视频在线| 亚洲色大成网站WWW久久| 又色又爽又黄的视频网站| 亚洲韩国精品无码一区二区三区| 尹人香蕉久久99天天拍| 99久久精品国产熟女拳交| a在线观看视频在线播放| 中文字幕国产精品综合| 99久久精品免费看国产电影| 欧美熟妇乱子伦XX视频| 风韵丰满妇啪啪区老老熟女杏吧| 国产极品精品自在线不卡| 亚洲精品国产男人的天堂| 精品国产大片中文字幕| 精品国产午夜肉伦伦影院| 日韩人妻少妇一区二区三区| 国产宅男宅女精品A片在线观看| ww污污污网站在线看com| 邻居少妇张开腿让我爽了一夜| 日产国产一区二区不卡| 亚洲一区二区精品极品| 亚洲最大日韩精品一区|