电工学习网

 找回密码
 立即注册
查看: 4080|回复: 0

西门子S7-1200TCP通信

[复制链接]
发表于 2019-7-24 17:14:15 | 显示全部楼层 |阅读模式
        由于工作需要,我对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字节。
6369946835721369661254914.jpg


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


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



        从上图可以看出,发送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信号的计数值)。
6369946846476136237777528.jpg


        从上图可见,分六次每次发送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区显示接收数据。
6369946849977721145574313.jpg


        当不采用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一半大小的空间时,才会更新接收窗口值使发送端能够发送数据。
6369946851518356001214799.jpg


        如上图所示,当发送数据共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。
6369946852716801173510112.jpg


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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-4-18 10:14

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表