基于ARM与GPRS技术的SCADA系统在风光电厂中的应用
太阳能和风能是公认的洁净资源,对环境不产生任何污染,是21世纪能源发展战略的重要选择。随着风光互补发电系统应用范围的不断扩大,对风光互补发电系统的性能要求也越来越高。
通常应用于风光发电厂的监督控制与数据采集系统SCADA(Supervisory Control And Data Acquisition)一般都是由电力通信专网来保障其通信。但由于风光电厂在地理位置上的特殊性、多样性(通常在边远偏僻地区),使得某些通信网无法胜任SCADA的要求[1]。
通用分组无线业务(GPRS)是GSM网络的升级,通过在GSM网络上增加SGSN和GGSN两种数据交换节点设备以及一些更新软件来实现,GPRS网络中的数据传输以数据分组的形式传送。在国内,移动通信网络目前已基本覆盖全国所有地区,因此利用技术上较为成熟的GPRS无线网络,可对风光发厂的各个发电站进行实时远程监测与控制,这对提高整个风光电厂的性能具有实际意义。
1 系统组成
整个风光电厂的SCADA系统由风光发电站的状态参数采集部分和数据处理及传输两部分组成。本文重点介绍数据处理及传输部分。风光电厂SCADA系统如图1所示。
通过CAN总线与CAN总线适配器的连接,将各个风光发电站的状态参数传输至基于LPC2214的嵌入式系统,数据经处理后由GPRS通信模块MC39i输出,并通过GPRS网络和Internet将数据传输至监控中心。反之,监控中心也可以将各种操作指令传送至控制终端,以控制风光发电站的运行。本系统的核心部分为"嵌入式GPRS通信模块"的实现[2]。
本系统使用ARM7核微处理器LPC2214,并适当对系统存储资源进行扩展,通过移植嵌入式操作系统μC/OS-Ⅱ来管理整个系统的运行。系统所使用的GPRS模块MC39i由西门子公司生产,具有使用方便、接口电路简单等优点[3]。GPRS虽支持TCP/IP业务,但因为MC39i没有嵌入TCP/IP协议和PPP协议,所以需要在基于LPC2214的嵌入式系统中实现TCP/IP协议和PPP协议,否则系统无法使用GPRS网络的数据分组业务。
2 CAN总线接口电路设计
SJA1000与LPC2214之间的接口电路如图2所示,主要包含:LPC2214最小系统(未画出)、CAN通信控制器SJA1000、CAN总线驱动器82C250和高速光电耦合器6N137。LPC2214控制SJA1000的初始化以及对风光发电站状态参数的接收和发送。其中,SJA1000的AD0~AD7连接到LPC2214的P2口(DATA0~DATA7),/CS为0时,LPC2214选中SJA1000。SJA1000的/RD、/WR、ALE分别与LPC2214的对应引脚相连,/INT接LPC2214的P0.1脚(外部中断0),用于中断访问SJA1000。
SJA1000的TX0、RX0通过高速光耦6N137后与82C250的TXD和RXD连接,这样可较好地实现本节点在CAN总线上的电气隔离,从而增强CAN总节点的抗干扰能力。要注意光耦部分电路采用的两个电源VCC和VDD必须完全隔离,否则此光耦就失去了意义。本系统中的电源隔离采用了小功率的电源隔离模块实现。
另外,通过在82C250的CANH和CANL引脚之间串连60 ?赘的电阻以消除电路中信号反射等干扰。CANH和CANL与地之间并联两个30 pF的小电容,可滤除总线上的高频干扰和一定的电磁辐射。另外,在两根CAN总线输入端与地之间分别接了一个防雷击管,当两端输入端与地之间出现瞬变干扰时,通过防雷击管的放电可起到一定的保护作用。
3 基于μC/OS-Ⅱ环境的多任务设计
3.1 μC/OS-Ⅱ操作系统在ARM7核上的移植
移植是使一个实时内核能在其他微处理器上运行,也就是为特定的CPU编写特定的代码。因为μC/OS-Ⅱ在读/写CPU寄存器时,只能通过汇编语言来进行,因此在使用μC/OS-Ⅱ时,针对具体的CPU,用户需要用汇编语言编写与CPU硬件相关的代码。
根据μC/OS-Ⅱ的要求,移植μC/OS-Ⅱ到一个微处理器的体系结构上需要提供三个文件:在C语言头文件OS_CPU.H中,要定义与编译器无关的数据类型;定义所使用的堆栈数据类型以及堆栈的增长方向;定义一些有关ARM核的软中断。在C程序源文件OS_CPU_C.C中,主要是μC/OS-Ⅱ任务堆栈初始化函数;在汇编程序源文件OS_CPU_A.S中,主要是时钟节拍中断服务函数、中断退出时的任务切换函数以及μC/OS-Ⅱ第一次进入多任务环境时运行最高优先级任务的函数。
3.2 系统任务设计
μC/OS-Ⅱ要求在其上运行的应用软件"任务化",所以需要按μC/OS-Ⅱ的任务编写规范设计系统应用任务。按任务优先级从高到低设计如下[4]。
Task0:完成系统各部分(包括MC39i)初始化工作后,采用时间片的方式进行PPP数据帧的接收,并完成该数据帧的解析。
Task 1:风光发电厂各发电站状态参数的读取。
Task 2:UDP数据包的接收处理。
Task 3:TCP数据包的接收处理。
Task 4:ICMP数据包的接收处理(主要是响应PING)。
Task 5:针对UDP数据报中的命令请求进行响应。
Task 6:针对TCP数据报中的命令请求进行响应(Web服务器功能)。
系统任务之间的通信如图3所示。
3.3 IP数据包解析模块软件设计
IP协议是TCP/IP协议的核心,也是网络层中最重要的协议,IP层接收由更低层发来的数据包,并将其发送到更高层--TCP或UDP层;反之,IP报也把从TCP或UDP层接收来的数据包传送到更低层,并最终通过TCP/IP网络进行无连接传送数据报。
本系统向监控中心传送的数据,需先进行TCP/IP协议的处理,即要求LPC2214实现TCP/IP协议。其中IP数据包的封装及发送是通过函数ip_send( )实现的,通常此函数是在PPP协议处理函数中被调用。风光发电站各状态参数在被封装为UDP数据包以后,调用此函数进行IP协议格式数据封装,即在IP数据报头的数据结构中添加IP报头信息(其中包括计算IP报头的校验和值)。在封装好IP包之后,要设置此IP报头数据(20 B)的"发送结构"Send_Ptr,从而与UDP数据报构成一个发送数据链。
发送IP报之前要先得到"发送信号量"SendFlag,否则只有挂起当前任务等待此信号量。一旦得到发送信号量,对该IP报进行PPP协议数据格式封装,之后再启动MC39i发送数据,数据发送完毕后要及时释放发送信号量。
具体程序如下:
Uint8 ip_send(struct Send_Ptr *TxdData,uint8 * dest_ip,uint8 PROTOCOL)
{//TxdData为存放待传输数据首指针;dest_ip为目的IP地址首指针;IP包中的下一层
//客户协议类型(UDP、TCP)
uint16 CRC;
uint8 Ip_Head[20];
struct Send_Ptr TxdIpData;
uint8 err;
static uint16 FrameIndex=0;
Ip_Head[0]=0x45;
…… //进行TCP/IP协议中的IP数据包
//报头设置
Ip_Head[19]=dest_ip[3];
CRC=CreateIpHeadCrc(Ip_Head); //对IP首部中每16位
//进行二进制反码求和
Ip_Head[10]=(CRC&0xff00)>>8;
Ip_Head[11]=CRC&0x00ff;
TxdIpData.STPTR=TxdData;
TxdIpData.length=20;
TxdIpData.DAPTR=Ip_Head;
OSSemPend(SendFlag,10,&err);
//获取μC/OS-Ⅱ操作系统当前的发送权(得到"发
//送信号量"SendFlag)
if(err==OS_NO_ERR) //没有得到发送权(发送信
//号量SendFlag),挂起任务,等待
{
if(ip_mac_send(&TxdIpData,dest_ip))
//按照PPP协议打包数据,并启动MC39i
//通信模块进行传输数据
{
OSSemPost(SendFlag);
//发送成功,释放"发送信号量",并返回"1"
return(1);
}
else
{
OSSemPost(SendFlag);
//发送失败,释放"发送信号量",并返回"0"
return(0);
}
}
else
return (0);
}