xzm0036 发表于 2007-6-22 10:19:52

求助:调用采集卡DLL如何实现连续采样

求助:现有一虚拟示波器硬件及其DLL程序(VB编写),在WIN98下用LabVIEW7.0调用其DLL出现如下问题:
(1)不能实现连续采样.采样一次获得几个周期波形(依存储长度而定)后就不能再次运行了,否则会出现"该程序执行了非法操作"错误,点确定后直接关闭LV,在程序中用循环结构调用Capture函数也出现同样的问题;
(2)只运行采样一次情况下不自动关闭,但点保存时会出现以下错误"Insane object at FPHP+E8 in "untiled.vi":{dsitem} Panel(FPSC);点确定后出现:"Fatal Internal Error:"fpsane.cpp" line 319 LabVIEW Version 7.0,确定后自动退出LV;
   以上错误令我无从下手,请各位高手指点.

[ 本帖最后由 xzm0036 于 2007-6-22 10:21 编辑 ]

lgh269 发表于 2007-6-22 11:47:22

你的DLL是否有返回处理的相关调用,
这样很难看出问题

xzm0036 发表于 2007-6-23 16:35:42

以下是DLL程序中所给的说明,说实在的没太看明白楼上的意思,"DLL返回处理的相关调用",不懂,但还是要感谢

'DLL库应拷贝到 "C:\program files\dso29dll\OUT.dll"
'硬件控制 API 函数调用
'Sysver是操作系统板本号
Declare Function FindPort Lib "out.dll" (ByRef UIP As Long, ByRef UCP As Byte, ByVal Sysver As Byte) As Byte
'FindHardware:Call it at beginning when load program first,it can let program auto detect printer port address and model of dso scope.
'在程序执行前,用来检测并口通讯和示波器型号,并口通讯是否为EPP增强并口,USB通迅是通过并口转USB实现。主机型号分为DSO2902双通道,DSO2904四通道。
Declare Function FindHardware Lib "out.dll" (ByVal winversion As Long, ByRef board_model As Byte, ByRef UIP As Long, ByRef UCP As Byte) As Byte
'PowerOn: It turn on dso scope power,call it at beginning when load program first.
'打开示波器电源,在程序开始时调用,因为示波器即使接通电源,亦处在休眠状态,必须软件初始化。
Declare Sub PowerOn Lib "out.dll" (ByRef UIP As Long, ByRef UCP As Byte)    '参数 UIP,UCP 无须返回参数
'PowerOff: It turn off dso scope power,call it at ending when quit program .
'在程序退出之前,关掉示波器电源,使示波器处在休眠状态。
Declare Sub PowerOff Lib "out.dll" (ByRef UIP As Long, ByRef UCP As Byte)
'ForceTrigger: it can let hardware auto generate a proper trigger when you can't get trigger in auto trigger mode.
'使硬件自动产生一个适当的触发,当你在自动方式时不能得到触发。

Declare Sub ForceTrigger Lib "out.dll" (ByRef UIP As Long, ByRef UCP As Byte)
'capture : Call it everytime when u want capture a new data,it set all parameter to hardware.
'当你每次采集新数据时调用,并传送所有一至四通道的参数到硬件。如触发电平,触发方式,触发斜率,触发位置,触发通道,存储深度,采样时钟等等 V_tshd =0~80 ,TrigPos:=0~256k ,voffdex:=3~252,clk_int=0 设置为内时钟,Trans总为1 ,AdjAddr:无用 ,返回参数:无
Declare Sub capture Lib "out.dll" (ByRef bufanalog0 As Byte, ByRef bufanalog1 As Byte, ByRef bufanalog2 As Byte, ByRef bufanalog3 As Byte, ByRef buflogic0 As Byte, ByRef buflogic1 As Byte, ByVal ABufLen As Long, ByVal MemMode As Byte, ByVal board_model As Byte, ByRef UIP As Long, ByRef UCP As Byte, ByRef s_val As Byte, ByVal ClkRate As Byte, ByVal TrigCh As Byte, ByRef TrigSlope As Byte, ByVal TrigWd1A As Byte, ByVal TrigWd1B As Byte, ByVal TrigWd2A As Byte, ByVal TrigWd2B As Byte, ByVal TrigWd3A As Byte, ByVal TrigWd3B As Byte, ByVal TrigWd4A As Byte, ByVal TrigWd4B As Byte, ByVal v_tshd As Byte, ByVal v_tshd2 As Byte, ByVal v_tshd3 As Byte, ByVal v_tshd4 As Byte, ByRef cp_val As Byte, ByRef p_attn As Byte, ByVal TrigPos As Long, ByRef VOffDex As Long, ByVal ClkSource As Byte, ByRef Trans As Byte, ByRef AdjAddr As Long)
'传送主机采样的数据到计算机内存。
'EndCapture : This routine transfers the captured data from DSO to memory.
Declare Sub EndCapture Lib "out.dll" (ByRef bufanalog0 As Byte, ByRef bufanalog1 As Byte, ByRef bufanalog2 As Byte, ByRef bufanalog3 As Byte, ByRef buflogic0 As Byte, ByRef buflogic1 As Byte, ByVal ABufLen As Long, ByVal MemMode As Byte, ByVal board_model As Byte, ByRef UIP As Long, ByRef UCP As Byte, ByRef s_val As Byte, ByVal ClkRate As Byte, ByVal TrigCh As Byte, ByRef TrigSlope As Byte, ByVal TrigWd1A As Byte, ByVal TrigWd1B As Byte, ByVal TrigWd2A As Byte, ByVal TrigWd2B As Byte, ByVal TrigWd3A As Byte, ByVal TrigWd3B As Byte, ByVal TrigWd4A As Byte, ByVal TrigWd4B As Byte, ByVal v_tshd As Byte, ByVal v_tshd2 As Byte, ByVal v_tshd3 As Byte, ByVal v_tshd4 As Byte, ByRef cp_val As Byte, ByRef p_attn As Byte, ByVal TrigPos As Long, ByRef VOffDex As Long, ByVal ClkSource As Byte, ByRef Trans As Byte, ByRef AdjAddr As Long)
'得到触发状态,从主机读状态寄存器,通过反回值确定示波器处在的工作状态。
' GetTrigStat: This routine reads the status register from the DSO, so one can determine
' the state the DSO is in
                                    
' 反回值
'   6      触发 缓冲区满 triggered and buffer filled
'   0,1,4,5预触发等待状态 pre_trigger wait state
'   3      预触发等待状态之后,没看到触发字after pre trigger state but has not seen trigger word
'   2      预触发等待,充满缓冲区post trigger wait, filling buffer

Declare Function GetTrigStat Lib "out.dll" (ByRef bufanalog0 As Byte, ByRef bufanalog1 As Byte, ByRef bufanalog2 As Byte, ByRef bufanalog3 As Byte, ByRef buflogic0 As Byte, ByRef buflogic1 As Byte, ByVal ABufLen As Long, ByVal MemMode As Byte, ByVal board_model As Byte, ByRef UIP As Long, ByRef UCP As Byte, ByRef s_val As Byte, ByVal ClkRate As Byte, ByVal TrigCh As Byte, ByRef TrigSlope As Byte, ByVal TrigWd1A As Byte, ByVal TrigWd1B As Byte, ByVal TrigWd2A As Byte, ByVal TrigWd2B As Byte, ByVal TrigWd3A As Byte, ByVal TrigWd3B As Byte, ByVal TrigWd4A As Byte, ByVal TrigWd4B As Byte, ByVal v_tshd As Byte, ByVal v_tshd2 As Byte, ByVal v_tshd3 As Byte, ByVal v_tshd4 As Byte, ByRef cp_val As Byte, ByRef p_attn As Byte, ByVal TrigPos As Long, ByRef VOffDex As Long, ByVal ClkSource As Byte, ByRef Trans As Byte, ByRef AdjAddr As Long) As Byte



'display control to let display fast because visual c is faster than visual basic,user can write their own display routine to replace it.
Declare Sub buffer2display Lib "out.dll" (ByVal Displayaddress As Long, ByVal board_model As Byte, ByRef bufanalog0 As Byte, ByRef bufanalog1 As Byte, ByRef bufanalog2 As Byte, ByRef bufanalog3 As Byte, ByRef buflogic0 As Byte, ByRef buflogic1 As Byte, ByRef disanalog0 As Byte, ByRef AdjAddr As Long)
Declare Sub SetPixeltest Lib "out.dll" (ByVal hdc As Long, ByVal analogch0ADD As Long, ByRef disanalog0 As Byte, ByVal crColor As Long)
Declare Sub linedraw Lib "out.dll" (ByVal hdc As Long, ByVal analogch0ADD As Long, ByRef disanalog0 As Byte)
Declare Sub linedrawlogic Lib "out.dll" (ByVal yposition As Long, ByVal hdc As Long, ByVal analogch0ADD As Long, ByRef disanalog0 As Byte)

Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
   Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As Long) As Long
   Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
页: [1]
查看完整版本: 求助:调用采集卡DLL如何实现连续采样