您的位置:首页 > 其它

PSD-BPA 暂态稳定仿真批处理计算方法的实现

2015-07-01 15:35 627 查看

写在前面的话

期待了好久,终于在这2015下半年开始第一天,正好也是自己本科毕业一周年之际开通了自己的第一篇博客。由于毕设课题方向需要海量的原始数据仿真,想想就泪流满面,于是开发了一个BPA仿真接口程序进行批处理计算,现在终于解放了!其实这种方法早就有人已经实现,只是目前很难获得公开的代码。一直以来很喜欢很多国内外开源社区那样的分享环境,利用前人的研究成果会节省了很多时间和精力,所以将这个小程序分享出去,希望给需要用到的人带来一点点小便利。作为一只菜鸟级程序猿,代码肯定还有许多优化和改进的地方,有问题或者想指教的可以发私信交流。最后要十分感谢在编写过程中,中国电力科学研究院董老师的指导和帮助!

BPA暂态稳定仿真批处理的实现

具体过程

BPA 是分析电力系统动态行为之有力工具,能够快速准确地计算大型复杂电网发生故障以后的暂态稳定性。但是利用BPA每次只能处理一种负荷水平下的一种故障状态, 如果需要再次计算, 必须重新修改负荷或故障状态等条件。而对于大型复杂电网, 当利用数据挖掘的方法来研究其暂态稳定性时,需要模拟计算的故障状态和负荷水平数量是巨大的,如果每次都需要人工干预输入数据和故障状态, 不仅工作量巨大,而且很容易出错。所以通过开发一个外围环境可以很好地解决了上述问题, 在计算过程中不需要人工干预, 大大提高了计算的速度与效率。

下面详细介绍整个接口技术的实现过程。

人工输入数据文件, 包括潮流计算和稳定计算所需要的原始数据, 并且将所要研究的潮流方式和故障事件分别存放于文件夹中;

启动程序通过文件复制重命名自动修改相应的潮流文件, 然后在程序中自动调用BPA 中的潮流计算程序进行潮流计算;因为暂态计算必须在潮流潮流计算结束后方可进行,所以当潮流计算结束后,务必要侦测潮流计算的进程是否结束;

如果潮流计算程序进程已经结束, 则控制程序再次利用文件复制重命名语句自动修改相应的稳定计算文件, 接着启动BPA 的稳定计算程序进行稳定计算, 并且在给定充足的时间以后强制关闭稳定计算进程(因为当稳定计算结束时, 进程不会自动关闭);

当所有的计算都已结束后, 再将需要的结果文件复制保存到结果文件夹中并重新命名(BPA每次计算都会更新结果文件),然后进行下一轮计算。

代码块

源程序是基于VC++6.0平台开发的

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include <windows.h>
#include <tlhelp32.h>

int permit;
char pfexe[10]={"pfnt.exe"};

int checkproc()    //检测进程是否结束,结束则返回1
{
int bz=1;
PROCESSENTRY32 pe32; //用来存储进程信息的结构体
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//获取进程快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("调用失败\n");
return 1;
}
BOOL bProc=Process32First(hProcessSnap,&pe32);
while(bProc)
{
//pe32.th32ProcessID进程ID和pe32.szExeFile进程名
if(stricmp(pe32.szExeFile,pfexe)==0)
bz=0;
bProc=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
if(bz==1)
return 1;
else
return 0;

}

int KillMyProcess(char *exeName)      //结束进程函数
{
int rc=0;
HANDLE hSysSnapshot=NULL;
PROCESSENTRY32 proc;
hSysSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSysSnapshot==(HANDLE)-1)
return 1;
proc.dwSize=sizeof(proc);
if(Process32First(hSysSnapshot,&proc))
{
do
{
if(stricmp(proc.szExeFile,exeName)==0)
{
HANDLE Proc_handle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,proc.th32ProcessID);
if(Proc_handle==NULL||!TerminateProcess(Proc_handle, 0))
rc=1;
else
rc=0;
}
} while(Process32Next(hSysSnapshot,&proc));
}
CloseHandle(hSysSnapshot);
return rc;
}

main()
{
int pfnum=25,swnum=33;     //分别表示潮流方式和故障种类的个数
int i,j,n=1;              //n  处理的文件个数统计
char  filename1[20],filename2[20],filename3[20],filename4[20];

for(i=1;i<25;i++)
{
sprintf(filename1,"dat\\%d.dat",i);
CopyFile(filename1,"IEEE39\\039bpa.dat",false);
system("start H:\\BPA程序\\BIN\\pfnt\\pfnt.exe");
Sleep(2000);  //延时2s

permit=checkproc();
if(permit==1)
{
for(j=1;j<=33;j++)
{
sprintf(filename2,"swi\\%d.swi",j);
CopyFile(filename3,"IEEE39\\039bpa.dat",false);

system("start H:\\BPA程序\\BIN\\swnt\\swnt.exe  ");
Sleep(11000);//延时11s--时间根据自己仿真时间确定

KillMyProcess("swnt.exe");
if(KillMyProcess("swnt.exe")!=0)
printf("进程没有被结束掉!\n");

sprintf(filename2,"result\\%d.OUT",n);
sprintf(filename3,"result\\%d.SWX",n);
CopyFile("IEEE39\\039bpa.OUT",filename2,false);
CopyFile("IEEE39\\039bpa.SWX",filename3,false);

Sleep(1000);
n++;
printf("已经完成第 %d 个\n",n-1);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: