请教高手:如何解决PLC与PC之间的实时采集数据出现的错误?
请教高手:如何解决PLC与PC之间的实时采集数据出现的错误?
我的代码如下,是用定时器每隔0.5秒采集一次数据,结果发现很多数据有错误或和前面的数据重复!!
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_1.Closesleep(50)Winsock_1.Connect
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采集的数据就是这样,那是正确的,