发表于:2002-03-27 18:25:00
楼主
第三章 开发MCGS设备驱动
虽然MCGS提供了大多数常用设备的驱动程序,但在实际应用中,或因为所用设备的特殊性、或因为实际工程的需要,MCGS所提供的设备驱动程序总会有些不尽人意。为解决这些问题,MCGS提供了一套规范的设备驱动程序接口,允许用户根据自己的需要来定制设备驱动程序。
在学习完本章之前,你可能会觉得开发设备驱动程序是件难事,而编制能在Win95和WinNT下能同时运行的设备驱动程序更是不可思议。MCGS设备驱动的开发既不需用复杂的汇编语言,也不需用难懂的C语言,而只须使用简单易用、大多数工程人员都会使用的Visual Basic。MCGS把和操作系统底层打交道的内容全部包装起来,以函数调用的方式提供给你,同时,MCGS的高级开发向导能为你自动生成设备驱动程序的框架,MCGS大多数设备驱动程序的源程序代码也都随系统提供给你。只要你会VB,熟悉你所使用的硬件设备,你就完全可以按照你自己的需要来开发定制你自己的设备驱动程序。
本章下面各节将详细介绍开发设备驱动程序的方法和步骤,请在开始之前,先安装Visual Basic6.0(中文专业版或企业版),然后安装MCGS高级开发工具包,建议你按下面各节介绍的方法和步骤来一步一步地学习开发设备驱动程序。
3.1 设备驱动构件的实现方法
MCGS用Active DLL构件的方式来实现设备驱动程序,通过规范的OLE接口挂接到MCGS中,使其构成一个整体,所以MCGS把设备驱动程序叫做设备驱动构件。由于设备驱动构件和MCGS运行在同一个进程内,故设备构件的运行速度快,可靠性高,不存在传统DDE方式连接设备驱动时的数据流通不畅和数据传输速度慢等问题。同时,OLE是一个可扩充的开放标准,用于实现不同软件之间的相互操作,而不管软件本身是使用什么编程语言。因此,只要遵守MCGS的接口规范,可以使用VB、VC、Delphi等语言来编制MCGS的设备驱动程序。鉴于Visual Basic通用性和简单性,建议使用VB来开发MCGS的设备驱动程序,本书也只讲解使用VB进行开发的技术问题。由于VB6.0以上版本是以二进制码来编译执行程序,其运行速度已接近或超过VC,完全能满足设备驱动构件所需的速度要求。
MCGS把实际外部设备分为独立的设备、父设备和子设备三类,独立的设备是可独立工作、完成特定数据输入输出功能的设备,如用于模拟量输入输出、数字量输入输出的PC接口卡等;父设备是本身不直接处理数据输入输出,但起到管理其它设备工作的设备,如串行口设备、IDCN-893的通讯卡等;子设备是本身具有处理数据输入输出的功能,但只有和对应的父设备一起才构成完整工作系统的设备:如PLC设备、带智能通讯功能的仪器仪表等;不同类型的设备的工作方式有所不同,其对应的设备驱动程序的处理方法也有所不同。本章只重点介绍独立设备(PC接口卡)和通讯类子设备设备驱动程序的开发,如需要进行父设备和其它类型子设备的设备驱动程序的开发,请和MCGS开发小组联系。
3.2 设备驱动构件接口规范
MCGS设备构件的实现方法和原理与标准VB的ActiveDLL完全一致,但MCGS规定了一套接口规范,只有遵守这些接口规范的ActiveDLL才能用作MCGS的设备驱动构件。MCGS设备驱动构件必须具有如下5个属性和8个方法:
属性:DevType 标识设备的类型
属性:DevStyle 标识设备的类别
属性:DevChannel 标识设备的通道个数
属性:DevBaseIO 标识设备所用IO的基地址
属性:DevIONumber 标识设备所用IO地址的个数
方法:GetDevName 读取设备构件类型名称
方法:GetDevHelp 调用设备构件的在线帮助内容
方法:SetDevPage 调用设备的内部属性页
方法:InitNewDev 初试化设备的初试值
方法:GetChlType 读取设备构件各通道的数据类型和注释
方法:InitDevRun 运行时对设备进行初试化工作
方法:RunDevCommand 执行指定的设备命令
方法:CollectDevDat 定时操作设备,采集或输出数据
开发MCGS设备驱动的过程,实际上就是根据设备的特性和含义来完成8个方法功能的编程过程。下面详细讲述各个接口的含义和用法:
属性接口:DevType
接口作用:本接口用于Mcgs确定设备构件的类型。对独立的设备构件固定为0;对通讯子设备,固定为1。本属性为只读属性。
语法形式:Public Property Get DevType() As Long
属性接口:DevStyle
接口作用:本接口用于Mcgs确定设备构件的类别。对独立的设备构件固定为0;对通讯子设备,固定为1。本属性为只读属性。
语法形式:Public Property Get DevStyle() As Long
属性接口:DevChannel
接口作用:本接口用于Mcgs确定设备构件通道个数。一般把本属性设置为只读属性。
语法形式:Public Property Get DevChannel() As Long
属性接口:DevIONumber
接口作用:本接口用于Mcgs确定设备构件所用IO地址的个数。本属性为只读属性
语法形式:Public Property Get DevIONumber() As Long
属性接口:DevBaseIO
接口作用:本接口用于Mcgs确定设备构件所用IO基地址。本属性为读写属性,在设备属性页中以16进制数表示
语法形式:Public DevBaseIO As Long或Public Property Get DevBaseIO() As Long
注意:对不占用IO地址的设备,把本属性设置为只读属性,且属性值为0。
方法接口:GetDevName
接口作用:本接口在组态环境装载时被MCGS组态环境调用,返回设备构件对应的设备类型名称,比如“Omron 200 PLC”等。MCGS组态软件将把这个名称显示在设备工具框中。对于不同的设备,应该返回不同的设备类型名称。
语法形式:GetDevName() as string
返 回 值:设备类型名称。
参数说明:无。
方法接口:InitNewDev
接口作用:当用户在组态环境的设备组态新增加一个设备时调用本接口,用于初始化新设备的缺省参数值。
语法形式:InitNewDev(SavObj As Object) as Long
返 回 值:=0:设备初始化成功,<>0:设备初始化失败。
参数说明:SavObj ,存盘服务对象,接口程序中通过该对象来保存和读取数据。
方法接口:SetDevPage
接口作用:本接口在组态环境中当用户要修改设备的内部属性时被调用,他将打开设置设备构件内部属性的对话框,并设置设备构件的属性。
语法形式:SetDevPage(SavObj as Object) as Long
返 回 值:=0:属性设置有效,要保存,=1:属性设置无效,不保存。
参数说明:SavObj ,存盘服务对象,接口程序中通过该对象来保存和读取数据。
方法接口:GetChlType
接口作用:本接口在组态环境中调用,读取设备通道的数据类型及通道内容说明当用户要修改设备的内部属性时被调用,他将打开设置设备构件内部属性的对话框,并设置设备构件的属性。
语法形式:GetChlType(Dat As Variant, msg As Variant) As Long
返 回 值:=0:设备通道有效,=1:设备通道无效。
参数说明:Dat ,长整型数组,标识设备各通道的数据类型和输入输出类型。=1开关型;=2数值型;=3字符型;大于0表示把设备通道的数据采集到MCGS中,小于0表示把MCGS中的数据输出到设备构件中;
msg,字符型数组,标识各设备通道内容注释。
方法接口:InitDevRun
接口作用:本接口在MCGS运行环境启动设备构件开始采集之前被调用一次,用于对设备硬件进行初始化工作。
语法形式:InitDevRun(SavObj As Object, DatObj As Object) as long
返 回 值:=0:设备工作正常, =1:设备工作不正常,MCGS运行环境将弹出对话框,提示用户设备出错。
参数说明:SavObj ,存盘服务对象,接口程序中通过该对象来保存和读取数据。
DataObj,实时数据库对象,接口程序中通过该对象来操作实时数据库对象的属性和方法。
方法接口:CollectDevDat
接口作用:本接口由MCGS运行环境在每一次设备采集中调用,运行时,按设定的时间周期定时调用本方法采集数据,并送入实时数据库,或把实时数据库中的数据送进来,供设备驱动构件处理。
语法形式:CollectDevDat(DatF As Variant, Dat As Variant, msg As Variant) as long
返 回 值:= -1:设备故障;
=0:采集数据有效,但只对返回的输入数据进行处理;
=1:采集数据有效,但对返回的输入输出数据都进行处理;
=2:采集数据无效,不须进行处理。
参数说明:DatF, 长整型数组, 标明对应设备通道有效,=0无效,=1有效;
Dat, 浮点数组, 存放设备通道的数值型或开关型数据;
Msg, 字符数组, 存放设备通道的字符型或事件型数据。
方法接口:RunDevCom