首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

:怎么解决PLC与PC之间的实时采集数据出现的异常

2012-04-09 
请教高手:如何解决PLC与PC之间的实时采集数据出现的错误?请教高手:如何解决PLC与PC之间的实时采集数据出现

请教高手:如何解决PLC与PC之间的实时采集数据出现的错误?
请教高手:如何解决PLC与PC之间的实时采集数据出现的错误?
我的代码如下,是用定时器每隔0.5秒采集一次数据,结果发现很多数据有错误或和前面的数据重复!!

VB code
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
          DoEvents         
        Loop Until Winsock_1.State = sckConnected
               
        Call send_Signal(280)        '向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 Sub

Private 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 Sub

End Sub

Private 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


在上面的代码中,采集到得数据都和第一个数据相同;

如果在winsock关闭与连接之间暂停一段时间:

VB code
Winsock_1.Closesleep(50)Winsock_1.Connect


则能正确采集大部分数据,但是仍然有个别数据和前面的数据相同,因为需要每隔0.1-0.5秒采集一次,所以无法多暂停更多时间,困扰已久,请高手帮忙,谢谢~



[解决办法]
v发送命令前先清除绶冲区,
[解决办法]
send_Signal() 调用 Winsock_1.SendData() 后,并不会马上触发 Winsock_1_DataArrival() 事件,这时候的 rtnValue 还是上次的值。
必须等待数据返回。
VB code
Option ExplicitPrivate rtnValue As Long                'winsock控件中dataarrival事件中返回值'Private bDataArrival As Boolean         '<-触发了 DataArrival 事件'Private Sub send_Signal(ByVal var_Int As Integer)    ...    Next i    bDataArrival = False '<-清除标志'        Winsock_1.SendData aStr        While Not bDataArrival '<-等待'        DoEvents    WendEnd SubPrivate Sub Winsock_1_DataArrival(ByVal bytesTotal As Long)    Dim a1 As String, a2 As String, s As String    Winsock_1.GetData s    If bytesTotal > 6 Then        a1 = Right$("0" & Hex$(Asc(Mid$(s, 10, 1))), 2) '<-你不能保证Hex()总返回2个字符'        a2 = Right$("0" & Hex$(Asc(Mid$(s, 11, 1))), 2)        rtnValue = CLng("&H" & a1 & a2) '<-只有 a1、a2 有值时表达式运算才不出错'    Else        rtnValue = 0 '<-要有错误时的返回值'    End If        bDataArrival = True '<-设置标志'End Sub 


[解决办法]
对于PLC来说,应该是取数据,而不是等plc把数据送到com口上。

建议的做法是:上位机送 代码到plc,plc响应后回复数据到上位机。
[解决办法]
只能帮顶...
[解决办法]

由PC发出站号地址数据,PLC匹配后回传PC.

不用sock程序的,plc带回应。具体的忘记了,好多年没有干这个活了。




[解决办法]
如何解决PLC与PC之间的实时采集数据出现的错误?

结果发现很多数据有错误或和前面的数据重复!!


1. 为什么有很多错误:可以在通讯协议中增加一个字段放校验位,接收时检查校验位,不对就接收退出


2. 和前面的数据重复,如果校验位是对的,那plc采集的数据就是这样,那是正确的,

热点排行