故事作者:绫

最近创作

看看TA的故事

【周三技术工坊】1200TCP通信

已锁定

总坛主

  • 帖子

    1534
  • 精华

    120
  • 被关注

    237

论坛等级:至圣

注册时间:2019-03-20

钻石 钻石 如何晋级?

【周三技术工坊】1200TCP通信

3676

7

2019-07-23 08:49:37

star star star star

        由于工作需要,我对S7-1200的各种通信方式进行了学习,在与客户交流问题的过程中,对TCP通信的使用及咨询最为广泛,了解S7-1200 TCP通信的数据交互过程能更好的帮助客户理解TCP及解决在使用过程中出现的问题。

 

一、TCP连接的建立

        TCP 是一种可靠的连接通信。在组态TCP时需要指定一方为客户端一方为服务器,为了建立连接,首先需要在服务器端调用并触发TCON 指令,使其处于listen状态监听客户机发出的SYN连接请求,之后,客户机调用并触发TCON指令,发出SYN请求建立连接,服务器端响应该请求通过“三报文握手”建立连接。如下图可见(S7-1200 IP:192.168.0.212),S7-1200的MSS(最大分段长度)为1460字节。


二、TCP连接的中断

        S7-1200 通过TDISCON指令取消TCP的连接,与互联网之间的TCP“四报文挥手”取消连接不一样的是,S7-1200 通过在报文置位RST来复位TCP连接,对方无需发出ACK响应。个人认为,此方式的好处在于能够立即中断连接,再次建立连接时也省去了常规时的FIN_WAIT_2及TIME_WAIT的等待过程。


三、数据的发送

        S7-1200 通过TSEND 发送指令,当然,前提是TCP已建立连接,在该指令中当输入引脚LEN=0时,发送的数据为DATA指令的区域长度;而当LEN≠0时,发送的数据长度为LEN指定的长度,当然,LEN的大小不能超过DATA指定的区域长度。当上升沿触发TSEND指令时,PLC建立一个上面指定长度的发送buffer 将数据Copy至 TCP 发送buffer中通过网卡将数据发送出去。


        从上图可以看出,发送DB为20字节,当LEN=0时,第一条发送长度为20,当修改LEN值为10或15时,发送长度相应地为10或15字节,共进行5此发送,tcp_send为DONE信号的计数为5次。


四、数据的接收

        S7-1200通过TRCV指令接收数据,其LEN用途与TSEND一致,当上升沿触发TRCV指令时,PLC建立一个指定大小的buffer将数据从TCP的接收buffer 传送过来, TCP的接收buffer 相应地释放相同大小的空间。如果接收的数据长度小于接收buffer的长度,无论触发多少次TRCV指令,数据都不会显示在DB中;如果接收的数据长度大于接收buffer的长度,则在第一次上升沿触发TRCV时建立buffer并导入TCP接收buffer中等长的数据,TCP接收buffer释放等长空间,第二次触发TRCV指令时buffer数据传至CPU应用。即,首次触发TRCV建立应用接收buffer并导入TCP接收buffer数据,二次触发数据从应用buffer传至应用使用。下图测试PLC的接收DB为500字节(NDR为TRCV输出NDR信号的计数值)。

 


        从上图可见,分六次每次发送100字节,TCP接收buffer不断被占用,当第一次上升沿触发TRCV指令时,tcp buffer中的数据传至应用buffer,TCP buffer释放500字节,这点从 keep-alive的反馈窗口值8092可以看出,再次上升沿触发TRCV指令时,TRCV完成数据传输,NDR计数为1;再次发送100字节,TCP buffer的窗口变为7992。

        当采用ADHOC模式时,如下图所示,分三次每次发送100字节,第一次上升沿触发TRCV时,根据keep-alive反馈窗口值为8192,即TCP buffer数据进入PLC应用buffer中,再次上升沿触发TRCV,TRCV接收数据,NDR计数为1,DB区显示接收数据。


        当不采用ADHOC模式时,如下图所示,分四次每次发送100字节,第一次上升沿触发TRCV指令时,400字节数据从TCP buffer进入PLC应用buffer中,从keep-alive窗口值可见TCP buffer已全部释放,第二次上升沿触发TRCV指令时,NDR计数依旧为0,DB区无数据,当再次发送100字节后,上升沿触发TRCV指令,NDR计数为1,DB区数据显示接收值。

        此外,在TCP接收buffer满时,还会有Nagle算法反馈接收窗口变化,即当窗口的值过小时不会将此窗口反馈给TCP 发送端 使TCP send buffer数据不能发送,直至TCP 接收buffer 的空间足够接收满足MSS大小的数据或者达到buffer一半大小的空间时,才会更新接收窗口值使发送端能够发送数据。


        如上图所示,当发送数据共8500字节将TCP接收buffer占满时,接收端反馈窗口值为0,禁止发送端继续发送数据,当两次上升沿触发TRCV指令时,NDR为1,报文4502显示TCP 接收buffer 空闲窗口为500字节,但在报文4912中Win的值仍为0;继续两次上升沿触发TRCV指令,NDR为2,报文6259显示TCP接收buffer有1000字节的空闲,但在报文7586的反馈报文中Win依然为0。

        直至多次触发至Win为1500(不会立即更新,需要等到探测报文时间到达才会更新)或空闲长度比较大时才会继续传输未完的数据。见下图,报文9875和9744。


        综上所述,S7-1200的TCP通信遵循了TCP的协议规范,其MSS为1460字节,TCP 接收Buffer为8192字节,根据上面的各种测试,建议在数据发送和接收过程中保持发送和接送DB保持同样的长度。


                                                                                                        -------来自 西门子技术支持工程师

【周三技术工坊】1200TCP通信 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

自动化so酷

共有80条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。