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的写时序图。
图4 sja1000写时序图
系统中can通讯协议采用扩展帧格式,29位id定义见图6。
图6 can通讯协议扩展帧id
其中,命令码是来自不同模块的报文的代号,占id的高12位,范围为0x000-0x0FFf,包含同一组信号的报文具有唯一的命令码。源地址和目标地址取决于控制器地址,主控制器为0x01,网侧变流控制器为0x02,电机侧变流控制器为0x03,变桨偏航控制器为0x04。id的低9位分别为后续帧标志和后续帧帧数,若后续帧标志为1,则表示该报文还有后续帧需要传输。#p#分页标题#e#
(2) 基于qt/e的图形界面应用程序设计。本系统中主控制器图形界面应用程序基于linux平台的qt/e实现。图形界面应用程序主要功能有两个:一是从can 总线接收风电机组运行状态信息,并显示给用户,二是判断并处理机组状态信息,通过can接口向各子控制模块发送控制信息。由于本系统中can以多主方式工作,接收来自多个节点的数据,并向多个节点发送数据,因此,在应用程序中要封装不同的报文,还要分析收到数据的信息。
为了提高系统的响应,应用程序采用多线程机制,本系统中设计三个独立线程来处理不同的任务。主线程负责主界面实时数据显示,历史数据查询以及机组状态的逻辑判断和流程控制等。由于数据库的读写是对磁盘文件的直接操作,速度较慢,因此在一独立线程中实现历史数据的写操作,以防止对主线程控制程序的影响,而对于历史数据的查询,现场只在特定情况下用到,仍在主线程中实现。can总线数据的交互比较频繁,为了避免数据的丢失,在一独立线程中完成数据的接收。
5 结束语
目前,风力发电控制技术主要掌握在国外大企业手中,国内机组的控制器主要依靠技术进口,因此,研究并设计有自主产权的机组控制系统有着深远的意义。
参考文献
[1] 叶杭冶. 风力发电机组的控制技术[m]. 北京:机械工业出版社,2006.
[2] 孙大鹏. 双馈风力发电机组电控与安全保护系统设计研究[d]. 北京:华北电力大学研究生论文,2009.
[3] 绕运涛等. 现场总线can原理与应用技术[m]. 北京:北京航空航天大学出版社,2007:242-243.
[4] 储忠,温阳东. 基于s3c2410控制的can总线接口设计[j]. 合肥学院学报:自然科学版,2007,5,2:59-62.
转载请注明出处。