请教高手:
在用winsock控件读取PLC中数据的时候:dim arrivData as integer   '触发winsock1_DataArrival事件后的PLC返回值,转换成十进制的数值winsock1.connect
send_Data(var_1)           '向PLC发送指令的函数,var_1是待读取的一个地址变量
msgbox arrivData winsock1.connect
send_Data(var_2)           '向PLC发送指令的函数,var_2是待读取的的地址变量
msgbox arrivData 运行后发现,两次输出的数据相同,如果改成下面的代码:dim arrivData as integer   '触发winsock1_DataArrival事件后的PLC返回值,转换成十进制的数值winsock1.connect
send_Data(var_1)           '向PLC发送指令的函数,var_1是待读取的一个地址变量
msgbox arrivData winsock1.close
winsock1.connectwinsock1.connect
send_Data(var_2)           '向PLC发送指令的函数,var_2是待读取的的地址变量
msgbox arrivData 运行后发现,两次输出的数值有时相同,有时不同,且有时是正确的输出,有时又不正确,请教高手如何解决?谢谢~~

解决方案 »

  1.   

    建议取消MSGBOX,改用标签来显示.其它需要通信协议才能判断.
      

  2.   

    事实上我是把接收到的数值存放在变量里的,然后输出到listview控件里的,发现好多中间有错误 
      

  3.   

    通讯协议:TCP判断连接状态,如果已经连接,则可以发送
                     UDP无法判断连接状态,可以直接发送。两次发送要做一定的延时。不要用msgbox来观查变量值
    用debug.print  arrivData 来观查变量值
      

  4.   

    源代码如下:Private position(100) As Integer    '存放记录的数据点
    Private rtnValue As Long            'winsock控件中dataarrival事件中返回值   
    Private Sub cmd_Connect_Click()     'connect按钮
        
        Timer1.Enabled = True
        call connect_PLC       
        
    End Sub
    Private Sub Timer1_Timer() '定时器定时触发事件
            
        Call connect_PLC    
        Me.Refresh
        
    End Sub
    Private Sub Form_Initialize()    
        
        Winsock_1.Protocol = sckTCPProtocol
        Winsock_1.LocalPort = 0
        
        Winsock_1.RemoteHost = "191.165.10.13"      'PLC的IP地址
        Winsock_1.RemotePort = 502
        
        Timer1.Enabled = False      ‘初始不开启定时器,在按下connect按钮后开启定时器    
        
        
    End Sub
    Private Function LoByte(ByVal var_Int As Integer) As String
        
        
        
        
    End Function         '获取低位   Private Function HiByte(ByVal var_Int As Integer) As String
        
            
    End Function          '获取高位  
    Public Sub connect_PLC()    
        
        
        On Error Resume Next    
            
            Winsock_1.Close
            Winsock_1.Connect
            
            Do
                If GetTickCount - lngOutTime > 80 * time_Step Then
                    Exit Sub
                Else
                    DoEvents
                End If
            Loop Until Winsock_1.State = sckConnected
                    
            Call send_Signal(220)         '向PLC发送第一个指令
        
            If rtnValue > 0 Then          '当返回值大于0
            
                position(0) = rtnValue
                Winsock_1.Close
                Winsock_1.Connect
                
        Do
                    
                      DoEvents
                    
                Loop Until Winsock_1.State = sckConnected
                
                Call send_Signal(220)         '向PLC发送第二个指令
                position(1) = rtnValue
                
                Winsock_1.Close
                Winsock_1.Connect
                
        Do
                    
                      DoEvents
                    
                Loop Until Winsock_1.State = sckConnected     Call send_Signal_1(180)      '向PLC发送第三个指令
        position(2) = rtnValue

                ''======================================''''''''
                     
                      '''''省略读取其他若干不同变量'''''                    ''======================================''''''''        End If      
            
        
    End SubPrivate Sub send_Signal(ByVal var_Int As Integer)  '向PLC发送指令过程    On Error Resume Next
        
        Dim sendstr(12) As Byte
        
        sendstr(0) = 0
        sendstr(1) = 0
        sendstr(2) = 0
        sendstr(3) = 0
        sendstr(4) = 0                   'high byte of byte length
        sendstr(5) = 6                   'low byte of byte length
        sendstr(6) = 255
        sendstr(7) = &H3                 'read register
        sendstr(8) = HiByte(var_Int)     'high byte of begin address
        sendstr(9) = LoByte(var_Int)     'low byte of begin address
        sendstr(10) = 0                  'high byte of data length
        sendstr(11) = 1                  'low byte of data length
        
        Dim aStr As String
        Dim i, j As Integer
        
        For i = 0 To 11
            aStr = aStr & Chr(sendstr(i))
        Next i
        
        Winsock_1.SendData aStr
        
        Exit SubEnd SubPrivate Sub Winsock_1_DataArrival(ByVal bytesTotal As Long)
         'PLC获取返回数据过程
        Dim a1, a2, b1, b2, s As String
        Winsock_1.GetData s
        
        If bytesTotal > 6 Then
             a1 = Hex$(Asc(Mid$(s, 10, 1)))
             a2 = Hex$(Asc(Mid$(s, 11, 1)))
        End If
        
        rtnValue = CLng("&H" & a1 & a2)
        
    End Sub结果发现:position(100)中所有数据均相同,且都为220指令返回的值!!!
    请教是怎么回事?如何解决?
    谢谢~~