发表时间: 2022-02-27 16:23:51
作者: 北京科瑞兴业科技有限公司
浏览:
下载资料中提供了两个分别在VB和VC下开发的示例程序,给出了板卡的相关参数的设置过程和数据处理方法及板卡的工作过程和顺序,包括卡的打开与关闭。用户可以参照相应VB或VC程序段根据实际需要利用函数库中提供的函数设计自己的软件,初次使用动态链接库的用户,还可以在程序中找到动态链接库的调用方法。为方便用户分析示例程序以工程的形式提供了所有的资源和代码。
一. D/I,D/O过程流程图
图1 DI/DO 过程流程
二. 编程示例:
1. VB 编程示例请参照“VB”下的程序。
2. VC 编程示例请参照“VC”下的程序。
3. 测试程序说明:
步骤1:运行KPCI847H.EXE程序进行测试,界面如下图所示。
步骤2:如果计算机中只有1块KPCI847H卡,设备号为“0”,无须修改。
步骤3:按“打开设备”按钮,若打开设备成功,“输入测试”、“输出测试”、“关闭设备”按钮变亮,否则提示错误信息。
步骤4:按“输入测试”按钮,可完成16路开关量输入测试。
步骤5:按“输出测试”按钮,可完成16路开关量输出测试。
步骤6:测试完成后,按“关闭设备”按钮,再按“退出”按钮,即可退出测试程序。
三. KPCI800.dll 库函数说明
以下介绍 KPCI800.dll 所包含的全部函数应用方法,用户可以具体根据所选用的板卡使用 其中的一些函数。函数中的参数设置要参考具体的板卡说明来设置。
1、 打开指定设备函数(适用 KPCI840、843、844、845、846、847、848)
Visual C++ & C++Builder:
BOOL WINAPI OpenmDevice(ULONG iIndex,ULONG boardtype)
Visual Basic:
Declare Function OpenDevice Lib "kpci800.dll" (ByVal iIndex As Long,ByVal boardtype) As Boolean
功能: 该函数负责打开指定板卡型号的设备对象
参数: iIndex 指定KPCI板卡的设备序号,0对应第一个设备
boardtype 指定KPCI板卡的型号,这里只能是840、843、844、845、846、847、848。
返回值:“1”表示成功,“0”代表失败。
注意:设备序号 兼容机是靠近CPU的PCI插槽号为小序号(从0开始),
工控机则相反,远离CPU的PCI插槽号为小序号(从0开始)。
注意:此函数是专门为带有开关量输出板卡编制的函数,当用户需要改变开关量输出的某一个通道的状态,而不影响其他通道时,必须用此函数打开设备。此函数与下面函数配合使用。
2、 改变开关量某一个通道的输出状态(适用 KPCI840、843、844、845、846、847、848)
Visual C++ & C++Builder:
VOID WINAPI DoutBit(ULONG iIndex,UCHAR channel,UCHAR ibit)
Visual Basic:
Declare Sub DoutBit Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal channel As Byte,
ByVal ibit As Byte)
功能: 该函数向开关量输出指定通道输出一个状态
参数: iIndex 与OpenmDevice中的相同
channel 为开关量输出通道号
KPCI840、KPCI847H的取值范围是1~16
KPCI843、KPCI845的取值范围是1~32
KPCI844的取值范围是1~24
KPCI846的取值范围是1~64
KPCI847、KPCI848的取值范围是1~8
ibit 为输出的状态,只能是“0”或“1”。
返回值:无
3、 关闭设备
Visual C++ & C++Builder:
VOID WINAPI CloseDevice(ULONG iIndex )
Visual Basic:
Declare Sub CloseDevice Lib "kpci800.dll" (ByVal iIndex As Long)
功能: 该函数负责关闭板卡的设备对象
参数: iIndex 与OpenDevice中的相同
返回值:无
4、 打开设备
Visual C++ & C++Builder:
BOOL WINAPI OpenDevice(ULONG iIndex)
Visual Basic:
Declare Function OpenDevice Lib "kpci800.dll" (ByVal iIndex As Long) As Boolean
功能: 该函数负责打开板卡的设备对象
参数: iIndex 指定KPCI板卡的设备序号,0对应第一个设备
返回值:“1”表示成功,“0”代表失败。
注意:设备序号 兼容机是靠近CPU的PCI插槽号为小序号(从0开始),
工控机则相反,远离CPU的PCI插槽号为小序号(从0开始)。
5、 读A/D某一通道转换数据(适用KPCI812数据采集卡)
Visual C++ & C++Builder:
ULONG WINAPI PCI812_ReadAd(ULONG Iindex,UCHAR adch,ULONG delay)
Visual Basic:
Declare Function PCI812_ReadAd Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal adch As Byte,
ByVal delay As Long)
As Long
功能: 启动 KPCI812 卡 A/D 某一通道采集数据并读入转换结果
参数: iIndex 与OpenDevice中的相同
adch 为A/D的通道号
delay 为改变通道后需要延时(单位为1微秒,此处delay的值要大于100)
返回值:A/D数据
6、 读 A/D 某一通道转换数据(适合 KPCI815 数据采集卡)
Visual C++ & C++Builder:
ULONG WINAPI PCI815_ReadAd (ULONG iIndex, UCHAR flbmode, UCHAR flbnum,UCHAR adch, ULONG delay);
Visual Basic:
Declare Function PCI815_ReadAd Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal flbmode As Byte,
ByVal flbnum As Byte,
ByVal adch As Byte,
ByVal delay As Long)
As Long
功能: 启动 KPCI815 卡 A/D 某一通道采集数据并读入转换结果
参数: iIndex, 与 OpenDevice 中的相同
flbmode, 滤波方式,
flbnum, 滤波次数,
adch, 要采集的通道号,
delay 送通道号到启动AD转换之间延时(单位为1微秒,此处delay的值要大于200)
返回值:两字节 A/D 转换数据
注:关于滤波:
flbmode=1:中值滤波法, | flbmode=2:算术平均值滤波法, |
对某一被测参数连续采样N次(N取奇数), 把 N 次采样结果按大小排序,取中间值为 本次采样值,能有效克服偶然扰动,适用 于温度、液位等变化缓慢的参数。 | 连续采样 N 次,然后取算术平均值为本次采样值, 适用于随机干扰、信号在某一数值范围附近上下 波动时。N 取值大时,信号平滑度高、灵敏度低, N 取值小时,信号平滑度低、灵敏度高,对于流 量,N=12,对于压力,N=4。 |
Flbmode=0 时,不滤波,此时应特别注意,对某一通道连续采样时,第 N 次转换后读取的数 据为上一次转换的结果。对多个通道循环采样时,第 N 通道转换读取的数据为上一通道转换的结果。
7、 向AO端口输出一个字节(适用KPCI823模拟量输出卡)
Visual C++ & C++Builder:
VOID WINAPI DAOut823(ULONG iIndex,UCHAR channel,UCHAR iByte)
Visual Basic:
Declare Sub DAOut823 Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal channel As Byte,
ByVal iByte As Byte)
功能: 该函数向 KPCI823 卡 AO 某一通道写输出数据
参数: iIndex 与OpenDevice中的相同
channel 指定模拟量输出的通道号(查阅6.1的偏移地址操作表)
iByte 为输出的数据(字节)
返回值:无
8、 从 I/O 端口读入一个字节
Visual C++ & C++Builder:
UCHAR WINAPI ReadByte(ULONG iIndex ,UCHAR dich)
Visual Basic:
Declare Function ReadByte Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal dich As Byte)
As Byte
功能: 从端口读入一个字节
参数: iIndex 与OpenDevice中的相同
dich 为开关量输入的地址
返回值:读取的单字节数据
9、 从 I/O 端口读入一个字
Visual C++ & C++Builder:
WORD WINAPI ReadWord(ULONG iIndex ,UCHAR dich)
Visual Basic:
Declare Function ReadWord Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal dich As Byte)
As Long
功能: 从端口读入一个字
参数: iIndex 与OpenDevice中的相同
dich 为开关量输入的地址(查阅6.1的偏移地址操作表,地址为0和表中所列偶数)
返回值:读取的单字数据(双字节数据)
10、 从 I/O 端口读入一个双字
Visual C++ & C++Builder:
DWORD WINAPI ReadDWord(ULONG iIndex ,UCHAR iAddr)
Visual Basic:
Declare Function ReadDWord Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal dich As Byte)
As Long
功能: 从端口读入一个双字
参数: iIndex 与OpenDevice中的相同
iAddr 为开关量输入的地址(查阅6.1的偏移地址操作表,地址为0或4)
返回值:读取的双字数据(4个字节数据)
11、 向I/O端口输出一个字节
Visual C++ & C++Builder:
VOID WINAPI WriteByte(ULONG iIndex ,UCHAR iAddr , UCHAR iByte )
Visual Basic:
Declare Sub WriteByte Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal iAddr As Byte,
ByVal ibyte As Byte)
功能: 该函数向端口写一个字节
参数: iIndex 与OpenDevice中的相同
iAddr 为开关量输出地址(查阅6.1的偏移地址操作表)
iByte 为输出的数据(字节)
返回值:无
注:对于有两极锁存功能的板卡,执行过程略有不同,第一次执行此函数,数据被送入第一级 锁存器,并未实际输出,当第二次执行此函数(数据变量iByte内容无效,地址变量iAddr要参照6.1 的偏移地址操作表中二级锁存输出允许的偏移地址)时,数据才真正送到输出端口。请仔细阅读演 示程序。
12、 向 I/O 端口输出一个字
Visual C++ & C++Builder:
VOID WINAPI WriteWord(ULONG iIndex ,UCHAR iAddr , UCHAR iWord )
Visual Basic:
Declare Sub WriteWord Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal iAddr As Byte,
ByVal idate As Long)
功能: 该函数向端口写一个字
参数: iIndex 与OpenDevice中的相同
iAddr 为开关量输出地址(查阅6.1的偏移地址操作表,地址为0和表中所列偶数)
iWord 为输出的字数据(单字数据)
返回值:无
13、 向 I/O 端口输出一个双字
Visual C++ & C++Builder:
VOID WINAP I WriteDWord(ULONG iIndex ,UCHAR iAddr , UCHAR iDWord )
Visual Basic:
Declare Sub WriteDWord Lib "kpci800.dll" (ByVal iIndex As Long,
ByVal iAddr As Byte,
ByVal idate As Long)
功能: 该函数向端口写一个双字
参数: iIndex 与OpenDevice中的相同
iAddr 为开关量输出地址(查阅6.1的偏移地址操作表,地址为0或4)
iDWord 为输出的双字数据
返回值:无
14、 延时函数
Visual C++ & C++Builder:
VOID WINAPI TimeDelay(ULONG timedelay )
Visual Basic:
Declare Sub TimeDelay Lib "kpci800.dll" (ByVal timedelay As Long,)
功能: 该函数完成延时功能
参数: timedelay延时时间常数(单位为微秒,在Windows系统下,此数值应大于100)
返回值:无