读书人

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

发布时间: 2012-04-09 13:41:24 作者: rapoo

请教高手:如何解决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采集的数据就是这样,那是正确的,

读书人网 >VB

热点推荐