APP下载

基于VC++和MATLAB的船舶电力系统动态仿真软件开发

2018-09-27高国章高志国杨雪帆

造船技术 2018年4期
关键词:绘图端口绘制

高国章, 高志国 , 杨雪帆

(武汉理工大学 a.能源与动力工程学院, b.理学院, 湖北 武汉 430073)

0 引 言

随着船舶智能化的程度越来越高,船舶综合电力系统的安全性和稳定性要求也越来越高。仿真[1]成为了许多研究人员常用的研究手段之一。

国内外电力系统仿真软件有PSCAD(Power Systems Computer Aided Design)、VTB(Virtual Test Bed)、SABER等[2],但是这些软件都是针对陆地电力系统仿真需求制作的,针对性不强。VTB是美国QSI集团开发的一款软件,其中包含船舶综合电力系统仿真的模型,因而对船舶电力系统的仿真针对性更强,但是VTB对外保密,没有实现通用。哈尔滨工程大学在船舶电力系统仿真平台的研究和开发方面已经有多年的积累,在理论、平台搭建和仿真方面都取得了一定的成果,但由于各方面原因,仍未能实现通用。

目前,大多数研究工作者使用MATLAB/SIMULINK仿真,但在不间断正在进行的仿真的情况下,系统无法根据需要实现参数修改,有一定的局限性。Visual C++面向对象编程[3],在应用程序界面编制、图元绘制和人机交互等方面具有较大的优势,MATLAB中有丰富的优化、计算工具[4]。VC++与MATLAB相结合,将发挥VC++可视化编程和MATLAB数值计算的优点,可提高软件开发的效率,缩短开发周期[5]。本平台针对船舶电力系统开发,利用VC++和MATLAB混合编程不仅便于系统绘制实现可视化[6],且在不间断正在运行的仿真的同时,根据实际情况改变设备参数或者网络结构实现延续仿真,实现在不同工况下的比较分析。

1 平台的需求分析

平台的需求主要包括非功能性需求和功能性需求。非功能性需求主要包括:可扩展性、低耦合性、便捷性、易用性和高性能,其中高性能最为重要,它需要满足复杂电力系统的快速构建与计算要求,并且进行延续仿真。仿真平台的功能性需求按船舶电力系统构建流程可分为:(1)文件操作——新建、打开、保存、关闭;(2)设备图元绘制——柴油机、发电机、汇流排母线、线路、变压器、电动机、螺旋桨等;(3)设备图元操作——复制粘贴、选中、移动、缩放、线宽、颜色、端点自动连接、删除;(4)参数设定;(5)拓扑分析[7];(6)VC++调用MATLAB。

2 仿真平台的开发

2.1 平台组成介绍

本平台基于船舶电力系统开发使用。船舶综合电力系统的主要组成包括:产生电能的原动机、发电机等,配电变电部分的汇流排、变压器、整流器、逆变器等[8],用电负载部分的推进电机、螺旋桨等。每个设备都有自己的模型,本仿真平台用编程语言描述这些设备的数学模型,再将数学模型的编程与图元封装,实现图模一体化。图1为简单的船舶电力系统框图。

图1 船舶电力系统简化框图

2.2 图元绘制与操作的实现

船舶电力系统的设备众多,为方便后期的封装,平台为船舶设备对应的每1个图元定义1个类,可以利用类的继承特性去实现每个图元对共有属性的继承,而不必在每个图元类中重复实现。本平台采用面向对象编程,其定义类的基本流程为

(1) 从基类CObject中派生出绘图类CDraw-Object,设备图元对应的类从CDrawObject类中派生。

(2) 在CDrawObject类中添加图元类的公共属性,把CDrawObject类的各个子类的公共属性放到父类中,并且将CDrawObject类中的成员函数设置为public,让子类都可以使用父类的成员函数。

(3) 利用类的另一个特性多态性,实现同一函数的不同操作。将父类的成员函数设置成虚函数,声明其类型为virtual,具体的功能在各个子类中去完成,对于不同的对象,程序会自己调用对应类中的成员函数去实现。

2.2.1 图元绘制

实现图模一体化后,将每个设备的图元都放在工具栏或者菜单栏中,在绘制时直接点击相应的图标或者选项,然后在窗口通过鼠标拖曳完成图元绘制,可简化绘图操作,提高绘图效率。整个工具栏如图2所示。工具栏中,设备对应图标是可以浮动的,避免工具栏按钮太多导致使用不方便。通过调用CToolBar类的Create或CreateEx成员函数,设置其参数DWORD dwstyle的值就可实现工具栏浮动。给工具栏各图元命名相应的专业ID,经过类向导添加响应函数,实现相应的功能。

图2 工具栏示例

在微软基础类库(Microsoft Foundation Classes, MFC)中与图形相关的类有:CDC(Create Device Contert)类和GDI(Graphics Devices Interface)类。CDC类主要可以实现绘图功能和绘图环境的设置,利用CDC类可以实现形状的绘制和图形颜色、画笔线条宽度等设置。GDI对象类包括位图类、画刷类、字体类、画笔类、区域类等。当获取当前CDC类对象或者指向对象的指针后,在绘图时,使用函数SelectObject()将画笔、画刷、字体等对象引入到函数CreatDC()中,实现特定的绘图属性。绘制图元时,必须先在图元类中添加绘图函数,之后在视类View中的函数OnLBottonDown()中经由各自图元对象调用绘图函数完成绘图。

按相对应关系将图1所示简单电力系统框图绘制成图元,界面如图3所示。菜单栏中主要包括:文件、编辑、视图、绘图、分析等,工具栏呈现于菜单栏下方,使用者可在绘图窗口区通过拖曳工具栏中的相应图元实现系统绘制。

图3 仿真平台绘制界面

2.2.2 图元操作

在系统建立过程中,为使系统图元整洁、规范且绘制便利,不可避免地要求图元能够移动、复制粘贴、旋转和删除等,且通过双击图元实现对相应设备参数的设定。基本操作的实现方法如下:

(1) 移动。首先删除原图元,然后调用自定义函数MoveAt()实现图元重新绘制,最后利用DeleteObject()释放笔资源。

(2) 复制粘贴。通过图元类中的一个构造函数,给该类的变量赋初值,这些变量都存入类中,当进行复制时,这些参数存入到结构体中,在粘贴时,把结构体中这些参数重新赋值给新的位置重新绘制成新的设备图元。

(3)旋转。利用一个for循环实现参数m_nSource的累加赋值,其不同赋值在绘图函数选择中执行不同的绘制命令。对于只在水平和竖直方向绘制的图元,则通过改变其状态变量的取值来实现。参数m_bIsHor初始值为true,当旋转操作时对变量m_bIsHor重新赋值为fasle。根据参数m_nSource、m_bIsHor的不同取值,绘图函数执行不同的操作,可实现图元按顺时针方向旋转,每次旋转90°。

(4) 删除。调用OnDelete()函数,先选中图标,遍历图元数据列表,找到需要删除的图元,然后将图元删除。

2.2.3 参数设定

双击图元弹出对话框,弹出后在对话框中填写参数具体数值并在窗口显示,点击保存之后保存到图元类。弹出电动机的参数设置对话框如图4所示。

图4 电动机参数设置图

图元建模在完成绘制图元和双击图元设置对应系统各设备的参数后,再经过图元封装,将设备的模型封装到设备对应的类中,使设备图元和模型成为一个整体,进而实现编程的模块化。

2.3 拓扑分析

完成上述操作后,为了解系统的连接关系必须对所绘制的系统进行拓扑分析。电网拓扑结构分析的主要作用是依据开关和设备图元的状态,确定每个图元与其他图元的连接关系,把电力系统网络物理模型转化为采用节点/支路描述的数学模型[9]。系统将设备与图元对应,系统的接线图可以理解为由图元、线段组成的支路以及由这些支路组成的几何图形,通过确定节点-开关-节点和母线-支路的连接关系以及设备的数量,为后续计算提供依据。

拓扑分析即是根据设备图元的ID号和图元端口位置坐标,通过比较端口坐标是否相同来判断图元之间的连接关系[10],确定与母线连接的设备图元,从而将电力系统的接线图转换为计算机可识别的电路图的过程。

拓扑分析的本质是分析图元的端口坐标或者比较节点的参数值。每个图元在绘制或移动过程中端口的坐标会保存到图元类中,当两个图元端口的坐标值相同时就将图元的ID号存入到数组中。拓扑分析可分为以下几个步骤。

Step 1:判断图元是否与导线或者母线连接。这个通过端口到线的距离来判断,当端口距离线的距离小于设定值时认为两者相连。将每条线都当做是点集,端口与其中任一点相连都当做是相连接。端口与端口之间的坐标判断是通过点到点的距离实现的,利用条件公式sqrt((x1-x)2+(y1-y)2)

Step 2:节点融合。通过图元自身的端口坐标是否相等或者接近,如果满足条件则将两图元的ID号保存到数组中,并将两节点合并为同一节点。

Step 3:在系统中对开关的处理。当开关闭合时,当作导线对待,节点数减少1个;当开关断开时,开关的节点数增加1个,节点数的变化对应开关的不同状态。

Step 4:支路的判断。具有相同的节点,两设备图元的其他端点的位置坐标不同,则认为是不同的支路,并按照不同的支路方向继续搜索,直到终点。

经过上述几个步骤,点击菜单栏,系统能够识别并存储设备图元的种类、节点和支路,从而确定各个图元的连接关系,自动生成系统相应的拓扑关系。

船舶电力系统中所有发电机接到汇流排,所有的负载从汇流排引出,然后通过开关的通断决定发电机在网数目和负载大小[11],系统结构相对简单,只需识别图元设备和支路即可,拓扑分析的难度降低。

在程序中约定,在汇流排左边的开关对应着发电机组数目的增加,开关变量只有2种取值0和1,取值0代表开关断开,取值1代表开关闭合。在汇流排右侧的开关对应的是负载的增加,开关的取值仍为0和1。

拓扑分析的流程如下:

(1) 在绘制图中,首先通过坐标比较实现节点融合,将相连通的节点等价为同一个节点;通过遍历图元,完成整个系统节点的融合,简化连接关系。

(2) 通过图元端点坐标比较,若界面中有无效模块,则系统自动将对应图元的数目从该类图元总数目中减去。在判断连接关系时,首先找出与母线相连接的设备,通过设备的另一个端点坐标和所有图元的端点比较,根据相连判据找到与该设备相连接的下一个设备,如此循环,直到找不到下一个具有相同端点的设备,即可认为到达了支路的终点。每个图元在绘制时端点坐标、图元类型和端口数都已经保存,通过上述搜索,便可以找到设备的连接关系。

(3) 在(2)中剔除没有实际作用的图元后,判断开关的通断状态和位置,根据所得到的信息确定所绘制电力系统中的发电机数、电动机数等,进一步确定系统的设备类型、数目和在网设备。

(4) 根据不同的分析结果调用模型完成计算。

下面举例说明拓扑分析的情况。绘制的船舶电力系统图如图5所示,相对应的拓扑分析结果如图6所示。

图5 船舶电力系统模型图示例

图6 拓扑分析结果图

3 调用MATLAB实现仿真

在VC++程序中通过MATLAB引擎调用MATLAB, MATLAB引擎主要提供给用户1组引擎函数,通过这些函数可以实现MATLAB与VC++之间的数据传递[12],其具体的过程和操作如下:

(1) 打开一个MATLAB引擎。在VC++应用程序中通过调用engOpen()函数能够方便地打开一个MATLAB进程。应用程序在使用引擎之前,须在应用程序中包含“engine.h”头文件。

(2) 将VC++应用程序中数组形式的数据转换为MATLAB中的使用形式。通过调用函数库中的函数mxCreateDoubleMatrix()来创建mxArray阵列;然后再通过拷贝函数memcpy()将一个自定义数据结构复制到mxArray中,但是需要注意到主句存储形式不同。

(3) 将设备需要设置的参数保存到mxArray阵列中,然后把mxArray阵列传输至MATLAB引擎的工作空间中,可通过调用函数engPutVariable()实现这一操作,数据传输到MATLAB工作空间后就在MATLAB计算中被相应的变量使用。

(4) 在VC++应用程序中,使用函数向MATLAB引擎发送所要执行的命令字符串,命令字符串的使用形式与在MATLAB命令窗口中直接使用的形式是相同的。在应用程序中执行函数engEvalString()后,MATLAB命令窗口将自动被打开,MATLAB会话期窗口是否可见可自行设计。打开MATLAB后完成命令语句中的数值计算和分析等操作,并将命令字符串的处理结果显示出来。

(5) 由预先定义的输出缓冲来获取MATLAB引擎的输出结果,此步操作是(4)的补充,能够实现获取任意想要的结果。

(6) 调用engClose()函数关闭引擎,释放内存空间并退出。

整个工作流程是在VC++的图形界面上绘制出电力系统的连接图,并将每个图元的变量名显示在对应的位置,电网经过拓扑分析之后显示节点,系统自动记录输入的设备类型和连接关系。在弹出的参数设置窗口中给定对应参数值或者使用程序中的默认值,保存后点击运行,系统根据设备类型、数量和连接关系等信息,结合开关的状态,自动启动MATLAB引擎执行数学模型的计算,最后利用绘图函数将结果显示,计算结果返回到VC++中。

4 结 语

本文基于船舶电力系统模型,结合VC++和MATLAB两者的优势,采用图元的思想,实现船舶综合电力系统的可视化界面绘制、拓扑分析和动态仿真等功能,充分利用拓扑分析实现系统拓扑结构的自动辨识,利用动态仿真实现MATLAB在执行已经赋予参数的仿真的同时,又时刻访问VC++端口传入的参数。若系统检测到其结构或设备参数被修改,本平台将可以在不中止上一个仿真的条件下延续进行,达到参数变化或结构变化时不中断仿真的目的。

猜你喜欢

绘图端口绘制
来自河流的你
“禾下乘凉图”绘图人
一种有源二端口网络参数计算方法
一种端口故障的解决方案
基于Excel VBA和AutoCAD的滚动轴承参数化比例图绘制方法
多按键情况下,单片机端口不足的解决方法
超萌小鹿课程表
垂涎三尺
为雄安的交通绘制一张蓝图
在转变中绘制新蓝图