1、要考虑PLC第次发送数据要做一定的延时(0.1~0.5秒做测试),否则粘包是不可避免的。
   关闭重连的方法不可取。
2、这里用doevents不可取Private Sub Timer1_Timer()    '定时器定时触发事件
 
     if Winsock_1.State =7 then  call send_Signal
    
End Sub3、接收数据使用winsock事件,winsock发送数据可以小于1秒。

解决方案 »

  1.   


    1、要考虑PLC编程时每次发送数据间要做一定的延时(0.1~0.5秒做测试,在PLC里大概就是多做几次空操作),否则vb收到粘包是不可避免的。
      

  2.   

    Timer定时器不就是每隔一段时间才触发一次,不就相当于延时了吗?
    你说的这个延时是放在VB代码里还是PLC程序里?具体是放在什么步骤与什么步骤之间?
    谢谢~
      

  3.   

    事件驱动程序,把计算机解脱出来一些
    Private Sub Form_Load()
    '建立TCP链接
    Winsock1.ConnectEnd SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    '有PLC来的数据了
    'PLC要是1ms次发送了10字节,而协议是1字节1个包,..而且这里vb程序处理1次数据到达要用1秒,并且一次接受所有字节..就是粘包了,因为接受缓冲区里面有超过1个包(1字节)的数据
    '粘包了就要自己拆分包
    '否则要求PLC发送1字节后,延迟一定时间,等PC计算机处理这个1字节的数据End Sub
      

  4.   

    高手解释的很详细,我理解一下,是否可以这样操作:(1) 做一个标记flag,为Boolean型,初始化为FALSE;
    (2) 当在Winsock1_DataArrival事件中,接收到PLC的数据,并且PC机处理完所有的该次的数据后,将标记flag置为TRUE;
    (3) 在定时器中,当flag为TRUE的时候发送协议给PLC,并且发送完成后再将flag置为FALSE;
      

  5.   

    和定时器没关系,数据到达就会触发Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)不要定时器
      

  6.   

    可能我的问题表述的不是很清晰,我用定时器是为了不断的向PLC发送数据然后接收数据,因为需要获取的PLC数据是每隔一段时间会更新的,所以我要把所有的数据都保存起来;举个例子:
    某个内部字记录设备的某个参数,该参数可能过10ms改变一下,也可能过20ms改变一次;我需要把该内部字一天当中所有的数据都记录并保存下来;如果按照我最原始的方法(参见最上面的帖子),该内部字采集到的数据有可能在连续两次会发生错误!
      

  7.   

    PLC返回的数据应该是有一定格式的,可以在DataArrival事件中按此做判断和数据处理的.
      

  8.   

    这个东西的具体问题具体分析,不能泛泛而谈的。不同的PLC是不一样的。
      

  9.   

    一提到PLC,我的第一选择就是OPC的方式
      

  10.   

    OPC咋连的?
    可否给一个例子?这种方式如果我每隔不到0.5秒去采集一次数据,两次之间的数据会不会发生重叠一类的问题?高手帮忙指条路啊,谢谢了~~
      

  11.   

    既然有TCP/IP模块,那就应该有主动通知功能.好好看看说明书,或者问一下PLC客服.
      

  12.   

    需要看什么厂家的 PLC ,一般来说 OPC 要方便很多,OPC 具有订阅功能,可以实现”主动通知“功能。再说延迟的问题,Winsock 和 OPC 都存在延时问题,它们都是取决于网络质量。另外,你的Timer内的处理代码执行时间如果超过了interval,那么延时就不可控了,这个是一直顺延下去的。
      

  13.   

    请问你用的哪一种plc。如果是三菱,小弟有办法。
      

  14.   

    我不是用三菱的,施耐德的PLC,但是可否分享一下三菱的方法?看看可否借鉴一下
      

  15.   

    @north00  这个项目搞定了没有,我现在也要搞这样的东西,看了你的帖子,感觉这玩意不好弄啊