999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

OPC技術在智能倉儲系統中的應用

2021-08-02 03:35:34成衛青
計算機技術與發展 2021年7期
關鍵詞:數據庫

吳 晗,成衛青

(南京郵電大學 計算機學院,江蘇 南京 210023)

0 引 言

當今社會不斷進步,工業上的自動化程度也在不斷提高,智能倉儲也被逐漸應用于各種場景,以達到減少貨物存放空間,提高效率的目的。而對各個設備狀態的實時監控是整個智能倉儲軟件最為關鍵的一部分,在監控、控制整個智能化立體倉儲中發揮著十分關鍵的作用。作為整個系統的核心,WCS(warehouse control system,倉庫控制系統)能夠根據設備當前的狀態,通過對數據庫的查詢來控制任務信息的下達,可以實時監控當前堆垛機所處的位置、堆垛機狀態、是否報警以及堆垛機貨叉上是否有貨的狀態變化,也能夠對輸送線的狀態和是否有報警進行監控,還能夠查詢到當前貨物所存放的位置及庫位信息等。為了能夠實現上述的功能,第一步需要解決PLC和上位機之間的通信。一般來說,對于一些要求不是很高的設備,串口通信是最常見的方式,除此以外還有總線通信、串口轉以太網通信等。但是根據實際使用的情況發現,串口通信和現場總線通信會受到通信距離的限制,而且通信效率不高,常常會有信號延遲或者信號收不到的問題出現。為了解決上述問題,出現了OPC(OLE for process control)通信。

1 OPC技術

通信協議規定了實體雙方要實現通信所必須遵守的規則或約定?,F階段,隨著工業自動化的快速進步,在完成PLC和上位機的數據交互方面,OPC協議起著至關重要的作用[1-4]。由于基于OPC通信協議的交互速度快,性能穩定,目前越來越多的交互方式都采取這種協議。根據不同的控制系統,OPC服務器不僅能夠放在PLC上成為上位機的遠程OPC服務器,也能夠放在上位機上成為本地OPC服務器。此外,接口作為組件之間通信的橋梁[5],OPC為開發人員提供了一個具有開放式的接口,可以對這個接口進行引用、改寫、擴展,從而實現符合自身需求的接口,完成基于OPC的上位機與下位機的數據交互。因此,OPC協議為實現通過PLC連接到現場工控電腦的OPC客戶端提供了一個可行的方式。圖1為數據源與WCS的連接結構。

圖1 數據源與WCS連接結構

WCS與OPC服務器的數據通信包含兩方面:一方面是WCS從OPC服務端讀數據;另一方面是WCS向OPC服務端寫數據[6]。WCS從OPC服務端讀數據有4種方法,分別為:異步讀取、刷新與訂閱、同步讀取[7]。WCS向OPC服務器寫入數據有兩種方法:異步寫入和同步寫入。WSC和OPC服務器的數據通信有3種方式,分別為:異步、同步以及訂閱。

1.1 同步訪問

同步讀和寫都屬于同步訪問,同步訪問指的是WCS(OPC客戶端)調用OPC服務器提供的接口,對服務器中的內容進行讀取和寫入,OPC服務器根據WCS所請求的內容將查找到的數據返回給WCS,而在此之前WCS將會一直處在等待狀態。

同步訪問的特點是:在WCS讀取特定數據塊內容時,必須要求WCS讀到數據為止;同樣的,WCS在寫入指定的數據塊地址之前,會始終處在等待數據的狀態。因此,當數據量比較小且WCS與OPC服務器交互不是很頻繁的時候可以使用同步訪問的方法。但當數據量大或者有大量用戶訪問的時候,同步訪問會出現延遲情況,造成系統的效率降低。

1.2 異步訪問

異步讀和寫也都屬于異步訪問,異步訪問和同步訪問相似,但異步訪問的操作過程比同步訪問更加復雜,先要WCS提出數據請求,然后在OPC服務器接收到這個數據請求后,OPC服務器會將這個請求進行“隊列”排序并且為其編號,WCS所調用的方法就會立即返回,使WCS能夠繼續執行其他任務,不再處于等待狀態。在OPC服務器操作完成后,WCS會在一個專門處理外部事件的代碼塊中處理OPC服務器發送過來的數據。

異步訪問的特點是:在WCS發出讀取請求后需要馬上返回,然后WCS可執行其他任務,當OPC服務器讀取數據完成后,調用WCS的讀取完成事件,完成讀取過程;同樣的,在WCS發出寫入請求后需要馬上返回,然后WCS繼續執行其他任務,當OPC服務器把數據寫入完成后,再調用WCS的寫入完成事件,完成寫過程。所以異步訪問的效率相比較于同步訪問更高,它可以承載更多的用戶請求的數據,并且在最大程度上節約通信以及CPU資源。

1.3 訂閱方式

訂閱方式是OPC服務器與WCS通信中的一種十分特別的數據通信模式[8]。OPC服務器不需要收到來自WCS的數據請求,它是OPC服務器在每一個周期內,對于在掃描緩沖區內的數據進行掃描然后對比,若對比結果發現前后數據的變化大于閾值時,則會更新掃描緩沖區中的數據并且向WMC提供數據。這樣一旦出現數據變化WCS就能夠及時地收到變化后的數據信息。訂閱方式從本質上來說是一種異步方式中的讀取方式。使用訂閱方式采集數據是按照固定的周期更新數據緩沖區的值,當發現數據出現變化時,則會通過數據變化事件告訴WCS,并且只有當數據的變化超過規定閾值的時候才會更新數據緩沖區的值并且通知WCS,由此可以得出,使用此種方式將會忽略數據微小的變化,以降低WCS與OPC服務器的負載。

訂閱方式的特點是:通過OPC服務器在每個固定周期中檢查緩存區中的數據,當發現數據的變化超過一個固定值之后,就會立即告訴WCS應用程序,將數據緩存區的信息傳送過去。這種技術是根據“硬件設備-服務器-用戶”的模型,如圖2所示,在服務器內部預先建立一個動態緩存區用來存儲數據,當數據出現變化較大時對其進行更新且發送給WCS。這種方式在數據變化不大的情況下不會向WCS發送信息,從而減少數據發送的次數,也能夠減少WCS對OPC服務器的重復訪問的次數。在提供數據的設備點十分多的情景中,更能體現出使用這種通信方法的優點。

圖2 訂閱數據訪問交互方式

2 OPC服務器的搭建

智能倉儲一般都使用C/S的架構模式,它包含了OPC服務器以及WCS(OPC客戶端)兩個部分,該文主要探討的是OPC服務器的實現過程。

2.1 總體設計構思

OPC服務器的設計需要根據智能倉儲的實際情況去考慮,為WCS提供一個穩定、流暢的通信平臺。具體需要實現3個方面的功能。第一,作為一個數據服務器,OPC服務器需要向WCS提供OPC服務器的對象以及接口,這樣其他軟件才能對OPC服務器提供的數據進行讀操作和寫操作,這是作為OPC服務器最關鍵也是最為基本的功能;第二,OPC服務器應當能夠對現場采集的實時數據進行數據管理;第三,為了能便于維護人員進行操作,OPC服務器應提供靈活多用的交互接口。在開發設計層面,OPC服務器應當與WCS的功能模塊相對獨立,由數據采集、OPC對象和接口以及數據管理三個子模塊組成。OPC服務器的總體結構如圖3所示[9]。

圖3 OPC服務器的總體結構

2.2 數據采集模塊

數據采集與現場設備直接連接,獲取到現場設備的實際數值,再將其分配到其對應的通信子模塊中。通常來說,每一個設備都會有一個通信子模塊與其對應。數據采集模塊會有一個固定的采集周期,在每個采集周期內都會從現場實際設備中采集數據。對于數據采集模塊來說有兩種方式可以實現數據采集,第一種為直接通過I/O驅動實現現場設備與通信子模塊之間的通信;第二種為使用數據接口,通過這個數據接口不斷地讀取現場設備中的數據。OPC服務器數據采集模塊的結構如圖4所示。

圖4 OPC服務器數據采集模塊的結構

在實際開發應用的時候,工業上很多的控制軟件都配備了屬于其單獨擁有的數據庫。通常情況下,都是利用數據庫供應商提供的專門的API來實現對數據庫的操作。除此以外,目前市面上經常使用的數據庫如SQLServer、Oracle、MySql等,雖然大致相同,但是每個數據庫都具備其自身的特點,如果需要訪問這些數據庫的話,就要對每個數據庫單獨地編寫不同的控制軟件。對于日后的系統集成來說,這將會是一個巨大的挑戰[10]。

在本系統中OPC服務器特別為數據采集模塊提供了對數據庫進行操作的接口,使得整個WCS具有OPC服務器的功能,有效地解決了數據庫版本不統一,需要單獨編寫的問題。對于這樣的設計方式類似于創建了一個訪問WCS實時數據庫的中間件,對于其他的開發商來說就無需知道這個數據庫的特有結構了。OPC客戶端(WCS)只需要根據所提供的OPC通信規范[11],就可以利用OPC服務器通過間接訪問的方式與數據源交換數據。

對于不同的數據源如輸送線、傳感器、堆垛機等,OPC服務器必須能夠取得這些設施的數據。因此在數據采集模塊中,通信子模塊中的接口都是以動態鏈接庫(dynamic-link library,DLL)的形式實現的。利用動態鏈接庫能夠制定一個統一的通信接口格式,這樣就能將OPC服務器中上層具體功能和下層數據采集模塊的功能分隔開,兩部分獨立開發降低耦合程度,這樣使得OPC服務器能夠對多種不同的設備實現兼容。除此以外,將通信接口封裝成DLL來實現,不僅能夠在很大程度上降低程序運行所需的資源,增強系統的安全性和可靠性,也使得用戶對其二次開發更加方便。

2.3 OPC對象和接口

WCS和OPC服務器之間的數據通信依靠對象的接口來實現,OPC對象和接口也是整個OPC通信規范的核心。主要有三種結構組成了OPC服務器:服務器、組和項[12]。作為所有組對象的集合,服務器對象包含了所有組對象的數據。在同一個組中,本組的組對象可以獲得所有信息,同時也包含了OPC數據項。

OPC的組對象為客戶獲取數據信息提供了一種方法。客戶既可以在客戶端當中設置對數據的更新頻率,也可以對數據進行讀操作或寫操作。當在數據緩沖區的數據出現變化后,OPC服務器會將變化的數據發送給WCS,它在接收到數據后進行信息處理,無需花費大量的時間來搜索。在OPC定義的規范當中,有兩組對象:分別是本地組以及公共組。對于公共組來說,它可以被多個WCS共同擁有,但是本地組只能有一個WCS客戶。一般情況下,對于一對已建立連接的WCS和OPC服務器來說,它們只需要定義唯一的一組對象。但是在每組對象中,WCS能夠將多個OPC數據項增加進來。

服務器、組、數據項這三類對象形成了一個分層式的結構模型。在這個結構模型中,作為標準的COM對象,OPC對象包含了服務器對象和組對象,是OPC服務器必須實現的兩個組件對象[13],它需要通過實現OPC規范定義的接口,并且將這些接口提供給WCS,WCS再根據所提供的接口,完成對OPC服務器的訪問[14]。服務器對象擁有自己的類廠,如果需要使用,就必須先行在系統注冊表中完成注冊;而由于組對象沒有類廠,因此不需要向服務器對象一樣在注冊表中注冊,在服務器對象創建的同時也創建了組對象。組對象包括了項對象,它的作用是創建和數據存儲區的聯系,表明數據源的地址和類型。項對象與數據存儲區的數據項這兩個項是不同的,數據存儲區的數據項主要作用是和數據源通信,獲取該數據源中的數據;而項對象主要是和組對象通信,以及獲得WCS所需要獲得的信息。WCS通過組對象獲取到相關對象的名稱、屬性、值等信息,然后再將項對象與數據存儲區的數據項進行關聯,從而避免直接操作數據存儲區。

OPC對象和接口模塊對外提供OPC接口與WCS進行交互,對內則通過變量連接機制建立與數據源的連接,其結構如圖5所示。

圖5 服務器中對象和接口模塊結構

2.4 數據管理

WCS需要監控很多的變量數據信息,其中就包括了堆垛機的狀態,模式,輸送線的狀態模型,光電開關,報警信息,也能夠通過其他程序來獲得數據,以上的數據都能作為OPC服務器中的數據項,存儲在服務器的地址空間中。

3 WCS與OPC服務器通信的實現

WCS要從OPC服務器中獲取數據,是數據使用者,而OPC服務器是數據的提供者,將數據提供給WCS。它們兩個之間的數據傳遞、交互是通過OPC協議來實現的,也就是說必須要符合OPC的接口規范。OPC技術不僅僅適用于WCS和硬件設備之間,也適用于兩個軟件之間實現數據互通,它們既可以都配置在同一臺PC上,也能夠配置在同一個局域網中的不同PC上。

3.1 WCS與OPC服務器的通信流程

WCS和OPC服務器的交互流程如圖6所示。首先,無論對于WCS還是OPC服務器第一步都要做的是初始化COM(組件)庫。COM是微軟公司為了計算機工業的軟件生產更加符合人類的行為方式開發的一種新的軟件開發方式,可以將系統中的組件用新的替換掉,以便于日后的升級,也能夠在多個系統中使用多次。然后,OPC服務器將自身的信息注冊到操作系統的注冊表中,獲取CLSID,也叫類標識符。接下來是WCS根據查詢到的CLSID向OPC服務器提出構建服務器對象的請求,將WCS的請求發送給OPC服務器后就會構建服務器組件對象,并且向客戶端提供返回服務器接口對象的指針。當服務器組件對象構建完成后,WCS就能根據這個接口指針去調用OPC服務器中提供的方法。最后,當WCS結束訪問后就會將OPC服務器的資源進行釋放,然后卸載COM庫,關閉程序。在執行這一項過程當中,是WCS主動連接或者斷開OPC服務器,但是對于OPC服務器本身來說,它是并不知道對于任何訪問它的客戶的信息的。圖6為OPC服務器和WCS的交互流程。

圖6 OPC服務器和WCS的交互流程

3.2 組對象的實現

WCS是通過控制組對象從而實現更小單位的控制,從本質上來說,是OPC服務器將相同類型的數據劃分成為一個組而達到對相同類型的數據進行統一管理的目的。比如說,有兩個WCS需要經常訪問的數據,但是它們的數據刷新速率是不同的,那么就可以將這兩個數據分別劃分到不同組對象當中,這樣將大大提高WCS讀取數據的有效性和效率。

(1)組對象類的定義和方法。

接口中包含的方法與變量如下:

Class OpcDaCustomGroup

{

public int ServerGroupHandle; //輸出參數,服務器為新創建的組對象產生的句柄

public int RevisedUpdateRate; //輸出參數,服務器返回給客戶端的實際使用的數據更新率

public Guid Riid=typeof(IOPCItemMgt).GUID; //引用參數,客戶端想要的組對象的接口類型(如 IIDIOPCItemMgt)

public object Group; //輸出參數,用來存儲返回的接口指針。如果函數操作出現任務失敗,此參數將返回NULL

public Guid Riid; //引用參數,客戶端想要的組對象的接口類型(如IIDIOPCItemMgt)

public object Group; //輸出參數,用來存儲返回的接口指針。如果函數操作出現任務失敗,此參數將返回NULL。

public GCHandle TimeBias; //指向Long類型的指針

public GCHandle PercendDeadBand; //一個項對象的值變化的百分比,可能引發客戶端程序的訂閱回調。此參數只應用于組對象中有模擬dwEUType(工程單位)類型的項對象。指針為NULL表示0.0

public int LCID; //當用于組對象上的操作的返回值為文本類型時,服務器使用的語言

public OpcDaCustomItem[] OpcDataCustomItems; // OPC項數組

}

(2)組對象的接口實現。

組對象在Opc自定義接口-異步管理類(OpcDaCustomAsync)中的添加OPC項AddOpcGroup中實現,其中部分關鍵代碼如下:

//添加OPC組

Private void AddOpcGroup(OpcDaCustomGroupopcGroup)

{

InitIoInterfaces(opcGroup); //初始化IO接口

if(opcGroup.OpcDataCustomItems.Length>0)

{

//添加OPC項

AddOpcItem(opcGroup);

//激活訂閱回調事件

ActiveDataChanged(IOPCGroupStateMgt);

}

opcGroup.TimeBias.Free();

opcGroup.PercendDeadBand.Free(); //釋放組對象的資源

}

其中IOPCGroupStateMgt為OpcDaCustomAsync類中的成員變量,是Opc組管理器。

//初始化I/O接口方法

public void InitIoInterfaces(OpcDaCustomGroupopcGroup){

int cookie;

//組狀態管理對象,改變組的刷新率和激活狀態

IOPCGroupStateMgt=(IOPCGroupStateMgt)opcGroup.Group;

IConnectionPointContainer=(IConnectionPointContainer)opcGroup.Group;

Guidiid=typeof(IOPCDataCallback).GUID;

IConnectionPointContainer.FindConnectionPoint(ref iid, out IConnectionPoint);

//創建客戶端與服務端之間的連接

IConnectionPoint.Advise(this,out cookie);}

其中IConnectionPoint為OpcDaCustomAsync類中的成員變量,是連接指針。

3.3 項對象的實現

項對象作為OPC服務器之中的私有變量,是將WCS和數據源連接起來的核心,又因為是私有變量,但在OPC定義的規范中并未為其設定出任何標準接口,WCS只能通過組對象對其進行操作,但也正因為沒有為項對象做出規定,開發者們就能夠根據現場的實際情況以及自身的需求來對項對象進行設計與開發[15]。用設計類OpcDaCustomItem來描述項對象,包含的主要屬性和部分關鍵代碼有:

///添加OPC項

private void AddOpcItem(OpcDaCustomGroup opcGroup)

{

OpcDaCustomItem[] opcDataCustomItemsService=opcGroup.OpcDataCustomItems;

IntPtrpResults=IntPtr.Zero;

IntPtrpErrors=IntPtr.Zero;

OPCITEMDEF[] itemDefyArray=new OPCITEMDEF[opcGroup.OpcDataCustomItems.Length];

int i=0;

int[] errors=new int[opcGroup.OpcDataCustomItems.Length];

int[] itemServerHandle=new int[opcGroup.OpcDataCustomItems.Length];

//獲取每一個數據項的值,存放在一個集合中

foreach (OpcDaCustomItem itemService in opcDataCustomItemsService){

if (itemService!=null)

{

itemDefyArray[i].szAccessPath = itemService.AccessPath;

itemDefyArray[i].szItemID = itemService.ItemID;

itemDefyArray[i].bActive = itemService.IsActive;

itemDefyArray[i].hClient = itemService.ClientHandle;

itemDefyArray[i].dwBlobSize = itemService.BlobSize;

itemDefyArray[i].pBlob = itemService.Blob;

itemDefyArray[i].vtRequestedDataType = itemService.RequestedDataType;

}

//添加OPC項組

((IOPCItemMgt)opcGroup.Group).AddItems(opcGroup.OpcDataCustomItems.Length, itemDefyArray, out pResults, out pErrors);

IntPtr Pos = pResults;

Marshal.Copy(pErrors, errors, 0, opcGroup.OpcDataCustomItems.Length);

Pos = new IntPtr(Pos.ToInt32() + Marshal.SizeOf(typeof(OPCITEMRESULT))); }

var result = (OPCITEMRESULT)Marshal.PtrToStructure(Pos, typeof(OPCITEMRESULT));

itemServerHandle[j] = opcDataCustomItemsService[j].ServerHandle = result.hServer;

4 系統實際應用

OPC服務器在系統實際應用中主要起以下兩個方面的作用:與電子元器件(主要為PLC)相連獲取外界物理數據;與上位機通訊,將獲取來的數據提供給上位機進行讀寫操作,從而實現對外部設備的控制。該系統運行需要的軟硬件有:Net Framework 4.0、WinCC_V7.3、西門子300或其他類型PLC。

OPC服務器從PLC處獲取數據,需先在本機上安裝WinCC_V7.3,并對站組態編輯器進行配置,如圖7所示,需要配置好站名、模式,選擇本機使用的網卡,以及對應的IP。

圖7 OPC服務器站組態編輯器

當以上操作都完成后,需要PLC編程人員將程序下載至站組態編輯器之中,這樣OPC服務器就能與PLC建立連接,獲取數據。

而作為OPC服務器的上位機WCS在從OPC中獲取時,通常情況下都是在文本文件中預先編寫好xml類型的配置文件,如圖8所示。

圖8 xml文件配置示例圖

xml配置文件的第一行為xml的版本(1.0版本),并且使用的是UTF-8字符編碼。其中的標簽從大到小分別為OpcServer,OpcGroup和Item,依次對應OPC服務器配置、OPC組對象配置以及OPC項對象配置。在OPC服務器配置中需要寫明OPC服務器名及IP地址;在OPC組對象配置中需要寫明OPC組名、客戶端句柄以及刷新頻率;最后在項對象中則需要寫明OPC項對象在PLC中的地址塊、自定義英文名和中文名、客戶端句柄以及刷新頻率。至此,上位機配置文件基本完成。

由于PLC一般適用于工業自動化設備,考慮到軟件的穩定性和適用性,以及庫文件的多樣性,上位機軟件開發常使用微軟的VS平臺作為開發環境,.NET作為開發語言。圖9為上位機軟件WCS的變量監控圖。

圖9 WCS監控數據變量圖

從圖9中可以看出,監控的變量為xml配置文件中配置好的項對象,其中包含了變量描述、變量地址、變量名以及變量值。其中變量值的刷新頻率可以通過xml文件的刷新頻率(UpdateRate)進行設置,通常情況下數據交互模式都是采用訂閱方式進行數據更新,因為這種方式效率高、穩定性好。

5 結束語

該文為智能倉儲系統設計實現了OPC服務器以及OPC接口,實現了基于OPC的WCS和PLC之間的通信。使得WCS系統能夠對堆垛機、輸送線等進行控制并且下發指令,從而實現對貨物以及庫位的管理。在智能倉儲中使用OPC通信,相較于傳統的串口通信,傳輸性能大大提高,提升了WCS下指令的速度、整個倉儲的工作效率以及管理水平。

猜你喜歡
數據庫
數據庫
財經(2017年15期)2017-07-03 22:40:49
數據庫
財經(2017年2期)2017-03-10 14:35:35
兩種新的非確定數據庫上的Top-K查詢
數據庫
財經(2016年15期)2016-06-03 07:38:02
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
數據庫
財經(2015年3期)2015-06-09 17:41:31
數據庫
財經(2014年21期)2014-08-18 01:50:18
數據庫
財經(2014年6期)2014-03-12 08:28:19
數據庫
財經(2013年6期)2013-04-29 17:59:30
主站蜘蛛池模板: 婷婷色狠狠干| 久久99国产精品成人欧美| 欧美一级夜夜爽| 国产在线精彩视频论坛| 欧美日韩专区| 亚洲日韩精品无码专区97| 人人澡人人爽欧美一区| 国产亚洲精久久久久久久91| 国产高清在线精品一区二区三区| 一本色道久久88综合日韩精品| 大香网伊人久久综合网2020| 丁香亚洲综合五月天婷婷| 91区国产福利在线观看午夜 | 亚洲香蕉在线| 亚洲综合精品第一页| 欧美综合在线观看| 日韩在线2020专区| 在线精品欧美日韩| 国产第一页屁屁影院| 色香蕉影院| 国产精品久久久精品三级| 国产综合另类小说色区色噜噜| 欧美一区日韩一区中文字幕页| 国产小视频a在线观看| 国产精品成人不卡在线观看| 亚洲成人网在线观看| 色偷偷av男人的天堂不卡| 97久久精品人人做人人爽| 一本大道无码日韩精品影视| 免费可以看的无遮挡av无码| 国产精品私拍99pans大尺度| 国产精品三级av及在线观看| 国产午夜无码专区喷水| 午夜国产理论| 日韩精品无码免费专网站| 国产成人福利在线| 麻豆精品在线| 国产亚洲欧美在线视频| 国产精品嫩草影院av| 成人免费视频一区| 国产亚洲精品yxsp| 一本大道东京热无码av | 亚洲无码电影| 欧美成人精品高清在线下载| 亚洲狼网站狼狼鲁亚洲下载| 四虎影视8848永久精品| 亚洲视频三级| 色悠久久久久久久综合网伊人| 国产欧美精品专区一区二区| 五月六月伊人狠狠丁香网| 欧美国产另类| 亚洲第一中文字幕| 精品久久综合1区2区3区激情| 国产极品美女在线观看| 国产色婷婷| 2021国产精品自产拍在线观看| 欧美日韩精品一区二区在线线| 在线免费观看AV| AV不卡国产在线观看| 视频国产精品丝袜第一页| 农村乱人伦一区二区| 国产在线日本| 欧美精品一二三区| 亚洲黄网在线| 国产无人区一区二区三区| 国产乱子伦一区二区=| 国产亚洲欧美在线中文bt天堂| 色播五月婷婷| 国产成人av大片在线播放| 久热中文字幕在线| 中文字幕伦视频| 中文字幕2区| 91免费观看视频| 手机永久AV在线播放| 91人妻日韩人妻无码专区精品| 伊在人亚洲香蕉精品播放| 国产一区二区视频在线| 国产拍在线| 日韩欧美中文| 熟妇丰满人妻av无码区| 无码日韩人妻精品久久蜜桃| 国产成人高清精品免费5388|