【编程指南PSS/E】在PSSE中使用Python脚本(Using Python to automate PSSE 翻译)
注:此文是根据网页http://www.see.ed.ac.uk/~jbo/PSSE_Python/index.html的翻译,这片翻译是我在初学PSSE,初学Python时一时冲动翻译下来的,错误和纰漏肯定不少,仅供大家参考,更希望能给与修正,供初学者入门,版权是原作者的。thx。 附件前半部分和本文相同,后半部分为部分代码,在原网站上能找得到,只是综合了一下。在PSSE中使用Python脚本:简要介绍 translated by Jackain
PSSE30提供了Python的API接口,使在PSSE中使用Python脚本语言成为了可能,这不仅使PSSE批量运行,同时可以根据你的Python代码,使处理功能更强大,更灵活。
我没有找到很好的关于在PSSE中使用Pyhton的资料,我把我能找到的东西写在这里供初学者入门。
前面的一些资料能在使用说明书USERS.pdf的第12章找到,其他资料是通过API.pdf和IPLAN.pdf综合而来的,可以从中找到。
我发现使用Adobe的搜索功能非常有用,你可以根据一个关键词同时搜索在一个文件夹下面的所有的pdf文件,这样寻找某个函数的IPLAN和API的描述遍得很简单。IPLAN的描述一般在查找详细描述“某些传递数据的参数”的解释时非常有用。IPLAN函数的名称同API文档中Python的那些函数相同,只是后者是大写字母而已。
我使用的是30版本的PSSE,和2.3版的Pyhton,这篇文章的前提是你了解一些基本的Python,Mack Lutz和David Ascher写的《Learning Pyhon》非常不错。
Python
Python.org homepage
PSSE
Power System Simulator for Engineering.
在PSSE中使用Python简介
PSSE说明文档说:根据你在PSSE中的操作可以生成Python代码。这花了我一段时间才理解,因为我是PSSE和Python的初学者。根据以下步骤,可以生成你的第一个python代码,用来进行潮流计算分析。前提是你有一个包含有网络信息的.raw文件,格式符合PSSE30要求。
1、
打开PSSE。
2、
选择“I/O Control”中的“Start Recording”菜单,输入一个PSSE写入的文件名。PSSE会自动地添加.py后缀。
3、
使用“File”菜单中的“Open”按钮,读入网络信息。将文件类型设定为.raw告诉PSSE你在给他的是raw文件(不知道是原文傻还是我翻译的傻:’()
4、
选择“Power Flow”中“Solution”,选择“Solve”,运行潮流计算。选择所需要的设置模式,点击“Solve”按钮。
5、
选择“File”菜单中的“Save or Show”保存运算结果。选择“Power Flow Raw Data”选项卡,点击“Data File”单选按钮,并在旁边的文本框中输入文件名。点击OK按钮。
使用你最喜欢的python浏览器查看生成的python代码。
# File:"C:\Documents and Settings\jbo\MySensibleFolderName\pssetest.py", generated on TUE, FEB 08 2005 14:11 psspy.read(0,r"""C:\Documents and Settings\jbo\MySensibleFolderName\testCase_30EV30test.raw""")
psspy.fdns()
psspy.rawd(0,1,,0,r"""C:\Documents and Settings\jbo\MySensibleFolderName\SOLVEDtestCase_30EV30test.raw""")注意,所有的方法都是通过一个叫做psspy的对象调用的。这个对象包括所有可用的方法和对象。他们看起来只不过是通过一个列表来组织的。我还没有写任何接口对象来组织和调用psspy方法时,就是这么想的。(瞎翻译的)
注意声称路径字符串的方法,这不是python提倡的格式,下面的写法更好:
"C:\\Documents and Settings\\jbo\\MySensibleFolderName\\testCase_30EV30test.raw".
怎样来运行python代码
我试过三种方式
1、
在PSSE中打开命令输入窗口(command line input, CLI)任务。
2、
在PSSE中选择“Run Automation File”按钮运行一个python文件。
3、
在PSSE30中python文件作为一个命令行变量。你可以指定图形界面只有在完成之后才出现。这可以为机器节省内存。在这种情况下,你可以指定仿真的母线数量。可以参照PSSE Users Manual中的PSSE Overview。
在PSSE中打开CLI
1、
在“I/O Control”菜单中选择“Begin command line input session”。
2、
使用“Command Language”选择框将语言更改为python。
3、
选择“RunAuto”按钮并选择一个python文件,PSSE会运行那个文件。
注意python命令可以直接在控制台输入。控制台动作同编译python的交互式平台不同,它不自动显示调用方法所返回的结果。要想显示的话必须使用python的print命令,例如:print(psspy.aMethod(myParameters))。
一个重要的点是所有列出的方法都是psspy方法。所以使用要使用totbus方法返回母线数量时,输入CLI时不能使用ival=totbus(),而应该使用ival=psspy.totbus()。在CLI中使用print(ival)来显示ival。Python语法也可以使其简化,如:from psspy import * 。采用何种编程风格由用户决定。
在IDLE编译平台测试python代码
我花了让人崩溃的长时间来寻找下面这个加入到python路径的方法。
当你想将自己写的一个模块导入python,或者要把一个处在其他文件夹下的模块加入到python文件中去,那么下面的方法就大有用啦:
1、
创建一个扩展名为.pth的文件。我们起个很漂亮比尔盖茨又很喜欢的名字myconfig.pth。当你在使用记事本之类的编辑器时就要小心了,不要保存成myconfig.pth.txt哦。
2、
把这个文件放到python根目录下面去,比如我的就是C:\Python23。
3、
把每个你想加入PYTHONPATH的文件夹全路径,单独一行的加入到这个文件中去。例如,第一行可能就是:C:\aFolder\work\Python。
这样可以解决下面的错误,当你导入Spam这个模块的时候就不会出现:ImportError: No module named Spam.
获取和设置网络数据
直接获取数据是很费力费时的事情。在网络中的每个部分都有几个不同的参量,比如负荷。每个参量均必须分别通过函数调用来访问。所以如果要找出每个母线的电压,那么必须对每个母线通过psspy对象调用方法busdat。它的参数通过一个字符串来解释,就如一开始所说的,这些参数可以在IPLAN说明书里找到,同Python里的命令名字相同。
生成
字符/文件
格式的报告是可以的,我曾经试图寻找转存这些变量的方法,这样就可以不通过文件系统直接可以通过python代码来访问了,但是没找到。如果有谁找到了这种方法请告诉我。如果西门子能改进一下API的话这将变得很简单,但是我们现在只能根据已有的东西来做。
反过来,也令人郁闷的是,要设置数据,每个部分的所有参量都要提供出来。幸运的是,有默认的对象_i 和_f,当你不想改变某个值时,插入这些对象即可。当运行和导入我自己的主模块时,我把这些对象存储在psspy对象中,这样每当psspy对象使用的时候,他们就能使用。对于整形和浮点数参数分别有个默认值(对象),我想他们与各自能取到的最大值相等。
在Python中组织PSSE数据
当使用Python扩展PSSE时,经常没有必要抽取所有的PSSE使用的数据。我创建了两个主要的类,一个与一个母线有关,叫做Bus,另一个与两条母线有关,叫做Branch。我所使用的所有层次如下所示:
·
Bus o
Load o
Machine ·
Branch o
Line o
Transformer 我把这些对象做一个列表来标识整个的网络。Python在快速和简化处理对象列表方面非常擅长。选择或者增加方法可以用于大批bus和branch类,这些类包含有用于对象中所有参量的处理方法。这样可以提供一种便利:一个部分的任何参量,通过大量的方法均可以对其他部分可见。可是呢,我正在有目的的在我的工作中避免出现这种情况。
注意当在Python中创建一个PSSE模型的拷贝时,这些拷贝还处于同步状态。因为潮流计算的原因,一些参数会改变而其他参数不会,例如,改变线路参数并重新计算,貌似改变了复杂(复数)的母线电压,但是不改变负荷。这样必须把从PSSE模型里观察到的数据同存储在python模型中但是在PSSE模型中使用的数据区分开来。
编译更复杂的Python程序
我保留了一个叫做PSSPYStub.py的python文件,它包含一个仿冒的psspy类,其中对应于每个所使用的psspy方法均创建一个短小的仿冒方法。这样当我进行简单测试编译python代码时把这个PSSPYStub类代替psspy类,这样就避免了开启PSSE,可以允许python调试工具的简单使用。
这个短小的仿冒方法对于psspy函数来说是微不足道的,但是在使用一些函数时需要注意,例如nxtbus函数,这个函数用来返回
调用inibus函数之后还没有输出的下一个载入PSSE的母线节点号。为在这个仿冒方法中实现这个函数,需要在inibus函数中创建一个count变量,并且在nxtbus函数中对这个变量进行递减,并返回一个母线节点号直到其达到0。
注意!更难的python内容
调试过后的代码如果能在PSSE中运行同样可以使用IDLE界面。打开PSSE和CLI界面并且输入并运行Runldle.py,不出意外地话会打开IDLE编程环境。通过打开这个调试器运行你的python代码。
使用这个方法有点不同,当你使用import命令时,主要的psspy对象和伴随的_i和_f将在你运行中的模块中不能访问。在PSSE中的“Run Auto”按钮不同于标准python 中的import命令。“”按钮允许运行一个python模块时把psspy作为一个全局变量。但是在你得到的IDLE解释器中的import命令不会把psspy作为导入模块的全局变量。在python中一个全局变量只能在本模块中可见。
为了解决这个问题,我在本应在“Run Auto”按钮运行的代码之外创建了一个类,__init__的定义会将psspy对象作为一个参数分配到一个类变量中。这样他在整个类中都会可见。
包含这个类的模块被导入后,一个这种类的对象会被创建,这样这个类的所有函数都能被调用。例如,这个类可能包含如下的函数:
·
loadRawFile装载一个raw文件到PSSE中. ·
parseDataFile
装载额外的仿真参数. ·
runSimulation
运行一个潮流计算. ·
saveResults
存储重要的数据到文件中. 你可以从Python解释器中手动调用这些函数。
同样的,你可以使用__init__
函数仅按顺序包含所有你想执行的脚本。这些命令就像是初始化PSSE和你想使用的任何Python对象。最终这些命令会使PSSE进行一些例如潮流的计算。
处理数组
我逐渐能熟练处理数组和数字矩阵了。不在重复强调使用列表类型,而使用数字类型,这样会比使用列表快的多,而且你的程序读起来也更直观。它同在MATLAB里面使用一样方便,数字类型不仅仅是一个Python模块,也与最优化并且与编译的矩阵运算代码相关。
与数字类型相关的信息可以在这里找到
在导入数字类型(Numeric)之前必须进行安装。使用在Python中导入模块的标准方法进行导入,你可以通过dir(Numeric)命令观察可用的方法及类结构。
我使用的最多的方法是:
Array
使用这种方法从一个列表里创建数组可以包含一个数字或者一列数字。加些参数就可以使数组包含浮点数等等。例如:Numeric.array(,'f')可以返回一个包含有浮点数1,2和3的数组。
Arrange
这个方法根据你的描述来产生一个范围的等差数字,例如:Numeric.arange(0,0.5,0.1)返回
array([ 0. , 0.1, 0.2, 0.3, 0.4]). 注意数组中不包括最终值。
Transpose
给定a=array(),array()]), 那么transpose(a)可以返回:
array([,
,
])数字数组中最有用的功能是数字定义了标准的操作如何执行例如加法,乘法和逻辑运算。 保存数据以便在MATLAB中使用导入数据到MATLAB中有多种方法,广义来说主要有以下三种:l
MATLAB格式.mat文件l
ASCII编码数据文件l
文本文件MATLAB格式.mat文件这个格式需要各种文件头。我不知道有没有pythond的模块可以执行保存为.mat文件,但是在这个文件中细节描述了这种格式。ASCII编码数据文件就我所注意到的,这些文件只能存储数字信息。这些值按照行列来组织,每一行的列数必须相等。列之间可以使用各种字符隔开,比较常用的选择就是使用tab建或者空格键键入的空格。行使用转行分开,这样他们在文本编辑器中显示新的一行。下面是一个例子:from Numeric import *m = array()m = reshape(m,(2,2))f = open('test.dat','w')for r in m:
for c in r:
f.write("%i ")
f.write("\n")f.close()在MATLAB里面,下面的语句就可以装载test.dat文件并把它作为一个变量test。文本文件最强大的,看起来可以被容易执行的方法,就是生成一个文本字符串,当执行的时候可以生成需要的对象或者在MATLAB中的对象。但是我想这可能不是最有效的办法。例如,设想一个bus类含有fields, voltage, load 和 generation over time,如下所示:class Bus:
number=None
Pgen=[]
Pload=[]
V=[]
def __init__(self,number):
self.number = number
def storeStepData(self,g,l,v):
self.Pgen.append(g)
self.Pload.append(l)
self.V.append(v)在类的定义中加入一种方法,这个方法可以产生适用于MATLAB的自我解释的字符串描述。
def matlabString(self):
s1="bus%i.Pgen=%s"%(self.number,str(self.Pgen))
s2="bus%i.Pload=%s"%(self.number,str(self.Pload))
s3="bus%i.V=%s"%(self.number,str(self.V))
return("%s;%s;%s;")%(s1,s2,s3)在Python中,在主程序中插入退出字符来建立包含变量的字符串。紧接着一个包含需要插入主程序的值的tuple(元组)。最后一样连接三个其他的字符串,并在每个字符串后面放置“;”字符,这同时把三个命令分开,并能组织MATLAB输出这些结构内容。
下面的测试代码在Python中运行会产生一个示例保存文件。
b=Bus(10)b.storeStepData(1,2,3)b.storeStepData(1.5,2.3,3.1)f=open('test.dat','w')f.write(b.matlabString())f.close()
下面一段MATLAB中的代码可以产生一个结构,包含有从bus工程中保存下来的数据
fhandle=fopen('test.dat')fstring=fscanf(fhandle,'%s')eval(fstring)结构“bus10”现在可以在键入的matlab代码中起到作用。其中“10”部分是根据bus和母线节点号在matlabSring()函数中生成的。
异常处理
异常处理,是现代编程语言中使用的一种错误处理和诊断的方法。例如,没有必要在其他返回值再增加一个错误代码,而是如果有错误发生的话直接引发一个异常。这样做的好处是,错误不会被默认忽略。如果不检查错误代码的话,这个方法的失败就可能不被发现,可能会造成跟踪程序错误的困难。
在python.org有一个异常处理的手册,它同样包含有用户自定义异常。
但是PSSE提供的API接口不适用异常处理,这样你在每次调用API时,都要严格检查错误代码变得很重要。我建立了一个与PSSE交互的特殊类来解决这个问题,所有API的调用都要适用这些类。每个API调用的时候都跟随错误代码检查。如果错误代码只是的是失败,则就引发一个异常,根据具体的错误代码使用合适的,定制的异常和信息。
使用Python模块random
Random模块可以根据不同的分布状态产生随机数,并允许控制产生的状态。使用在Python中引入模块的标准方法,导入random。你可以通过dir(random)函数查看可用的方法和类的构造。
我用的最多的方法是:
Getstate
这个方法返回产生随机数的当前状态。这个状态可以保存并在稍后用来设置模块的状态回到以前状态,具体方法可以查看下面的setstate,例如:savedState = random.getstate().
Jumpahead
这个方法用来改变当前状态,只要模块不会产生一系列数字覆盖在执行jumping ahead命令之前的状态。例如random.jumpahead(42)
normalvariate和uniform
这些方法是少数返回随即数的方法的两个,他们分别返回符合正态分布和平均分布的随机数。方法mormalvariate需要平均值和标准偏差两个参数,方法uniform需要最大值最小值得范围rang。
例如:random.normalvariate(0,1)和random.normalvariate(0,10).
Seed
这种方法可以使用任何不规则格式设置随机数产生器的状态,例如字符串。这样,不必要首先在文件系统中存储一个状态类就可以设置状态了。例如:random.seed("My! I do like coding, it's such fun!").
Setstate
这种方法使随机数产生器的状态设置为之前使用getstate保存的状态,例如:random.setstate(saveState)。
我发现在使用random模块时创建自己的类是十分有用的,在其中,产生随机数的方法保证了random模块的状态不发生变化。这可能被忽略了,但是一次只有一个random模块导入。那样我就可以创建多个自定义的random模块来产生随机数字,没有必要干涉每个产生器的状态。
其他注意事项
l
我也写了一些实现以下功能的python代码:
²
潮流运算和获取网络所有的数据。
²
基本的低/高/带通滤波器。
²
梯形三角形模糊逻辑
²
如下所说的我不能使用scipy,基本的插补类
l
我在PSSE CLI或者在CLI运行代码时,使用import scipy时出现了问题,当我从Fortran machine里导入时,出现了浮点数溢出的现象,所以我尝试了很多次重建wheel因为我不能使用。
l
我又碰到浮点数溢出的现象了,这次是当我把自己的模糊逻辑模块应应用为PSSE扩展脚本的一部分时出现的,我想这是甚至因为我再scipy只引入了interp部分造成的。如果只在python解释器下测试的话就不会出现这个问题。
l
我碰到了一个Fortran的错误,可能是由Python引起的。我忘记了它是不是被零除过,还是因为我试图当作一个list来读取数字,或者这两个方面都有。这里的课程可能会在Python没有抛出异常的地方出现问题,结果造成了不良的运行时错误,但是原因可能很简单而且错误能确定。
l
在潮流运行完毕之后需要使用solved()来检验潮流是不是收敛了。如果潮流没有收敛,一些网络可能从步参数比默认参数小100或者更多(-_-)受益。当先减小补偿时,代数限制应该也要放宽。
l
读一下说明书。他有不同求解方法的正面和反面介绍。
l
在我的版本中GSLV会让电脑崩溃,更郁闷的是他在我的工程里运行比在MSLV中运行的好,而我只能呢个使用MSLV进行扩展仿真。
l
警告。逐步备份你的.raw文件。PSSE有个坏习惯,覆盖的时候没有警告,即使那个模式已经关掉。PSSE还可能把不能自动调节的变压器,做成能自动调节的变压器模型。我不确定什么时候会发生这种情况,但是我已经被这个问题浪费了一些时间了。
l
一个不错的网站,关于Python的。
建议和评论
如果有任何建议或者改进欢迎发Email给我,我可以分别把具体的PSSE功能性的使用和详细地执行信息联系起来。Email jbo at ee ed ac uk。
发邮件给我的任何问题或者在AQ网页里的问题我都会回答的。
[ 本帖最后由 dsyljh 于 2007-9-24 16:27 编辑 ] 楼主您的资料非常不错,可以进行指导吗,您的资料非常有用,您的邮箱是啥呢?
有人知道.out文件数据如何通过.py文件导入excel吗 正在学习中,正是我需要的东西,谢。 格式好像乱了,大家看得不爽的话就看附件吧 正好急需…谢谢大大提供! 谢谢学长提供的资料,回去好好学习一下. 楼主非常实在,没有把他打包,让我们很方便的学到知识,谢谢 好東西.絕對支持樓主::victory:: ::victory:: ::victory:: ::victory:: 嗯,不错,大家相互学习 太感谢楼主的大公无私了,不会为了‘资料币’,而是为了服务大众,高尚::victory:: 嗯,不错,大家相互学习 谢谢,保存了已经。