用VB开发工业控制程序的几个问题
李光明 熊兵 周晓明
随着新的软件开发工具的不断涌现,应用软件设计人员面临的可使用的工具越来越多,令人眼花眼花缭乱,其中,Visual Basic是最为人们所容易接受的软件开发工具之一。但是大多数使用VB进行软件应用程序开发的人员都认为,VB不能进行工业控制程序的开发。其实不然,我们曾多次使用VB成功地实现了工业控制程序的开发,所开发出的产品业已投入实际使用。下面就其开发过程中的经验介绍给大家。
平台的选择
使用VB开发工业控制程序,首先面临的一个问题是平台的选择。目前,一般应用软件的开发大多数都是在Windows 9x平台上进行的。但是,我们认为在选择平台时,应考虑到客观实际情况来决定。如果我们的用户是一般的操作工人,并且在微机主板上安装了我们自己开发的控制硬件板(如I/O板等),那么其平台应选择Windows 3.x。因为一般的操作工人接触计算机较少,那么对于操作,而且在实际使用过程中,一般都可能会出现紧急事件或突然停电而非正常关机,此后再启动时,Windows 9x将首先执行Scandisk.exe程序,或由此破坏了Windows 9x的注册表,这将造成操作工人不知所措;如果在微机主板上安装了我们自己开发的控制硬件板,那么Windows 9x还将要求安装其驱动程序,综合这些因素,我们建议使用Windows 3.x。否则,我们可以选择Windows 9x。我们在开发“盆腔治疗仪”时,考虑到用户为医护人员,并且通过平行口进行I/O控制,因此我们选择了Windows 95;而在开发用于自动粘贴防伪标志的“复卷贴标机”时,其用户系工厂工人,并且在工控机的主板插槽上我们安装了自行开发的I/O控制板,为此我们选择了Windows 32。根据实际使用情况看,我们的考虑、选择是正确的。
编写并生成对端口操作的动态链接库
动态连接库是Windows应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。动态连接库是包含数据和函数的模块,可以被Windows的其他可执行文件调用。它包含输出函数和内部函数两种函数。输出函数可以被其他模块所调用,而内部函数则只能在动态连接库内部使用。一般,动态连接库以DLL作为其文件扩展名。
当前,可用于编写动态连接库的工具很多,如Turbo PASCAL for Windows、Delphi、Borland C++、Visual C++等等。下面介绍我们使用Turbo PASCAL for Windows Version 1.5所编写的一个动态连接库,其功能是实现对端口的I/O操作。
启动PASCAL for Windows后,在程序编辑窗口中输入如下程序MYDLL.PAS:
Library IOLIB; {库名为IOLIB,将编译生成MYDLL.DLL}
function read_port(port_address:integer):integer;export;
{函数被说明为export,port_address为端口地址}
Begin
read_port:=port[port_address]; {使用预定义数组读端口数据}
End;
procedure write_port(port_address,write_value:integer);export;
{过程被说明为export,port_address为端口地址,write_value为输出值}
Begin
port[port_address]:=write_value; {使用预定义数组向端口写入数据write_value}
End;
Exports {Exports语句}
read_port index 1, {定义read_port的索引号为1}
write_port index 2; {定义write_port的索引号为2}
Begin {初始化部分,本部分为空}
End.
在其菜单栏中选择Compile/Make(或Build),即可生成动态连接库MYDLL.DLL。
在VB中调用动态链接库实现端口的I/O操作
生成动态连接库MYDLL.DLL后,这样就可以在VB程序中调用该动态连接库了。具体调用方法是:
⒈将该动态连接库拷贝到windows\system目录下;
⒉在VB程序中创建模块(Module1),并在通用声明(General_Declarations)中用下列语句说明该动态连接库:
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)
⒊在需要对端口进行I/O操作的事件中,如同调用VB的标准函数一样调用该动态连接库实现对端口的输入输出操作。如:
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
控制程序中的几个特点
⒈启动Windows时启动控制程序
为了在启动Windows时自动启动控制程序,我们可以将控制程序放到Windows 3.x的“启动”程序组中或Windows 9x的“启动”菜单中;或者在autoexec.bat中的合适位置加入如下命令:
win 控制程序的文件名
⒉取消标题栏
为了防止控制程序被用户多次加载,因此应使每个窗体均为最大化,并取消最大化、最小化和控制按钮,取消窗体的标题栏,即如下设置窗体的四个属性:
WindowState=2 (即Maximized)
MaxButton=False
MinButton=False
ControlBox=False
Caption=””
⒊热键问题
为了使功能键F1~F10及光标移动键(←、→、↑、↓)等实现DOS环境下的热键功能,应使用对象的KeyUp或KeyDown事件,对所键入键的KeyCode进行判别,而不要使用KeyPress事件中KeyAscii进行判别。因为KeyPress事件中KeyAscii并不能给出这些键的值。