程序崩溃,谁能帮我修改一下 !!!
Option Explicit
Dim i As Integer
Dim iRecord As Integer
Dim iagain As Integer
Dim pic(0 To 31) As String
Const m_cardNO = 1
Const m_chCount As Long = 32
Private Sub Command1_Click()
'清零
Dim i As Integer
Call ZT8403_DOAll(m_cardNO, &H0)
For i = 0 To m_chCount - 1
ledDO(i).Value = 0
Next i
End Sub
Private Sub Command2_Click()
Call ZT8403_CloseDevice(m_cardNO)
Unload Me
End Sub
Private Sub Form_Load()
Me.Left = (Screen.Width - Me.Width) / 2
Me.Top = (Screen.Height - Me.Height) / 3
If ZT8403_GetCardCount() <= 0 Then
MsgBox "打开设备失败,找不到此类板卡。 " & vbCrLf & _
"可能是未插卡或未安装驱动 "
End
End If
Call doloop
'初始化开关量
Call ZT8403_OpenDevice(m_cardNO)
If ZT8403_OpenDevice(m_cardNO) <> 0 Then
MsgBox "打开设备失败,找不到指定的板卡。 "
Exit Sub
End If
ZT8403_DOAll m_cardNO, &H0
pic(0) = App.Path & "\pic\1.gif ": pic(1) = App.Path & "\pic\2.gif ": _
pic(2) = App.Path & "\pic\3.gif ": pic(3) = App.Path & "\pic\4.gif ": _
pic(4) = App.Path & "\pic\5.gif ": pic(5) = App.Path & "\pic\6.gif ": _
pic(6) = App.Path & "\pic\7.gif ": pic(7) = App.Path & "\pic\8.gif ": _
pic(8) = App.Path & "\pic\9.gif ": pic(9) = App.Path & "\pic\10.gif "
End Sub
Public Sub doloop()
Call collect
iRecord = i
Do While True
Sleep 1000
Call collect
iagain = i
If iagain = iRecord Then
ledDI(iagain).Value = 1
ledDO(iagain).Value = 1
Exit Do
Else
iRecord = iagain
End If
Loop
End Sub
Public Sub collect()
i = 0
Do Until ZT8403_DIBit(m_cardNO, i + 1) = 1
i = i + 1
If i = m_chCount Then i = 0
Loop
End Sub
Public Sub review()
Do Until ZT8403_DIBit(m_cardNO, iagain + 1) = 0
Loop
Call doloop
End Sub
[解决办法]
加断点看看
[解决办法]
非必要情况下不要用api,
个人非常不喜欢sleep,会导致程序挂起。。。
[解决办法]
单步调试,加断点呀,F9断点,根据楼主所说的情况来看,可能是在加载的时候出错了
Call ZT8403_OpenDevice(m_cardNO)___________________!可能在这两处出错了,使程序一直在打开板卡中
If ZT8403_OpenDevice(m_cardNO) <> 0 Then_______!
MsgBox "打开设备失败,找不到指定的板卡。 "
Exit Sub
End If
ZT8403_DOAll m_cardNO, &H0
pic(0) = App.Path & "\pic\1.gif ": pic(1) = App.Path & "\pic\2.gif ": _
pic(2) = App.Path & "\pic\3.gif ": pic(3) = App.Path & "\pic\4.gif ": _
pic(4) = App.Path & "\pic\5.gif ": pic(5) = App.Path & "\pic\6.gif ": _
pic(6) = App.Path & "\pic\7.gif ": pic(7) = App.Path & "\pic\8.gif ": _
pic(8) = App.Path & "\pic\9.gif ": pic(9) = App.Path & "\pic\10.gif "
[解决办法]
对于以下几个函数调用严重怀疑:
Public Sub collect()
i = 0
Do Until ZT8403_DIBit(m_cardNO, i + 1) = 1
i = i + 1
If i = m_chCount Then i = 0
Loop
End Sub
Public Sub review()
Do Until ZT8403_DIBit(m_cardNO, iagain + 1) = 0
Loop
Call doloop
End Sub
这里的ZT8403_DIBit()调用的返回值是否有问题?
硬件相关API的设计,一般很少做成阻塞式的.
PS:
下断点,按F9键.
[解决办法]
你的程序效率太低,使用资源巨大,建议重新设计代码!
[解决办法]
板卡的API一般都有回调式的提供,你找找.
自己写一个回调函数,传入口地址给API,那样就非常好了.
有事件时API会通知你.
[解决办法]
看了附带的API函数,没有发现叫回调的东东。
[解决办法]
如果通道有信号能够触发事件用事件,一般都有的。
极个别的没有。用循环扫描几次还可以,一直扫描用Timer定时检查可以的。
不断循环扫描直到某一通道开关量为1,这时根据通道号做相应的动作。(要不然还有什么方法知道哪个通道有信号啊)