APP下载

基于对象模型的船舶电力负荷表格计算系统

2012-08-10吕显强陶冶杨文莲杨松吴俊峰石云峰

大连海洋大学学报 2012年4期
关键词:单元格表格船舶

吕显强陶冶杨文莲杨松吴俊峰石云峰

(大连海洋大学教育技术与计算中心,辽宁大连116023)

基于对象模型的船舶电力负荷表格计算系统

吕显强,陶冶,杨文莲,杨松,吴俊峰,石云峰

(大连海洋大学教育技术与计算中心,辽宁大连116023)

针对船舶电力负荷计算输入数据多、表格设计复杂等问题,提出了一种利用MFC基于对象模型的表格计算系统,采用View对象负责表格的绘制和各种项目的计算,利用编辑框定位方式来模拟手工表格输入的过程,有效地避免了基于Form-Control法输入数据和最终打印效果不一致的缺陷,实现了所见即所得。View-Document对象模型能够独立处理表格数据,并支持打开、保存和打印操作,该系统具有可视化和仿真操作能力,实例显示具有较高的执行效率和应用效果。

电力负荷;对象模型;表格计算;微软基础类库

船舶电站是船舶动力的主要来源,合理的电站容量配置不仅关系到整个船舶的各种电力系统及设备的使用寿命,而且可有效地确保船舶电力使用的安全性和可靠性,并最终达到船舶经济运行的目标。船舶电力负荷计算主要采用3种方法:概率法、昼夜航行图表法和负荷系数法[1]。其中负荷系数法是目前广泛使用的一种方法,而概率法则需要具备相同类型母型船的相关资料,昼夜航行图表法适用于小型船舶或电动辅助性船舶,在一定程度上限制了使用范围。负荷系数法一般需要船舶电力设计人员根据船舶设备的实际工况 (包括航行状态、工作状态、进出港状态和停泊状态等),分别统计并计算出硒装设备、轮机设备、空调冷藏设备、弱电及其它设备的数量,以及电动机额定功率、机械负荷系数、电动机负荷系数、功率因数、所需有功和无功功率等,以获得船舶需要配置的主发动机和备用发电机的台数。目前,负荷系数法主要通过设计人员手工建立表格的方法进行计算,统计修改困难,工作量很大。

随着计算机技术的发展,电力系统的计算机仿真已成为电力系统设计、规划、运行及故障分析的重要工具。有关这方面的研究主要集中在电动机建模方面,Iked等[2]提出了一种新的计算机仿真方法用于异步电动机暂态及数学模型的研究;Bossio等[3]建立了动态电动机模型用于实现定子铁心故障的分析。在船舶电力计算机辅助计算方面,大部分以基于传统的窗体设计为主,王焕文等[4]采用Visual Basic在Windows窗体上利用控件对象,作为与设计人员交互的手段,用户通过在文本框中输入各类参数值,并利用指定的算法模型进行处理和计算。但上述方法有一定的缺陷,一是控件过多,设计难度大;二是人机功效差。为此,本研究中作者根据上述情况,重点研究采用面向对象技术,利用Visual C++的MFC(微软基础类库)中的View-Documents对象思想[5-6],设计出真正意义上的船舶电力负荷计算的 “电子表格”,可方便地进行各参数的输入、保存、计算和打印,该表格与设计人员手工计算的表格完全一致,实现了所见即所得,设计人员可以在完全熟悉的环境下进行输入和计算,大大提高了计算效率。

1 船舶电力负荷的基本对象模型

面向对象方法 (Object-oriented method)是一种按照人类认识世界的思维来分析和解决问题,并将 “对象”的思想引入到软件开发过程中,以对象为中心,以类和继承为构造机制的软件系统。面向对象的程序设计语言具有封装性、继承性和多态性,可读性强,易于维护,大大降低了代码的重复率和工作效率。

模拟船舶电力负荷手工计算表格是一项比较复杂的工程,主要包括前台表格界面的绘制和后台文档的处理。其中前台表格界面的设计要涉及大量的位置计算和交互性的处理,因此设计比较困难,为此,本研究中采用了Visual C++的MFC中的View-Document对象的思想,将二者单独进行处理,减少了代码冗余度,提高了效率。

1.1 船舶设备类的设计和封装

在船舶电力负荷计算表中,用户要预先输入大量的设备参数,为此定义了船舶设备CEDevice类,该类封装了船舶设备的基本参数值。此外,该类还具有自绘能力,以实现用户每次输入一个设备的同时,系统能够自动完成对该设备行所有单元格边框的绘制。CEDevice类的原型设计如下:

class CEDevice:public CObject

{

public:

CString m_strName;//设备名称

int m_nNumber;//设备数量

float m_fMaxAxisPower;//最大机械轴功率

float m_fRatedData[5];//电机额定数据

float m_fSumPowerNeeded;//所需总功率

float m_fK1;//电动机利用系数

float m_fStateData[8][7];//8种工作状态数组

int* m_nItemWidth;//项目宽度指针变量

CRect* m_ItemRect;//项目矩形尺寸指针变量

public:

void Init(int*ItemWidth,CRect*pRect,int dd,int TextHeight);//表格初始化函数

void DrawText(CDC*pDC,int nLeft,int nTop,BYTE bFlag[]);//自绘设备表格标题函数

void SetItemRect(int nLeft,int nTop,BYTE bFlag []);//计算单元格矩形尺寸函数

void DrawBorder(CDC*pDC,intnLeft,int nTop,BYTE bFlag[]);//绘制表格边框函数

};

1.2 表格对话框类的创建

用户在新创建一张船舶电力负荷计算表格前,均需要事先确定船舶名称、工作状态名称、设备分类名称以及I类和II类负荷系数的大小。用户也可以自定义新的工况名称和设备分类名称,这些功能均需要通过对话框完成,本研究中将这些功能抽象地定义为对话框类。对话框类的原型设计如下:

class CNewDialog:public CDialog

{ public:

CStringm_strDEviceCategoryName[8];//设备分类名称

CStringm_strStatName[8];//工作状态名称

CListBoxm_listDeviceCategory;//设备分类列表框CListBoxm_listWorkState;//工作状态列表框CStringm_NEWCATE;//新设备分类名称CStringm_NEWSTAT;//新工作状态名称CStringm_strShipName;//船舶名称floatm_fCoef1;//I类负荷系数floatm_fCoef2;//II类负荷系数

};

新建计算表格对话框如图1所示。

图1 电力负荷计算表的 “新建”对话框Fig.1 The“new”dialog of tabular computation for power loading

1.3 编辑框类的定义

在船舶电力负荷计算表中,由于该表格是通过多条直线绘制出的,所有单元格均为不可编辑状态。为了能够实现用户即点即输入的效果,以实现模拟用户手工填写表格的要求,本研究中定义了编辑框类,该类继承于标准编辑框类,并重载了键盘单击OnKeyDown函数,以实现用户按上下左右方向键的同时,能动态改变编辑框的位置。编辑框类的原型设计如下:

class CMyEdit:public CEdit

{

public:

CMyEdit();

virtual~CMyEdit();

protected:

afx_msg void OnKeyDown(UINT nChar,UINT nRepC-nt,UINT nFlags);

};

2 船舶电力负荷View-Document对象模型

MFC通常使用View-Document结构来管理数据和视图显示,文档 (CDocument)负责数据的输入、输出和文件管理;视 (CView)类从文档结构中获取数据;框架窗口 (CFrameWnd)类负责整个系统移动、最大化、最小化和关闭应用程序操作等,该模型将数据管理和图形显示进行了分离,有效地降低了管理的难度[6]。在船舶电力负荷计算中,主要包括用户表格绘制、表格编辑 (插入和删除行列)、文件保存和打印操作,输入数据量大,表格操作和数据管理复杂,因此,本研究中将上述内容采用MFC的View-Document对象来建模,以减轻设计难度。

2.1 CELoadView类

CELoadView类主要作为显示表格和用户的操作界面,以便将文档类的内容显示到屏幕或进行打印和打印预览操作。由于船舶电力负荷计算表格内容多,本研究中采用了MFC的CScrollView类作为其父类,以支持表格的滚动功能。由于CEDevice设备类已经支持表格设备数据的自绘功能,因此, CELoadView类主要负责绘制表格的标题,该功能由DrawSummary、DrawHeadText和FillBK函数来实现。此外,在CELoadView类中还设计了两个重要的对象成员,即m_Edit和m_Combo,它们主要用于实现与用户的交互性操作。CELoadView类的原型设计如下:

class CELoadView:public CScrollView

{

public:

CComboBoxm_Combo;//负荷类别组合框对象

CMyEditm_Edit;//输入编辑框

int nTextHeight;//文字高度

CEDevice*m_pEDevice[8];//8种设备类型指针RectRowData*m_pRectRowData;//每行数据矩形尺寸(所有列)

int x,y;//鼠标滚动偏移量

SelectedPostion m_SelectedPos;//记录用户选择位置

intm_nPageWidth,m_nPageHeight;//纸张大小(单位mm)

int*m_nSumWidthPrinted,*m_nSumHeightPrinted;//打印的总宽度、总高度

int p,p1;//水平、垂直分页数

public:

void MoveCombo(CRect&rect);//负荷类别组合框移动处理函数

void MoveEdit(CRect&rect);//编辑框移动处理函数

void DrawSummary(CDC*pDC,int nLeft,int nT-op);//统计行绘制函数

void DrawHeadText(CDC*pDC,int nLeft,int nTop, CString str);//表格标题函数

void FillBK(CDC*pDC,CRect&rect,CBrush &brush);//表格背景处理函数

};

2.2 CELoadDoc类

CELoadDoc类可以存储和载入用户定义的数据,相当于 “容器”功能,它是CDocument类的派生类,其主要功能是将用户输入的参数和表格计算的数据存入到指定的文件中。该系统可以实现将每艘船的数据单独存入一个文件,同时允许用户打开已经存在的文件,方便用户进行修改。CELoad-Doc类的原型设计如下:

class CELoadDoc:public CDocument

{

public:

CString m_strShipName;//船名

CStringm_strEngineChosen[2][8];//已选定的发电机名称

int m_nDeviceNumber[8];//各类设备数量

floatm_fSumP1[8],m_fSumQ1[8];//I类负荷总有功功率,总无功率

floatm_fSumP2[8],m_fSumQ2[8];//II类负荷总有功功率,总无功率

floatm_fSumP1Coef[8],m_fSumQ1Coef[8];//考虑同时系数的I类负荷总功率

floatm_fSumP2Coef[8],m_fSumQ2Coef[8];//考虑同时系数的II类负荷总功率

floatm_fSumP[8],m_fSumQ[8];//考虑同时系数的总功率之和

floatm_fSumP5[8],m_fSumQ5[8];//考虑网络传输中功率损失5%时的总功率

floatm_cos[8];//加权平均值功率

floatm_fCoef1,m_fCoef2;//负荷系数

};

3 负荷计算表中的主要系数

在通常情况下,船舶设备本身的功率与负荷计算表中的实际计算功率是不同的。此外,船舶的电力设备还可能受到间歇负荷和特殊设备的影响。本研究中综合考虑上述三类情况,相应的系数计算主要包括以下3个方面[7]。

3.1 电动机、机械负荷的各类系数

船舶电力负荷计算表中的主要功率和各类系数的计算公式如下:

1)电动机利用系数K1=P2/P1;

2)机械负荷系数K2=P3/P2;

3)电动机负荷系数K3=K1×K2=P3/P1;

4)电动机额定效率η=P1/P4;

5)电动机实际所需总功率

Pe≈K3×P4=(K3/η)×P1=P3/η;

其中:P1为电动机额定功率 (kW);P2为机械轴上所需的最大轴功率 (kW);P3为机械轴上的输出功率 (kW);P4为电动机需要从电网获取的功率 (kW)。上述几类系数均由本系统自动完成计算。

3.2 同时使用系数K0

K0是运行的间歇载荷最大需要功率之和与所有间断负载的最大需要功率之和的比值。目前,在国内外大多数计算中,同时使用系数K0都选为0.4或0.5。

3.3 其他特殊设备系数

1)厨房及洗衣设备 这些设备工作的时段和时间的长短都较为固定,其负荷系数一般取为0.2~0.3。

2)舵机 该设备正常工作时所需要的功率远小于其额定功率,其负荷系数可以考虑取小值,一般取为0.2~0.3。

3)空调 一般按照2台压缩机同时运行计算制冷量,此外空调还应作为间歇负荷考虑。

4 交互操作设计及流程图

交互操作设计是本研究的重点和难点,为了能够记录用户对表格数据的操作,以符合重绘表格的要求,本研究在文档类中采用了动态链表作为主要的数据结构支持,从4个方面进行了设计。

1)编辑框定位 根据用户鼠标的位置坐标,将编辑框移动到指定的单元格位置,以实现即点即输入的目的。该方法的步骤如下:

(1)返回鼠标坐标点point,存入到变量m_ SelectedPos中。

(2)根据已经绘制的表格边框线,判定m_ SelectedPos所处的单元格,并返回该单元格的尺寸m_ItemRect及行列坐标i,j。

(3)修改编辑框的位置,并改变编辑框的大小与该单元格相同。

(4)将编辑框的内容输入到由CEDevice类型的指针数组m_pEDevice[i][j]所指向的内存空间存放。

(5)调用Invalidate方法,更新视图,以显示编辑框新输入的内容。

2)表格行删除 该方法的步骤如下:

(1)返回待删除行的鼠标坐标点point,存入到变量m_SelectedPos中。

(2)根据已经绘制的表格边框线,判定m_ SelectedPos所处的单元格,并返回该单元格的尺寸m_ItemRect及行坐标i。

(3)释放指针变量m_pEDevice[i]所指向的内存空间。

(4)调用Invalidate方法,更新视图。

3)表格行插入 该方法的步骤如下:

(1)返回待插入行的鼠标坐标点point,存入到变量m_SelectedPos中。

(2)根据已经绘制的表格边框线,判定m_ SelectedPos所处的单元格,并返回该单元格的尺寸m_ItemRect及行列坐标i,j。

(3)使用new方法动态分配CEDevice类型大小的内存空间,由指针变量m_pEDevice[j]指向,并初始化该内存空间的全部成员变量。

(4)调用Invalidate方法,更新视图。

上述3种基本操作均以CEDevice类型的指针作为数据支持,均可共享该部分数据,实时地反映用户操作的情况,并由CDocument文档类负责处理,进行保存和打开文件的操作。

4)船舶设备数据的链表结构 考虑到在实际应用中,用户可能随时添加和删除表格数据,因此当用户在执行第1) ~第3)步时,均需要访问文档类的数据,本研究在CDocument类中增加了链表指针数组m_RowArray,程序通过坐标变换可以先获得该船舶设备数据所在行的坐标i和j,并通过m_RowArraya[i]引用即可得到该数据所在的内存空间的地址。

对于表格的行删除操作,可以通过程序

deletem_RowArray[i]

m_RowArray.RemoveAt(m_SelectedPosRow)

来释放某种船舶的数据,以达到删除该设备的目的。

对于表格的插入操作,主要包括两步:动态分配设备类的内存空间 (new CEDevice)以及增加链表数据元素,其程序如下:

m_RowArray.InsertAt(m_SelectedPos.Row,new CEDevice)

此外,为了能够重新显示用户修改的数据,该链表也作为表格重绘的数据支持。程序首先进行电力负荷计算表的字体设置、显示滚动范围设置和表头输出,再判定链表指针是否到达表尾。如果为否,则修改链表指针,使其指向下一船舶设备行数据,并输出该设备数据和绘制表格边框。上述过程循环进行,当链表指针到达表尾,则退出循环,输出选定方案的各项统计数据。

上述过程相关的算法流程如图2所示。

图2 船舶电力负荷表格交互功能流程图Fig.2 The flow charts of interactive function for ship power loading

5 运行与讨论

船舶的电力负荷计算不仅作为船舶电站容量的参考,是船舶电力系统发动机配置的基础,直接影响到发动机型号的选择,而且还可有效地避免船舶电站容量匹配不合理,资源和资金浪费的缺陷。本研究中采用面向对象的方法,设计了完全仿真手工绘制计算的电子表格,实际运行情况如图3所示。

从图3可以看出,由于使用了编辑框定位技术,使原来通过绘制方法得到的静态表格处于可编辑状态,用户只要使用鼠标单击表格中的任意单元格,即可对该单元格进行编辑操作。由于每个单元格可以通过行、列标号记录该单元格所对应的数据,因此,将移动的编辑框和后台数据建立关联,当编辑框离开单元格后,即修改该单元格对应的数据,确保了显示内容和后台保存内容的一致性。从应用角度看,该单元格有效地避免了用户利用控件方法接受用户输入的缺陷,实现了用户全屏幕编辑和修改数据。

6 结语

本研究中提出利用MFC的View-Document对象结构,设计船舶电力负荷计算的电子表格系统。与传统的基于窗体-控件的输入界面不同,该方法模拟了设计人员手工绘制表格的方法,根据用户鼠标的点击坐标,定位单个编辑框控件,可修改该单元格对应的数据结构,并由CDocument对象负责存盘,集保存和输入操作为一体,所有的计算均由计算机负责,用户完全处于自己最熟悉的可视化环境中,大大降低了用户通过表格计算的难度,该系统具有很好的应用前景。

图3 船舶电力负荷表格计算系统的初始界面Fig.3 The initial table of software system for shippower loading

[1] 张统光.浅析船舶电站容量确定和计算方法[J].中国水运, 2011,11(2):106-107.

[2] Ikeda M,HIyama T.Simulation studies of the transients of squirrel -cage induction motors[J].IEEE Trans-actions on Energy Conversion,2007,22(2):233-239.

[3] Bossio G R,Solsona JA,Garcna G O,et al.Model for three-phase induction motors with stator core faults[J].Electric Power Applications,IET,2010,4(8):591-602.

[4] 王焕文,王殿卿.船舶电力负荷计算软件开发[J].中国造船, 2004,45(12):233-237.

[5] 李春葆,章启俊.Visual C++程序设计基础教程[M].武汉:武汉大学出版社,2006.

[6] Caragian B.Visual C++6.0程序员指南[M].北京:希望电脑公司,1998.

[7] 顾一清,姚炯,陈逢源.运输船电力负荷计算探讨[J].船舶设计通讯,2010(增刊):65-70.

A tabular com putation software system for ship power loading based on objectmodel

LÜXian-qiang,TAO Ye,YANGWen-lian,YANG Song,WU Jun-feng,SHIYun-feng
(Educational Technology&Computer Center,Dalian Ocean University,Dalian 116023,China)

Considering the problem of abundant input data and complex table design for ship power loading,the paper puts forward a tabular computation software system by using MFC objectmodel,which adopts view object to draw tables and calculate the items in tables and uses the editbox to locate the proper position.The method simulates the process of inputting data by handwork,avoids inconsistence between data input and print result as a result of using Form-Controlmethod,and accomplishesW.Y.S.W.Y.G.Furthermore the View-Document objectmodel can dealwith data in table independently,and supports the operations such as file open,save,and print.The proposed method has visual propety and simulation analysis ability.The actual example shows that it has good executive efficiency and pratical effect.

power loading;objectmodel;tabular computation;MFC

U662.6;TP273

A

2095-1388(2012)04-0377-06

2012-05-10

大连海洋大学教育教学改革研究项目 (2011);辽宁省优秀青年骨干教师资助计划项目 (2006);辽宁省教育厅高等学校科研计划项目 (2008146)

吕显强 (1957-),男,副教授。E-mail:lxq@dlou.edu.cn

猜你喜欢

单元格表格船舶
《现代临床医学》来稿表格要求
《现代临床医学》来稿表格要求
《船舶》2022 年度征订启事
流水账分类统计巧实现
玩转方格
玩转方格
船舶!请加速
统计表格的要求
BOG压缩机在小型LNG船舶上的应用
浅谈Excel中常见统计个数函数的用法