Option ExplicitDim 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 SubPrivate Sub Command2_Click()
Call ZT8403_CloseDevice(m_cardNO)
    Unload Me
End SubPrivate 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 SubPublic 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
    LoopEnd SubPublic Sub review()
    
    Do Until ZT8403_DIBit(m_cardNO, iagain + 1) = 0
    Loop
    Call doloop
    
End Sub

解决方案 »

  1.   

    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
      

  2.   

    我是楼主同学,回yangao,根本看不到错误号,程序运行不起来,鼠标成等待样,看不到运行界面,反正是一副死样。
    回ldq,那个end是例程上拷过来的,我的那段程序也有,我的程序运行正常。
    回clear_zero,不知道怎么加断点。
      

  3.   

    非必要情况下不要用api,
    个人非常不喜欢sleep,会导致程序挂起
      

  4.   

    单步调试,加断点呀,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"
      

  5.   

    对于以下几个函数调用严重怀疑:Public Sub collect()
        i = 0
        Do Until ZT8403_DIBit(m_cardNO, i + 1) = 1
            i = i + 1
            If i = m_chCount Then i = 0
        LoopEnd SubPublic Sub review()
        
        Do Until ZT8403_DIBit(m_cardNO, iagain + 1) = 0
        Loop
        Call doloop
        
    End Sub这里的ZT8403_DIBit()调用的返回值是否有问题?硬件相关API的设计,一般很少做成阻塞式的.PS:下断点,按F9键.
      

  6.   

    谢谢楼上各位!
    回ldq,我的程序里也有这两处,运行正常。
    回myjian,周二到学校去下断点试试。因为家里的电脑没有板卡。
    回xx22nn,我们用新学的VB编程做毕业设计,不知道如何从新设计代码,思路是不断循环扫描直到某一通道开关量为1,这时根据通道号做相应的动作。(要不然还有什么方法知道哪个通道有信号啊)
    原程序比贴出来的这个还多加点东西(贴出来的也运行失败了),因为检测到某通道号信号为1后就退出循环了,对开关量变化不再做出响应,课题是轨道交通站点信号采集与展示,人踩在一个站点上得到相应信息后可能再踩在另一个站点上希望得到另一个站点的信息。和导师讨论一下,导师的意思是采集到信号后启动另一个程序不断检测刚才那个站点通道信号是否为0(人有没有离开那个站点),为0了再做doloop的那个循环。
    总之循环套循环,难怪机器会想不开,有没有什么好的思路啊?
      

  7.   

    板卡的API一般都有回调式的提供,你找找.自己写一个回调函数,传入口地址给API,那样就非常好了.有事件时API会通知你.
      

  8.   

    看了附带的API函数,没有发现叫回调的东东。
      

  9.   

    如果通道有信号能够触发事件用事件,一般都有的。
    极个别的没有。用循环扫描几次还可以,一直扫描用Timer定时检查可以的。不断循环扫描直到某一通道开关量为1,这时根据通道号做相应的动作。(要不然还有什么方法知道哪个通道有信号啊)
      

  10.   

    下断点然后怎么看?在Do Until ZT8403_DIBit(m_cardNO, i + 1) = 1处下断点看不出什么问题,但在Call collect处下断点程序就死机了。
    一句一句运行发现程序直接从Do Until ZT8403_DIBit(m_cardNO, i + 1) = 1跳到End Sub而外部没有信号给它是低电平。