2.2 实现功能
检测装置的软件由两大部分组成:一是实时检测与处理程序,包括了试验参数的设置,对试验状态以及失效数据的保存,对失效数据进行数学分析,打印报表等,检测装置记录的失效数据有失效时间,失效试品号、触点号,触点失效的类型,失效时触点电压以及各触点累计失效次数等;二是通讯程序,接收服务器的参数设置、基本操作,并上传试验状态及失效信息。图2为检测装置的操作界面,菜单项代表了所能实现的所有操作,文本显示区对设置参数、试验状态以及失效发生时的失效信息进行显示。软件采用可视化编程语言VC++6.0嵌入汇编语言的方法实现[4]。
图2 检测装置操作界面
3、集中控制的实现
以太网只定义了物理层和链路层,但目前在传输层和网络层已基本上统一,TCP/IP协议被普遍采用。传输层协议包括UDP协议和TCP协议。无论是基于UDP协议或者TCP协议,都要保证网络传输的一定的可靠性和实时性。由于UDP协议具有实现机制简单、传输效率高的特点,其较多地被应用到高效率的实时系统中。但为了实现传输的可靠性,就需要在应用层采用一些差错控制机制,而这些措施与TCP协议中自带的传输机制非常相似。实际上,在许多实时性的系统中,采用TCP协议也基本可以满足传输时间的要求,还避免了在应用层进行繁琐的处理[5]。因此在本方案中传输层选择使用TCP协议。
应用层的协议目前还没有统一,本文旨在研究一个可广泛适用于多种应用场合和多种应用层协议的通用的通信方案,用户可根据需要选择不同的应用层协议,也可以定义自己的数据包格式。
3.1 套接字(Socket)
TCP/IP网络环境下的应用程序是通过网络系统编程界面套接字Socket(在Windows操作系统下称之为Winsock)来实现的。套接字构成了核心协议的用户视图,通过套接字应用程序可访问通信协议,套接字是网络通信的基本构件。套接字是可以被命名的通信端点,应用程序通过它在网络上发送和接收数据。每个套接字都有其类型,并有一个与之相连的进程。TCP/IP提供3种类型套接字:
1)流式套接字(Stream Scoket)。该接口提供一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作字节流,无长度限制。流式套接字提供了一种可靠的面向连接的数据传输方式,如果想发送大批量数据或想让数据按顺序无重复地到达目的地,流式套接字最为有用。
2)数据包套接字(Datagram Scoket)。该接口提供一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。数据包套接字比较适用于数据包或记录型数据的传输,数据包的发送不能得到保证,而且不能排序到达。
3)原始套接字(Raw Scoket)。该接口允许对较低层协议,如IP、ICMP直接访问,主要用于新的网络协议实现的测试等[6]。
在进行网络开发时,阻塞问题是网络编程中十分重要的问题。由于在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回程序(将控制权交还给程序)。故用这种方式,服务器应用程序将很难同时通过多个建好连接的套接字进行通信。在此系统的应用中,需要实现一台服务器同时和六个套接字进行通信,因此结合对有限硬件资源的考虑,选择了非阻塞类型的套接字,这也是一般协议开发中通常用到的套接字通信方式。
3.2 通信的实现
系统通信采用客户机/服务器模式,利用VC的微软基础类(MFC)进行网络开发,MFC提供了两种类型描述Windows Socket,分别是CAsynSocket和CSocket。其中CAsynSocket类封装了Windows Sockets API,并将与Socket有关的Windows消息转换为回调函数。CAsynSocket处于网络更底层,其使用就更具灵活性,相应要求编程者应熟悉网络底层细节。而CSocket类是CAsynSocket类的派生类,通过MFC中的CArchive类的对象提供了更高层次的抽象,它封装了Socket实现中的许多细节。这里我们采用CAsynSocket类实现系统中“一对多”的数据发送,通过在服务器中建立Winsock空间数组的方式来解决[7]。
首先,构造CAsyncSocket类型的对象,然后利用该对象创建内嵌的Socket句柄。例如:
CAsyncSocket m_listen;
m_listen.Create(nPort);//服务器指定端口
若是客户端,需要用CAsyncSocket::Connect()函数连接服务器端的套接字。