发表于:2003-11-20 08:34:00
楼主
3.11 编制简单的设备驱动构件
本章以上各节所讲的是编制一个通用设备驱动构件的具体方法和技巧,看起来比较复杂和难懂,但在实际应用中,如果设备的功能和作用已经确定,而你的目标也只是完成具体的工程,那么,设备驱动构件的编制就要简单的多。下面以中泰PC6319模拟量输入板和研华的亚当模块ADAM4050为例,讲解如何编制特定功能的设备驱动构件。
中泰PC6319设备驱动构件
功能要求
假定只须使用中泰PC6319接口卡的10个通道,且接口卡的跳线设置为:单端输入、0~10V输入量程、数码转换方式为单极性,要求本设备构件能对10个通道的数据进行采集。
开发步骤
根据前面所述,利用MCGS的高级开发向导,生成一个独立设备驱动构件的源程序框架;假定工程名设为:My6319,类型名设为:我的6319;
把属性DevChannel中的值该为10;把接口GetChlType中的代码该为:
Dim i As Long
For i = 0 To 9
Dat(i) = 2
msg(i) = "AD输入"+format$(I+1,”0”)
Next i
参照中泰PC6319中给出的例程,在接口CollectDevDat中编制如下程序代码:
Dim i as Long, h as Long, l as Long
For i=0 to 9
Outp mHandle, DevBaseIO, i ‘设置AD通道
Outp mHandle, DevBaseIO+1, 0 ‘启动AD转换
Do ‘等待AD转换结束
If Inp(mHandle, DevBaseIO + 2) < 128 Then Exit Do
Loop
h = Inp(mHandle, DevBaseIO + 2) And &HF ‘读高4位
l = Inp(mHandle, DevBaseIO + 3) ‘读低8位
dd(i) =( h * 256 + l)*10000/4096 ‘转换为mV数
Next i
编译工程,得到DLL文件My6319.dll,把该文件拷贝到MCGS的program\drivers目录下,即可完成本设备构件的编程工作。
在MCGS组态环境中,按设备工具箱上的“设备管理”按钮,进入设备管理窗口,通过“浏览”按钮把新生成的设备驱动构件选取到设备工具箱中即可在MCGS中使用新设备。
研华ADAM4050设备驱动构件
功能要求
能随时读入7个开关量输入通道的状态和设置8个开关量输出通道的输出状态。
开发步骤
根据前面所述,利用MCGS的高级开发向导,生成一个通讯子设备驱动构件的源程序框架;假定工程名设为:My4050,类型名设为:我的4050
定义一个属性DevNumber,用来标识模块的地址号
Public DevNumber As Long
把属性DevChannel中的值该为15;
把接口GetChlType中的代码该为:
Dim i As Long
For i = 0 To 14
IF i<=6 then
Dat(i) = 1
msg(i) = "DI输入"+format$(i,”0”)
else
Dat(i) = -1
msg(i) = "DO输出"+format$(i-7,”0”)
endif
Next i
在接口CollectDevDat中编制如下程序代码:
On Error Resume Next
Dim flag As Long
flag = CollectOneComm(mParent, DevNumber, dat)
CollectDevDat = 0
If flag <> 0 Then CollectDevDat = -1
参照研华亚当模块的通讯协议,在程序模块DevBas中编制如下程序:
Option Explicit
Dim InputByte(127) As Byte
Dim OutPutByte(127) As Byte
通过串口采集ADAM模块数据。
Public Function CollectOneComm(comm As DevCom232, ByVal num As Long, dat As Variant) As Long
Dim Cmd As String, i As Long, m As Long
‘准备输出数据
m = 0
For i = 7 To 14
m = m Or (dat(i) * 2 ^ (i - 7))
Next i
‘准备输出命令字符串
Cmd = "#" + Right(("00" + Hex$(num)), 2) + "00"
Cmd = Cmd + Right(("00" + Hex$(m)), 2) + Chr$(13)
‘和模块进行通讯,向模块写输出通道状态
m = Write4050Data(Cmd, comm)
If m = -1 Then CollectOneComm = -1: Exit Function
‘准备读取通道状态命令字符串
Cmd = "$" + Right(("00" + Hex$(num)), 2) + "6" + Chr$(13)
‘和模块进行通讯,读取输入通道状态
m = Read4050Data(Cmd, comm)
If m = -1 Then CollectOneComm = -1: Exit Function
‘进行数据转换
For i = 0 To 6
dat(i) = Sgn(2 ^ i And m)
Next i
CollectOneComm = 0
End Function
通过调用串口父设备的ComOutDat和ComInDat两个函数实现从ADAM模块读数据。
Public Function Read4050Data(ByVal Cmd As String, comm As DevCom232) As Long
On Error Resume Next
Dim i As Long, iLen As Long
‘把命令字符串转换成字节数组
For i = 1 To Len(Cmd)
OutPutByte(i - 1) = Asc(Mid$(Cmd, i, 1))
Next i
‘通过串行口父设备,给模块发指令
comm.ComOutDat Len(Cmd), OutPutByte()
‘等待模块返回信息
iLen = comm.ComInDat(InputByte(), 0, 0, 13, 1500)
If iLen <= 0 Then Read4050Data = -1: Exit Function
‘把字节数组转换成字符串
Cmd = ""
For i = 0 To iLen
Cmd = Cmd + Chr$(InputByte(i))
Next i
‘判断返回结果是否正确
If Mid$(Cmd, 1, 1) <> "!" Then Read4050Data = -1: Exit Function
‘转换读取的数据值
Read4050Data = Val("&h" + Mid(Cmd, 4, 2))
End Function
通过调用串口父设备的ComOutDat和ComInDat两个函数实现向ADAM模块输出数据。
Public Function Write4050Data(ByVal Cmd As String, comm As DevCom232) As Long
On Error Resume Next
Dim i As Long, iLen As Long
‘把命令字符串转换成字节数组
For i = 1 To Len(Cmd)
OutPutByte(i - 1) = Asc(Mid$(Cmd, i, 1))
Next i
‘通过串行口父设备,给模块发指令
comm.ComOutDat Len(Cmd), OutPutByte()
‘等待模块返回信息
iLen = comm.ComInDat(InputByte(), 0, 0, 13, 1500)
‘判断返回结果是否正确
If iLen <= 0 Then Write4050Data = -1: Exit Function
If Chr$(InputByte(0)) <> ">" Then Write4050Data = -1: Exit Function
Write4050Data = 0
End Function
编译工程,得到DLL文件My4050.dll,把该文件拷贝到MCGS的program\drivers目录下,即可完成本设备构件的编程工作。