基于Visual C++与OpenGL 的风电机组仿真系统研究*

2013-12-23 05:47尹海峰库祥臣
组合机床与自动化加工技术 2013年6期
关键词:圆台控件对话框

尹海峰,库祥臣

(河南科技大学 机电工程学院,河南 洛阳 471003)

0 引言

相对于传统发电行业,风力发电行业受到风资源分布的限制。风电机组受恶劣环境的影响比较厉害,时常在变速变载的条件下工作,受到风产生的扭矩、弯矩和轴向推力的作用,其部件容易发生变形,产生附加的结构应力,使得风电机组齿轮箱、轴承、发电机等关键设备经常出现故障。对风电机组进行画面实时监控可以大大降低维修费用与停机时间,减少不必要经济损失。本文仿真系统采用OpenGL技术,在Windows 环境中以Visual C++为开发工具进行开发。OpenGL 具有绘制三维图形的各项功能,它可以与Visual C++紧密结合,可以实现有关计算和图形算法,实现三维模型的可视化[1]。用OpenGL来实现三维显示,具有简单、直观、高效率等特点,它具有强大的三维建模功能及帧缓存动画技术,并且可以对模型进行光照、材质、纹理、反走样等处理,使得动态仿真过程呈现逼真三维立体显示。

1 建立一个OpenGL 控件

OpenGL 是一个独立于窗口的图形库,而图形最终是在窗口系统里绘制出来的,我们可以建立一个通用的OpenGL 控件,用来绘制机组各部件图形,当引入这个控件时,控件会自动初始化OpenGL[2]。引入控件还有一个好处,它可以在对话框中显示Open-GL 渲染的画面,我们可以在对话框中添加其他控件,并在ClassWizard 中为对话框类添加事件响应函数,实现与图形的交互控制。

(1)创建一个MFC ActiveX Control 应用程序框架。在StdAfx.h 头文件中加入与0penGL 相关的头文件和连接,在“Project”中添加静态库“opengl32.lib,glu32.lib,glaux.lib,glut32.lib”,在ClassWizard 中实现消息响应函数的设置,最后为COpenGlView 添加保护型变量HDC m_hDC;HGLRC m_hRC;

(2)设置像素格式。它反映了0penGL 的绘制风格、颜色模式、颜色位数等。正确设置像素格式:①填充PIXELFORMATDESCRIPTOR 结构;②用ChoosePixelFormat 函数在硬件所支持的像素格式中选出与给定的像素格式最匹配的一个设备描述表(Dc);③用SetPixelFormat 函数将其设为当前像素格式[3]。

(3)建立着色描述表(Render context)并当前化着色描述表。在进行OpenGL 绘制之前,必须先建立着色描述表并将其当前化,这样绘制的物体才能显示出来。

(4)设置坐标变换方式。每次窗口创建或改变大小的时候。都要重新设置视口大小,因此我们需要在OnSize()中进行视口设置。

2 风电机组三维模型建立

图1 风电叶片

在风力发电仿真中,模型要能准确的反映机组的结构特点、零部件的几何相对关系,因此要对每个运动部件进行单独的几何建模,风电机组整体结构可分为:叶片、轮毂、低速轴、高速轴、固定支架、齿轮箱、发电机、控制柜、偏航电机、塔架几部分。

2.1 叶片模型建立

风力发电机叶片专用翼型已成系列,我们可按其常规外形进行曲面造型。OpenGL 中的GLU 提供了一个NURBS 接口,该接口是建立在OpenGL 求值程序函数的基础上,可进行曲面构造。NURBS 能够比传统的网格建模方式更好地控制物体表面的曲线度,从而能够创建出更逼真、生动的模型[4]。以下为u 向p 阶,v 向q 阶的NURBS 曲面的数学表达式:

式中:{Pi}为曲面网格控制点;{wi}为曲面控制点的权因子;{Ni,p(u)},{Nj,p(v)}分别为p 阶和q 阶B样条基函数。

对于风电叶片本仿真系统只需直观、形象的表达其外部结构,不需要严格体现其气动外形结构。可以根据风电叶片凹面弧度及弧长确定所画曲面半径,进而推算出NURBS 曲面的控制点。将控制点储存在ctlpoints[m][n][k]中,再通过调用gluNurbsSurface()函数进行NURBS 曲面绘制。然后根据风电叶片的轮廓边界,将边界坐标存储在edgePt[r][l]中,调用函数gluBeginTrim()进行定义修剪。修剪曲线为逆时针方向,保留修剪曲线内部部分。

2.2 轮毂模型建立

风电轮毂部件可划分为两部分进行建模,前半部分为1/4 椭球,后半部分为圆台形,轮毂模型如图2所示。椭球模型的建立可以从球形入手,实体球面用一个二十面体进行逼近,对二十面体中的三角形进行分割,再通过归一化将顶点移到球面上,通过重复这一分割过程得到一个实体球面,再进行glScale(TYPE x,TYPE y,TYPE z)缩 放 变 换 和glTranslate(TYPE x,TYPE y,TYPE z)平移变换,使得球面X 轴半径为Y、Z 轴的2 倍,向X 轴正方向平移1/2X 轴半径,然后添加一个剪裁面:

可得出1/4 椭球,椭球的剪裁面半径为:y1=y* sinπ/3,其中x = 2y = 2z;由椭球剪裁面半径可知,圆台的上底面半径为y1,为保证椭球到圆台的平滑过渡,选着适当的夹角θ,可推算出下底面半径y2= y1+H* sinθ,其中H 圆台高度。圆台的绘制可将其划分为许多四边形网格,从下至上划分为M 个环形面,每个环形面划分为N 个四边形网格,每个网格上的坐标为:

其中0 ≤i <N,0 ≤j <M,M = N-N* y1/y2;i 为网格的第i 列,j 为网格的第j 行。再通过以下流程绘制出圆台部分,以1/4 椭球坐标系为基准,通过glRotatef()绕Z 轴旋转与glTranslatef()向X 轴正方向平移,经过两次模型变换将两部件契合在一起。

图2 轮毂

图3 圆台绘制流程图

2.3 其他各部件模型建立

由于其他几个部件皆可用三角形网格法和以上圆台的建模方法进行构建,我们将在这里统一讲述。三角网格法是OpenGL 绘制不规则图形常用的方法之一。其绘图流程如下:首先确定物体表面各个顶点坐标,将坐标存储在vertices[]数组中;然后,遵循环绕规则将物体表面划分为一个个环绕在物体表面的三角形,将其环绕顺序存储在round[]数组中,最后调用函数进行绘制:

按照以上两种方法构建出风电机组其余各部件的三维模型。最后,通过OpenGL 中的gltranslatef()、gl-Rotatef()、glscalef()、glViewPort()等函数实现模型的旋转、平移、缩放、视口变换、正交投影和透视投影等操作[6],进行各部件的合理拼装,得出完整的风电机组三维模型。由于0penGL 具有很强的渲染能力,我们可以对模型进行光照、材质、纹理、反走样、雾化等处理,使得模型如同在现实中一样,具有光洁度、纹理、层次感。图4,图5 为完整风力发电机三维模型。

图4 风力发电机概貌

图5 风力发电机内部组件

3 动态仿真实现

3.1 动画显示及界面控制

风电机组动画仿真采用了双缓存技术和显示列表实现动画显示。双缓存技术即采用前后两个缓存,在双缓存模式下,位平面被分为前台缓存和后台缓存。只有前台缓存才被显示,因此当完整的画面在后台缓存中哂出以后,就调用swapBuffer()函数,使其成为前台可见缓存[5]。这样循环往复,隐藏了画图的过程,视频图像可以在人眼察觉不出的时间间隔交替出现,于是看起来所有的画面都是连续的。显示列表的设计能优化程序运行性能,尤其是网络性能,它被设计成命令高速缓存,而不是动态数据库缓存。采用双缓存技术及显示列表实现动画显示可大量减少刷新时间和计算量,使得画面更加流畅。

风电机组要进行刷新操作,首先要在ClassWizard 中为对话框类添加事件响应函数OnTimer(),此函数为一个时钟计时器,设置计时器,每0.01s 响应一次:SetTimer(1,10,NULL);每次响应刷新一下OpenGL 中的画面:

可在ClassWizard 中为对话框类添加事件响应函数OnOutofmemorySlider(),通过修改轮毂及主轴在每次刷新中旋转的角度,实现轮毂及主轴转速的控制;修改机舱绕塔架的旋转角度,来实现机舱随风向变化而产生相应的旋转。该界面主要功能是打开模型、仿真操作、运动控制等,在操作菜单下可以打开“串口通信接收”,提供各参数的实时显示[7]。系统设定不同级别的报警阈值,超出阈值范围会出现相应级别的预警,并在该部位显示出来。

3.2 网络通信及动态仿真

网络通信主要是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行锯析,从而提取出对应的信息,达到通信的主要的目的[8]。

本系统采用基于TCP/IP 协议的Winsock 数据通信,首先在V C++6.0 的应用程序生成向导中:在对话框程序向导的第二步的Windows Socket 选项选中即可自动加载Socket 初始化代码[9]。通信程序由两部分构成,一部分是服务器程序,另一部分是客户端程序。在服务器程序中,添加两个基类为CSocket 的类分别实现Socket 的监听和与客户端的通信。在CListeningSocket 类中,添加函数OnAccept 负责Socket 的监听,当有客户端连接服务器时,执行此函数。在CClientSocket 类中,添加函数OnReceive 和On-Send 负责接收和发送数据。在客户端程序中我们将添加一个基类为CSocket 的类来实现与服务器的连接和通信。在CChatSocket 类中,添加函数OnReceive和OnSend 负责接收和发送数据[10]。在系统界面中打开“串口通信接收”,将机组的振幅、高低速轴转速、机舱转角等数据由服务器端传输到客户端,通过数据处理,将各数据设定为操作界面中的动态参数,从而实现风电机组的动态仿真。

4 结束语

本文采用OpenGL 技术,在Visual C++6.0 环境下,开发的风电机组三维可视化仿真系统,建立了形象逼真的三维模型,实现了风力发电机运行状态的动态仿真,为进一步研究风力发电机在线实时状态监测奠定了基础。

[1]杨艳华,杨维芳,张志华. 基于OpenGL 的铁路轨枕模型的三维可视化研究与实现[J]. 兰州交通大学学报,2011,30(6):35-39.

[2]孙波. OpenGL 编程实例学习教程[M]. 北京:北京大学出版社,2000.

[3]曹自洋,郝矿荣. OpenGL 在机器人三维动态仿真系统中的应用[J]. 计算机应用研究,2004,21(5):200-201,204.

[4]Dave Shreiner,Mason Woo,Jackie Neider,Tom Davis. Open-GL 编程指南[M]. 北京:人民邮电出版社,2005.

[5]王泉国,王孚懋,刘凯. 基于OpenGL 的快速成型实时仿真动画软件的开发[J]. 煤矿机械,2012,33(1):254-256.

[6]王泉国,王孚懋,刘凯. 基于OpenGL 的快速成型实时仿真动画软件的开发[J]. 煤矿机械,2012,33(1):254-256.

[7]孙晓洁,叶桦,费树岷,等. 基于OpenGL 的混凝土泵车智能臂架系统仿真[J]. 科技通报,2011,27(5):686-690.[8]曹衍龙,刘海英. Visual C++网络通信编程实用案例精选[M]. 北京:人民邮电出版社,2006.

[9]孙军文,安妮,王中训. 基于V C++6.0 的网络通信设计[J]. 现代电子技术,2011,34(23):52-55.

[10]刘松,钟子发. 基于对等模式的Socket 网络通信[J].微处理机,2008,29(5):46-50.

猜你喜欢
圆台控件对话框
圆台扰流换热器结构参数优化的数值模拟研究
基于.net的用户定义验证控件的应用分析
正常恢复虚拟机
在学校变革中,构建校长的自主管理能力“圆台”
Bootlace Worms’Secret etc.
What Is Beauty?
关于.net控件数组的探讨
浅谈VB的通用对话框《CommonDialog》控件的使用
现代红木家具鉴赏——十二生肖圆台
基于嵌入式MINIGUI控件子类化技术的深入研究与应用