日本在线www-日本在线播放一区-日本在线不卡免费视频一区-日本在线不卡视频-成人影院久久久久久影院-成人影院一区二区三区

ABB
關注中國自動化產業發展的先行者!
CAIAC 2025
2025工業安全大會
OICT公益講堂
當前位置:首頁 >> 案例 >> 案例首頁

案例頻道

ActiveX Scripting技術在先控工程上的應用
  • 企業:浙江中控軟件技術有限公司     領域:儀器儀表     行業:綜合    
  • 點擊數:2211     發布時間:2010-01-06 20:25:36
  • 分享到:

 
 

    張  軍(1981-)



    男,浙江杭州人,助理工程師,本科,畢業于浙江工業大學計算機及應用專業,主要研究方向為自動化軟件的研發和應用。



    摘   要:本文介紹了ActiveX Scripting技術,基于ActiveX Scripting技術開發了算法擴展組件,探討了該組件的系統特點及在先控工程上的應用,為先控工程師提供了腳本編輯,離線調試,最后在線運行這樣一套完整的編寫自定義擴展算法的操作流程,解決了在特殊工況、特殊裝置下運用算法擴展組件編寫腳本擴展算法達到輔助控制的目標。

    關鍵詞:ActiveX Scripting;腳本引擎;腳本宿主;離線調試;腳本工程;COM;Automation對象;先進控制

    Abstract: This article describes the ActiveX Scripting technology. Based on ActiveX Scripting technology, we extend the algorithm component and explore the characteristics of the components of the system and its application in control engineering  We provide a complete operation procedure of script editing, off-line debugging, and on-line running for control engineer to compile self-defined extended algorithm. Thus, we can edit script extended algorithms in special conditions and special equipment to achieve auxiliary control.

    Key words: ActiveX Scripting; The script engine; Script Host; off-line debugging; script works; COM; Automation object; advanced process control

    先控工程絕大部分情況下,采用預測控制或PID控制等標準控制算法就可實現預期控制目標;但也有一小部分情況,如裝置改造、擴容或者在某些特殊工況下完全采用標準控制算法并不能達到預期控制目標,這種情況下需要采用自定義算法輔助實現控制目標。

    這就需要應用的軟件是可擴充和可定制的,微軟提供的ActiveX Scripting技術可使軟件擴充變得非常簡單,利用腳本引擎(Script Engine)對腳本語言解釋和執行的支持,用戶可以根據需要使用腳本語言編寫自定義擴展算法,并交由軟件處理,對于用戶來說,就好象自己在編寫程序控制應用程序,以完成自己所期望的功能。

1 ActiveX Scripting技術介紹

    ActiveX是Microsoft公司于1996年提出的一項技術,它以COM(Component Object Model,組件對象模型)為基礎,使得不同的進程(特別是網絡進程)之間可以相互通信。ActiveX控件是Microsoft公司提供的一種用于模塊集成的協議,是可移植的軟件模塊,適用于各種開發語言,因而與開發平臺無關。ActiveX Scripting技術是Microsoft 的ActiveX技術的一個組成部分,它主要目的是使應用程序在不被修改的情況下,為各種腳本語言所控制。在軟件交互性不斷提高的今天,僅僅提供菜單或工具箱的界面已經不能滿足用戶的需要了,軟件的可定制特性已經成為當今軟件的一項基本特征,尤其對于一些通用的軟件更為如此。大家比較熟悉的Microsoft Office軟件,比如Word字處理軟件,它不僅提供了界面的任意定制,還提供了方便的Basic語言的可編程特性,用戶可以通過編寫BASIC語言實現較為復雜的功能擴充。

    ActiveX Scripting體系由一個COM接口族組成,這些接口定義了一個把腳本引擎和腳本宿主連接起來的協議。在ActiveX Scripting的世界里,腳本引擎只是一個組件對象,是ActiveX Scripting技術的實現,它暴露了一套標準的COM接口,能夠動態地執行腳本程序,如果應用系統實現了這套標準接口,那么它就可以通過腳本引擎為用戶提供對腳本語言的支持,也即實現了腳本宿主的功能。腳本宿主可以將它的Automation接口暴露在腳本引擎的名字空間中,可在動態執行的腳本中像訪問程序中的變量那樣訪問應用程序的對象。

    Automation技術以COM(組件對象模型)為基礎,所有的Automation對象都實現了標準的IDispatch接口,通過IDispatch接口暴露對象的屬性和方法以便在客戶程序中使用這些屬性并調用它所支持的方法。Automation對象的客戶程序或者宿主程序通過類型庫(Type Library)獲得對象運行時刻的類型信息,并提供事件處理。宏語言解釋器或者腳本引擎根據對象的類型信息,把其中對對象屬性和方法的引用解釋為對IDispatch接口成員函數Invoke的調用,從而實現對對象的控制。
圖1是腳本宿主和腳本引擎之間的協作過程。

           

                  圖1   腳本宿主和腳本引擎之間的協作過程

    從圖1中可以看到IActiveScriptParse、IActiveScript、IActiveScriptSite這三個腳本引擎暴露的接口在整個協作過程中扮演了非常重要的角色。

    (1)創建必要的受控對象,這里的受控對象指的是Automation對象并且是在腳本文件中將會被引用到的。

    (2)創建腳本引擎對象,獲取IActiveScript接口指針。

    (3)通過IActiveScript接口查詢IActiveScriptParse接口,調用其中的ParseScriptText方法將腳本代碼加載到腳本引擎中。

    (4)向腳本引擎注冊命名對象名稱,在第一步為創建的每個Automation都定義一個命名項,然后通過IActiveScript接口中的AddNamedItem接口方法將命名項添加到腳本引擎中。當腳本文件中需要引用Automation對象時,這一步是不能省略的,否則腳本引擎將無法解析該對象。

    (5)啟動引擎,運行腳本。即將腳本引擎狀態設置為連接狀態即可,可通過調用IActiveScript接口中的SetScriptState方法來完成。

    (6)腳本運行時,如遇到命名對象,則腳本引擎會調用由腳本宿主重新實現的IActiveScriptSite接口中的GetItemInfo方法,它根據傳入的命名項字符串與已注冊的命名對象名稱進行比較,并返回對應的Automation對象的IDispatch接口指針。

    (7)通過連接點機制實現Automation對象與相關腳本的事件通知,如Automation對象觸發了一個鼠標雙擊動作,則與雙擊事件相關的腳本代碼將被執行。

    (8)在腳本引擎的執行過程中,如遇到腳本引用了Automation對象的方法或屬性時,則腳本引擎會通過第六步拿到的該對象的IDispatch接口指針調用Invoke方法來實現與該對象的交互。

2 算法擴展組件

    2.1 系統介紹


    算法擴展組件采用ActiveX Scripting技術為先控工程師提供了編寫擴展算法腳本的環境,實現了離線編輯腳本,離線調試腳本,最后在線運行腳本這樣一套完整的編寫自定義擴展算法的操作流程。

    算法擴展組件由腳本開發環境、腳本在線運行監視環境、算法擴展組件(以COM組件形式發布)三部分組成。

    算法擴展組件的模塊層次如圖2所示。

                    

                          圖2   算法擴展組件模塊層次示意圖

    算法擴展組件實現了腳本引擎暴露的IActiveScriptSite、IActiveScriptSiteWindow、IDebugSessionProvider、IApplicationDebugger、IDebugExpressionCallBack接口,并將這些接口包裝成IScriptHost、IScriptDebug等接口暴露給腳本開發環境,用戶通過腳本開發環境訪問算法擴展組件提供的這些接口服務,使之成為腳本宿主和調試器于一體的應用系統;腳本在線運行監視環境通過訪問算法擴展組件暴露的IScriptPrj接口提供對腳本工程的加載、卸載、啟動、停止等功能。

    2.2 離線調試

    算法擴展組件內部定義了一些與先控平臺相關的Automation對象,使之能在腳本中被引用,從而針對特定裝置編寫特定算法實現特定控制;如果將編寫的算法腳本直接加載到腳本引擎,那么它的安全性和有效性是無法保障的,考慮到先進控制的高可靠性和高安全性要求,需要事先對算法腳本進行調試,算法擴展組件提出了離線調試的概念,即將腳本調試器集成到腳本開發環境中,腳本在調試過程中所引用的Automation對象并不與先控平臺連接,中間所發生的數據處理和數據交互交由算法擴展組件的IScriptVar接口完成,這樣對腳本引擎來說IScriptVar就是一個虛擬的Automation對象,并且對它是透明的。在現場環境中這種調試模式有效屏蔽了與現場數據的交互,避免因所寫算法存在缺陷將數據誤寫而引起控制異常。
圖3顯示了在離線調試下腳本引擎與Automation對象的交互過程。

             

                             圖3   離線調試示意圖

    2.3 腳本工程

    算法擴展組件定義了腳本工程的概念,即將所編寫的腳本代碼與該腳本相關的組態信息(比如腳本的觸發方式以及它的觸發周期等)打包成一個腳本工程。通過算法擴展組件為每個在線加載的腳本工程派發一個后臺線程來處理,以實現多腳本工程的并發運行,當其中一個腳本工程運行出現異常時不影響其他工程的運行。腳本在線運行監視環境被集成到原有的在線操作平臺中,并以腳本工程為操作單元,實現對腳本工程的加載、卸載、啟動、停止等功能。
圖4顯示了腳本工程的加載、運行示意圖。

         

                         圖4   腳本工程加載、運行示意圖

    2.4 腳本算法庫

    將多年先控工程實施過程中積累的常用腳本算法提煉到腳本算法庫中,便于工程師提取,并運用相應的組態功能,對某個腳本算法稍作參數的改動就可應用于新的先控工程中,減少工程師重新編寫腳本或粘貼/復制等重復勞動。同時腳本算法庫是可維護的,什么時候把一個什么樣的腳本算法添加到算法庫中完全由工程師決定。

3 腳本調試器的實現

    在介紹腳本調試的實現之前,先介紹一下腳本調試技術。

    微軟為腳本調試框架定義了5個模塊,分別是腳本宿主(Host)、腳本引擎(Language Engine)、進程調試管理器(Process Debug Manager)、本機調試管理器(Machine Debug Manager)、調試器(Application Debugger),其框架定義如圖5所示。

                   

                               圖5   腳本調試框架圖

    (1)Host:負責為腳本創建運行環境,提供腳本編譯時和運行時的錯誤信息處理及其他一些腳本事件處理,如當腳本終止運行時、當腳本狀態改變時等等。

    (2)Language Engine:負責解析和執行腳本代碼并提供腳本調試狀態下的功能,如枚舉調用堆棧、表達式計算、編譯時和運行時的錯誤通知等等。例程名為VBScript.dll。

    (3)PDM:負責管理在Active Scripting Framework中各種和進程相關的問題,一個進程通常能支持一個或多個腳本應用程序,而PDM就是用來管理這些應用程序的。它能跟蹤到正在運行的這些應用程序和進程,并且能跟蹤到所有的線程和他們的父線程,同時協調MDM、調試器和腳本引擎之間的通信。例程名為PDM.dll。

    (4)MDM:負責管理所有正在本機上運行的應用程序。例程名為mdm.exe。

    (5)Application Debugger:負責提供調試時的所有用戶界面功能,如調用堆棧窗口、即時窗口、監視窗口及斷點設置等。

    根據對上述各模塊的描述,要實現調試器,就需要自己構建Host和Application Debugger框架與腳本引擎通信。

    通過實現IActiveScriptSite、IActiveScriptSiteWindow接口構建Host框架。在Host框架中創建一個PDM實例,并獲取默認應用程序對象指針。

::CoCreateInstance(CLSID_ProcessDebugManager,

                               NULL,

                               CLSCTX_ALL,

                               IID_IProcessDebugManager,

                               (LPVOID*) &m_pProcessDebugManager

                               ); 

m_pProcessDebugManager->GetDefaultApplication(&m_pDebugApplication); 

     通過實現IApplicationDebugger、IDebugSessionProvider接口構建調試器框架調試器框架類的定義大致如下:

class CScriptDebug : public IApplicationDebugger,

public IDebugSessionProvider

{

 ……

}

    一旦調試器框架類被實例化之后,通過QI查詢IDebugSessionProvider接口,該接口有一個重要的方法StartDebugSession,該方法負責將應用程序對象和調試器關聯起來,以支持調試功能,所以該方法是必須要實現的,實現方式如下:

STDMETHODIMP CScriptDebug::StartDebugSession( 

  IRemoteDebugApplication __RPC_FAR *pda)

 {
  HRESULT hr;

  hr = pda->ConnectDebugger(this);

  return SUCCEEDED(hr) ? S_OK : E_FAIL;

 }

      調試器中設置的斷點如何映射到腳本引擎中呢?首先需要一個IActiveScript接口指針,這可以通過以下代碼得到:

 // 創建語言引擎實例

 CLSID clsid;

 IActiveScript* pActiveScript;

 HRESULT hr = CLSIDFromProgID(L"VBScript", &clsid);

 hr = ::CoCreateInstance(clsid,

                                               NULL,

                                               CLSCTX_ALL,

                                               IID_IActiveScript,

                                               (LPVOID*) &pActiveScript

                                               );

    進而通過QueryInterface查詢IActiveScriptDebug接口,該接口中有一個方法EnumCodeContextsOfPosition,該方法根據當前設置的斷點位置獲取相應的代碼上下文的枚舉器(IEnumDebugCodeContexts)接口指針,通過該枚舉器枚舉IDebugCodeContext接口,IDebugCodeContext接口有一個方法SetBreakPoint,該方法負責將當前的斷點映射到腳本引擎對應的代碼上下文中。

    當調試器中設置的斷點被映射到腳本引擎對應的代碼上下文后,接下來的問題是當腳本引擎開始執行腳本時,遇到斷點怎么通知調試器?這就需要用到IDebugApplication這個接口,該接口繼承自IRemoteDebugApplication。

    IDebugApplication接口實例是有PDM負責創建的并注冊給腳本引擎,因此當腳本引擎命中斷點時,IDebugApplication接口中的HandleBreakPoint將會被調用,進而會調用到調試器重載的onHandleBreakPoint方法,該方法的簽名如下:

onHandleBreakPoint( 

  /* [in] */ IRemoteDebugApplicationThread __RPC_FAR *prpt,

  /* [in] */ BREAKREASON br,

  /* [in] */ IActiveScriptErrorDebug __RPC_FAR *pError)

    從該方法中可獲取到RemoteDebugApplicationThread接口指針,通過該指針可以獲取調用堆棧信息、屬性信息、進行表達式計算、獲取當前腳本語句所在的行號。

    因此當一個斷點到來時,就可以根據中斷原因進行相應的處理;如果中斷原因是BREAKREASON_ERROR,那么第三個參數將會被用到,否則其他情況下該參數總是為空。

    一旦斷點被命中,應用程序就被阻塞等待調試器給它的喚醒指令。具體執行喚醒指令的是ResumeFromBreakPoint這個方法,其簽名如下:

 HRESULT ResumeFromBreakPoint(

                        IRemoteDebugApplicationThread* prptFocus, 

  BREAKRESUMEACTION        bra,

                        ERRORRESUMEACTION        era

                               );

    該方法由IRemoteDebugApplication接口實現,遺憾的是并不能通過PDM直接獲取到該接口指針,但是能獲取到IRemoteDebugApplicationThread這個接口指針,進而再通過這個接口調用其GetApplication方法就能獲取IRemoteDebugApplication接口,在獲取到IRemoteDebugApplication接口指針后,就可以調用ResumeFromBreakPoint方法來向應用程序發出喚醒指令。

    前面說過onHandleBreakPoint中的IRemoteDebugApplicationThread接口指針非常重要,因為通過它能獲取調用堆棧信息,該接口下有一個方法EnumStackFrames,該方法能返回一個IEnumDebugStackFrames類型的接口指針,它被用來枚舉線程中的調用堆棧,枚舉的結果是返回一個DebugStackFrameDescriptor類型的結構體,該結構體定義如下:

 typedef struct  tagDebugStackFrameDescriptor

 {
     IDebugStackFrame __RPC_FAR *pdsf;

     DWORD dwMin;

     DWORD dwLim;

     BOOL fFinal;

     IUnknown __RPC_FAR *punkFinal;

 } DebugStackFrameDescriptor;

    其中第一個參數是IDebugStackFrame類型的接口指針,通過該接口中的方法能獲取到具體的調用堆棧信息,而其他參數則是在對調用堆棧進行排序時才有用。

    獲取腳本上下文屬性可通過IDebugProperty接口來實現,那么怎么獲取該接口呢,前面提到tagDebugStackFrameDescriptor這個結構有一個IDebugStackFrame接口,該接口有一個方法GetDebugProperty,通過這個方法就能獲取到IDebugProperty接口指針了,獲取IDebugProperty接口后再調用其中的EnumMembers方法來枚舉屬性的成員,其方法簽名如下:

 EnumMembers (

                                DBGPROP_INFO_FLAGS dwFieldSpec,

                                UINT nRadix,

                                REFIID refiid,

                                IEnumDebugPropertyInfo** ppEnum

                                );

    通過此方法,就能獲取到一個IEnumDebugPropertyInfo枚舉器接口指針,有了這個接口指針就能枚舉所有屬性信息,微軟定義了如下屬性信息結構:


 typedef struct  tagDebugPropertyInfo

 {

     DBGPROP_INFO_FLAGS m_dwValidFields;

     BSTR m_bstrName;

     BSTR m_bstrType;

     BSTR m_bstrValue;

     BSTR m_bstrFullName;

     DBGPROP_ATTRIB_FLAGS m_dwAttrib;

     IDebugProperty __RPC_FAR *m_pDebugProp;

 } DebugPropertyInfo;

    從該結構中能獲取到屬性名、屬性類型、屬性值等一些需要的信息,同時通過結構中的m_pDebugProp成員可遞歸枚舉其所有子屬性信息。

4 結束語

    ActiveX Scripting技術為開發的軟件提供了強大的可擴展性,以該技術開發的算法擴展組件為先控工程師提供了友好的操作界面,支持對腳本關鍵字著色、大綱折疊、行號顯示、撤消/重做、斷點設置、StepIn、StepOut、StepOver等三種調試模式;支持調試狀態下的調用堆棧查看、即時窗口查看、表達式計算;支持對腳本語法錯誤或運行時錯誤的信息提示并實現相應的錯誤信息定位;實現了在線運行環境下根據組態信息自動控制腳本的執行和停止。

    算法擴展組件改變了工程師完全依賴第三方腳本編輯器來編寫及調式腳本的狀況,根據先控工程特點定制的離線調試功能解決了之前調試狀態下直接連接先控平臺的缺陷;腳本內容和相應的組態信息被算法擴展組件中包裝成一個腳本工程,并通過加密增強了腳本算法內容的安全性。腳本算法庫便于工程師提取常用腳本算法,減輕了一部分工作量。

    2009年8月投入試用之后工程師可在不使用第三方腳本調試器情況下,使用算法擴展組件完成腳本編輯、調試、運行等一整套完整的操作流程,運行效果良好。

    參考文獻:

    [1]呂思偉,潘愛民. ActiveX Scripting技術介紹[EB/OL].http://www.vckbase.com/article/atl/0003.htm. 

    [2] microsoft.Windows 腳本技術[EB/OL]. http://download.csdn.net/source/160096.

    [3] Mike Pellegrino. Active Scripting APIs: Add Powerful Custom Debugging to Your Script-Hosting App[EB/OL]. MSDN Magzine,2000.

    [4] Steve Wampler. ActiveX Scripting in MFC[EB/OL].http://download.csdn.net/source/894113.

    [5] Mark Baker. Active Scripting Newsletter[EB/OL]. http://www.ddj.com/windows/184405549.

    [6] BRENT RECTOR, CHRIS SELLS. 深入解析ATL[M].潘愛民,新語,譯.北京:中國電力出版社,2001(10):347-393.







                                                        轉自《自動化博覽》

熱點新聞

推薦產品

x
  • 在線反饋
1.我有以下需求:



2.詳細的需求:
姓名:
單位:
電話:
郵件:
主站蜘蛛池模板: 五月婷六月婷婷,97九色,成年人国产,精品久久久久久久,久久久久久久国产精品电影,国产在线观看青草视频 | 久久精品免费电影-久久精品免费-久久精品美乳-久久精品美女视频-亚洲最大福利视频-亚洲综合视频一区 | 精品国产91乱码一区二区三区,成人国产一区二区三区精品,亚洲一区免费在线观看,日韩在线一区二区三区免费视频,波多野吉衣在线观看,日韩一级精品久久久久 | 日韩专区第一页-日韩中文字幕在线亚洲一区-日韩中文字幕在线观看视频-日韩中文字幕在线播放-日韩中文字幕一区二区不卡-日韩中文字幕一区 | 国产精品视_精品国产免费-国产精品视-国产精品深夜福利免费观看-国产精品三区四区-四虎成人4hutv影院-四虎成年永久免费网站 | 极品少妇粉嫩小泬啪啪AV-极品少妇粉嫩小泬啪啪小说-极品少妇高潮啪啪AV无码-极品少妇伦理一区二区-极品少妇小泬50PTHEPON-极品夜夜嗨久久精品17c | 国产精品成av人在线观看片-国产精品成久久久久三级-国产精品成久久久久三级四虎-国产精品成久久久久三级无码-国产精品成年片在线观看-国产精品成人 | 亚洲 欧美 日韩 在线,97热久久免费频精品99国产成人,另类激情亚洲,久久99九九精品免费,久久综合精品国产一区二区三区,2020精品极品国产色在线观看 | 极品丝袜小说全集-极品丝袜乱系列在线阅读-极品丝袜老师h系列全文阅读-极品手交handjobtattoo-亚洲男人网-亚洲男人天堂影院 | 日本a天堂,亚洲精品乱码久久久久久,欧美精品一区二区三区在线播放,国产亚洲视频在线观看,国产丰满眼镜女在线观看,亚洲日韩欧美综合 | 久久这里只有精品国产99-久久这里只有精品2-久久这里只有精品1-久久这里只精品热在线99-在线少女漫画-在线涩涩免费观看国产精品 国产精选一区二区-国产精选一区-国产精选污视频在线观看-国产精选91热在线观看-特级黄色视频毛片-特级黄色免费片 | h在线动漫-h玉足嫩脚嗯啊白丝-h网站国产-h视频免费高清在线观看-欧美亚洲欧美-欧美亚洲免费 | 久久久久久一级毛片免费野外-久久久久久一级毛片免费无遮挡-久久久久久亚洲精品影院-久久久久久亚洲精品不卡-午夜久久精品-午夜精品在线视频 | 亚洲日本中文字幕在线-亚洲日本中文字幕区-亚洲日本中文字幕-亚洲日本中文-免费jizz在在线播放国产-免费jizz在线播放视频 | 在线日韩亚洲-在线日韩视频-在线日韩欧美一区二区三区-在线日韩欧美-久久精品嫩草影院-久久精品免视看国产盗摄 | 91精品视频播放-91精品视频免费播放-91精品视频免费观看-91精品视频免费在线观看-91精品视频网站-91精品视频一区二区 | 日本特黄一级-日本特黄特色aa大片免费-日本特黄特色aaa大片免费-日本特黄特黄aaaaa大片-二级特黄绝大片免费视频大片-二级片在线观看 | 国产一级视频在线-国产一级视频免费-国产一级视频久久-国产一级视频播放-日本中文字幕在线视频站-日本中文字幕在线视频 | 福利精品短视频在线-福利精品国产一区-福利视频网站一区二区三区-福利视频一二区-福利视频一区-福利视频一区二区 | 国产激情对白一区二区三区四-国产或人精品日本亚洲77美色-国产黄站-国产黄在线免费观看-日韩中文字幕网-日韩中文字幕视频在线观看 | 在线看国产,精品国产一区二区二三区在线观看,国产一区二区三区视频,美女一级毛片免费观看,日韩aa在线观看,成人精品一区二区www | 国产一卡2卡3卡四卡精品网站-国产一久久香蕉国产线看观看-国产一进一出视频网站-国产一级在线现免费观看-亚洲高清国产拍精品影院-亚洲高清二区 | 天堂网在线观看-天堂网在线www最新版在线-天堂网在线www资源在线-天堂网在线www资源网-精品久久一区二区-精品久久一区 | 国内精品免费久久影院-国内精品蜜汁乔依琳视频-国内精品乱码卡一卡2卡三卡新区-国内精品乱码卡一卡2卡三卡-亚洲国产精品第一影院在线观看-亚洲国产精品VA在线看黑人 | 手机看片福利永久国产日韩-手机看片369-手机精品在线-手机国产乱子伦精品视频-国产精品嫩草影院在线观看免费-国产精品嫩草影院在线播放 | 亚洲尹人-亚洲伊人久久综合影院2021-亚洲伊人久久在-亚洲伊人久久网-免费网站在线观看人数在哪里看的-免费网站在线观看国产v片 | 麻豆蜜桃色精品电影网在线高清-麻豆蜜臀国产精品无码视频电影无删减在线观看-麻豆免费版-麻豆免费观看高清完整视频-麻豆免费看-麻豆免费网站 | 亚洲精品国产免费-亚洲精品国产理论电影网-亚洲精品国产精品国自产网站-亚洲精品国产第1页-韩国电影一区二区-韩国电影一区 | 国产91av视频在线-国产91av在-国产91av在线-国产91av在线播放-国产91chinese在线观看-国产91l在线播放 | 亚洲国产区男人本色vr-亚洲国产区男人本色-亚洲国产品综合人成综合网站-亚洲国产品有宅男-亚洲国产片在线观看-亚洲国产片精品一区二区三区 | 久久亚洲精品中文字幕-久久亚洲精品永久网站-久久亚洲精品无码A片大香大香-久久亚洲精品成人综合-在线观看视频中文字幕-在线观看视频一区 | 国产夜色福利院在线观看免费-国产夜趣福利免费视频-国产野花视频天堂视频免费-国产亚洲综合一区二区在线-日韩精品在线观看免费-日韩精品在线电影 | 四虎永久免费影院在线-四虎永久免费影院-四虎永久免费网站免费观看-四虎永久免费观看-国产精品麻豆综合在线-国产精品麻豆一区二区三区 | 天堂网在线最新版www-天堂网在线资源-天堂网在线看-天堂网在线观看视频-日本精品无码特级毛片-日本精品无码一区二区三区久久久 | 美国a毛片-美国成人影院-美国毛片aa-美国毛片aaa在线播放-美国毛片基地-美国毛片基地a级e片 | 国产免费看-国产免费久久精品久久久-国产免费久久精品99-国产免费久久精品44-天天干天天天天-天天干天天爽天天射 | 久久免费资源-久久免费小视频-久久免费手机视频-久久免费视频网站-欧美国产亚洲一区 | 日本黄页网站-日本黄页网-日本黄页视频-日本黄页免费大片在线观看-国产免费网址-国产免费网站看v片元遮挡 | 精品久久久久久蜜臂a∨-精品久久久久久蜜臀-精品久久久久久免费看-精品久久久久久免费影院-精品久久久久久清纯-精品久久久久久日韩字幕无 | 久久久精品视频免费观看,非会员体验60秒试看福利区,免费福利在线观看,国内免费视频成人精品,久久久中文字幕日本,婷婷激情五月 | 亚洲香蕉久久综合网-亚洲香蕉久久一区二区三区四区-亚洲香蕉久久一区二区-亚洲香蕉国产高清在线播放-净空法师最新忏悔文-精油按摩理论片 |