前言 多个世纪以来,风力涡轮机与水力机械一样,作为动力源取代人力和畜力,在风力发电的发展中发挥了重要作用生产率。现代机电动力的广泛应用和20世纪50年代中东油田的发现减缓了风力涡轮机的发展。70年代初,因“石油危机”,出现能源短缺问题。人们意识到常规矿物能源供应的不稳定性和局限性,因此寻求清洁和可再生能源已成为现代世界的一个重要问题。风能作为一种可再生、无污染的自然能源,再次引起人们的重视。现在希望通过这次风力发电机的demo,能够近距离的把风力发电机的各种功能展示给大家,让大家更好的了解风力发电机。本demo使用HTforWeb产品的轻量级HTML5/WebGL建模方案。演示链接:hightopo.com/demo/fan3d-...风扇主要功能介绍效果: 周边环境功能: 1.风速值。 一个虚拟的风速值,风速值会影响风力机的发电效率和变桨系统的变化。 2.统计数据。** 环境温度、车厢温度、变速箱温度、风速的图形百分比会随时间变化。 3。环境监测。** 左边是监测风扇的各项参数,右边是风速变化的折线图。 4。数据监控。** 风机在发电过程中出现的异常情况,故障部位及故障时间。异常信息的收集有利于人们分析和处理异常。 5.偏航系统。** 偏航系统,又称迎风装置,是风力机机舱的一部分。其作用是在风速矢量方向发生变化时,迅速平稳地对准风向,使风轮获得最大的风能。 *6。变桨系统。* 变桨控制系统作为大型风机控制系统的核心部件之一,对风机的安全、稳定、高效运行起着非常重要的作用。稳定变桨距控制已成为大型风电机组控制技术研究的热点和难点之一。 变桨控制技术简单来说就是通过调整叶片的变桨角,改变气流对叶片的迎角,进而控制风轮捕获的气动扭矩和气动功率。按钮控制功能: 风机启停: 线框模式: 机舱视角: 发电过程: 整理思路: 场景部分: 使用3D这里作为背景嵌套在一个二维场景中。 这样在初始化绘图的时候,直接反序列化二维绘图就可以了。 活动部分: 2D绘图中有很多按钮,通过它们可以控制3D中的一些动画。 实现思路是在反序列化图纸时,将2D、3D模型和视图对象挂载到窗口上,从而在不同的场景下获取对应的数据模型。 环境部分: 风速、风向、俯仰角将以2D和3D显示,可放入数据池,便于管理。具体代码实现:场景搭建:上面说了,我们用3D做背景,在2D里面嵌套,所以我们只需要序列化2D,就需要背景判断的部分代码。相关伪代码:graphView.deserialize('displays/demo/windturbine/风力发电机结构view.json',function(json,dm,gv,datas){ if(json.title)document.title=json.titleif(json.a['json.background']){varbgJSON=json.a['json.background']if(bgJSON.indexOf('displays')===0){varbgGv=newht.graph.GraphView()bgGv.deserialize(bgJSON)bgGv.addToDOM()graphView.addToDOM(bgGv.getView())}elseif(bgJSON.indexOf('scenes')===0){varbgG3d=newht.graph3d.Graph3dView()bgG3d.deserialize(bgJSON)bgG3d.addToDOM()graphView.addToDOM(bgG3d.getView())}graphView.handleScroll=function(){}}模拟风速:每隔30s,随机产生一个值,作为风速值相关伪代码://模拟风速mockWindSpeed(){ return8+Math.random()*12}数据统计:每30s,随机变化。作用:相关伪代码://指针旋转角度与扇叶变化varoldPointerValue=pitchSystem.a('pointer')||0//扇叶和变桨系统的旋转角度varnewRotateAngular=(this.windSpeed-8)*7.5*translateAngularRadian.radianvaraddPointerValue=newRotateAngular-oldPointerValuevaroldWindSpeedClip=environmentalData.a('windSpeedClip')||0varnewWindSpeedClip=(this.windSpeed-8)/12varaddWindSpeedClip=newWindSpeedClip-oldWindSpeedClipvaranim={ duration:1e3, easing:(v)=>{ returnv*v}, 动作:(v)=>{ varwindSpeed=Number(this.windSpeed.toFixed(2)) varMax=Number(MaxValue.toFixed(2)) varaverage=Number(Aver.toFixed(2)) varwindSpeedClip=oldWindSpeedClip+(addWindSpeedClip*v) //设置Generator参数随机数据 generator.a({windSpeed}) //设置环境监测随机数据 environmentalData.a({windSpeed,windSpeedClip}) //设置统计参数随机数据 statisticalParam.a({average,Max,windSpeed}) //设置导航系统的指针角度 pitchSystem.a('pointer',oldPointerValue+(addPointerValue*v)) }}ht.Default.startAnim(anim)这里涉及到角度和弧度的转换1°=Math.PI/180°,1rad=180°/Math.PI,因为在scene,因此需要将随机角度值转换为弧度。解释一下这里的代码,先获取当前值。然后添加随机值-当前值。比如当前值为16,那么随机生成的值有两种情况,1:大于当前值。2:小于当前值。如果大于当前值,比如18,那么就是这样16+(18-16)*v(缓动函数运算后的值)如果小于当前值,比如13,那么就是这样16+(13-16)*v(缓动函数运算后的值)这样随机的时候,会平滑的从当前值变化到目标值。数据统计:每30s,监测当前风扇的故障信息。作用:这里使用table.json文件,通过修改ht.dataSource属性添加实时信息。相关伪代码:varcheckInternals=()=>{ /** *故障信息 *变桨系统主轴偏航系统变速箱油冷装置发电机空冷装置 */varFailureStatus={//正常状态status1:newMap([[0,['舱内温度正常,俯仰角正常','i10']],[1,['舱内温度正常,主轴转速正常。','i9']],[2,['偏航系统准确','i8']],[3,['齿轮箱温度正常','i1']],[4,['油冷装置温控表正常','i3']],[5,['发电机功率正常','i5']],[6,['风冷装置正常','i2']]]),//异常状态status2:newMap([[0,['俯仰角异常','i10']],[1,['主轴转速过高。','i9']],[2,['偏航系统偏移。','i8']],[3,['变速箱温度过高。','i1']],[4,['油冷装置灰尘过多。','i3']],[5,['发电机电流过大。','i5']],[6,['风冷设备散热不足。','i2']]]),}//返回设备的正常状态status1:正常2:异常varmockQquipmentFailure=(status)=>{var{rangeRandom}=commonvarindex=rangeRandom(7)//返回随机设备状态returnFailureStatus[`status${status}`].get(index)}varinfo=randomInfo[0]vartargetTag=randomInfo[1]this.tableArr=table.a('ht.dataSource')varcurrentTimeFormat=DateUtil.formatHourTime(newDate())//默认是正常的。如果发现fault关键字,则赋值异常varstatus='normal'vartime=0 this.tableArr.push({status,info,time:currentTimeFormat})}我们需要两个Map数组方便取值手术。一个是正??常信息数组,一个是异常信息数组。使用随机值作为索引,然后获取相应的状态信息,并将其添加到表中。如果当前状态正常,则表示信息正常,否则为异常信息。对于异常信息,可以使用table.json的渲染回调函数“drawCell”:function(g,text,rect,option){}修改其颜色使其高亮。偏航系统:风力发电机在旋转过程中,根据风的位置,通过偏航系统改变方向。效果: 相关伪代码:/***RandomYawSystem*@param{*}*/randomYawSystem(){ var{dm}=this var{d2d}=window var{rangeRandom}=common varpoll=()=>{ //随机数30-50 varrandom=30+rangeRandom(20) varcabin=dm.getDataByTag('cabin') //将角度转换为弧度并乘以随机数以获得随机风向 varrandomDegrees=translateAngularRadian.radian*random vardefaultDegress=translateAngularRadian.radian*180ht.Default.startAnim({ 持续时间:1e3, 动作:(v)=>{ varoldValue=cabin.getRotationY() varnewValue=randomDegrees varaddValue=newValue-oldValue cabin。setRotationY(oldValue+addValue*v) } }) } }角度-弧度的转换上面说了。在这里,随机角度首先被转换成弧度,然后赋值给rotate。变桨系统:风速的变化影响风扇叶片的角度。作用:相关伪代码:varold3Value=whiteShell3Line.getRotationX()varold4Value=whiteShell4Line.getRotationX()varold5Value=whiteShell5Line.getRotationX()//指针和扇叶的旋转角度变化varoldPointerValue=pitchSystem.a('指针')||0//风扇叶片和变桨系统的旋转角度varnewRotateAngular=(this.windSpeed-8)*7.5*translateAngularRadian.radianvaraddPointerValue=newRotateAngular-oldPointerValuewhiteShell3Line.setRotationX(old3Value+((newRotateAngular-oldPointerValue)))whiteShell4Line.setRotationX(old4Value+((newRotateAngular-oldPointerValue)))whiteShell5Line.setRotationX(old5Value+((newRotateAngular-oldPointerValue)))复制代码先获取当前每个扇叶的X轴旋转值,然后获取需要的旋转的角度值已分配。风扇启停:风扇启停相关的伪代码:varfanWireframe=d3d.getDataByTag('fanWireframe')fanWireframe.setRotationMode('zxy')this.allAnimManage=newMap([['fanRotate',null]])varfanRotating=(easeType)=>{ anim=ht.Default.startAnim({ duration:5e3, easing:(t)=>easeIn(t), action:(v)=>{ fanWireframe.setRotationZ(fanWireframe.getRotationZ()+speed) //风扇轮毂旋转 if(fanWireframe.getRotationZ()<=-6.28){ fanWireframe.setRotationZ(0) } //风扇叶片uv偏移 for(leti=1;i<17;i++){ varnode=d3d.getDataByTag(`q${i}`) node.s('shape3d.uv.offset',fanOffsetData(v)[i-1]) } //暂停命令 if(isStop){ stopFanRotate(fanWireframe.getRotationZ()) anim.pause() anim=null } }, finishFunc:()=>{ fanRotating(false) }})this.allAnimManage.set('fanRotate',anim)}因为可以启动和停止,那么我们可以通过控制ht.Default.startAnim()返回的对象的恢复和暂停来实现为了实现效果,我在全局对象中加入了风扇旋转的动画,方便调用。setRotationMode('zxy')方法是设置三维旋转模式,顺序为z->x->y,先进行z轴旋转,再进行x轴旋转,最后进行y轴旋转。设置的目的是防止坐标轴受到外旋的影响。风向:根据风的角度,判断当前风向。作用:相关伪代码://判断风向varwindDirection=(rotate)=>{letdirectionswitch(true){caserotate===0:direction='South'breakcaserotate===90:direction='East''breakcaserotate===180:direction='North'breakcaserotate===240:direction='West'breakcaserotate>0&&rotate<90:direction='Southeast'中断案例旋转>90&&rotate<180:direction='Northeast'breakcaserotate>180&&rotate<270:direction='Northwest'breakcaserotate>270&&rotate<360:direction='Southwest'breakdefault:direction='无风directionfound'}returndirection}//判断是哪个方向varangular=randomDegrees*translateAngularRadian.angularvardirection=windDirection(angular)将罗盘指针角度放入开关判断,如果找到对应的风向则返回。总结风力发电是工业互联网的一个典型例子。我们可以通过分析风机模型或监测数据来降低我们工作的复杂度,帮助我们快速了解发电的内部结构和功能。HT能做的远不止于此,这需要我们丰富的想象力和过硬的技术。希望通过这篇文章,能够传递一种能量给大家,让大家更有兴趣,有更多新鲜的想法,做更多好玩的事情。
