基于ARM的城市供水站分布式监控系统
下位机ARM扩展了网络RJ-45网络接口,使上下位机之间实现TCP/IP通信变得更加简单。
每个供水站的下位机在将数据处理完毕之后,通过RJ-45网络接口与上位机相连,多处下位机通过路由器接入网络,然后再与上位机进行通信。其结构图如图1。
2供水站分布式监控系统的软件设计
供水站分布式监控系统的软件设计包括下位机地址映射、下位机数据处理及显示、数据通信以及上位机程序的实现。
2.1 下位机地址映射与实现
下位机搭载WinCE操作系统,ARM数据采集是通过GPIO来操作相应的寄存器,WinCE系统则将GPIO的实地址映射到虚拟地址空间,通过对虚拟地址空间的操作来完成对GPIO及其他片内资源的控制。要在WinCE中操作ARM中的GPIO,就必须按照BSP中的基地址找到相应的虚拟地址。这就需要对其进行地址映射。图3为地址映射原理图。本文引用地址://m.amcfsurvey.com/article/151721.htm
地址映射的方法有2种:一是流驱动方法,即在流驱动中将物理地址进行相应地映射,将流驱动添加到底层映像中来实现。另一种方法是在外部WinCE程序中将物理地址与虚拟地址进行相应地映射,只需对外部程序进行操作,对内核没有影响,由于下位机数据采集部分并不复杂,所以采用第二种方法进行实现。
要实现地址映射,首先将所用到底层驱动中的寄存器作为一个类定义到WinCE嵌入式程序中去。然后把物理地址与虚拟地址用VirtualAlloc和VirtualCopy函数进行映射操作。VirtualAlloc函数用于在当前进程的虚拟地址空间中保留或者提交空间,在保留时以64 KB为单位,提交时以4 KB为单位。VirtualCopy函数则用来绑定物理地址到静态映射虚拟地址。VirtuaAlloc+VirtualCopy就可以将内核到当前进程进行映射,让当前程序找到对应的虚拟地址[5-6]。
把映射后的地址作为一个新类进行定义,就可对寄存器进行操作,如图3。
2.2 下位机数据处理及显示
下位机采集数据后采用数字模块进行显示,当数据超出上下限的时候,下位机中的蜂鸣器就会进行报警,通知现场操作人员。
数字显示模块采用重绘的形式,预先定义好相应的数字显示值,在接收到数据后对数字显示模块进行相应地重绘。数字显示模块作为一个插件加入到WinCE程序中,在主函数中调用模块中的显示函数来实现数字的显示。
下位机报警功能采用ARM扩展的蜂鸣器实现,蜂鸣器由PWM进行控制。在S3C2440A中GPB0为控制PWM的寄存器,通过地址映射的方法对相应的寄存器进行操作。
首先设置端口GPB0为TOUT0功能,然后设置预分频和分割值,计数器的输入时钟(CCLK)频率为:PCLK/(预分频+1)/分割值。预分频值和分割值分别由TCFG0、TCFG1来确定。接着设定初始值TCMPB3和TCNTB,由于计数器的输入时钟为PCLK/16/8;而rTCNTB0=(PCLK>>7)/freq;并且计数计到最大值的一半时发生翻转。因为计数的基值是由rTCMPB0设定为最大计数值的50%。最后是定时控制器的设定rTCON,TOUT0就产生频率是rTCNTB0,占空比是50%的方波,蜂鸣器就可以被驱动。当数据超限时就调用此函数进行蜂鸣器报警。
2.3 TCP/IP通信的实现
上下位机之间采用客户机/服务器(C/S)形式,下位机作为客户机上位机作为服务器进行通信,TCP/IP通信通过套接字(socket)来实现[7-8]。
下位机利用套接字socket的connect函数向上位机(server)发送连接请求,当连接成功之后,用send函数向上位机发送相应的数据,通信完成后关闭套接字。
上位机通信部分则与下位机相互对应,用套接字socket的bind函数将套接字绑定到本地地址和端口上,并将套接字设置为监听模式,用listen函数来准备接收client的请求,当用accept函数接收到连接请求后,调用recv函数来接收相应的数据,其流程如图4所示。
评论