购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5 TCP与UDP及其在SCADA系统中的应用

2.5.1 TCP

1.TCP概述

传输控制协议(TCP)为同一网络中或者连接到一个互联网络系统的成对计算机提供可靠的主机到主机的通信协议。其主要目的是为驻留在不同主机的进程之间提供可靠的、面向连接的数据传送服务。在网络体系结构中,TCP的上层是应用程序,下层是IP,TCP可以根据IP提供的服务传送大小不等的报文,IP负责对报文进行分段、重组,并在多种网络上传送。

为了在并不可靠的网络上实现面向连接的可靠的数据传送,TCP必须解决可靠性、流量控制等问题,必须能够为上层应用程序提供多个接口,同时为多个应用程序提供数据,而且必须解决连接问题,这样TCP才能称为面向连接的可靠的协议。

2.TCP报文段的结构

TCP虽然是面向字节流的,但TCP传送的基本数据单元是报文段,一个TCP报文段分TCP报首和TCP数据两部分,其中很关键的就是TCP报首,TCP的全部功能都体现在TCP报首的各个字段中。IP数据包与TCP报文段格式如图2.24所示。限于篇幅,这里不对IP包头进行介绍。报文、包、段、数据报、帧、比特等术语,可以理解为要传输的基本数据单元在网络不同层的叫法。

图2.24 IP数据包与TCP报文段格式

TCP报文段格式与Wireshark抓包对照图如图2.25所示。由于利用Wireshark抓包工具可以更好地学习网络通信知识,因此这里结合Wireshark抓包进行介绍。图2.25把TCP协议体系及TCP报文段与Wireshark抓取的数据包进行了对照,其中,没有展开Flags包含的字段。可以看到,TCP报首共有20个字节的固定长度和可变报首。当有选项时,可根据4位报首长度计算可变报首长度。例如,假设4位报首长度是二进制0011(对应十进制为3),表示可变报首为3×4=12字节,这里的4表示4位报首计算出来的数据的单位是4字节。这样,TCP报首总长就为20+12=32字节。根据该原理,可以算出可变报首长度最大值为40字节。

报首中首先是各2个字节的源端口号和目的端口号。然后是4字节的序号和4字节的确认序号。序号用来标识从TCP发送端向TCP接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。若将字节流看作两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32位的无符号数,序号到达231后又从0开始。存在同步序列(SYN)时,当建立一个新的连接时,SYN标志变成1。序号字段包含由这个主机选择的该连接的初始序号(Initial Sequence Number,ISN)。该主机要发送数据的第一个字节序号把这个ISN加1,因为SYN标志消耗了一个序号。确认序号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到的数据字节序号加1。只有当后面的ACK标志为1时,确认序号字段才有效。一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。

随后的4个字节中主要包括4位报首长度、6位保留位、6个标志位,这些标志位中的多个可同时被设置为1。标志位的含义如下。

• URG:紧急指针(URGent Pointer)有效。

• ACK:确认序号有效。

• PSH:接收端应该尽快将这个报文段交给应用层。

• RST:重建连接。

• SYN:同步序号,用来发起一个连接。

• FIN:发送端完成任务发送。

标志位后是16位窗口大小声明段,表示发送者可接收的字节数,该编号以确认字段编号的首位开始。

16位校验和证明报文传送无误,若传送错误,则丢弃该报文。

16位紧急指针是一个正的偏移量,与序号字段中的值相加表示紧急数据最后一个字节的序号。只有在URG置位时才有效,紧急方式是发送端向另一端发送紧急报文的一种方式。

选项属于报首的长度可变部分,TCP提交给IP层的最大分段大小MSS就属于可选项中的内容。

在TCP/IP通信中,每个TCP报文段都包含源端和目的端的端口号,用于寻找发送端和接收端的应用进程。这两个值加上IP数据包中的源IP地址和目的IP地址,可以唯一确定一个TCP连接。有时,一个IP地址和一个端口号也称为一个套接字(Socket),套接字对(Socket Pair,包含客户IP地址、客户端口号、服务器IP地址和服务器端口号的四元组)可以唯一确定互联网络中每个TCP连接的双方。

图2.25 TCP报文段格式与Wireshark抓包对照图

图2.26所示为Modbus TCP中的TCP报首,共20个字节。其中,十六进制ea 53就表示16位源端口号59987。TCP报首后面的就是Modbus TCP报文。对于图2.26中的其他参数,读者可以结合报文段的结构进行分析。

图2.26 Modbus TCP中的TCP报首

3.TCP连接的建立和终止

TCP栈支持同时建立两个TCP连接:一个为主动连接,另一个为被动连接。TCP是基于连接的协议,因为必须保持对TCP连接状态的监视并将与状态有关的信息保存在发送控制块中,而TCP连接状态的改变由TCP的软件状态机来实现。软件状态机又由事件或用户来触发。例如,当监视到一个带有SYN标志的TCP报文到达时,状态机就将TCP连接转换到接收状态,用户也可以手工控制状态机,使其处于发送状态,以建立TCP连接。

建立了TCP连接后,TCP通过下列方式来实现数据的可靠传输。

(1)将信息分割成TCP认为最适合发送的数据块。即当应用层要发送的数据长度过长时,网络层要把数据分段,每段都要加上TCP报首。

(2)当发送方发出一个报文段后,它启动一个定时器,等待接收方确认接收到这个报文段。若不能及时收到确认信息,则重发报文段。

(3)当接收方收到来自TCP连接的另一端的报文后,它将发送确认信息。此确认信息不是立即发送的,而是延迟一段时间再发送的。

(4)接收方对收到的报文段进行校验,如果校验结果和收到的报首中的校验和不一致,那么接收方将丢弃这个报文段,并且不会确认收到此报文段,由于发送方收不到确认信息,所以会重发。

(5)TCP报文段作为IP数据包来传输,而IP数据包的到达可能失序,因此TCP的到达也可能失序。如有必要,TCP将对收到的报文进行重新排序。

(6)IP数据包会发生重复,TCP的接收端必须丢弃重复的报文。

(7)TCP还能提供流量控制,这将防止较快主机致使较慢主机从缓冲区溢出。

TCP的数据传输具有5个特征:面向数据流、虚电路连接、有缓冲的传送、无结构的数据流和全双工连接。若报文被破坏或丢失,则由TCP将其重新传输。

为了建立一条TCP连接,必须经过以下3次握手过程。

(1)这里以Wireshark抓包中的字段为例来说明,TCP连接第1次握手的数据包中的报文分析如图2.27所示。客户端发送一个SYN包,标志位SYN=1,这里将发送序号(Sequence Number)置为0( X )。客户端口号为55863,服务器端口号为80。

图2.27 TCP连接第1次握手的数据包中的报文分析

(2)第2次握手时,服务器收到SYN包后,向客户端返回一个TCP报文(端口是从80到53992),其中SYN=1,ACK=1,并将确认序号(Acknowledgement Number)设置为第1次握手时客户发送序号加1( X +1=0+1=1),设置SYN的发送序号为0( Y )。

(3)第3次握手时,客户端收到服务器发来的ACK与SYN帧后,检查标志位ACK是否为1(只有ACK为1,确认序号才有效)、确认序号是否正确(是否为第1次握手时发送序号 X 加1)。若正确,客户端会再向服务器发送一个ACK报文,其中,标志位SYN=0,ACK=1,并置本次ACK的发送序号为第2次握手时SYN发送序号加1( Y +1=0+1=1)。至此,TCP连接建立完成,可以传送报文了。

限于篇幅,没有给出第2次和第3次握手的Wireshark抓包,读者可以自己尝试。

在此过程中,发送第1个SYN的一端将执行主动打开(Active Open),接收这个SYN并发回一个SYN的另一端执行被动打开(Passive Open)。

这里再以计算机中的Kepware服务器与研华ADAM-6024模块的Modbus TCP通信为例来说明3次握手。计算机网卡的IP地址为192.168.5.75,模块的IP地址为192.168.5.100。OPC服务器作为客户端,模块作为服务器端。通过Wireshark抓包的标志位,可以看到3次握手过程,如图2.28所示。第1个报文标志位[SYN]表示第1次握手;第2个报文标志位[SYN,ACK]表示第2次握手;第3个报文标志位[ACK]表示第3次握手。

建立一个连接需要3次握手,而终止一个TCP连接需要经过4次握手。因为一个TCP连接是全双工的,所以必须单独关闭各个方向。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在接收到一个FIN后仍能发送报文。首先进行关闭的一方(发送第1个FIN)将执行主动关闭,而另一方(收到这个FIN)将执行被动关闭。

图2.28 TCP连接中的3次握手的标志位

2.5.2 UDP

1.UDP概述

UDP(用户数据报协议)主要用来支持那些需要在计算机之间传输数据的网络应用。众多的客户机/服务器模式的网络系统都使用UDP。与TCP一样,在TCP/IP模型中,UDP位于IP层之上、应用程序范围内,UDP层使用IP层传送数据。IP层的包头表明了源主机和目的主机的地址,而UDP层的报首指明了主机上的源端口和目的端口。

UDP是一个简单的面向数据报的传输层协议,与TCP不同,UDP不对应用层要传输的报文进行分组,而是直接加上IP包头,组装成一份待发送的IP数据包。若IP数据包长度过长,超过最大传输单元MTU,则在网络层会对数据包进行分片。把分片后的数据段加上IP包头传入数据链路层。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据包可能没有什么联系。UDP和TCP相似,同属传输层协议,都作为应用程序和网络传输的中介。

与TCP相比,UDP不提供可靠性,它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。但UDP提供某种程度的差错控制,它只完成非常有限的差错检验。

2.UDP数据报(datagram)格式

UDP位于IP层之上,IP层数据包包括包头和数据,该数据就是UDP数据报。UDP数据报包含8字节的UDP报首和可变长度的UDP数据。IP数据包的包头指明了源主机和目的主机地址,而UDP层的报首指明了主机上的源端口和目的端口。由于IP层已经把IP数据包分配给TCP或UDP(根据IP报首中的协议字段值),因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号与UDP端口号是相互独立的。尽管相互独立,当TCP和UDP同时提供某种知名服务时,两个协议还是会选择相同的端口号。这纯粹是为了使用方便,而不是协议本身的要求。

UDP长度字段指的是UDP报首和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据报是0KB)。这个UDP长度是有冗余的。IP数据报长度指的是数据报全长,因此UDP数据报长度是全长减去IP包头的长度(该值在报首长度字段中指定)。

UDP的校验和与IP的校验和不同。UDP的校验和覆盖UDP报首和UDP数据,TCP也是这样,但UDP的校验和是可选的,而TCP的校验和是必要的。

UDP数据报的长度可以为奇数字节,但是校验和算法是把若干个16位字相加。解决方法是,必要时在最后增加填充字节0,这只是为了方便校验和的计算(也就是说,可能增加的填充字节不会被传送)。

2.5.3 基于TCP的Socket通信及其在SCADA数据通信中的应用

在SCADA系统中,上位机与服务器多是客户机/服务器结构,这些承担不同功能的网络节点之间广泛使用以太网通信。由于有专门的驱动,因此,一般不需要对这些设备之间的通信进行单独编程。但是,在现场控制层,控制器之间的通信需求会比较多样。一般来讲,某个厂家的自身控制器产品之间的通信方式都比较完善,不需要复杂的编程就可以实现。但当不同厂家之间的控制器进行通信时,一般要在控制器中进行一定的编程,这时Socket通信就是一种可以采用的以太网通信方式。特别是当控制器与第三方应用(如MES)之间有大量数据交换时,更适合采用Socket通信。这是因为这种方式具有通信效率高、稳定性好的特点。

1.Socket的含义

可将Socket(套接字)看作虚拟出来的应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。通过Socket,可以方便地调用TCP/IP协议。也就是说,Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,用户通过接口就可以实现Socket通信,让Socket组织数据,以符合指定的协议。

当两台主机的程序要通过网络进行通信时,首先要知道如何识别这两台主机。因此,首先用主机的IP地址来识别主机。然而,由于主机中的不同应用程序都可能通过这个IP地址与另外的主机通信,因此,还需要识别具体要通信的程序。解决方法就是在IP地址上增加端口号。因此,当通信双方的套接字都有自己的IP地址和端口号后,就可以实现网络中的两台主机上相关的应用程序之间的以太网通信了,而实现这种网络通信的一个关键就是Socket。可以看出,客户机和服务器端都存在Socket。

网络中的节点无论是利用UDP还是利用TCP通信,都可以利用Socket进行数据传输,但通信双方要约定好协议内容。由于UDP是非面向连接的,因此两者的编程是有所不同的。

2.基于TCP的Socket通信流程

基于TCP的Socket通信流程如图2.29所示。此时,服务器端和客户端两侧各有一个Socket。在服务器端,首先创建Socket,然后把IP地址和端口号进行绑定,先对端口进行侦听,再调用Accept阻塞,以等待客户端连接。如果收到客户端的连接,则建立连接,根据客户端的请求进行数据传输。数据传输完后关闭Socket,结束会话。

图2.29 基于TCP的Socket通信流程

在客户端,首先创建Socket,然后用Connect初始化Socket,对于TCP通信,当经过3次握手建立了与服务器的连接后,就可以与服务器进行数据通信了。通信完成后,关闭Socket,结束会话。

与服务器端在Listen()之前会调用Bind()不同,客户端不会调用Bind(),而是在Connect()时由系统随机生成一个端口号,这个自动分配的端口号和自身的IP地址组合,就完成了客户端Socket的初始化。

当服务器端与客户端之间通信时,对于要发送出去的数据,都要先从内存复制到发送缓冲区,再通过DMA等方式把数据复制到网卡中。同样,对于要接收的数据,也是先从网卡复制到接收缓冲区,再从接收缓冲区复制到内存中用户进程的缓冲区中。

Socket通信是在应用程序的线程实现的,由于控制器可能会响应多个客户机(上位机)的通信请求,同时,客户机会与多个控制器通信,因此,应用软件一般都要支持多线程。简便起见,图2.29中给出的是客户端与服务器端一对一的情况。

3.三菱电机PLC的Socket通信实例

三菱电机FX5U系列控制器的Socket通信通过专用指令与通过以太网连接的对方设备(变频器、仪表、控制器等)以TCP及UDP收发任意数据。要采用TCP进行Socket通信时,需要设置以下参数。

(1)通信对方侧的IP地址及端口号。

(2)CPU模块(集成以太网接口)的IP地址及端口号。

(3)通信对方侧与CPU模块侧中的开放侧(Active开放及Passive开放)。

TCP连接有Active开放与Passive开放两种动作。在等待TCP连接的一侧所指定的端口号中,执行Passive开放。TCP连接侧指定以Passive开放等待的端口号后,执行Active开放。设置完成后,可以执行TCP连接,建立连接后,即可实施通信。这里以TCP连接、Active开放为例加以说明。

首先对FX5UC本机自带的以太网端口进行配置,把Active连接设备拖拉到窗口中。FX5UC PLC Socket通信服务器侧以太网配置如图2.30所示。设置完通信参数后,就可以在主站(PLC)编写Socket通信程序了,如图2.31所示。这里,要发送的数据是6个字节,放在D301~D303。要接收的数据长度和数据放在从D500开始的寄存器中。通信结束时调用Socket关闭函数。程序中的M3000是发送数据的指令,在实际系统编程时可以是定时器触点等。Socket通信函数的详细说明可以参考三菱电机FX5U控制器以太网通信手册。

图2.30 FX5UC PLC Socket通信服务器侧以太网配置

图2.31 三菱FX5U控制器Socket通信程序

2.5.4 SCADA系统中的TCP与UDP通信

1.三菱FX5UC PLC的TCP与UDP通信

以三菱FX5UC PLC为例,通过Wireshark抓取应用软件与控制器以太网通信时的数据包来直观了解TCP与UCP通信。FX5UC是三菱比较新型的微型PLC产品,集成以太网和RS-485通信接口,通信能力较以往的产品有大幅提高。

利用GX Work3编程软件对PLC的通信方式进行配置,设置模块参数中的以太网端口,包括IP地址、子网掩码、默认网关设置,如图2.32所示。

在控制器组态中,在对象设备连接配置设置中拖入Modbus TCP连接,即FX5UC PLC可以与一个外部设备进行Modbus TCP通信。这里最多可以拖入8个Modbus TCP连接,即FX5UC PLC最多支持同时与8个客户端通信。添加通信连接配置,如图2.33所示。

图2.32 PLC网络地址设置

设置完成后,在连接方式中选择直接连接,将参数与数据写入PLC中。把编程软件GX Work3切入监控模式,这时GX Work3与PLC之间进行数据通信,利用Wireshark抓取数据包,如图2.34所示,可以看出,PLC与主机的数据包的目的地址都是广播地址,通信方式是基于UDP的广播模式,也就是说,当运行GX Work3的主机与控制器进行直接连接时,采用UDP通信。

图2.33 PLC通信组态增加连接

图2.34 直连通信数据包

把参数设置下载到PLC中,就可以设置通过TCP连接的方式了,在连接方式中选择其他连接方式,如图2.35所示。输入刚刚设置的IP地址,单击搜索,就可以查找到网络上的PLC,这里发现了FX5UC PLC。

进行通信测试,在主机中运行Modbus客户机模拟软件,实现与PLC的Modbus TCP通信。利用Wireshark抓取数据包,如图2.36所示,在数据包中可以看到主机和PLC互相ping了一下,后续都是TCP数据包,读者可以把数据包与2.5.1节的内容结合起来看,从而对TCP通信有更加直观的了解。

图2.35 控制器连接设置

图2.36 TCP通信数据包

2.组态软件和PLC的TCP/UDP通信配置

在工业控制系统中,在进行以太网通信时,用户一般可以选择采用TCP或UDP。但由于采用UDP一般不需要对端口等进行专门配置,使用方便,因此在传输层大量使用UDP。这里以三菱Q系列PLC与组态王及InTouch之间的通信组态为例加以说明。

(1)组态王与三菱Q系列PLC的UDP通信配置。

要实现组态王与三菱Q系列PLC的UDP通信,需要对Q PLC的以太网通信参数进行配置。这里,PLC机架的2号插槽安装了QJ71E71-100以太网通信模块,通过该模块进行通信。添加以太网模块,选择网络类型,填写该模块占用的起始I/O号、网络号、组号和站号等,如图2.37所示。

图2.37 以太网模块参数设置

进行运行设置,如图2.38所示。在这里要填写IP地址等。其中,要勾选“允许RUN中写入”,否则通信时上位机只能读,不能执行参数写入。

图2.38 以太网通信运行设置

若采用组态王进行通信,还需要在三菱以太网模块中进行打开设置,如图2.39中的第3条和第4条内容,就是用于组态王与PLC进行UDP通信的设置。这里需要填写以本站端口号、通信对方IP地址和通信对方端口号。把上述设置下载到PLC中,PLC侧的参数设置就完成了。

图2.39 以太网通信的打开设置

需要在组态王软件中添加设备并进行设备参数配置。在本例中,选用的是组态王7.50SP3,自带的驱动只有以太网UDP。添加的设备名称是“QJ71E71”,设备添加的关键一步是填写设备地址,如图2.40所示。这里填写的是192.168.5.8:800:401:3,最后的“3”表示连接超时(单位:s),对于其他参数,读者对比PLC中的参数设置就可以理解其意义。

图2.40 在组态王驱动中设置地址

设备添加完成后,就在数据词典中添加变量。添加一个地址为D500的变量,变量名也是D500,在数据字典中定义设备中的变量,如图2.41所示。变量定义的关键是变量类型、连接设备及其寄存器和数据类型要准确,否则即使添加的设备驱动没问题,通信也不会成功。由于该变量要与PLC中的寄存器建立映射,因此是I/O类型的变量。关于设备添加和变量类型等可以看组态王的驱动帮助文件。

图2.41 在数据字典中定义设备中的变量

当组态王由开发环境切入运行环境时,若与PLC通信成功,则组态王的信息窗口会有以下提示。

其中,端口号2048(十进制)对应PLC参数中设置的800(十六进制)。从提示中可以看出,组态王驱动与PLC的以太网通信是成功的,而且关联了QJ71E71设备。

(2)InTouch组态软件与三菱Q系列PLC的UDP通信配置。

当采用InTouch组态软件(2014R2版本)与三菱Q系列PLC通过以太网进行通信时,若采用UDP通信,则不需要对PLC的以太网通信参数进行打开设置,在上位机的DAServer中可以选用默认的参数,即UDP,端口号为5000。

若采用TCP,则需要对PLC的端口等进行设置,图2.42中的第5条和第6条就是为与InTouch的TCP通信而设置的。

在上位机的DAServer中进行驱动配置,添加三菱以太网驱动(DASMTEthernet),在该驱动下进行配置,包括添加通道(QPLC)、设备(S1APLC等)。添加通道时要选择所用的计算机网卡。在DAServer中进行设备配置如图2.42所示,这里包括PLC参数配置和协议配置,这些参数配置都要与PLC中的设置一致。在协议配置中,选择TCP,填写端口号5001(十进制),该端口号与PLC中的打开设置中的1389(十六进制)是一致的。

DAServer设置好后,还需要在InTouch中添加访问名,如图2.43所示。其中,访问名必须与DAServer中的设备一致,对于三菱PLC,应用程序名是DASMTEthernet,主题名可以与访问名一致,也可以是其他名字。

图2.42 在DAServer中进行设备配置

图2.43 在InTouch中添加访问名

在InTouch中定义变量时,若是外部变量,则当有多个设备时,需要选对访问名,如图2.44所示。

图2.44 在InTouch中进行变量定义 Be3x45/a3+gBzdk9KjsvlEoPxz/MujMJaFGwljTDgzpIpz0uDeDuTyLptCgqpcna

点击中间区域
呼出菜单
上一章
目录
下一章
×