浅谈PLC通信中的TCPIP的连接和断开
在PLC通信中,TCP/IP是大家普遍选择的协议,因为它是开放的以太网协议,不仅仅在西门子内部的设备之间可以使用,也可以在与第三方的设备之间进行广泛的通信。其中原因还包含TCP/IP是面向连接的,可靠的通信服务协议。
对于面向连接,表示通信是需要建立连接的,那么必然会对应断开连接,早期的300/400PLC我们会在NetPro中进行组态TCP的连接,这属于静态链接,不能通过程序断开TCP/IP的连接。而对于新的PNCPU,例如S7-1500CPU,则可以使用T_CON和T_DISCON分别来动态的建立和断开连接,实现灵活的TCP通信。
使用T_CON建立连接就是TCP通信的3次握手,通过Wireshark抓包是可以看见三次握手的过程,但这是大家看到的外在表象,实际上通过T_CON是先建立了TCP的通信资源,然后通过该通信资源与对方建立三次握手的连接。下图的wireshark中的1507,1509,以及1510是TCP的3次握手过程,在这三次握手中,通信双方协商了WidowSize和MSS的大小,即滑动窗口和TCP的Zui大分节长度。PLC中的TCP/IP的三次握手与标准的TCP/IP协议的三次握手形式相同。
使用T_DISCON程序功能块是用于断开连接的,然而与标准的TCP/IP通信的4次挥手是不同的,本质上是报文中的标志字段标志位不同,标准的TCP/IP的4次挥手字段标志位使用FIN,即Finish用来结束此连接,但是资源没有释放。而PLC中TCP的断开连接,并不是真的用于断开连接,而是释放通信资源,真正的逻辑是因为释放资源,所以连接断开。所以这和标准的TCP的4次挥手完全不同,而是使用字段标志位RST,即Reset来释放连接资源。通过Wireshark抓包来观察断开连接的过程。上图中的1797,是客户端使用T_DISCON的断开连接的过程,客户端通知服务器已释放该TCP的通信资源,连接断开。
下图中的2012,是服务器端使用T_DISCON的断开连接的过程,通知客户端已释放该TCP的通信资源,连接断开。2089,2197表示客户端尝试继续与服务器建立连接,然而服务器通知客户端,2198通信资源释放,连接断开。
那么为什么断开连接,PLC不能参考标准TCP的4次挥手呢?我想原因有两点,第一点是资源释放,有利于灵活的编程,例如,PLCA与其中一台PLC B断开连接,资源释放,利用释放的资源,与PLCC建立连接进行通信;第二点就是标准的4次挥手期间,数据仍然是可以交互的,对于工业环境来说,数据安全是有要求的,所以使用释放资源的方式,防止连接断开继续有数据交互,避免不必要的编程错误。