5 w8 n6 e5 V1 k 1 C G. Z) ^2 `$ \ ; z- m8 f# j2 L0 L
在PSSE中使用Python脚本:简要介绍 translated by Jackain
1 C1 l# ~6 L1 Y6 s4 V/ j/ m% z( _0 T3 z) \0 O
PSSE30提供了Python的API接口,使在PSSE中使用Python脚本语言成为了可能,这不仅使PSSE批量运行,同时可以根据你的Python代码,使处理功能更强大,更灵活。5 ~7 o0 x5 T- J3 ?
我没有找到很好的关于在PSSE中使用Pyhton的资料,我把我能找到的东西写在这里供初学者入门。 3 |+ ^3 `3 q' y0 Q& q# Y% S前面的一些资料能在使用说明书USERS.pdf的第12章找到,其他资料是通过API.pdf和IPLAN.pdf综合而来的,可以从中找到。) A' T+ x, i# G7 s7 a: r
我发现使用Adobe的搜索功能非常有用,你可以根据一个关键词同时搜索在一个文件夹下面的所有的pdf文件,这样寻找某个函数的IPLAN和API的描述遍得很简单。IPLAN的描述一般在查找详细描述“某些传递数据的参数”的解释时非常有用。IPLAN函数的名称同API文档中Python的那些函数相同,只是后者是大写字母而已。 3 M1 _ j; v# z# [; A/ }/ H我使用的是30版本的PSSE,和2.3版的Pyhton,这篇文章的前提是你了解一些基本的Python,Mack Lutz和David Ascher写的《Learning Pyhon》非常不错。! {& `- @( ], p2 ] o4 E Python$ z7 ?. X; p: R2 L$ t/ ], i( g8 P- q Python.org homepage 2 r' E! C; e9 X PSSE 2 C% ~7 k: G: a" M) GPower System Simulator for Engineering. - n" u* o+ I" Z8 F5 q) m8 G0 B; S , `& C* U/ H. X. G# K' r( e+ Q% k 在PSSE中使用Python简介1 o, `- A' o; z: y# s) H3 H' }
PSSE说明文档说:根据你在PSSE中的操作可以生成Python代码。这花了我一段时间才理解,因为我是PSSE和Python的初学者。根据以下步骤,可以生成你的第一个python代码,用来进行潮流计算分析。前提是你有一个包含有网络信息的.raw文件,格式符合PSSE30要求。 4 ~) r6 z% e$ o& I1、 ' f3 s, u" ]0 X' u1 J打开PSSE。3 E1 B) a8 G9 X5 u) @+ B
2、. K3 J/ w* T: }' k q
选择“I/O Control”中的“Start Recording”菜单,输入一个PSSE写入的文件名。PSSE会自动地添加.py后缀。1 x- P+ K- \ \/ h! I+ A9 G
3、 n3 ?# h l, s6 D; ~* Z使用“File”菜单中的“Open”按钮,读入网络信息。将文件类型设定为.raw告诉PSSE你在给他的是raw文件(不知道是原文傻还是我翻译的傻:’()4 L/ W4 R. d& z/ k* |3 E: K" J
4、! n: i" y, {) R2 k# E6 q
选择“Power Flow”中“Solution”,选择“Solve”,运行潮流计算。选择所需要的设置模式,点击“Solve”按钮。9 H+ p& \$ P h" j/ q
5、 4 V9 E" ?) u6 j! Q" r( i v+ D8 j选择“File”菜单中的“Save or Show”保存运算结果。选择“Power Flow Raw Data”选项卡,点击“Data File”单选按钮,并在旁边的文本框中输入文件名。点击OK按钮。) F. F% \3 H1 G# E8 ?5 }4 s s
使用你最喜欢的python浏览器查看生成的python代码。 % s( X: |) l8 S4 h
# 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""") 8 D9 F: d2 W- Z9 Ppsspy.fdns([0,0,0,1,1,0,99,0]) ' A: C' x* S9 s, Mpsspy.rawd(0,1,[1,1,1,0,0,0],0,r"""C:\Documents and Settings\jbo\MySensibleFolderName\SOLVEDtestCase_30EV30test.raw""")
"C:\\Documents and Settings\\jbo\\MySensibleFolderName\\testCase_30EV30test.raw".
3 r( @* N5 r0 c. z7 R0 e 怎样来运行python代码& P6 W# O) [* J2 \( ]4 E3 @
我试过三种方式 ' |, |6 x% h4 r4 z! w1、 4 d9 U! i) p# W' K2 m) f4 ]% z" C在PSSE中打开命令输入窗口(command line input, CLI)任务。 5 E% w' l- X: v7 q) h5 F* o2、% U. L, ?3 a+ G' b3 [
在PSSE中选择“Run Automation File”按钮运行一个python文件。 $ Q- r4 }4 e/ L3 e3、. q4 G* u% G) Y; x. `; [5 \% {
在PSSE30中python文件作为一个命令行变量。你可以指定图形界面只有在完成之后才出现。这可以为机器节省内存。在这种情况下,你可以指定仿真的母线数量。可以参照PSSE Users Manual中的PSSE Overview。7 P. M6 P% e* g. }( L+ A N. h 在PSSE中打开CLI , U( B$ Y2 Y8 X( j& ^1、2 _3 b( }5 ~5 [; q$ L: _- _* z
在“I/O Control”菜单中选择“Begin command line input session”。 % H% F1 k7 [1 E. [% O2、1 f! K$ \. k+ w+ V! h1 N% Z5 H$ w
使用“Command Language”选择框将语言更改为python。 # G- {2 K) m6 s' ^- z( _/ I3、 $ }7 n- y+ G6 c9 J选择“RunAuto”按钮并选择一个python文件,PSSE会运行那个文件。 9 e( t8 c/ o1 M注意python命令可以直接在控制台输入。控制台动作同编译python的交互式平台不同,它不自动显示调用方法所返回的结果。要想显示的话必须使用python的print命令,例如:print(psspy.aMethod(myParameters))。" T: {* m3 j+ E ^* E
一个重要的点是所有列出的方法都是psspy方法。所以使用要使用totbus方法返回母线数量时,输入CLI时不能使用ival=totbus(),而应该使用ival=psspy.totbus()。在CLI中使用print(ival)来显示ival。Python语法也可以使其简化,如:from psspy import * 。采用何种编程风格由用户决定。 + l$ |2 `5 i" J& _- O" l # y7 I" S" q3 }9 h( C在IDLE编译平台测试python代码 ) m: J/ h) e/ j& `3 Q* B; l我花了让人崩溃的长时间来寻找下面这个加入到python路径的方法。+ B- p; r9 `6 f! o
当你想将自己写的一个模块导入python,或者要把一个处在其他文件夹下的模块加入到python文件中去,那么下面的方法就大有用啦:3 _3 V. E0 X, _3 e2 a! i% p
1、 ! ?' W& J0 t6 g* F0 }4 r9 L& R7 m创建一个扩展名为.pth的文件。我们起个很漂亮比尔盖茨又很喜欢的名字myconfig.pth。当你在使用记事本之类的编辑器时就要小心了,不要保存成myconfig.pth.txt哦。! W' `8 F/ D6 D$ J: H
2、2 ]+ w* S2 d$ v( t9 y& e7 B$ I
把这个文件放到python根目录下面去,比如我的就是C:\Python23。. D% r+ Q2 g. M Q. q t
3、 4 J5 s! c; Y0 ~# X; d( S. O- G8 _把每个你想加入PYTHONPATH的文件夹全路径,单独一行的加入到这个文件中去。例如,第一行可能就是:C:\aFolder\work\Python。 8 g8 V5 Y# l/ N4 t+ a; H这样可以解决下面的错误,当你导入Spam这个模块的时候就不会出现:ImportError: No module named Spam.+ Y b0 M8 V' o3 ~9 o. ], n5 p* U
# O5 ^# ^: ?) b! s: A# [! n获取和设置网络数据 + ?" [1 [% Y# @; B直接获取数据是很费力费时的事情。在网络中的每个部分都有几个不同的参量,比如负荷。每个参量均必须分别通过函数调用来访问。所以如果要找出每个母线的电压,那么必须对每个母线通过psspy对象调用方法busdat。它的参数通过一个字符串来解释,就如一开始所说的,这些参数可以在IPLAN说明书里找到,同Python里的命令名字相同。 9 O% C# q8 g+ o
生成 9 ], s2 i" T; a/ W. D/ @字符/文件% f* I3 r8 T; B
格式的报告是可以的,我曾经试图寻找转存这些变量的方法,这样就可以不通过文件系统直接可以通过python代码来访问了,但是没找到。如果有谁找到了这种方法请告诉我。如果西门子能改进一下API的话这将变得很简单,但是我们现在只能根据已有的东西来做。 7 \$ _, J ~: }反过来,也令人郁闷的是,要设置数据,每个部分的所有参量都要提供出来。幸运的是,有默认的对象_i 和_f,当你不想改变某个值时,插入这些对象即可。当运行和导入我自己的主模块时,我把这些对象存储在psspy对象中,这样每当psspy对象使用的时候,他们就能使用。对于整形和浮点数参数分别有个默认值(对象),我想他们与各自能取到的最大值相等。, O1 ?2 [7 \1 I$ O+ v
" ~" E' {) k% c" X 在Python中组织PSSE数据 & e8 J' @/ M, I9 t8 {. @# B当使用Python扩展PSSE时,经常没有必要抽取所有的PSSE使用的数据。我创建了两个主要的类,一个与一个母线有关,叫做Bus,另一个与两条母线有关,叫做Branch。我所使用的所有层次如下所示: # z7 G2 W7 d6 L2 c
·: X% J( Q/ f# n0 g" X3 Q. l
Bus
o : s. w" r2 i8 F7 k0 _0 {Load
o1 _) u7 x3 A6 F c+ {( z& j3 |# J
Machine
· 1 e4 M& {; n# iBranch
o6 G4 C( m( `+ `! K
Line
o 1 t$ F; A( ^) H r1 L {1 X' HTransformer
我把这些对象做一个列表来标识整个的网络。Python在快速和简化处理对象列表方面非常擅长。选择或者增加方法可以用于大批bus和branch类,这些类包含有用于对象中所有参量的处理方法。这样可以提供一种便利:一个部分的任何参量,通过大量的方法均可以对其他部分可见。可是呢,我正在有目的的在我的工作中避免出现这种情况。* P J6 ?3 l; d! G! k1 z. J
注意当在Python中创建一个PSSE模型的拷贝时,这些拷贝还处于同步状态。因为潮流计算的原因,一些参数会改变而其他参数不会,例如,改变线路参数并重新计算,貌似改变了复杂(复数)的母线电压,但是不改变负荷。这样必须把从PSSE模型里观察到的数据同存储在python模型中但是在PSSE模型中使用的数据区分开来。) b- n i. u) K) Y) R6 C
* |$ a. f9 i% U r* f5 K编译更复杂的Python程序! X Q1 r: V6 N# d; ?/ W: h
我保留了一个叫做PSSPYStub.py的python文件,它包含一个仿冒的psspy类,其中对应于每个所使用的psspy方法均创建一个短小的仿冒方法。这样当我进行简单测试编译python代码时把这个PSSPYStub类代替psspy类,这样就避免了开启PSSE,可以允许python调试工具的简单使用。- z- Y* \& \3 J: |/ k5 V$ [8 w
这个短小的仿冒方法对于psspy函数来说是微不足道的,但是在使用一些函数时需要注意,例如nxtbus函数,这个函数用来返回7 Y' n! p7 Q2 p) Y2 |( I; m
调用inibus函数之后还没有输出的下一个载入PSSE的母线节点号。为在这个仿冒方法中实现这个函数,需要在inibus函数中创建一个count变量,并且在nxtbus函数中对这个变量进行递减,并返回一个母线节点号直到其达到0。 * i4 ~; ]- a- `注意!更难的python内容- Q. f5 a9 w' e$ ~/ _
调试过后的代码如果能在PSSE中运行同样可以使用IDLE界面。打开PSSE和CLI界面并且输入并运行Runldle.py,不出意外地话会打开IDLE编程环境。通过打开这个调试器运行你的python代码。 3 k1 M. L2 ]$ E( s+ m3 `使用这个方法有点不同,当你使用import命令时,主要的psspy对象和伴随的_i和_f将在你运行中的模块中不能访问。在PSSE中的“Run Auto”按钮不同于标准python 中的import命令。“”按钮允许运行一个python模块时把psspy作为一个全局变量。但是在你得到的IDLE解释器中的import命令不会把psspy作为导入模块的全局变量。在python中一个全局变量只能在本模块中可见。 2 Y7 D: B+ R/ G. c为了解决这个问题,我在本应在“Run Auto”按钮运行的代码之外创建了一个类,__init__的定义会将psspy对象作为一个参数分配到一个类变量中。这样他在整个类中都会可见。6 I! W9 e: Y! c/ M& _% R3 V* D8 v
包含这个类的模块被导入后,一个这种类的对象会被创建,这样这个类的所有函数都能被调用。例如,这个类可能包含如下的函数: & @. J2 @! k2 q; t6 F/ j) S: Z) r