电力系统接线图组态简易实现

最近把两三年前做的个程序翻出来改了一下,虽然很久没搞VC了,算是恢复了一些记忆,,做这类的程序就它比较靠谱效率高体积小好把控不需要用户装这类装那的,主要就是实现发电站的接线组态一个显示。相应的闸刀和开关合上就电流指示和电机转动。当时到处找了一下现成的组态图软件发觉很贵,到处查资料自己分析了一下感觉也不难,就自己根据项目要求的实现了一下。当时时间紧动态效果指示不流畅反应不灵敏,最近应用户的建议进行了深化,优化了逻辑判断效果,记录一下以后免得忘记。也给有需要的兄弟要做这类似的提供一个小小的思路。

目前,实现了动态调整开关位置和电机位置,没有和生产系统连接(主要原因是电力发电系统的协议没获取到),点击开关来模拟的 ,想实现动态生产系统实时也是很简单的,进行协议解析,联动程序中相应的开关和电机,和生产中的开关这类的同步更新。

分辨率:1920*1080(为了显示不被压缩) 运行效果图:

由于以前习惯了VC6了 而且它也能实现这个项目的开发所以还是用的是vc6+win7来做的。大致记录一下实现的过程:

1、全屏显示,不能把分辨率改了就不改回来,为更好的用户体验,先记录计算机的原始分辨率,然后设置这个软件需要的分辨率1920*1080,程序退出就恢复到原来的分辨率。

实现改变分辨率:

void CxxxApp::ChangeScreenXY(int x, int y)
{

	DEVMODE lpDevMode;
	lpDevMode.dmBitsPerPel=32;
	lpDevMode.dmPelsWidth=x;
	lpDevMode.dmPelsHeight=y;
	lpDevMode.dmSize=sizeof(lpDevMode);
	lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL;
	LONG result;
	result=ChangeDisplaySettings(&lpDevMode,0);
	if (result==DISP_CHANGE_SUCCESSFUL)
	{
	    
		ChangeDisplaySettings(&lpDevMode,CDS_UPDATEREGISTRY);	
	}
	else
	{
		AfxMessageBox("修改分辨率失败,恢复原有设置!");
		ChangeDisplaySettings(NULL,0);
	}

}
程序进入先进行原始分辨率信息收集:

BOOL CxxxApp::InitInstance() 添加

	m_nSreenX  = ::GetSystemMetrics(SM_CXSCREEN);  
	m_nSreenY  = ::GetSystemMetrics(SM_CYSCREEN);

	if(m_nSreenX !=SCREENX && m_nSreenY != SCREENY){
	  ChangeScreenXY(SCREENX,SCREENY);
	}


<pre name="code" class="cpp">
           程序退出 善后处理:


int CxxxApp::ExitInstance() 

if(m_nSreenX !=::GetSystemMetrics(SM_CXSCREEN) && m_nSreenY != ::GetSystemMetrics(SM_CYSCREEN) ){
	    ChangeScreenXY(m_nSreenX,m_nSreenY);
	}


      2、为了更通用实现背景和程序分离方式,通过读取外部图片的方式。

		CPaintDC dc(this);
		CRect rect;
		GetClientRect(&rect);
		CDC dcMem;
		dcMem.CreateCompatibleDC(&dc);
		
		CHAR FilePath[255]; 
		GetModuleFileName(NULL,FilePath,255); 
		(strrchr(FilePath,'\\'))[1] = 0; 
        strcat(FilePath,"bg.bmp");
        HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,FilePath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
		if(hBitmap ==NULL){
			MessageBox("接线图没找到!");
		}else{
			CBitmap bmpBackground;
			bmpBackground.Attach(hBitmap);
			BITMAP bitmap;
			bmpBackground.GetBitmap(&bitmap);
			CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
			dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
		}


      3、开关,发电机,电流组件通过拖动到相应的位置,信息记录保存在ini文件中。

                               发电机位置记录来了个循序实现代码:

<span style="white-space:pre">	</span>for(int i = 0 ; i<MAX_FAN ;i++){
<span style="white-space:pre">		</span>strName = "Motor";
<span style="white-space:pre">		</span>m_Dynamotor[i].GetWindowRect(&rect);
<span style="white-space:pre">		</span>strName +=itoa(i,ch1,10);
<span style="white-space:pre">	</span>    COPini::WriteString(strName, "left", itoa(rect.left,ch1,10), "setinfo.ini");
<span style="white-space:pre">		</span>COPini::WriteString(strName, "top", itoa(rect.top,ch1,10), "setinfo.ini");
<span style="white-space:pre">		</span>COPini::WriteString(strName, "width", itoa(rect.right-rect.left,ch1,10), "setinfo.ini");<pre name="code" class="cpp">

COPini::WriteString(strName, "height", itoa(rect.bottom-rect.top,ch1,10), "setinfo.ini");
}

 
 
4、为了图上组件可以自动拖动 便于位置配置 从CStatic扩展了一个类CMoveCtrl;实际上很简单就是鼠标按下时加个定时器进行鼠标位置计算和重绘 

void CMoveCtrl::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==6)
	{ 
		//获得鼠标当前位置,转换为父窗口内的坐标
		CPoint cursor_Pos;
		GetCursorPos(&cursor_Pos);//该函数检取光标的位置,以屏幕坐标表示。
		GetParent()->ScreenToClient(&cursor_Pos); //该函数把屏幕上指定点的屏幕坐标转换成用户坐标。
		
		CPoint edit_Pos=pPoint;
		ClientToScreen(&edit_Pos);//该函数将指定点的用户坐标转换成屏幕坐标
		GetParent()->ScreenToClient(&edit_Pos);
		
		// 获得控件的大小,并且转换到父窗口的坐标,主要是为了获得左上角的坐标,方便下面的movewindow调用
		CRect edit_rect;
		GetWindowRect(edit_rect);//该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
		GetParent()->ScreenToClient(&edit_rect);
		
		CRect parentRect;
		GetParent()->GetClientRect(parentRect);
		// 利用向量相等的性质求得鼠标移动后的新左上角坐标
		int x=edit_rect.left+(cursor_Pos.x-edit_Pos.x);
		int y=edit_rect.top+(cursor_Pos.y-edit_Pos.y);
		if (x<0)
		{
			x=0;
		}
		if (y<0)
		{
			y=0;
		}
		if (x+edit_rect.Width()>parentRect.Width())
		{
			x = parentRect.Width() - edit_rect.Width();
		}
		if (y+edit_rect.Height()>parentRect.Height())
		{
			y = parentRect.Height() - edit_rect.Height();
		}
		
		MoveWindow(x,y,edit_rect.Width(),edit_rect.Height());
	    CStatic::OnTimer(nIDEvent);
	
	}

}

5、电机的动态显示当时还费一点劲,显示原理很简单就是几张图片用定时器来控制来回的调用

	if((nIDEvent == 15) && (m_dynameotor2 !=NULL)){
       	if(dynameotor_cout2 > 2147483000){    //为了溢出设置一个数 重置作用 不然溢出电机不转了
		     dynameotor_cout2 = 0;
		}
		m_Dynamotor[1].SetMeotorState(((dynameotor_cout2) % (STATE_NONE-1)),true );
		dynameotor_cout2++;
	}
6、就是开关联动,某几个开关进行判断触发相应的动作,这无非就是条件判断。

比如:

	if( m_switch[11].GetSwitchState() && m_switch[12].GetSwitchState()){
			if(m_dynameotor2 ==NULL){
				m_dynameotor2=SetTimer(15,40,NULL);
			}
小结:两三年前在xp下搞的我使用exit(0)退出程序能够恢复到原来的分辨率,在win7下ExitInstance() 就不执行了,最后发现是exit(0) 不好使。改用 PostQuitMessage(0)才好使用。最后得出结论 平台有差异,有些坑。程序慢慢改都是还是改到自己满意的。
演示程序: demo



                
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先说明该文件有安装包和完整的代码。打开运行时需要添加(或者更新)Visio。如果电脑没有visio可以装一个。下载绝对超值。 本项目通过用C#进行Visio进行二次开发,实现了绘制电气接线图, 并能实现潮流计算。 0 前言 中国电力行业属于垄断行业。从目前来看,改革我国电力行业,打破垄断引入竞争已成为大势所趋,但是,电力行业与其他垄断行业不同,至少有三个特点: 电力行业与其他垄断行业服务对象不同。其他垄断行业服务对象都是部分群体,如民航、铁路它们的服务对象只是人们群众中的一部分,不像电力行业与所有人有关,不论城市或农村,不论生产或生活,不论信息传递或网络联系,家庭生活都离不开电,对社会是全方位的覆盖。一个国家电气化水平越高,电力在全社会作用越大。一旦发生问题,小则引起局部瘫痪,大则引起全社会瘫痪。因为它既是国民经济中的骨干行业,又是全社会的吃穿住行和人们生活需要的公用产品,这是其他垄断行业无法比拟的。 电力行业另一个特点是它的产品不能储存,发电量超过需要量会形成浪费,发电量不足,会影响生产和生活的需要。而且,社会对电量的需要是一个不定量,它会随着地区、时间、季节、气候、人们生活等方面的变化而变化。这种不能储备,需要量又是瞬息万变的行业,就要求对供给和需求要有精确的掌握,以便及时进行调整和控制,才不至于出现象美国加州那样长期电力危机。 中国电力行业还有它自己的特点。中国电力行业的垄断说到底是非经济型的行政性的垄断,情况非常复杂,这在国外也少见。在所有制上,有国家所有制、地方政府所有制、合资企业、集体所有制,国家担保贷款企业、股份制,等等。发电厂有火电、水电、核电。区域电价上差别也相当大。电网有国家投资,地方政府投资,企事业单位投资等等。在进行厂网分开竞价上网过程中,必须对电力企业的产权有所界定,对不同电价有所处理,以及今后电价的监督,等等问题,都需要政府介入。 但是,电力行业不可能彻底打破垄断,完全自由竞争,这是电力行业的特点决定的,即便在西方市场经济条件下,所有的竞争也不是完全的自由竞争(美国的电力自由化程度也不高,相对来说欧洲电力市场的自由最高,但也没有完全市场化),只能是有限的竞争。何况在我们这样大的一个国家,电力行业这么重要,政府不可能放手不管完全自由竞争,问题在于垄断和竞争的度如何掌握,二者如何结合,这是我们电力行业面临的挑战。 电力行业已经开始从生产导向型向市场导向型的巨大转变。电力行业运作继续关注在电厂和电网方面,并面临提高运行可靠性的强烈需求。当今,我们需要用崭新的视角来透视市场状况,一些术语,如竞争能力、产品 质量、收益率、效率及客户服务等都已经被赋予了全新的理念。只有清楚地分析、理解当前的形势并及时、勇敢地采取行动,才能应对这些挑战。 在21世纪,计算机显得越来越重要,在电力行业中,计算机也得到了 越来越广泛的运用。而且随着社会的进步,电力行业已经抛弃了手工绘制电气接线图和手工计算潮流。 本系统就是在基于以上原因,开发了一款利用Visio进行二次开发,将C#与Visio想结合,能绘制电气接线图,并能打开已有的电气接线,保存所绘制的接线图等功能,并能在接线图的基础上,进行潮流计算。 1 绪论 1.1 课题的研究背景与意义 1.1.1 课题的研究背景 随着国民经济的发展,我国电力系统的规模越来越庞大,其网络结构越来越复杂,因而电力系统基础分析计算的工作量也越来越大。图形是工程中最简洁的语言,用图形来描述电力系统的网络结构,图形会起到一目了然的作用,这也逐渐成为用户对电力系统分析计算软件的基本要求。光只能绘图并不能满足需求,将绘制接线图与潮流计算结合起来才能使软件更贴近需求。 Microsoft Visio是当今优秀的绘图软件,也是近年国内外最流行的图形化解决方案开发平台之一,具有强大的图形操作功能,它还提供了二次开发功能。能够建立电力系统计算软件的图形平台框架,在此平台上绘制和编辑基于电力系统电气接线图,对电网拓扑结构进行自动识别,完成了电力网络图形元件各参数输入和设置,并实现电力网络操作的图形化模拟、仿真和潮流计算。 1.1.2 课题的研究意义 本项目实现的电气接线图的绘制和潮流计算。Visio是当今最优秀的绘图软件之一,它将强大的功能和易用性完美结合,可广泛应用于电子、机械、通信、建筑、软件设计和企业管理等众多领域。使用该软件可以完成各类专业图纸的制作,例如程序流程图、网络拓扑图、数据分布图、地图、室内布置图、规划图、线路图等,可见功能十分的强大。Visio软件有助于学生以及各种专业人员轻松地可视化、分析和交流复杂信息。这能够将难以理解的复杂文本和表格转换为一目了然的Visio图表,增加工作学习的效率。 1.2 问题的定义及内容简介 1.2.1 问题的定义 本系统是为了电力公司运行管理设计的。实现系统的准备工作如下: 1、搜集和查阅电力公司的相关资料、信息,调研、分析对项目开发有益的相关网站和软件系统; 2、学习和掌握VS2005技术,建立合适的开发环境; 3、综合运用所学专业知识,完成系统的总体设计和详细设计; 4、系统要完成的主要功能包括: (1) 通过VS2005对Visio控制绘图过程,处理图形元素。 (2) 使用VS2005建立并能在绘制的接线图基础上进行潮流计算。 (3) 系统可以对绘制的图另存为,并能将潮流计算结果保存到TXT文本中,方便以后查看。 1.2.2 问题的内容简介 本系统主要实现绘制接线图和潮流计算。 1、绘制接线图:在C#中调用Visio控件,并能将绘制电力系统图的相关Visio控件调用到该项目中,能绘制、打开、另存为。 2、潮流计算:因为网络节点不一定,故该功能先确定网络节点,并确定PQ节点个数,在依次录入线路参数和节点数据,最好进行计算。 1.3 问题的调研 在本系统开发之初,为了做好系统需求分析工作,我做了充分的调研,从而认识到完成本系统需做到以下几点: 1、对VISIO二次开发的可行性与价值进行充分的考查和调研。 2、了解在电力公司运行管理系统的需求和现状。 3、熟悉VS开发环境,熟练掌握C#操作TXT,掌握C#的编程语言。 4、系统具体运行环境及配置要求再做详细调查研究并与指导老师面谈。 在充分了解、调查情况的基础上,本人开发了这一项目。 2 可行性分析 可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。要达到这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。 系统的可行性分析主要包括经济上的可行性,技术上的可行性和操作上的可行性。本系统的可行性分析如下: 2.1 经济可行性 本系统作为信息与电气工程学院的创新项目,开发所需要投入的人力物力资源并不是很大。人力方面只需开发人员本人经过几个月的时间进行分析设计与实现,而在软硬件方面只需一台计算机和相关的软件即可。在整个开发过程中充分考虑了各个模块之间的独立性和可维护性,开发成本和运行成本以及维护成本都比较低。所以在经济上本系统的开发是可行的。 2.2 技术可行性 本系统的开发环境是微软的Visual Studio 2005开发系统,使用的语言是C#语言,运用TXT作为数据库。Visual Studio 2005是建立在公共语言运行库上的编程框架,是一个集成开发环境,其支持的语言有二十几种。所以利用这项成熟的技术开发这个系统在技术上是可行的。 2.3 操作可行性 本系统是基于Visio的二次开发,用户无需经过专业的培训即可以完成系统的安装操作及使用,运行十分的方便。所以在操作上本系统是可行的。 3 系统设计 3.1 系统总体功能结构 根据此系统所需要实现的功能,我们将该系统设计成主要两部分。设计了如下图所示的系统结构: 图3.1 系统结构图 3.2 系统数据库 鉴于本级软件主要考察的不是数据库,故此次设计我主要用于了TXT来保存结果。系统默认的数据库在安装文件夹下,名为data.txt的文本文件里。 txt文件是微软在操作系统上附带的一种文本格式,是最常见的一种文件格式 ,早在DOS时代应用就很多,主要存文本信息,即为文字信息,在微软在操作系统等于直接存,就是它了,现在多用的操作系统得使用记事本等程序保存,大多数软件可以查看如记事本,浏览器等等。 5 系统评价 5.1 系统特色/优点介绍 本系统是在做了许多考查和调研的基础上编写制作的,从界面设计到系统设置都是从方便用户的角度出发,系统具有以下几点特色: 1、 在调查和了解了网络教学的基本需求与应用现状的前提下设计开发了此程序,切合实际,具有较强的实用性。 2、本系统不需要通过网络即可运行,系统运行要求较低。并且系统可以在多种操作系统平台上(Windows NT/Windows 2000/Windows XP)运行。数据库采用TXT文本,移植性很强。。 3、 在重要的Visio画图板块,可以通过增加相应VSS模具的形式任意增加Visio画图的类型,十分方便。 5、 及时全面地处理各种错误异常,在潮流计算时有错误提醒机制,避免用户输入错误。 6、采用TXT作为数据库,便于移植,且操作快捷方便。 7、用户界面比较友好,操作简单,使用方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值