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; }
相关文章推荐
- 二叉树的构建和先序,中序,后序遍历
- 【翻译mos文章】Linux x86 and x86-64 系统SHMMAX最大
- 反向打印单链表
- Win10如何让文件显示后缀名默认是不显示的
- swfit各种Function表现形式
- 去哪儿网前端架构师司徒正美:如何挑选适合的前端框架?
- PAT数素数
- jQuery 效果 - fadeOut() 方法
- NUnit Test Adapter----单元测试需要安装这个插件
- Akka Stream BackPress 技术(个人处女作啊, Be nice to me^_^)
- iOS 截取屏幕当前显示的图片(可按范围截取)
- 宁可编译和链接时出错,也不要运行时出错
- Json字符与Json对象的相互转换
- 涨停板联盟7月2日分享。
- oc基础复习08-OC的类方法
- win7 创建软链接方式
- POI对Excel自定义日期格式的读取
- 奇偶排序
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- Python 2.x和3.x不同点