国产欧美日韩精品a在线观看-国产欧美日韩精品一区二区三区-国产欧美日韩精品综合-国产欧美中文字幕-一区二区三区精品国产-一区二区三区精品国产欧美

ACS880-07C
關注中國自動化產業發展的先行者!
CAIAC 2025
2024
工業智能邊緣計算2024年會
2023年工業安全大會
OICT公益講堂
當前位置:首頁 >> 案例 >> 案例首頁

案例頻道

ActiveX Scripting技術在先控工程上的應用
  • 企業:浙江中控軟件技術有限公司     領域:儀器儀表     行業:綜合    
  • 點擊數:1852     發布時間: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.詳細的需求:
姓名:
單位:
電話:
郵件:
主站蜘蛛池模板: 欧美xxxxxxxxxxxxx| 欧美18www| 久久久精品国产免费观看同学| 国产区一区| 中文字幕乱码系列免费| 欧美一区二区在线视频| 成年人网站黄| 欧美一级做一a做片性视频| 国内自拍偷拍视频| 在线久草| 美女福利视频国产片| 在线看免费观看韩国特黄一级| 欧美成人区| 成人在线观看国产| 日韩三级欧美| jizz国产精品免费麻豆| 免费看欧美毛片大片免费看| 成人性视频在线| 欧美在线区| 一级成人| 国产一区精品| 手机免费在线看毛片| 成人在线a| 久久久网久久久久合久久久久| 黄色美女网站视频| 亚洲国产精品成人久久| 国产在线一区二区三区欧美| 亚洲国产日韩欧美| 成年美女黄网站色视频大全免费| 欧美成人午夜做爰视频在线观看| 成人合成mv福利视频网站| 欧美一区二区三区精品影视| 一区二区中文字幕亚洲精品| 精品日本一区二区三区在线观看 | 中文字幕日本不卡| 男人和女人的做刺激性视频| 亚洲成a人在线播放www| 国产成人免费视频精品一区二区| 欧美三级在线| 手机看片99| 91精品人成在线观看|