代码优化:如何用winsock实现对PLC数据的实时采集?请教高手:如何用winsock实现对PLC数据的实时采集,也
代码优化:如何用winsock实现对PLC数据的"实时"采集?
请教高手:
如何用winsock实现对PLC数据的"实时"采集,也就是当PLC中被监控的某个量一发生变化就立即(或者延迟0.5秒以下)发送回本地电脑并且保存???
用Winsock采集PLC数据的代码如下(定时器间隔为1秒):
- VB code
Private Sub Timer1_Timer() '定时器定时触发事件 Winsock_1.Close Winsock_1.Connect Do DoEvents Loop Until Winsock_1.State = sckConnected call send_Signal End SubPrivate Sub send_Signal() '向PLC发送指令过程 Dim sendstr(12) As Byte '************************* '将通讯协议写入sendstr中 '************************* 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 End SubPrivate Sub Winsock_1_DataArrival(ByVal bytesTotal As Long) '**************************** 'winsock返回数据事件 '返回数据,判断正确无误后保存到本地电脑 '**************************** End Sub
现在问题如下:
(1) 在定时器事件中必须每次将winsock先关闭掉再重新连接,否则返回来的数据会和上一次返回来的数据重叠;
(2) 用doevents方法有时会导致连接需要花费很长时间,可能需要几十秒才能连上;
(3) 由于用winsock采集数据,定时器的时间不宜设置过短,一般需要设置1秒以上发送接收一次;
所以:
请教高手,如何用winsock方法来实现PLC"实时"的数据采集,也就是尽量的缩短接收发送一次的时间间隔,最好小于0.5秒??
[解决办法]
1、要考虑PLC第次发送数据要做一定的延时(0.1~0.5秒做测试),否则粘包是不可避免的。
关闭重连的方法不可取。
2、这里用doevents不可取
- VB code
Private Sub Timer1_Timer() '定时器定时触发事件 if Winsock_1.State =7 then call send_Signal End Sub3、接收数据使用winsock事件,winsock发送数据可以小于1秒。
[解决办法]
PLC还支持TCP/IP啊?
