引言
组态软件是面向工程监控和数据采集的软件平台工具,具有丰富的设置项目。组态软件所涉及的工业领域非常广泛,在工业监控系统中发挥着越来越重要的作用。组态软件要接收现场的采集数据,并形成动态画面,以反映工业现场的各种状态,并能够对现场设备进行控制。这些都依赖于组态软件的通信模块。通信模块作为组态运行环境中数据交互的重要渠道,通常处于监控组态软件运行环境的核心区,其功能直接决定着组态软件的性能。本文在基于TCP/IP网络协议和SOCKET接口技术的基础上,介绍了基于IEC61131-3标准的组态软件通讯模块的设计与实现方法。
1、通信模块功能
组态监测系统分为控制器和工程师站两部分,图1所示是系统的总体结构图。图中的控制器负责采集并处理数据,工程师站负责接收控制器发送过来的数据,并将数据显示和保存。通信模块根据用户定义的通信协议实现工程师站组态软件与控制器之间的数据通信,完成数据通信帧的组织下行和上行数据帧的校验、解析。由此可见,在整个组态软件中,通信功能模块担负着上层组态运行环境与下层控制器之间数据交互的重要作用。
2、通信模块设计
为了能够及时、准确的反映设备运行状况,设计时可采用基于TCP/IP协议的流式套接字(SOCK_STREAM)来实现组态软件通信模块的程序设计。
为了实现网络通讯,Windows为应用程序提供了各种编程接口,如Windows Sockets API等,应用程序可以直接使用这些API函数。但对于较大型的应用程序来说,应该设计一个虚拟网络接口层,以使能用windows提供的各种通讯API来为应用程序提供通用的网络功能。这样的接口层可以采用中间DLL的形式,它将应用程序和windows的各种API隔离开来,使程序员能更方便地设计自己的应用程序。这样的设计可使应用程序更易于维护和移植。
基于通信需求和上述思路,利用基于TCP_IP的SOCKET接口可以实现网络通信,通信模块通常以动态链接库的形式存在。
2.1 Socket套接字
Windows Sockets不是一种网络协议,而是一套开放的、可支持多种协议的、Windows下的网络编程接口。Winsock实际在计算机中提供了一个通信接口,应用程序在网络上传输信息都可以通过这个Socket接口来实现。Windows Sockets分为三种类型:其中流式套接字(sock-stream)定义了一种可靠的面向连接的服务,它使用TCP作为传输层协议,可实现无差错无重复地顺序数据包传输;数据报套接字(sock-dgram)定义了一种无连接的服务,它使用UDP协议,数据通过相互独立的报文进行传输,而且是无序的,同时不保证可靠和无差错;原始套接字(sock-raw)允许对低层协议(如IP或ICMP)直接访问,主要用于新网络协议的实现和测试等。
图2给出了一种典型的C/S(客户端服务器)面向连接套接字调用的实现流程。
本系统中,工程师站组态软件一般可作为客户端向控制器发送连接请求,以建立连接。由于控制器采集数据是周期性的,组态软件采用异步选择机制判断控制器是否有数据发送过来。Windows Sockets的异步选择函数提供了消息机制的网络事件选择功能,当它所登记的网络事件发生时,应用程序相应的窗口会收到一个消息,消息中指明了所发生的网络事件以及与该网络事件相关的一些信息。
连接建立之后,即可调用Winsock提供的函数来发送和接收数据,进程结束时,则关闭两个套接字。
2.2 数据交互
通讯模块主要与框架、在线两个模块以及控制器存在数据交互。图3所示是其通讯模块与组态软件的其它模块及控制器之间进行数据交互的流程图。其中,通讯模块发送给框架窗口的消息主要有三项功能:一是通知在线模块读取控制器返回的应答数据;二是在通讯中出现异常时,返回错误信息;三是在通讯出现超时时,返回超时信息。
2.3 数据传输协议
TCP/IP协议族的核心部分是传输层和网络层。传输层主要为应用程序提供端到端的通信,TCP/IP协议族有两个互不相同的传输协议,即TCP(传输控制协议)和UDP(用户数据报协议)。
TCP是一种面向连接的协议,它可给用户进程提供可靠的全双工的数据通信,其所做的工作是把应用程序交给它的数据分成合适的小块交给下面的网络层,同时确认接收到的分组,并提供流量控制、设定超时及重传等机制。由于TCP提供有高可靠性的端到端的通信,因此,应用程序可以忽略所有这些细节。
Winsock的Nagle算法会降低小数据包的发送速度,因此应当定义一种数据结构,以将发送的数据按照这种数据结构以字符型ASCII发送,客户端接收到服务器传来的数据,按照这种数据结构解析数据,这样做可以减少小数据包的数目,避免协议使用Nagle算法。此外通过消息响应代替轮询也是提高传输实时性的一种措施。
2.4 阻塞的预防及处理
TCP/IP协议本身的滑动窗口控制可以有效的防止阻塞的发生。假设服务器和客户端的收发缓冲区大小为100 K字节,服务器每发送一个大小为80 K字的数据包,客户端接收到这个数据包后,将返回一个应答,应答中包含有下次服务器能够发送的最大的字节数,即下次服务器只能发送大小不能超过20 K字的数据。按照这种控制方法,TCP/IP可根据滑动窗口的大小控制发送的速度,滑动窗口大,则发送的数据量大,滑动窗口过小,则发送的数据量也会减小,这样即可以防止阻塞的发生。
该通讯模块中使用的防阻塞方法是在同步方式中采用select函数来检查接收发送缓冲区的读写可用状态。服务器端发送数据前,应先检查服务器的发送缓冲区是否可写,如不可写,说明发送缓冲区己经写满,需要等待发送缓冲区有剩余空间时再发送,以避免阻塞。同样,客户端在读缓冲区数据前,也应先检查一下缓冲区是否可读。如果发送缓冲区一直不可写,那么可能是因为网络断开,或者网络负载过大,使数据不能发送出去。
设置一个超时时限,可以阻塞发生时,当发送缓冲区不可写的状态超过设置的超时时间,系统则重新建立一个连接。
将这种方法和TCP/IP协议本身的防阻塞控制结合使用,可以有效地防止阻塞的发生。
3、通信模块的实现
3.1 实现思路
为了实现与控制器之间的异步通讯,通讯模块的总体设计如图4所示。
首先,由主线程调用外部接口函数以建立连接,同时,创建发送和接收线程,以分别用于数据的发送和接收。
当要发送数据时,主线程调用外部接口函数来发送数据。该函数先将待发送的数据填充到通讯模块的发送缓冲区中,然后通知发送线程,并由发送线程负责将发送缓冲区中的数据发送出去。
当数据发送成功后,可由发送线程发送消息,通知接收线程准备接收数据。
当有应答数据到来时,接收线程将接收数据并将数据放入通讯模块的接收缓冲区。接收完后,接收线程将发送消息以通知主线程读取应答数据。
主线程接到通知后,将调用外部接口函数接收数据。该函数可将通讯模块的接收缓冲区中的应答数据复制到应用程序指定的缓冲区中。
数据的发送和接收交替进行,就可以完成特定的 *** 作。
3.2 模块封装
通过动态链接库技术可以提供一种方便、快捷的资源共享途径。这实质上是一些函数、数据和类集合成的可执行模块。通信模块采用动态链接库形式,可以在实现同一台机器上的多个工程师站组态软件进程的同时与多个控制器进行通讯。
将通信模块中套接字的建立、端口的绑定、数据的接收和发送封装到动态链接库中,同时屏蔽一些 *** 作细节,这样的方法可以方便地被其它程序所调用,更易于程序维护和移值,也方便将来程序的升级。
根据窗口句柄发送消息至该窗口,然后通知应用程序有数据到达。最后,还需要在函数前面使用extern“C”_declspec(dllexport)关键字,以使该PEI数能够被其它程序所调用。函数的参数分别为端口号和应用程序的句柄。在应用程序中,只需要调用该函数,就可以开启TCP/IP服务。按照同样的方法,也可以封装连接服务函数和发送数据函数。组态软件的在线等模块通过调用这些导出函数,就可以完成与控制器的通讯,而不用考虑具体的通讯细节。具体的通讯细节可在这些导出函数中实现。
4、结束语
在基于TCP/IP协议网络通讯的基础上,针对状态监测中数据传输的间歇这一特殊性,提出了一种基于事件驱动的网络通讯模块的设计方法,并将这种方法封装到动态链接库中,然后通过函数接口与应用程序交互。由于该通讯模块是以动态链接库形式给出的,编程者可以不需要深入了解TCP/IP协议以及Socket高级编程,而中需简单地调用通讯模块中的函数,即可实现局域网中数据的传输。本文所介绍的通信模块的设计方法目前已经实现,其可行性也得到了验证,并已应用在实际的组态软件开发项目中。
责任编辑:gt
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)