- w/ {! k! K6 B6 p7 K% S, C1 Q% N . O4 X( A6 _* m! ] ? 9 i \4 C! E! a
在PSSE中使用Python脚本:简要介绍 translated by Jackain
$ ?& B! n* q. e# |$ c# n% `' W5 d7 P; B3 a
PSSE30提供了Python的API接口,使在PSSE中使用Python脚本语言成为了可能,这不仅使PSSE批量运行,同时可以根据你的Python代码,使处理功能更强大,更灵活。 " M! s0 T& s8 s: e% p我没有找到很好的关于在PSSE中使用Pyhton的资料,我把我能找到的东西写在这里供初学者入门。. S* O9 X/ N& @! `
前面的一些资料能在使用说明书USERS.pdf的第12章找到,其他资料是通过API.pdf和IPLAN.pdf综合而来的,可以从中找到。4 _( C ~$ h% }1 M3 U
我发现使用Adobe的搜索功能非常有用,你可以根据一个关键词同时搜索在一个文件夹下面的所有的pdf文件,这样寻找某个函数的IPLAN和API的描述遍得很简单。IPLAN的描述一般在查找详细描述“某些传递数据的参数”的解释时非常有用。IPLAN函数的名称同API文档中Python的那些函数相同,只是后者是大写字母而已。( @ @) B4 o& a( e4 n9 v
我使用的是30版本的PSSE,和2.3版的Pyhton,这篇文章的前提是你了解一些基本的Python,Mack Lutz和David Ascher写的《Learning Pyhon》非常不错。7 |' \0 s. S+ _* J9 M2 e Python ( |2 h: o3 c! m& d" J3 PPython.org homepage ! D6 m: J7 R p$ q PSSE, Y' ]; y7 [5 ]% }5 B+ m Power System Simulator for Engineering. 1 c3 a7 i# J5 u2 `0 ~! P
" X: r8 W. h5 s, z0 V 在PSSE中使用Python简介 5 Y/ A- f! l6 K S, V; _PSSE说明文档说:根据你在PSSE中的操作可以生成Python代码。这花了我一段时间才理解,因为我是PSSE和Python的初学者。根据以下步骤,可以生成你的第一个python代码,用来进行潮流计算分析。前提是你有一个包含有网络信息的.raw文件,格式符合PSSE30要求。 ) X# t. E* C( e2 _1、 [2 c o( H8 `6 e; q# e" C打开PSSE。 / P& p% z6 ` ~2、* f* j8 l0 m z; Y
选择“I/O Control”中的“Start Recording”菜单,输入一个PSSE写入的文件名。PSSE会自动地添加.py后缀。 / }4 ?$ ] S2 O3、 2 K; P# g; {( I2 T$ @7 l1 r使用“File”菜单中的“Open”按钮,读入网络信息。将文件类型设定为.raw告诉PSSE你在给他的是raw文件(不知道是原文傻还是我翻译的傻:’() ( ~1 [! U1 }1 r$ u# y5 E$ ~4、1 V, C# P+ A$ l9 \3 U/ C* T% R
选择“Power Flow”中“Solution”,选择“Solve”,运行潮流计算。选择所需要的设置模式,点击“Solve”按钮。8 y4 Z+ F; X4 r9 l0 ?, N( e
5、 5 |! {6 h" p& @5 y% `选择“File”菜单中的“Save or Show”保存运算结果。选择“Power Flow Raw Data”选项卡,点击“Data File”单选按钮,并在旁边的文本框中输入文件名。点击OK按钮。9 f& [. F$ u5 _2 [5 `6 F1 P- a+ a
使用你最喜欢的python浏览器查看生成的python代码。 # C& o( T/ C0 a( m, m5 Q
# 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""")7 {: Q8 P' @1 F, B6 t; O# N2 d3 h
psspy.fdns([0,0,0,1,1,0,99,0])* ~& V; k# V) k i% w
psspy.rawd(0,1,[1,1,1,0,0,0],0,r"""C:\Documents and Settings\jbo\MySensibleFolderName\SOLVEDtestCase_30EV30test.raw""")
注意,所有的方法都是通过一个叫做psspy的对象调用的。这个对象包括所有可用的方法和对象。他们看起来只不过是通过一个列表来组织的。我还没有写任何接口对象来组织和调用psspy方法时,就是这么想的。(瞎翻译的)8 y2 n, e n% Y9 A; V8 g
注意声称路径字符串的方法,这不是python提倡的格式,下面的写法更好:7 E" f2 Z1 D5 k- k+ E& \
"C:\\Documents and Settings\\jbo\\MySensibleFolderName\\testCase_30EV30test.raw".
& c! }2 h" t9 T8 t* B# r怎样来运行python代码 1 y6 S5 C. l7 w( w+ T4 N% }8 r( D( s我试过三种方式0 g# b4 L9 g" t1 X0 G
1、* |( y6 b1 r) p
在PSSE中打开命令输入窗口(command line input, CLI)任务。- o' r' W D8 p: ] F- i
2、 ) V$ v0 V2 l& V: }8 A0 ^/ \在PSSE中选择“Run Automation File”按钮运行一个python文件。( X6 ]2 z* Z( f% `4 D
3、$ Y7 C* j. W s( L1 D. H
在PSSE30中python文件作为一个命令行变量。你可以指定图形界面只有在完成之后才出现。这可以为机器节省内存。在这种情况下,你可以指定仿真的母线数量。可以参照PSSE Users Manual中的PSSE Overview。$ e1 }+ E+ Y, y ?! d$ j4 ] 在PSSE中打开CLI# X$ r) {/ O. v+ k- g2 F6 h
1、% `& P# R, i. ]( C' y2 O
在“I/O Control”菜单中选择“Begin command line input session”。 4 r( a5 g( a' F4 C$ J) @8 ?" |# c5 A2、 . M7 A7 |( I9 f1 [( d6 [: w: B使用“Command Language”选择框将语言更改为python。 5 k3 G* r/ E0 Q3、 / K& y- E. G1 ~2 ~+ I选择“RunAuto”按钮并选择一个python文件,PSSE会运行那个文件。0 r9 {; K: ]; \) ?- B9 z- I4 [
注意python命令可以直接在控制台输入。控制台动作同编译python的交互式平台不同,它不自动显示调用方法所返回的结果。要想显示的话必须使用python的print命令,例如:print(psspy.aMethod(myParameters))。 1 c' ~7 Y( w4 j一个重要的点是所有列出的方法都是psspy方法。所以使用要使用totbus方法返回母线数量时,输入CLI时不能使用ival=totbus(),而应该使用ival=psspy.totbus()。在CLI中使用print(ival)来显示ival。Python语法也可以使其简化,如:from psspy import * 。采用何种编程风格由用户决定。 9 }9 c9 c; {7 F- a5 \( ~' U . W* q6 z4 N, h 在IDLE编译平台测试python代码 * ^9 h( N) b. q; R4 b1 T我花了让人崩溃的长时间来寻找下面这个加入到python路径的方法。1 Z9 G N3 m' _- S# j1 |
当你想将自己写的一个模块导入python,或者要把一个处在其他文件夹下的模块加入到python文件中去,那么下面的方法就大有用啦: @7 Z% [/ g8 N% k1、 9 x' f" F( J2 s) [- y) U创建一个扩展名为.pth的文件。我们起个很漂亮比尔盖茨又很喜欢的名字myconfig.pth。当你在使用记事本之类的编辑器时就要小心了,不要保存成myconfig.pth.txt哦。8 D# s3 ` {5 b: d0 Z
2、" ~! y5 B E$ F2 \7 Z
把这个文件放到python根目录下面去,比如我的就是C:\Python23。) t; @: I A2 z2 n- t7 c$ Z0 k
3、 / }4 v8 X. |4 `* b; S! }! i把每个你想加入PYTHONPATH的文件夹全路径,单独一行的加入到这个文件中去。例如,第一行可能就是:C:\aFolder\work\Python。 & n& G" z1 J' R9 w: Y8 o这样可以解决下面的错误,当你导入Spam这个模块的时候就不会出现:ImportError: No module named Spam.% K7 c% L+ U I3 ]3 E+ j4 x
) i7 L9 y6 e V" N7 V2 y8 L 获取和设置网络数据 , D9 P* k. A8 }* e& ~4 ~% [直接获取数据是很费力费时的事情。在网络中的每个部分都有几个不同的参量,比如负荷。每个参量均必须分别通过函数调用来访问。所以如果要找出每个母线的电压,那么必须对每个母线通过psspy对象调用方法busdat。它的参数通过一个字符串来解释,就如一开始所说的,这些参数可以在IPLAN说明书里找到,同Python里的命令名字相同。 $ M' U8 i+ P, R生成& K2 X$ L C" u% h/ _8 S
字符/文件 ; A3 J: |1 c9 o% N9 M格式的报告是可以的,我曾经试图寻找转存这些变量的方法,这样就可以不通过文件系统直接可以通过python代码来访问了,但是没找到。如果有谁找到了这种方法请告诉我。如果西门子能改进一下API的话这将变得很简单,但是我们现在只能根据已有的东西来做。( r, S' K7 k7 \4 u' O7 q0 Y
反过来,也令人郁闷的是,要设置数据,每个部分的所有参量都要提供出来。幸运的是,有默认的对象_i 和_f,当你不想改变某个值时,插入这些对象即可。当运行和导入我自己的主模块时,我把这些对象存储在psspy对象中,这样每当psspy对象使用的时候,他们就能使用。对于整形和浮点数参数分别有个默认值(对象),我想他们与各自能取到的最大值相等。 5 [, V0 \5 z6 W% ^# D; f: Z0 P . H; ~3 r1 x2 v; W% ?. |* y在Python中组织PSSE数据 , U5 e" ]+ l9 y0 \2 |2 r( K" _当使用Python扩展PSSE时,经常没有必要抽取所有的PSSE使用的数据。我创建了两个主要的类,一个与一个母线有关,叫做Bus,另一个与两条母线有关,叫做Branch。我所使用的所有层次如下所示: 0 B0 S2 D4 W' o( B2 g6 ^+ H
·+ m7 D9 S2 \6 i \% T. K
Bus
o $ b' a7 }# A: ?. i0 `2 NLoad
o # V1 y5 A5 w; i1 }Machine
· : J* B; W& ^: f( _" rBranch
o & G( T7 u: b( P) D, M n- NLine
o : e6 V! ~, ~4 t6 `$ jTransformer
我把这些对象做一个列表来标识整个的网络。Python在快速和简化处理对象列表方面非常擅长。选择或者增加方法可以用于大批bus和branch类,这些类包含有用于对象中所有参量的处理方法。这样可以提供一种便利:一个部分的任何参量,通过大量的方法均可以对其他部分可见。可是呢,我正在有目的的在我的工作中避免出现这种情况。 $ E% M; y/ Z. s& F注意当在Python中创建一个PSSE模型的拷贝时,这些拷贝还处于同步状态。因为潮流计算的原因,一些参数会改变而其他参数不会,例如,改变线路参数并重新计算,貌似改变了复杂(复数)的母线电压,但是不改变负荷。这样必须把从PSSE模型里观察到的数据同存储在python模型中但是在PSSE模型中使用的数据区分开来。 . m2 p. r9 @7 ?- F / _; j# R1 Y/ s" Y( Y 编译更复杂的Python程序$ w* P4 J2 Y0 I; G. q
我保留了一个叫做PSSPYStub.py的python文件,它包含一个仿冒的psspy类,其中对应于每个所使用的psspy方法均创建一个短小的仿冒方法。这样当我进行简单测试编译python代码时把这个PSSPYStub类代替psspy类,这样就避免了开启PSSE,可以允许python调试工具的简单使用。, ?+ e$ w# u( t8 Y$ f2 @
这个短小的仿冒方法对于psspy函数来说是微不足道的,但是在使用一些函数时需要注意,例如nxtbus函数,这个函数用来返回7 u" ]7 r+ r a" z, F2 K( t
调用inibus函数之后还没有输出的下一个载入PSSE的母线节点号。为在这个仿冒方法中实现这个函数,需要在inibus函数中创建一个count变量,并且在nxtbus函数中对这个变量进行递减,并返回一个母线节点号直到其达到0。 & O4 K0 \& ~9 V- P4 F+ H F注意!更难的python内容 d9 Y* O, m; r. a5 w+ {5 o
调试过后的代码如果能在PSSE中运行同样可以使用IDLE界面。打开PSSE和CLI界面并且输入并运行Runldle.py,不出意外地话会打开IDLE编程环境。通过打开这个调试器运行你的python代码。 . ]% G4 N* Y3 E2 y9 Z( A9 y/ o使用这个方法有点不同,当你使用import命令时,主要的psspy对象和伴随的_i和_f将在你运行中的模块中不能访问。在PSSE中的“Run Auto”按钮不同于标准python 中的import命令。“”按钮允许运行一个python模块时把psspy作为一个全局变量。但是在你得到的IDLE解释器中的import命令不会把psspy作为导入模块的全局变量。在python中一个全局变量只能在本模块中可见。 3 D6 e8 s: a; I N" T为了解决这个问题,我在本应在“Run Auto”按钮运行的代码之外创建了一个类,__init__的定义会将psspy对象作为一个参数分配到一个类变量中。这样他在整个类中都会可见。 , o& K2 f. z+ z6 f. A/ A包含这个类的模块被导入后,一个这种类的对象会被创建,这样这个类的所有函数都能被调用。例如,这个类可能包含如下的函数: 3 Y4 v2 j; p1 M# P