- UID
- 1023166
- 性别
- 男
- 来自
- 燕山大学
|
随着信息化的不断发展,在工业自动化、电力设备、通信管理、智能终端、智能小区等领域,对数据采集的实时性、可靠性的要求也不断地提高。以往传统的单片机 加采集卡的数据采集装置已经不能满足人们使用的要求。随着采集卡的采集频率不断地提升,其所属平台的工作频率也应跟上时代的步伐。同时,在某些情况下,装 置的操控人员不可能到工作现场去执行,所以有必要对采集装置进行远程监察和控制。在各种设备的通信方式中,由于以太网具有速度快、通用性好、扩展性强等优 点,已13渐成为设备之间进行通信的主要方式。本文提出了基于ARM的高速数据采集装置远程监控系统,在实现对数据的高速采集的同时,能保证数据的可靠性 和实时性,并对各帧数据嵌入时间标志为后续数据处理做好准备,最后能将数据及时准确地存储到移动存储设备和服务器上。该装置包括现场监控模式和服务器监控 模式。
1 系统简介
本装置由硬件和软件两部分组成,如图1所示。系统硬件由高速数据采集平台和采集模块构成。采集模块根据设计要求,采用DMM一32一AT采集板。采集平台 采用ATMEL公司A791RM9200作为主控芯片,附带16 kB的SDRAM和128 kB的ROM。该芯片融合了ARM920T ARM Thumb处理器,当工作频率为180 MHz时性能高达200 MIPS。带有10/100 MB Base—T型以太网卡接口,USB 2.0全速(12 Mbps)主机/设备接口。内含内存管理单元MMU,含有调试通道的内部仿真器,便于开发调试。由于AT91RM9200具有功能全、功耗低和工业级等优 点,可以使系统能运用到各种环境中。
系统的下位机软件选择嵌入式Linux操作系统。嵌入式Linux是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统运行的一种操 作系统,它既有无限的开放源代码资源,又有嵌人式操作系统的特性。通过对内核的重新配置、编译,即可将其移植到Aqgl RM9200中;再建立BootLoader和文件系统,形成基于ARM的嵌入式Linux操作系统,最后在此平台上开发运用程序,实现装置的各个功能。
2 TCP/IP协议
在因特网上,TCP/IP协议每时每刻保证了数据的准确传输。参考开放系统互连(OSI)模型,TCP/IP通常采用一种简化的四层模型,分别为:
① 应用层。网络应用层要有一个定义清晰的会话过程,如通常所说的Http、Ftp、Telnet等。在本系统中,下位机系统传递来自Ethernet和数据终端的数据,应用层只对大的数据报进行打包拆包处理。
② 传输层。传输层让网络程序通过明确定义的通道及某些特性获取数据,如定义网络连接的端口号等,实现该层协议的传输控制协议TCP和用户数据协议UDP。TCP服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等,在本系统中使用TCP数据报协议。
③ 网络层。网络层让信息可以发送到相邻的TCP/IP网络上的任一主机上,IP协议就是该层传送数据的机制。同时建立网络间的互连,提供ARP地址解析协议,从而实现从IP地址到数据链路物理地址的映像。
④ 链路层。由控制同一物理网络上的不同机器间数据传送的底层协议组成,实现这一层的协议并属于TCP/IP协议组。在本系统中这部分功能由ARM控制网卡芯片DM9161E实现。
在本系统中,利用TCP/IP协议中的TCP(传输控制协议)、IP(网络报文协议)、ARP(地址解析协议)及简单的应用层协议成功地实现了ARM装置和服务端的网络互联。既提高了数据传输的速度,又保证了数据传输的正确性,同时也扩展了数据传输的有效半径。
3 下位机的通信实现
下位机作为客户端,它和服务器的TCP/IP通信是通过对套接字编程实现的。套接字是网络通信的基本操作单元,最早是作为BSD规范提出来的,现已成为 Linux操作系统下TCP/IP网络编程标准。套接字提供了不同主机间进程双向通信的端点,这些进程在通信前各自建立一个Socket,并通过对 Socket的 写操作实现网络通信功能。下文将讨论的Winsock也是一个用于Windows系列操作系统的Sockets版本 。
在Linux提供的3种套接字中,本文选择流式套接字。流式套接字是最常用的套接字类型,其传输特点为:面向链接、无差错、发送先后顺序一致、包长度不限和非重复的网络信息包。TCP/IP协议簇中的TCP协议使用此类接口。下位机与服务器通信实现如图2所示。
① Socket()函数:用于创建一个套接字描述符。
#include<sys/types.h>
#include<sys/soc ket.h>
Socket
— ID=socket(AF_INET,SOCK_STREAM,0);
ff PF—INET OR AF—INET Intemet IP Protocal SOCK—STREAM选择流式套接字
② Connect()函数:用于与远端服务器建立一个TCP连接请求。
Status=connect(Socket—ID,(struc sockaddr})&Server—Addr,sizeof(struct sockaddr));
∥ 一定要指定服务器的IP地址和端口号,可带参数运行程序时指定,也有默认的lP和端口号
if(status!= 一1)∥ 一1:连接过程出错
{.… ..}
③ Write()函数:从套接字缓冲区写数据。
int Net— Send— SysConfig(int Conn—ID,char Cmdname)
∥向服务器反馈工作状态即执行服务器下达的命令情况
∥Conn—ID为已经建立的套接字描述符
{
status=write(Conn—ID,sendbuff,len);
∥向服务器发送信息
}
④ Read()函数:从套接字缓冲区读取数据
int Receive_ Command(int Conn—ID)
{…
return len=read(Conn—ID,NetBuf,REC—BUFF_SIZE);
∥成功返回实际收到的字节总数,出错返回一1
}
⑤ Close()函数:用于关闭一个套接字描述符。
close(Socket—ID); //关闭连接下位机的开发都是在Linux环境下用交叉编译器ARM.Linux—gcc编译通过。 |
|