( B9 [, _/ D8 D* D' f! S3 T' j
- U/ j) B: x a
PSSE30提供了Python的API接口,使在PSSE中使用Python脚本语言成为了可能,这不仅使PSSE批量运行,同时可以根据你的Python代码,使处理功能更强大,更灵活。% B. J) F+ j' F/ ]3 Y L. n
我没有找到很好的关于在PSSE中使用Pyhton的资料,我把我能找到的东西写在这里供初学者入门。 |$ B3 E. F" u+ n" j- W& c前面的一些资料能在使用说明书USERS.pdf的第12章找到,其他资料是通过API.pdf和IPLAN.pdf综合而来的,可以从中找到。 . N7 D7 V% _" T0 w% a0 U我发现使用Adobe的搜索功能非常有用,你可以根据一个关键词同时搜索在一个文件夹下面的所有的pdf文件,这样寻找某个函数的IPLAN和API的描述遍得很简单。IPLAN的描述一般在查找详细描述“某些传递数据的参数”的解释时非常有用。IPLAN函数的名称同API文档中Python的那些函数相同,只是后者是大写字母而已。 : G$ a! X8 @ i我使用的是30版本的PSSE,和2.3版的Pyhton,这篇文章的前提是你了解一些基本的Python,Mack Lutz和David Ascher写的《Learning Pyhon》非常不错。 1 }) c0 h$ x) Q4 Z; ?Python 4 `8 M7 b9 h0 q+ D+ j2 G6 }Python.org homepage 9 \$ z6 ^* T1 E5 J PSSE: X4 m5 u. ?6 b6 y Power System Simulator for Engineering. ) j* g6 C* T9 ?+ W8 D : H" k3 W i( ?( u0 w6 D在PSSE中使用Python简介 . y! w& Q2 Q2 f1 f& [PSSE说明文档说:根据你在PSSE中的操作可以生成Python代码。这花了我一段时间才理解,因为我是PSSE和Python的初学者。根据以下步骤,可以生成你的第一个python代码,用来进行潮流计算分析。前提是你有一个包含有网络信息的.raw文件,格式符合PSSE30要求。 $ g/ ]( c( }) x' ]7 j. S1、 2 \6 z. D: L5 o% F2 m打开PSSE。- \6 V" c2 s, }8 c3 r7 Q: Q
2、/ i' Y, G$ V" ?, y7 M7 G: Q7 @1 Q- P0 D
选择“I/O Control”中的“Start Recording”菜单,输入一个PSSE写入的文件名。PSSE会自动地添加.py后缀。 8 U. O( q+ a3 I( f/ Q6 o# j3、1 t3 ^( B \0 y# F3 ~- ~
使用“File”菜单中的“Open”按钮,读入网络信息。将文件类型设定为.raw告诉PSSE你在给他的是raw文件(不知道是原文傻还是我翻译的傻:’()( g9 q' X- y5 d
4、 : @4 e% n1 b' r- B; p选择“Power Flow”中“Solution”,选择“Solve”,运行潮流计算。选择所需要的设置模式,点击“Solve”按钮。# W; C' a; Y0 e, `3 l
5、 : u$ p3 n/ l3 y' X" o选择“File”菜单中的“Save or Show”保存运算结果。选择“Power Flow Raw Data”选项卡,点击“Data File”单选按钮,并在旁边的文本框中输入文件名。点击OK按钮。 / f7 u& v8 s, p4 Z7 L使用你最喜欢的python浏览器查看生成的python代码。4 @& a" s4 m2 N. C
# 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 Z' ]+ n1 h: s- x
psspy.fdns([0,0,0,1,1,0,99,0])/ g. k; U- d4 q5 ]* ?4 e
psspy.rawd(0,1,[1,1,1,0,0,0],0,r"""C:\Documents and Settings\jbo\MySensibleFolderName\SOLVEDtestCase_30EV30test.raw""")
注意,所有的方法都是通过一个叫做psspy的对象调用的。这个对象包括所有可用的方法和对象。他们看起来只不过是通过一个列表来组织的。我还没有写任何接口对象来组织和调用psspy方法时,就是这么想的。(瞎翻译的); j$ }& e. P, a% h/ b3 p0 s5 L4 E O3 T# c
注意声称路径字符串的方法,这不是python提倡的格式,下面的写法更好: # u) b; Z3 J1 @( \: w
"C:\\Documents and Settings\\jbo\\MySensibleFolderName\\testCase_30EV30test.raw".
$ h B* ]! }+ o2 x4 `- r怎样来运行python代码 T3 c0 o5 K0 Q1 E
我试过三种方式 . q6 ^" x7 i! c: Y1、- W) M' T) n) v' C" }% K$ l1 a) V" d- K
在PSSE中打开命令输入窗口(command line input, CLI)任务。5 ~0 y& d/ u$ v
2、: g0 r. \6 d, C( g$ w9 F
在PSSE中选择“Run Automation File”按钮运行一个python文件。 ) ]/ z: m2 D( @" i; {3、 ' T3 A4 G: e* Q' J, t) l在PSSE30中python文件作为一个命令行变量。你可以指定图形界面只有在完成之后才出现。这可以为机器节省内存。在这种情况下,你可以指定仿真的母线数量。可以参照PSSE Users Manual中的PSSE Overview。 " j `& z% p+ {% `在PSSE中打开CLI" ?, ]- k. } Q8 d1 m4 e
1、' x( b6 h7 \8 J2 d3 f: q: S3 c
在“I/O Control”菜单中选择“Begin command line input session”。3 X" n! q! L) z, [; u9 B) o
2、2 b' p9 M7 @8 f5 f- ]
使用“Command Language”选择框将语言更改为python。 2 Q/ C+ u8 J2 A8 H3 ^$ j3、 : d. }7 n) d, }+ d选择“RunAuto”按钮并选择一个python文件,PSSE会运行那个文件。" F( S9 T1 H4 H* n7 i2 l+ D5 l
注意python命令可以直接在控制台输入。控制台动作同编译python的交互式平台不同,它不自动显示调用方法所返回的结果。要想显示的话必须使用python的print命令,例如:print(psspy.aMethod(myParameters))。" f1 D+ o" a! m! @# X; s2 U
一个重要的点是所有列出的方法都是psspy方法。所以使用要使用totbus方法返回母线数量时,输入CLI时不能使用ival=totbus(),而应该使用ival=psspy.totbus()。在CLI中使用print(ival)来显示ival。Python语法也可以使其简化,如:from psspy import * 。采用何种编程风格由用户决定。 1 W8 f0 ~% ]/ N( c9 T . {. I6 `9 R! a/ P4 B 在IDLE编译平台测试python代码 ' ^. P$ ~1 N7 Y7 @8 E" @+ S我花了让人崩溃的长时间来寻找下面这个加入到python路径的方法。 * h$ E F# n/ q+ x7 i当你想将自己写的一个模块导入python,或者要把一个处在其他文件夹下的模块加入到python文件中去,那么下面的方法就大有用啦: 2 g/ v# e* V* T1、& U: I U/ @+ U- @1 @) t
创建一个扩展名为.pth的文件。我们起个很漂亮比尔盖茨又很喜欢的名字myconfig.pth。当你在使用记事本之类的编辑器时就要小心了,不要保存成myconfig.pth.txt哦。 : j. H, m2 X0 L( c m" b3 B: g2、 6 x* |& j. a: i7 U; w! |把这个文件放到python根目录下面去,比如我的就是C:\Python23。 8 X. `2 c5 H7 y, I1 @% @! |/ Z3、 ! |5 |) D% K9 @, C1 v, V把每个你想加入PYTHONPATH的文件夹全路径,单独一行的加入到这个文件中去。例如,第一行可能就是:C:\aFolder\work\Python。% X, `2 i7 O+ W" n9 @
这样可以解决下面的错误,当你导入Spam这个模块的时候就不会出现:ImportError: No module named Spam., o/ O8 n0 X h3 @# d
, L2 E1 N& D' Q$ F; {, P& W 获取和设置网络数据3 T, t; t3 T: M0 M& I6 |+ `9 C. N" r m
直接获取数据是很费力费时的事情。在网络中的每个部分都有几个不同的参量,比如负荷。每个参量均必须分别通过函数调用来访问。所以如果要找出每个母线的电压,那么必须对每个母线通过psspy对象调用方法busdat。它的参数通过一个字符串来解释,就如一开始所说的,这些参数可以在IPLAN说明书里找到,同Python里的命令名字相同。 % g% R7 z+ L, @4 I2 ^! H/ t
生成. _9 \8 F! W5 q& v' ]7 p D
字符/文件9 v$ F7 p- F( q1 o/ w9 k e; A
格式的报告是可以的,我曾经试图寻找转存这些变量的方法,这样就可以不通过文件系统直接可以通过python代码来访问了,但是没找到。如果有谁找到了这种方法请告诉我。如果西门子能改进一下API的话这将变得很简单,但是我们现在只能根据已有的东西来做。 , H& ?) Z5 {: z ]反过来,也令人郁闷的是,要设置数据,每个部分的所有参量都要提供出来。幸运的是,有默认的对象_i 和_f,当你不想改变某个值时,插入这些对象即可。当运行和导入我自己的主模块时,我把这些对象存储在psspy对象中,这样每当psspy对象使用的时候,他们就能使用。对于整形和浮点数参数分别有个默认值(对象),我想他们与各自能取到的最大值相等。 & n- C, v) R( r7 e, L; i4 \ 7 ?" d7 T2 H V; q ]4 | 在Python中组织PSSE数据0 K! Q6 d \* \+ O9 q) j
当使用Python扩展PSSE时,经常没有必要抽取所有的PSSE使用的数据。我创建了两个主要的类,一个与一个母线有关,叫做Bus,另一个与两条母线有关,叫做Branch。我所使用的所有层次如下所示: - ?# C) ?2 k# ^4 u" W. ?, {; Y
·3 l; T! ~2 h2 c) l. f! Q8 P
Bus
o! u/ |1 F) O2 P' n
Load
o+ {7 d+ s6 Z5 ` ~+ U7 L( V6 W
Machine
·8 k0 [4 F$ C# h; ]
Branch
o, l5 ^! U% ^0 p5 K" } O
Line
o; M. X, j$ f2 d! M' v8 A4 P, U, X; y/ \
Transformer
我把这些对象做一个列表来标识整个的网络。Python在快速和简化处理对象列表方面非常擅长。选择或者增加方法可以用于大批bus和branch类,这些类包含有用于对象中所有参量的处理方法。这样可以提供一种便利:一个部分的任何参量,通过大量的方法均可以对其他部分可见。可是呢,我正在有目的的在我的工作中避免出现这种情况。 3 A2 |2 s0 B2 w: V' B4 P! _注意当在Python中创建一个PSSE模型的拷贝时,这些拷贝还处于同步状态。因为潮流计算的原因,一些参数会改变而其他参数不会,例如,改变线路参数并重新计算,貌似改变了复杂(复数)的母线电压,但是不改变负荷。这样必须把从PSSE模型里观察到的数据同存储在python模型中但是在PSSE模型中使用的数据区分开来。 " v" T- y8 L1 d. O5 z + a: c7 D7 n3 a9 s4 i编译更复杂的Python程序7 n ^* X( ?0 Y/ `$ H, P
我保留了一个叫做PSSPYStub.py的python文件,它包含一个仿冒的psspy类,其中对应于每个所使用的psspy方法均创建一个短小的仿冒方法。这样当我进行简单测试编译python代码时把这个PSSPYStub类代替psspy类,这样就避免了开启PSSE,可以允许python调试工具的简单使用。 d' V9 c8 C1 Y7 ?! E4 ~这个短小的仿冒方法对于psspy函数来说是微不足道的,但是在使用一些函数时需要注意,例如nxtbus函数,这个函数用来返回 : i4 f D, F, i& _调用inibus函数之后还没有输出的下一个载入PSSE的母线节点号。为在这个仿冒方法中实现这个函数,需要在inibus函数中创建一个count变量,并且在nxtbus函数中对这个变量进行递减,并返回一个母线节点号直到其达到0。 % }; ?3 Y. m& |( A0 [ l! Q注意!更难的python内容! F9 P1 g+ L( Y; h+ P; k) O
调试过后的代码如果能在PSSE中运行同样可以使用IDLE界面。打开PSSE和CLI界面并且输入并运行Runldle.py,不出意外地话会打开IDLE编程环境。通过打开这个调试器运行你的python代码。 ( X- m& P# M$ ^ h3 t$ p使用这个方法有点不同,当你使用import命令时,主要的psspy对象和伴随的_i和_f将在你运行中的模块中不能访问。在PSSE中的“Run Auto”按钮不同于标准python 中的import命令。“”按钮允许运行一个python模块时把psspy作为一个全局变量。但是在你得到的IDLE解释器中的import命令不会把psspy作为导入模块的全局变量。在python中一个全局变量只能在本模块中可见。 8 `% k( f% ^# d2 B" C- ~3 ?为了解决这个问题,我在本应在“Run Auto”按钮运行的代码之外创建了一个类,__init__的定义会将psspy对象作为一个参数分配到一个类变量中。这样他在整个类中都会可见。 1 I5 }6 J; Q. l+ x# H包含这个类的模块被导入后,一个这种类的对象会被创建,这样这个类的所有函数都能被调用。例如,这个类可能包含如下的函数: / m: b: I, {( \9 N. ^) K