在长时间运行过程中,后台机与前台设备通讯的时候,偶尔出现通讯失败。比如我要采集数据,在采集过程中偶尔出现通讯失败,继续让程序运行,过一段时间之后又可以采到数据了,感觉好象是干扰问题,但也有人说是收到命令的动作问题,希望大侠可以提出宝贵意见或建议帮忙解决这一问题,谢谢!后台机与前台设备是通过屏蔽线连接的。不知道我描述得够清楚不。

解决方案 »

  1.   

    to zdingyun:串口连接线是RS232转485的一种AB屏蔽线,产品说明书上说距离可达到2000M。我现在接的才10M不到,在办公室试的应该没有电磁场干扰源。
    那我是要提高波特率的同时再留出足够时间处理数据吗?
    其实这个问题你在另一个我的帖子里也回答了,只是我不太明白,非常感谢你来,希望我的问题能解决
      

  2.   

    你说的情况在实时控制中,经常会有这些现象出现,原因不明。但整个程序终止,再运行又正常。所以可以将MSCOMM控件使用的代码放单一窗体。VB对窗体可瞬间卸载和加载。实时控制中PC机仅作终端使用,起传递数据作用。实际控制由下位机的单独仪表或PLC控制。所以瞬间卸载和加载通信窗体,不会影响实时控制。祝你好运。
      

  3.   

    要看工业实时控制的对象特性而定,假如你是需对速度反应快速对象,这种方法就有其缺陷。对惰性较大的温度对象,就不存在问题。前已说过,PC机仅作为终端用,实际控制仍由现场仪表或PLC执行。
      

  4.   

    我怀疑是时间bug. 
    1.你的程序好像工作很长时间,看前面的对答,猜想你采用串行口通信。
    2.关于采集数据,或许你采用定时轮询接收缓冲区的方式。
    时间.检查你的程序关于时间的计算有无bug。另外,你对通信失败的描述不够全。
    因为通信故障受到干扰,接收到数据错误,那就得增加容错措施。
    所谓失败,连接不上,握手不成功?连接后,线路断开?
    建议采用RTS/CTS 协议。
      

  5.   

    时间bug补充,比如经过午夜12点,系统时间会清零。
    如果采用程序开始运行的时间为基准,那么程序运行24小时后,也发生转折。通信,主要是吃透目标机的通信协议。
      

  6.   

    时间bug?是什么东西啊?
    通讯失败就是后台机没收到数据,而报通讯失败,但也可能是收到了数据,只是数据是错的从而校验和不一致导致失败,具体是那种情况我也不太清楚
    1."因为通信故障受到干扰,接收到数据错误,那就得增加容错措施。"如何增加容错措施
    2.RTS/CTS 协议是一种什么协议,如何操作
      

  7.   

    你得把你编程思想简单叙述出来,不然别人总是在猜测你使用的方法。
    所谓时间bug,就是说问题出在关于时间相关的部位。
    RTS/CTS 协议,需要有硬件连线下的应答方式,便于你确定通信双方之间是否在线。
      

  8.   

    赞同mmyyxx88() 观点"通信是不能100%准确的",关键是需对接收数据判断,正确的进入执行以下步骤,不正确则不执行.如果运行时间不确定,此时通信是否正常对实时控制是危险的.我前面介绍的方法,用于实时控制是有效的.
    看你前面叙述串口连接线是RS232转485,RS485口是非双工的.下位机侧应对此特性有所重视.
        ...如果通讯失败隔3秒重发,连发3次,如3次都不成功报通讯失败,通讯成功就以2秒的频率发送采集命令...
        看上段叙述,积极的通信中断不会造成无法"快速反应",而是克服程序使用中遭遇的无法预见的容错措施.
        请仔细查看你的代码,仅可能准确定义变量的作用域.对所有变量都应定义,少用或慎用变体变量.
      

  9.   

    借楼主的地头问个问题AT+CCED这个指令该怎么写,nokia6680,7610,3230支不支持这个指令因为我的不是串口编程,不能象超级终端那样测试是否支持这个指令,希望大家能帮帮我如果帮我解决这个问题,以下帖子的分全归他http://community.csdn.net/Expert/TopicView.asp?id=5670394谢谢
      

  10.   

    应该不是硬件故障,因为我连接COMM1和COMM2口自我测试的时候也会出现这种情况
      

  11.   

    '串口收到数据
    Private Sub mscom485_OnComm()
        Static nPoint As Long, arInput(MODEM_BUFF_SIZE - 1) As Byte
        Dim buffer As Variant
        Dim ar() As Byte
        Dim i As Long
        Dim mm As Long, nn As Long
        Dim checksum As String
        Dim nReceiveByte As Long, nTotalByte As Long
        
        Select Case mscom485.CommEvent
            Case comEvReceive
                nReceiveByte = mscom485.InBufferCount
                buffer = mscom485.Input
                ar = buffer
                    
                If (nReceiveByte + nPoint) > MODEM_BUFF_SIZE Then nPoint = 0
                
                For i = 0 To nReceiveByte - 1
                    arInput(i + nPoint) = ar(i)
                Next
                nPoint = nPoint + i
                
                If (arInput(0) = Val(m_CmdTmp.PlantAddr)) Then   '是已发出命令的回传数据
                    
                    Select Case Val("&H" & m_CmdTmp.CmdType) '不能用arInput(1)
                        Case &H0, &H2, &H5   '00号,02,05号命令
                            nTotalByte = arInput(2)
                
                            If nPoint = nTotalByte + 4 Then
                                  mm = 0
                                  For i = 0 To nTotalByte + 2
                                      mm = mm + arInput(i)    '校验和前面全部字符的和
                                  Next
                                     
                                  checksum = Hex(mm)
                                   '为避免检验和少于2位数
                                  Do While Len(checksum) < 2
                                      checksum = "0" & checksum
                                  Loop
                                  '为避免检验和超过了2位数
                                  mm = Val("&H" & right(checksum, 2))
                                  nn = arInput(nTotalByte + 3)
                                 
                                  If mm = nn Then '校验和正确
                                        ReDim ArrayInput(nTotalByte + 1)
                                        For i = 0 To nTotalByte + 1 '不需要首字节(地址),从命令号开始
                                                                '也不要末字节(校验)
                                            ArrayInput(i) = arInput(i + 1)
                                        Next
                                        
                                        timer485.Enabled = False '已收到正确的回传数据,不再重发,中止2s定时
                                        
                                        Call SignalProcess '处理数据后(入库,刷新显示),发送下一命令
                                  End If
                                  
                                  nPoint = 0
                             End If
                             
                        Case &H1, &H3, &H4, &H6, &H7, &H8, &H9, &HA, &HB, &HC, &HD, &HE '01号,03号,04号命令
                             timer485.Enabled = False '已收到正确的回传数据,中止2s定时,不再重发
                             ReDim ArrayInput(0)
                             ArrayInput(0) = Val("&H" & m_CmdTmp.CmdType)
                             Call SignalProcess '处理数据后(刷新显示),发送下一命令
                             
                             nPoint = 0
                    End Select
                    
                Else
                    nPoint = 0 '如果找不到字头则丢掉该字符串
                End If
                
             
        End Select
    End Sub
    这是串口收到数据的处理