發(fā)表于:2002/2/8 22:55:00
#0樓
用VB開(kāi)發(fā)工業(yè)控制程序的幾個(gè)問(wèn)題
李光明 熊兵 周曉明
隨著新的軟件開(kāi)發(fā)工具的不斷涌現(xiàn),應(yīng)用軟件設(shè)計(jì)人員面臨的可使用的工具越來(lái)越多,令人眼花眼花繚亂,其中,Visual Basic是最為人們所容易接受的軟件開(kāi)發(fā)工具之一。但是大多數(shù)使用VB進(jìn)行軟件應(yīng)用程序開(kāi)發(fā)的人員都認(rèn)為,VB不能進(jìn)行工業(yè)控制程序的開(kāi)發(fā)。其實(shí)不然,我們?cè)啻问褂肰B成功地實(shí)現(xiàn)了工業(yè)控制程序的開(kāi)發(fā),所開(kāi)發(fā)出的產(chǎn)品業(yè)已投入實(shí)際使用。下面就其開(kāi)發(fā)過(guò)程中的經(jīng)驗(yàn)介紹給大家。
平臺(tái)的選擇
使用VB開(kāi)發(fā)工業(yè)控制程序,首先面臨的一個(gè)問(wèn)題是平臺(tái)的選擇。目前,一般應(yīng)用軟件的開(kāi)發(fā)大多數(shù)都是在Windows 9x平臺(tái)上進(jìn)行的。但是,我們認(rèn)為在選擇平臺(tái)時(shí),應(yīng)考慮到客觀實(shí)際情況來(lái)決定。如果我們的用戶是一般的操作工人,并且在微機(jī)主板上安裝了我們自己開(kāi)發(fā)的控制硬件板(如I/O板等),那么其平臺(tái)應(yīng)選擇Windows 3.x。因?yàn)橐话愕牟僮鞴と私佑|計(jì)算機(jī)較少,那么對(duì)于操作,而且在實(shí)際使用過(guò)程中,一般都可能會(huì)出現(xiàn)緊急事件或突然停電而非正常關(guān)機(jī),此后再啟動(dòng)時(shí),Windows 9x將首先執(zhí)行Scandisk.exe程序,或由此破壞了Windows 9x的注冊(cè)表,這將造成操作工人不知所措;如果在微機(jī)主板上安裝了我們自己開(kāi)發(fā)的控制硬件板,那么Windows 9x還將要求安裝其驅(qū)動(dòng)程序,綜合這些因素,我們建議使用Windows 3.x。否則,我們可以選擇Windows 9x。我們?cè)陂_(kāi)發(fā)“盆腔治療儀”時(shí),考慮到用戶為醫(yī)護(hù)人員,并且通過(guò)平行口進(jìn)行I/O控制,因此我們選擇了Windows 95;而在開(kāi)發(fā)用于自動(dòng)粘貼防偽標(biāo)志的“復(fù)卷貼標(biāo)機(jī)”時(shí),其用戶系工廠工人,并且在工控機(jī)的主板插槽上我們安裝了自行開(kāi)發(fā)的I/O控制板,為此我們選擇了Windows 32。根據(jù)實(shí)際使用情況看,我們的考慮、選擇是正確的。
編寫(xiě)并生成對(duì)端口操作的動(dòng)態(tài)鏈接庫(kù)
動(dòng)態(tài)連接庫(kù)是Windows應(yīng)用程序共享資源、節(jié)省內(nèi)存空間、提高使用效率的一個(gè)重要技術(shù)手段。動(dòng)態(tài)連接庫(kù)是包含數(shù)據(jù)和函數(shù)的模塊,可以被Windows的其他可執(zhí)行文件調(diào)用。它包含輸出函數(shù)和內(nèi)部函數(shù)兩種函數(shù)。輸出函數(shù)可以被其他模塊所調(diào)用,而內(nèi)部函數(shù)則只能在動(dòng)態(tài)連接庫(kù)內(nèi)部使用。一般,動(dòng)態(tài)連接庫(kù)以DLL作為其文件擴(kuò)展名。
當(dāng)前,可用于編寫(xiě)動(dòng)態(tài)連接庫(kù)的工具很多,如Turbo PASCAL for Windows、Delphi、Borland C++、Visual C++等等。下面介紹我們使用Turbo PASCAL for Windows Version 1.5所編寫(xiě)的一個(gè)動(dòng)態(tài)連接庫(kù),其功能是實(shí)現(xiàn)對(duì)端口的I/O操作。
啟動(dòng)PASCAL for Windows后,在程序編輯窗口中輸入如下程序MYDLL.PAS:
Library IOLIB; {庫(kù)名為IOLIB,將編譯生成MYDLL.DLL}
function read_port(port_address:integer):integer;export;
{函數(shù)被說(shuō)明為export,port_address為端口地址}
Begin
read_port:=port[port_address]; {使用預(yù)定義數(shù)組讀端口數(shù)據(jù)}
End;
procedure write_port(port_address,write_value:integer);export;
{過(guò)程被說(shuō)明為export,port_address為端口地址,write_value為輸出值}
Begin
port[port_address]:=write_value; {使用預(yù)定義數(shù)組向端口寫(xiě)入數(shù)據(jù)write_value}
End;
Exports {Exports語(yǔ)句}
read_port index 1, {定義read_port的索引號(hào)為1}
write_port index 2; {定義write_port的索引號(hào)為2}
Begin {初始化部分,本部分為空}
End.
在其菜單欄中選擇Compile/Make(或Build),即可生成動(dòng)態(tài)連接庫(kù)MYDLL.DLL。
在VB中調(diào)用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)端口的I/O操作
生成動(dòng)態(tài)連接庫(kù)MYDLL.DLL后,這樣就可以在VB程序中調(diào)用該動(dòng)態(tài)連接庫(kù)了。具體調(diào)用方法是:
⒈將該動(dòng)態(tài)連接庫(kù)拷貝到windows\system目錄下;
⒉在VB程序中創(chuàng)建模塊(Module1),并在通用聲明(General_Declarations)中用下列語(yǔ)句說(shuō)明該動(dòng)態(tài)連接庫(kù):
Declare Function read_port% Lib "MYDLL.DLL" (ByVal port_address As Integer)
Declare Sub write_port Lib "MYDLL.DLL" (ByVal port_address As Integer, ByVal write_value As Integer)
⒊在需要對(duì)端口進(jìn)行I/O操作的事件中,如同調(diào)用VB的標(biāo)準(zhǔn)函數(shù)一樣調(diào)用該動(dòng)態(tài)連接庫(kù)實(shí)現(xiàn)對(duì)端口的輸入輸出操作。如:
Private Sub Command1_Click()
‘若單擊命令按鈕Command1,則從端口378H輸出02H
write_port &H378,&H2
End Sub
Private Sub Command2_Click()
‘若單擊命令按鈕Command2,則讀端口330H
Dim Port_Value As Byte
Port_Value=read_port(&H330)
End Sub
控制程序中的幾個(gè)特點(diǎn)
⒈啟動(dòng)Windows時(shí)啟動(dòng)控制程序
為了在啟動(dòng)Windows時(shí)自動(dòng)啟動(dòng)控制程序,我們可以將控制程序放到Windows 3.x的“啟動(dòng)”程序組中或Windows 9x的“啟動(dòng)”菜單中;或者在autoexec.bat中的合適位置加入如下命令:
win 控制程序的文件名
⒉取消標(biāo)題欄
為了防止控制程序被用戶多次加載,因此應(yīng)使每個(gè)窗體均為最大化,并取消最大化、最小化和控制按鈕,取消窗體的標(biāo)題欄,即如下設(shè)置窗體的四個(gè)屬性:
WindowState=2 (即Maximized)
MaxButton=False
MinButton=False
ControlBox=False
Caption=””
⒊熱鍵問(wèn)題
為了使功能鍵F1~F10及光標(biāo)移動(dòng)鍵(←、→、↑、↓)等實(shí)現(xiàn)DOS環(huán)境下的熱鍵功能,應(yīng)使用對(duì)象的KeyUp或KeyDown事件,對(duì)所鍵入鍵的KeyCode進(jìn)行判別,而不要使用KeyPress事件中KeyAscii進(jìn)行判別。因?yàn)镵eyPress事件中KeyAscii并不能給出這些鍵的值。
【作者】
李光明 空軍雷達(dá)學(xué)院計(jì)算機(jī)教研室講師 讀者登記號(hào): 07876
熊 兵 空軍雷達(dá)學(xué)院自控設(shè)備研究所
周曉明 空軍雷達(dá)學(xué)院計(jì)算機(jī)教研室講師
E-mail地址:liguangming@126.com
郵政編碼:430010
李光明 熊兵 周曉明
隨著新的軟件開(kāi)發(fā)工具的不斷涌現(xiàn),應(yīng)用軟件設(shè)計(jì)人員面臨的可使用的工具越來(lái)越多,令人眼花眼花繚亂,其中,Visual Basic是最為人們所容易接受的軟件開(kāi)發(fā)工具之一。但是大多數(shù)使用VB進(jìn)行軟件應(yīng)用程序開(kāi)發(fā)的人員都認(rèn)為,VB不能進(jìn)行工業(yè)控制程序的開(kāi)發(fā)。其實(shí)不然,我們?cè)啻问褂肰B成功地實(shí)現(xiàn)了工業(yè)控制程序的開(kāi)發(fā),所開(kāi)發(fā)出的產(chǎn)品業(yè)已投入實(shí)際使用。下面就其開(kāi)發(fā)過(guò)程中的經(jīng)驗(yàn)介紹給大家。
平臺(tái)的選擇
使用VB開(kāi)發(fā)工業(yè)控制程序,首先面臨的一個(gè)問(wèn)題是平臺(tái)的選擇。目前,一般應(yīng)用軟件的開(kāi)發(fā)大多數(shù)都是在Windows 9x平臺(tái)上進(jìn)行的。但是,我們認(rèn)為在選擇平臺(tái)時(shí),應(yīng)考慮到客觀實(shí)際情況來(lái)決定。如果我們的用戶是一般的操作工人,并且在微機(jī)主板上安裝了我們自己開(kāi)發(fā)的控制硬件板(如I/O板等),那么其平臺(tái)應(yīng)選擇Windows 3.x。因?yàn)橐话愕牟僮鞴と私佑|計(jì)算機(jī)較少,那么對(duì)于操作,而且在實(shí)際使用過(guò)程中,一般都可能會(huì)出現(xiàn)緊急事件或突然停電而非正常關(guān)機(jī),此后再啟動(dòng)時(shí),Windows 9x將首先執(zhí)行Scandisk.exe程序,或由此破壞了Windows 9x的注冊(cè)表,這將造成操作工人不知所措;如果在微機(jī)主板上安裝了我們自己開(kāi)發(fā)的控制硬件板,那么Windows 9x還將要求安裝其驅(qū)動(dòng)程序,綜合這些因素,我們建議使用Windows 3.x。否則,我們可以選擇Windows 9x。我們?cè)陂_(kāi)發(fā)“盆腔治療儀”時(shí),考慮到用戶為醫(yī)護(hù)人員,并且通過(guò)平行口進(jìn)行I/O控制,因此我們選擇了Windows 95;而在開(kāi)發(fā)用于自動(dòng)粘貼防偽標(biāo)志的“復(fù)卷貼標(biāo)機(jī)”時(shí),其用戶系工廠工人,并且在工控機(jī)的主板插槽上我們安裝了自行開(kāi)發(fā)的I/O控制板,為此我們選擇了Windows 32。根據(jù)實(shí)際使用情況看,我們的考慮、選擇是正確的。
編寫(xiě)并生成對(duì)端口操作的動(dòng)態(tài)鏈接庫(kù)
動(dòng)態(tài)連接庫(kù)是Windows應(yīng)用程序共享資源、節(jié)省內(nèi)存空間、提高使用效率的一個(gè)重要技術(shù)手段。動(dòng)態(tài)連接庫(kù)是包含數(shù)據(jù)和函數(shù)的模塊,可以被Windows的其他可執(zhí)行文件調(diào)用。它包含輸出函數(shù)和內(nèi)部函數(shù)兩種函數(shù)。輸出函數(shù)可以被其他模塊所調(diào)用,而內(nèi)部函數(shù)則只能在動(dòng)態(tài)連接庫(kù)內(nèi)部使用。一般,動(dòng)態(tài)連接庫(kù)以DLL作為其文件擴(kuò)展名。
當(dāng)前,可用于編寫(xiě)動(dòng)態(tài)連接庫(kù)的工具很多,如Turbo PASCAL for Windows、Delphi、Borland C++、Visual C++等等。下面介紹我們使用Turbo PASCAL for Windows Version 1.5所編寫(xiě)的一個(gè)動(dòng)態(tài)連接庫(kù),其功能是實(shí)現(xiàn)對(duì)端口的I/O操作。
啟動(dòng)PASCAL for Windows后,在程序編輯窗口中輸入如下程序MYDLL.PAS:
Library IOLIB; {庫(kù)名為IOLIB,將編譯生成MYDLL.DLL}
function read_port(port_address:integer):integer;export;
{函數(shù)被說(shuō)明為export,port_address為端口地址}
Begin
read_port:=port[port_address]; {使用預(yù)定義數(shù)組讀端口數(shù)據(jù)}
End;
procedure write_port(port_address,write_value:integer);export;
{過(guò)程被說(shuō)明為export,port_address為端口地址,write_value為輸出值}
Begin
port[port_address]:=write_value; {使用預(yù)定義數(shù)組向端口寫(xiě)入數(shù)據(jù)write_value}
End;
Exports {Exports語(yǔ)句}
read_port index 1, {定義read_port的索引號(hào)為1}
write_port index 2; {定義write_port的索引號(hào)為2}
Begin {初始化部分,本部分為空}
End.
在其菜單欄中選擇Compile/Make(或Build),即可生成動(dòng)態(tài)連接庫(kù)MYDLL.DLL。
在VB中調(diào)用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)端口的I/O操作
生成動(dòng)態(tài)連接庫(kù)MYDLL.DLL后,這樣就可以在VB程序中調(diào)用該動(dòng)態(tài)連接庫(kù)了。具體調(diào)用方法是:
⒈將該動(dòng)態(tài)連接庫(kù)拷貝到windows\system目錄下;
⒉在VB程序中創(chuàng)建模塊(Module1),并在通用聲明(General_Declarations)中用下列語(yǔ)句說(shuō)明該動(dòng)態(tài)連接庫(kù):
Declare Function read_port% Lib "MYDLL.DLL" (ByVal port_address As Integer)
Declare Sub write_port Lib "MYDLL.DLL" (ByVal port_address As Integer, ByVal write_value As Integer)
⒊在需要對(duì)端口進(jìn)行I/O操作的事件中,如同調(diào)用VB的標(biāo)準(zhǔn)函數(shù)一樣調(diào)用該動(dòng)態(tài)連接庫(kù)實(shí)現(xiàn)對(duì)端口的輸入輸出操作。如:
Private Sub Command1_Click()
‘若單擊命令按鈕Command1,則從端口378H輸出02H
write_port &H378,&H2
End Sub
Private Sub Command2_Click()
‘若單擊命令按鈕Command2,則讀端口330H
Dim Port_Value As Byte
Port_Value=read_port(&H330)
End Sub
控制程序中的幾個(gè)特點(diǎn)
⒈啟動(dòng)Windows時(shí)啟動(dòng)控制程序
為了在啟動(dòng)Windows時(shí)自動(dòng)啟動(dòng)控制程序,我們可以將控制程序放到Windows 3.x的“啟動(dòng)”程序組中或Windows 9x的“啟動(dòng)”菜單中;或者在autoexec.bat中的合適位置加入如下命令:
win 控制程序的文件名
⒉取消標(biāo)題欄
為了防止控制程序被用戶多次加載,因此應(yīng)使每個(gè)窗體均為最大化,并取消最大化、最小化和控制按鈕,取消窗體的標(biāo)題欄,即如下設(shè)置窗體的四個(gè)屬性:
WindowState=2 (即Maximized)
MaxButton=False
MinButton=False
ControlBox=False
Caption=””
⒊熱鍵問(wèn)題
為了使功能鍵F1~F10及光標(biāo)移動(dòng)鍵(←、→、↑、↓)等實(shí)現(xiàn)DOS環(huán)境下的熱鍵功能,應(yīng)使用對(duì)象的KeyUp或KeyDown事件,對(duì)所鍵入鍵的KeyCode進(jìn)行判別,而不要使用KeyPress事件中KeyAscii進(jìn)行判別。因?yàn)镵eyPress事件中KeyAscii并不能給出這些鍵的值。
【作者】
李光明 空軍雷達(dá)學(xué)院計(jì)算機(jī)教研室講師 讀者登記號(hào): 07876
熊 兵 空軍雷達(dá)學(xué)院自控設(shè)備研究所
周曉明 空軍雷達(dá)學(xué)院計(jì)算機(jī)教研室講師
E-mail地址:liguangming@126.com
郵政編碼:430010