各位大侠:
    我通过Modbus协议与一个仪表通信,发送命令格式都正确,返回值也正确。
但是我把这个发送命令的过程,放到timer时间中去执行时,就会出现返回值混乱问题,总是几个数来循环出现。只有当多个timer事件同时发送的时候才出现这个问题。要不就是我做一个按钮一下一下的发送命令,也会偶尔出现数据不匹配的问题!
大家帮我分析一下到底是什么原因:是不是串口冲突的问题还是中断时间太短的原因呢?

解决方案 »

  1.   


    使用1个Timer来控制发送不同指令轮询仪表返回数据.
      

  2.   

    所谓轮询就是把串口通信代码放到Timer中,一个上位机,多个下位机,Timer中每次只通信一个下位机。
      

  3.   


    Private Sub Timer1_Timer()
        Static sum As Long
        sum = sum + 1
        If sum = 1 Then
            '写轮询指令1
        ElseIf sum = 2 Then
            '写轮询指令2
        ElseIf sum = 3 Then
            sum = 0
            '写轮询指令3
        End If
    End Sub
      

  4.   

      Private Sub Tim_ReadVal_Timer()''用来不断读取表上的实时数据With vModbusBSBill
        .ReadBalValue
    End With
    End Sub
    Private Sub Tim_ReadState_Timer()""用来不断读取表上的状态
    With vModbusBSBill
        .ReadBalPanAndState
    End With

    End Sub
    如果同时启用2个timer.会出现相互之间数据混乱现象!  应该显示数值的时候,却显示状态。反正就是循环显示!
      

  5.   

    我同学说可以 “你可以建一个指令数组在两个timer事件同时操作这个数数组”,还是不懂啥意思,哪位老大能棒棒我妈!!
      

  6.   

    放弃多个Timer,把所有通信都放到一个Timer中,这时最简单、最合理的解决办法。
      

  7.   


    Private Sub Timer1_Timer()
        Static sum As Long
        sum = sum + 1
        If sum = 1 Then
            With vModbusBSBill
                .ReadBalValue
            End With
        ElseIf sum = 2 Then
            With vModbusBSBill
                .ReadBalPanAndState
            End With
        ElseIf sum = 3 Then
            sum = 0
            '写轮询指令3
        End If
    End Sub
      

  8.   

    Private Sub TimerRead_Timer()
    Static Sum As Long
      Sum = Sum + 1
     If Sum = 1 Then
    With vModbusBSBill
        .ReadBalPanAndState
    End With '写轮询指令1
     ElseIf Sum = 2 Then
      Sum = 0
    With vModbusBSBill
    .ReadBalValue
    End With       '写轮询指令2'    ElseIf Sum = 3 Then
    '        Sum = 0
    '        '写轮询指令3
        End IfEnd Sub
    谢谢你们!我的问题已经解决!!
      

  9.   

    不好意思!我又有问题来了!
    我是在timer事件中,写了轮询指令,通过Modbus协议实时读取智能仪表上的数值和表上的状态!
    但是我现在需要通过手动发送命令,来控制只能仪表的动作,又出现发送命令冲突问题。
    用什么方法,可以保证手动发送的命令和timer时间中的发送的命令不发生冲突呢!
      

  10.   

    手动使Timer的Enabled属性为False,发送手动发送的命令后使Enabled属性恢复为True.