 您現(xiàn)在的位置:
                中國(guó)傳動(dòng)網(wǎng)
                >
                技術(shù)頻道
                >
                應(yīng)用方案
                >
                面向過(guò)程的編譯和解釋環(huán)境在工控組態(tài)軟件系統(tǒng)中的應(yīng)用
                您現(xiàn)在的位置:
                中國(guó)傳動(dòng)網(wǎng)
                >
                技術(shù)頻道
                >
                應(yīng)用方案
                >
                面向過(guò)程的編譯和解釋環(huán)境在工控組態(tài)軟件系統(tǒng)中的應(yīng)用
            時(shí)間:2008-08-06 13:44:00來(lái)源:ronggang
 圖3 存儲(chǔ)空間關(guān)系圖(a)和運(yùn)行時(shí)存儲(chǔ)空間示意圖(b)[/align]
  3.4 中間代碼操作數(shù)的定義
  Child-C程序被編譯成中間代碼指令被解釋器執(zhí)行,如以下的Child-C語(yǔ)句執(zhí)行相加操作:
  int a,b,c; a=b+c;
  它被編譯為如下幾條中間代碼指令:
  LOD R0 Ox00000010 4; ①—— 加載變量a到寄存器R0,Ox00000010是變量a在運(yùn)行時(shí)堆存儲(chǔ)區(qū)內(nèi)的偏移地址,4表示加載的數(shù)據(jù)為4個(gè)字節(jié)
  LOD R1 Ox00000014 4; ②—— 加載變量b到寄存器R1
  ADD ③—— R1+R0->R2,三個(gè)寄存器的意義是固定的
  STR R2 Ox00000018 ④— 將寄存器R2的值保存到變量c中
  其中指令③的ADD指令是二元操作數(shù)指令,但是它的操作數(shù)固定為R0和R1寄存器,計(jì)算結(jié)果也固定放到R3中。
  3.5 字符串的兼容和特殊處理
  C語(yǔ)言中的字符串是通過(guò)字符數(shù)組進(jìn)行處理的,Child-C繼承了這種字符串處理方法。字符數(shù)組是長(zhǎng)度固定的字符串,而在使用Child-C與COM組件交互時(shí)經(jīng)常要處理COM標(biāo)準(zhǔn)的BSTR類(lèi)型變長(zhǎng)字符串,為了兼容該數(shù)據(jù)類(lèi)型,在Child-C中增加了bstr類(lèi)型的變長(zhǎng)字符串?dāng)?shù)據(jù)類(lèi)型。bstr由頭尾兩部分組成:頭部信息由head和len兩個(gè)32位無(wú)符號(hào)整形組成,頭部信息代表了字符串實(shí)體,它可以作為局部和全局變量存儲(chǔ),head是一個(gè)指針,它指向字符數(shù)據(jù)在全局堆中的首地址,len記錄了字符串的長(zhǎng)度。尾部信息保存在全局堆存儲(chǔ)區(qū)中,字符信息在該區(qū)中并不是連續(xù)的,這也適應(yīng)了字符串長(zhǎng)度變化的需要。bstr可以直接代替BSTR類(lèi)型,中間代碼指令集中有專(zhuān)門(mén)的轉(zhuǎn)換指令COMTOC和CTOCOM進(jìn)行數(shù)據(jù)轉(zhuǎn)換。當(dāng)需要將bstr轉(zhuǎn)換成BSTR時(shí),編譯器自動(dòng)添加COMTOC指令,該指令根據(jù)bstr的頭信息讀取字符數(shù)據(jù)組裝成BSTR數(shù)據(jù)提交給COM組件,而CTOCOM是一個(gè)逆過(guò)程。這兩條指令使用特設(shè)的第二組虛擬寄存器進(jìn)行轉(zhuǎn)換操作。
  3.6 COM組件的訪問(wèn)
  COM對(duì)象的訪問(wèn)需要進(jìn)行特殊處理,它是在解析運(yùn)行環(huán)境建立之前就已經(jīng)存在的。如圖3a所示,它存儲(chǔ)在組態(tài)軟件系統(tǒng)的存儲(chǔ)空間中,它不會(huì)隨著解釋運(yùn)行環(huán)境的消亡而消亡。而除此之外的數(shù)據(jù)都存儲(chǔ)在解釋器的存儲(chǔ)空間中,它們會(huì)隨著解釋運(yùn)行環(huán)境的消亡而消亡。為了便于編譯器和解釋器統(tǒng)一存儲(chǔ)空間的處理,需要將COM組件映像到解釋器存儲(chǔ)空間中,圖3b中的COM組件地址映射區(qū)就用來(lái)保存COM組件地址的映像。在編譯器和解釋器的運(yùn)行過(guò)程中,所有對(duì)COM組件的訪問(wèn)都被映射到該區(qū)域,從而避免了存儲(chǔ)空間的交叉訪問(wèn)。
  3.7 解釋器環(huán)境中對(duì)COM組件方法的調(diào)用
  COM組件的各種函數(shù)已經(jīng)被編譯成可被計(jì)算機(jī)直接執(zhí)行的機(jī)器代碼,自動(dòng)化COM對(duì)象允許使用IDispatch接口的統(tǒng)一調(diào)度函數(shù)Invoke()調(diào)用組件的函數(shù),被執(zhí)行的函數(shù)可以當(dāng)作一個(gè)字符串參數(shù)被傳送。因此在構(gòu)造的中間代碼指令集中有一條INVOKE指令,該指令格式為:INVOKE ComOffset FuncOffset ParaOffset;該指令有三個(gè)操作數(shù):ComOffset為要訪問(wèn)的COM組件在COM組件地址映射區(qū)的偏移,F(xiàn)uncOffset為被調(diào)用函數(shù)的名稱(chēng)bstr變量地址,ParaOffset是該函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)的存儲(chǔ)單元地址,該存儲(chǔ)區(qū)之后是一個(gè)4字節(jié)的單元,它用來(lái)保存Invoke()函數(shù)執(zhí)行的返回值。就是說(shuō),對(duì)COM組件的所有操作,解釋器只需通過(guò)執(zhí)行Invoke()函數(shù)就能完成。
4 事件體系的構(gòu)造
  Child-C函數(shù)是通過(guò)事件觸發(fā)而被調(diào)用的。事件包含兩種類(lèi)型,一種是組件運(yùn)行系統(tǒng)定義的事件,該類(lèi)型事件屬于整個(gè)系統(tǒng),它與具體組件無(wú)關(guān),但可以被COM組件和系統(tǒng)觸發(fā)。另一種是COM組件自定義的事件,該類(lèi)型事件屬于COM組件,它只能被組件自身觸發(fā)。事件發(fā)生時(shí)觸發(fā)解釋器解釋運(yùn)行事件的相應(yīng)函數(shù)。事件的處理工作全部交給事件槽來(lái)處理,事件槽實(shí)際上是一個(gè)可鏈接對(duì)象接收器[5],它可以接受系統(tǒng)和COM組件觸發(fā)的事件,同時(shí)它還維護(hù)了一張事件映射表,該表記錄了所有添加了響應(yīng)函數(shù)的事件和該事件響應(yīng)函數(shù)的入口地址以及有關(guān)參數(shù)信息。當(dāng)有事件到達(dá)時(shí),首先檢查事件映射表該事件是否有被注冊(cè),如果有則根據(jù)響應(yīng)函數(shù)的參數(shù)信息分配存儲(chǔ)空間并調(diào)用響應(yīng)函數(shù)。
5 結(jié)束語(yǔ)
  在實(shí)際的生產(chǎn)應(yīng)用中可以證明,Child-C完全可以勝任絕大部分流程控制的需要,提高了工控組態(tài)軟件的靈活性。解釋器環(huán)境開(kāi)發(fā)難度小但是程序執(zhí)行效率低,自動(dòng)化COM組件的函數(shù)調(diào)度機(jī)制可以很好的解決這種矛盾,該機(jī)制還可以廣泛地應(yīng)用于其它領(lǐng)域。
參考文獻(xiàn):
  [1] 李志剛.工控組態(tài)軟件及其在工業(yè)控制中的應(yīng)用[J].微機(jī)算計(jì)信息,1998;14(3)
  [2] 夏坤,張建國(guó),蔣洪. COM+及其在組態(tài)軟件中的應(yīng)用研究[J].計(jì)算機(jī)工程與應(yīng)用,2002,20.117-119
  [3] 王培進(jìn).面向?qū)ο蟮娜嵝栽O(shè)計(jì)與控制理論(I)[J].計(jì)算機(jī)工程與應(yīng)用,2001;36(16):17-19
  [4] 潘愛(ài)民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,1999.12
  [5] KennethCLouden.編譯原理與實(shí)踐[M].北京:機(jī)械工業(yè)出版社,1998.
  [6] 熊清平,張正勇,李作清.CNC系統(tǒng)巨量NC程序解釋實(shí)現(xiàn)的方法[J].中國(guó)機(jī)械工程,1999,10(6):673-675.
圖3 存儲(chǔ)空間關(guān)系圖(a)和運(yùn)行時(shí)存儲(chǔ)空間示意圖(b)[/align]
  3.4 中間代碼操作數(shù)的定義
  Child-C程序被編譯成中間代碼指令被解釋器執(zhí)行,如以下的Child-C語(yǔ)句執(zhí)行相加操作:
  int a,b,c; a=b+c;
  它被編譯為如下幾條中間代碼指令:
  LOD R0 Ox00000010 4; ①—— 加載變量a到寄存器R0,Ox00000010是變量a在運(yùn)行時(shí)堆存儲(chǔ)區(qū)內(nèi)的偏移地址,4表示加載的數(shù)據(jù)為4個(gè)字節(jié)
  LOD R1 Ox00000014 4; ②—— 加載變量b到寄存器R1
  ADD ③—— R1+R0->R2,三個(gè)寄存器的意義是固定的
  STR R2 Ox00000018 ④— 將寄存器R2的值保存到變量c中
  其中指令③的ADD指令是二元操作數(shù)指令,但是它的操作數(shù)固定為R0和R1寄存器,計(jì)算結(jié)果也固定放到R3中。
  3.5 字符串的兼容和特殊處理
  C語(yǔ)言中的字符串是通過(guò)字符數(shù)組進(jìn)行處理的,Child-C繼承了這種字符串處理方法。字符數(shù)組是長(zhǎng)度固定的字符串,而在使用Child-C與COM組件交互時(shí)經(jīng)常要處理COM標(biāo)準(zhǔn)的BSTR類(lèi)型變長(zhǎng)字符串,為了兼容該數(shù)據(jù)類(lèi)型,在Child-C中增加了bstr類(lèi)型的變長(zhǎng)字符串?dāng)?shù)據(jù)類(lèi)型。bstr由頭尾兩部分組成:頭部信息由head和len兩個(gè)32位無(wú)符號(hào)整形組成,頭部信息代表了字符串實(shí)體,它可以作為局部和全局變量存儲(chǔ),head是一個(gè)指針,它指向字符數(shù)據(jù)在全局堆中的首地址,len記錄了字符串的長(zhǎng)度。尾部信息保存在全局堆存儲(chǔ)區(qū)中,字符信息在該區(qū)中并不是連續(xù)的,這也適應(yīng)了字符串長(zhǎng)度變化的需要。bstr可以直接代替BSTR類(lèi)型,中間代碼指令集中有專(zhuān)門(mén)的轉(zhuǎn)換指令COMTOC和CTOCOM進(jìn)行數(shù)據(jù)轉(zhuǎn)換。當(dāng)需要將bstr轉(zhuǎn)換成BSTR時(shí),編譯器自動(dòng)添加COMTOC指令,該指令根據(jù)bstr的頭信息讀取字符數(shù)據(jù)組裝成BSTR數(shù)據(jù)提交給COM組件,而CTOCOM是一個(gè)逆過(guò)程。這兩條指令使用特設(shè)的第二組虛擬寄存器進(jìn)行轉(zhuǎn)換操作。
  3.6 COM組件的訪問(wèn)
  COM對(duì)象的訪問(wèn)需要進(jìn)行特殊處理,它是在解析運(yùn)行環(huán)境建立之前就已經(jīng)存在的。如圖3a所示,它存儲(chǔ)在組態(tài)軟件系統(tǒng)的存儲(chǔ)空間中,它不會(huì)隨著解釋運(yùn)行環(huán)境的消亡而消亡。而除此之外的數(shù)據(jù)都存儲(chǔ)在解釋器的存儲(chǔ)空間中,它們會(huì)隨著解釋運(yùn)行環(huán)境的消亡而消亡。為了便于編譯器和解釋器統(tǒng)一存儲(chǔ)空間的處理,需要將COM組件映像到解釋器存儲(chǔ)空間中,圖3b中的COM組件地址映射區(qū)就用來(lái)保存COM組件地址的映像。在編譯器和解釋器的運(yùn)行過(guò)程中,所有對(duì)COM組件的訪問(wèn)都被映射到該區(qū)域,從而避免了存儲(chǔ)空間的交叉訪問(wèn)。
  3.7 解釋器環(huán)境中對(duì)COM組件方法的調(diào)用
  COM組件的各種函數(shù)已經(jīng)被編譯成可被計(jì)算機(jī)直接執(zhí)行的機(jī)器代碼,自動(dòng)化COM對(duì)象允許使用IDispatch接口的統(tǒng)一調(diào)度函數(shù)Invoke()調(diào)用組件的函數(shù),被執(zhí)行的函數(shù)可以當(dāng)作一個(gè)字符串參數(shù)被傳送。因此在構(gòu)造的中間代碼指令集中有一條INVOKE指令,該指令格式為:INVOKE ComOffset FuncOffset ParaOffset;該指令有三個(gè)操作數(shù):ComOffset為要訪問(wèn)的COM組件在COM組件地址映射區(qū)的偏移,F(xiàn)uncOffset為被調(diào)用函數(shù)的名稱(chēng)bstr變量地址,ParaOffset是該函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)的存儲(chǔ)單元地址,該存儲(chǔ)區(qū)之后是一個(gè)4字節(jié)的單元,它用來(lái)保存Invoke()函數(shù)執(zhí)行的返回值。就是說(shuō),對(duì)COM組件的所有操作,解釋器只需通過(guò)執(zhí)行Invoke()函數(shù)就能完成。
4 事件體系的構(gòu)造
  Child-C函數(shù)是通過(guò)事件觸發(fā)而被調(diào)用的。事件包含兩種類(lèi)型,一種是組件運(yùn)行系統(tǒng)定義的事件,該類(lèi)型事件屬于整個(gè)系統(tǒng),它與具體組件無(wú)關(guān),但可以被COM組件和系統(tǒng)觸發(fā)。另一種是COM組件自定義的事件,該類(lèi)型事件屬于COM組件,它只能被組件自身觸發(fā)。事件發(fā)生時(shí)觸發(fā)解釋器解釋運(yùn)行事件的相應(yīng)函數(shù)。事件的處理工作全部交給事件槽來(lái)處理,事件槽實(shí)際上是一個(gè)可鏈接對(duì)象接收器[5],它可以接受系統(tǒng)和COM組件觸發(fā)的事件,同時(shí)它還維護(hù)了一張事件映射表,該表記錄了所有添加了響應(yīng)函數(shù)的事件和該事件響應(yīng)函數(shù)的入口地址以及有關(guān)參數(shù)信息。當(dāng)有事件到達(dá)時(shí),首先檢查事件映射表該事件是否有被注冊(cè),如果有則根據(jù)響應(yīng)函數(shù)的參數(shù)信息分配存儲(chǔ)空間并調(diào)用響應(yīng)函數(shù)。
5 結(jié)束語(yǔ)
  在實(shí)際的生產(chǎn)應(yīng)用中可以證明,Child-C完全可以勝任絕大部分流程控制的需要,提高了工控組態(tài)軟件的靈活性。解釋器環(huán)境開(kāi)發(fā)難度小但是程序執(zhí)行效率低,自動(dòng)化COM組件的函數(shù)調(diào)度機(jī)制可以很好的解決這種矛盾,該機(jī)制還可以廣泛地應(yīng)用于其它領(lǐng)域。
參考文獻(xiàn):
  [1] 李志剛.工控組態(tài)軟件及其在工業(yè)控制中的應(yīng)用[J].微機(jī)算計(jì)信息,1998;14(3)
  [2] 夏坤,張建國(guó),蔣洪. COM+及其在組態(tài)軟件中的應(yīng)用研究[J].計(jì)算機(jī)工程與應(yīng)用,2002,20.117-119
  [3] 王培進(jìn).面向?qū)ο蟮娜嵝栽O(shè)計(jì)與控制理論(I)[J].計(jì)算機(jī)工程與應(yīng)用,2001;36(16):17-19
  [4] 潘愛(ài)民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,1999.12
  [5] KennethCLouden.編譯原理與實(shí)踐[M].北京:機(jī)械工業(yè)出版社,1998.
  [6] 熊清平,張正勇,李作清.CNC系統(tǒng)巨量NC程序解釋實(shí)現(xiàn)的方法[J].中國(guó)機(jī)械工程,1999,10(6):673-675.
標(biāo)簽:
                                 
                            
傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來(lái)源:傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為傳動(dòng)網(wǎng)(www.cdcst56.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來(lái)源“傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來(lái)源的稿件,均來(lái)自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來(lái)源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>「頻」實(shí)力,新上市——富士電機(jī) FRENIC...
2025-09-08
華為昇騰Atlas800iA2 910B服務(wù)器Deepsee...
2025-09-04
2025-08-06
2025-07-08
推薦專(zhuān)題
更多>