基于qt/e的图形界面应用程序设计

接口/总线/驱动

50人已加入

描述

1  引言

风力发电机组的控制系统是综合性控制系统,控制系统不仅要监视机组运行参数,对机组进行并网与脱网控制,而且还要根据风速与风向的变化,对机组进行优化控制。CAN总线是一种支持分布式控制系统和实时性控制的串行通信网络。其以多主机方式工作,通信速率可达1mbps。

can总线的上述特点正适用于风力发电机控制系统的独特要求,因此,本文提出一种基于can总线架构的风力发电控制系统。控制系统中各模块之间通过can总线实时交换数据,实现主控系统及各控制节点间的实时通信与数据交换。文章在分析了can协议及can独立控制器sja1000工作原理和读写逻辑的基础上,设计了can接口,给出了硬件原理图,分析了can通讯程序流程及系统中信号和控制指令的通讯帧格式。另外,本文还给出了基于嵌入式qt的应用程序的设计方案。

2  系统结构与功能

本文基于分散控制系统理念,针对双馈型变速恒频风力发电机组设计控制系统。双馈型风电机组控制系统基本结构如图1所示。

CAN

图1  双馈型风电机组控制系统基本结构

主控制器选用32位嵌入式处理器at91rm9200,通过硬件设计扩展外围can接口,实现与其它节点的通信。同时外接带触摸屏的lcd显示器,监控界面利用嵌入式qt设计,对整个机组实时监控。主控制器通过以太网与风电场控制中心通信。变流器控制采用双pwm控制方式,即由两个dsp生成pwm信号,电机侧部分负责电机励磁控制,网侧负责并网控制;两模块均基于tms320f2812设计,通过其自带的ecan接口与主控制器及其它节点通信。变桨控制系统同样基于arm(at91rm9200)设计,扩展can接口实现通信。变桨控制器和变频控制器通过i/o通道采集接收各传感器数据,并进行相关计算与判断,输出控制信号,实现智能分散控制,同时向主控制器发送机组参数并接收主控命令。整体结构框图如图2。

CAN

图2  风力发电机组控制系统整体结构

主控制器位于地面控制柜,变桨控制器位于机舱控制柜,变频控制器分电机侧和网侧两部分,位于地面控制柜。模块与模块之间can总线信号经光电转换后使用光纤连接。

3  CAN接口硬件设计

can是一种基于广播的通讯机制,报文依靠报文标识符来进行识别。can协议支持两种帧格式,不同之处在于标识符域的长度不同,一种被称为can标准帧,支持11bit的标识符长度;另一种称为can扩展帧,支持29bit的标识符。

can接口芯片选用philips公司的can独立控制器sja1000。arm处理器at91rm9200内部集成了外部总线接口ebi,通过此接口与sja1000连接。从sja1000输出的can信号,通过光藕器件隔离后连接到收发器tja1050,收发器的输出与总线连接。

sja1000的地址线和数据线是分时复用的,而at91rm9200的外部数据总线接口ebi的地址线和数据线是相互独立的,因此,需要通过软件编程实现地址的锁存,以达到数据和地址的分时传输。硬件原理图如图3。

CAN

图3 CAN接口硬件原理图

sja1000的数据/地址复用总线直接与arm的ebi数据总线低8位连接,地址锁存信号/ale由arm的a0产生,/cs与/we分别由ncs4和new与a0经或运算后产生。由硬件电路可确定sja1000的物理地址是0x50000000。

风电场环境恶劣,为了保证控制系统准确传输数据,增强can总线节点的抗干扰性能, sja1000控制器经过高速光藕6n137隔离后与收发器tja1050相连,实现总线上各can节点之间的电气隔离。采用dc-dc电源隔离模块dcr010505,实现光耦两端的电源隔离。canh接总线的高电平端,canl接总线的低电平端。由于风电机组垂直距离较高,容易受雷电的影响,在两根can总线输入端与地之间分别并联一30pf的电容和一防雷击管,以滤除高频干扰和防止浪涌电压。

4  CAN接口通讯软件设计

对于can的通讯程序,采用分层处理的方法,包括驱动层和应用层。因此,can接口软件通讯包括两部分:can驱动程序和can应用程序。驱动程序负责完成linux内核与sja1000之间的数据通讯,即linux内核设置sja1000的控制寄存器,读写sja1000接收、发送缓冲器。应用程序部分负责完成用户空间和内核空间的数据交换,以及分析从sja1000接收到的报文,封装要发送报文。接收的报文主要包括来自变流模块和变桨偏航控制模块的机组状态信息及风速风向、各类温度和转速信号等。发送的报文包括下发给变流模块和变桨偏航控制模块的控制指令及控制参数。

4.1 can驱动程序设计

(1)底层驱动程序总体设计。在linux中设备驱动程序是由一组数据结构和函数组成的,它包含设备服务子程序(如open、read、write、close、ioctl等)、初始化函数can_init()和中断处理程序can_interrupt()。

在linux加载can驱动时调用can_init(),向操作系统注册设备,同时完成can总线波特率的设置,id过滤器的设置,清空接收和发送缓冲区,开启中断等工作,完成初始化后,退出复位模式,进入正常的工作模式。

read从接收缓冲区读取数据;write向发送缓冲区写人数据;release关闭can 控制器;ioctl向can 控制器发各种操作命令,包括设置sja1000总线波特率、id过滤器等;open 打开can 控制器,并使用函数request_irq()向系统申请中断,并设置中断处理程序为can_interrupt(),当sja1000内部中断寄存器(ir)的任意位置为1时,int引脚低电平有效,调用其中断处理函数can-interrupt(),在该函数中读取中断控制寄存器,判断中断原因(接收中断、发送中断、错误中断、数据溢出中断、唤醒中断),从而调用相应的服务子程序。

(2)sja1000读写逻辑分析及设计。由于sja1000的地址线和数据线是分时复用的,需要通过软件编程模拟地址锁存信号,以达到数据和地址的分时传输,因此,在程序设计中,要考虑sja1000的读写时序。图4为sja1000的写时序图。

CAN

图4  sja1000写时序图

4.2 写时序逻辑

通过分析写时序,可知,sja1000的写数据/命令过程分为以下两步:

(1)将sja1000的ale引脚信号拉高,然后往复用总线上送地址信号,待数据稳定后,拉低ale信号,在ale引脚产生下降沿,进行地址锁存。

(2)将cs引脚信号拉低,并拉低wr信号,打开写允许;然后往复用总线上送数据信号,待数据稳定后,拉高wr信号,使wr引脚产生上升沿,进行写操作,将数据写入sja1000目标寄存器。

linux系统中,不能直接访问物理地址,而是先要映射到内核空间中,通过虚拟地址去访问。由硬件电路可知,sja1000的物理地址是0x50000000,最大空间为为108个字节(pelican方式)。sja1000写程序如下:

addr = ioremap(0x50000000, 0x80);

void write_sja1000 (unsigned int data, unsigned int reg) {

writeb (reg, addr+1);

writeb (data, addr);

}

其中,ioremap()为物理地址到虚拟内存的映射,addr为地址映射后得到的内核空间虚拟地址;reg是sja1000内部寄存器地址;data是要写的数据。writeb(reg, addr+1)模拟ale锁存地址,发地址信号reg,addr+1将使地址线a0产生高电平,由硬件设计电路知道这将使地址锁存信号ale拉高;然后,reg被送到了复用总线上。writeb (data, addr)发送数据到地址reg,addr将使a0拉低,reg被锁存;然后,data被送到复用总线上,也就写到了被锁存的地址reg所指空间。

4.3 读时序逻辑

图5为sja1000的读时序图。

CAN

图5  sja1000的读时序

通过分析读时序,可知,sja1000的读数据/命令过程分为以下两步[4]:

(1) 将sja1000的ale引脚信号拉高,然后往复用总线上送地址信号,待数据稳定后,拉低ale信号,在ale引脚产生下降沿,进行地址锁存。

(2)将cs引脚信号拉低,并拉低rd信号,打开读允许;然后往复用总线上送数据信号,待数据稳定后,拉高rd信号,使rd引脚产生上升沿,进行读操作,将sja1000目标寄存器的数据读回。

sja1000读程序如下:

int read_sja1000 (unsigned int reg) {

writeb (reg , addr+1);

readb ( addr);

}

readb(addr)从地址reg读取数据。addr将使a0拉低,reg被锁存;然后,通过复用总线读取被锁存的地址reg所指空间数据。

4.4 can通讯应用程序设计

(1) can数据报文格式。风电机组控制系统中,各控制模块之间需要传输的信号很多,包括模拟量、数字量以及控制指令和控制参数等。模拟量包括风速风向,电压电流,功率,电网频率,各类转速和温度等,数字量包括机组的各类状态信息,如并网状态,电源状态等及各类故障信息。这些信号均根据can协议封装为报文,以数据包的形式发送。每个报文可由一个或一组信号组成。各个报文需要定义其帧格式,包括数据id,优先级,数据长度等。每个模拟量均定义为两个字节长度,数字量则占1位。为了提高传输效率,多个数字量组合为一个报文来发送。

系统中can通讯协议采用扩展帧格式,29位id定义。

其中,命令码是来自不同模块的报文的代号,占id的高12位,范围为0x000-0x0FFf,包含同一组信号的报文具有唯一的命令码。源地址和目标地址取决于控制器地址,主控制器为0x01,网侧变流控制器为0x02,电机侧变流控制器为0x03,变桨偏航控制器为0x04。id的低9位分别为后续帧标志和后续帧帧数,若后续帧标志为1,则表示该报文还有后续帧需要传输。

(2) 基于qt/e的图形界面应用程序设计。本系统中主控制器图形界面应用程序基于linux平台的qt/e实现。图形界面应用程序主要功能有两个:一是从can 总线接收风电机组运行状态信息,并显示给用户,二是判断并处理机组状态信息,通过can接口向各子控制模块发送控制信息。由于本系统中can以多主方式工作,接收来自多个节点的数据,并向多个节点发送数据,因此,在应用程序中要封装不同的报文,还要分析收到数据的信息。

为了提高系统的响应,应用程序采用多线程机制,本系统中设计三个独立线程来处理不同的任务。主线程负责主界面实时数据显示,历史数据查询以及机组状态的逻辑判断和流程控制等。由于数据库的读写是对磁盘文件的直接操作,速度较慢,因此在一独立线程中实现历史数据的写操作,以防止对主线程控制程序的影响,而对于历史数据的查询,现场只在特定情况下用到,仍在主线程中实现。can总线数据的交互比较频繁,为了避免数据的丢失,在一独立线程中完成数据的接收。

5  结束语

目前,风力发电控制技术主要掌握在国外大企业手中,国内机组的控制器主要依靠技术进口,因此,研究并设计有自主产权的机组控制系统有着深远的意义。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分