# 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""")2 {6 `3 ^: t$ _+ g& d% d2 d; y$ R
psspy.fdns([0,0,0,1,1,0,99,0]) / ]! t5 a/ [$ Y Cpsspy.rawd(0,1,[1,1,1,0,0,0],0,r"""C:\Documents and Settings\jbo\MySensibleFolderName\SOLVEDtestCase_30EV30test.raw""")
注意,所有的方法都是通过一个叫做psspy的对象调用的。这个对象包括所有可用的方法和对象。他们看起来只不过是通过一个列表来组织的。我还没有写任何接口对象来组织和调用psspy方法时,就是这么想的。(瞎翻译的)- E z) G5 b2 Q$ z+ g+ P# D3 [
注意声称路径字符串的方法,这不是python提倡的格式,下面的写法更好:) O% R+ b1 Z0 G: d; O& l
"C:\\Documents and Settings\\jbo\\MySensibleFolderName\\testCase_30EV30test.raw".
/ {* E( |' N5 _) I2 r* @ 怎样来运行python代码+ A) [0 h8 M/ ^8 ^; w# h3 x
我试过三种方式 * n- g" O8 E# O8 N9 U7 M, i9 `: V1、: A/ y% ?# }+ n% U# R2 y
在PSSE中打开命令输入窗口(command line input, CLI)任务。) [. ]+ e& t9 v+ e# u
2、 4 r' ]9 ^4 m* H' Q在PSSE中选择“Run Automation File”按钮运行一个python文件。 5 `1 N6 ^; D! p/ [2 Q8 v3、* P) w; k8 ^6 a- s
在PSSE30中python文件作为一个命令行变量。你可以指定图形界面只有在完成之后才出现。这可以为机器节省内存。在这种情况下,你可以指定仿真的母线数量。可以参照PSSE Users Manual中的PSSE Overview。 8 w& `; H) ?% K# j4 a* [0 _7 R在PSSE中打开CLI ! p" {1 T! e4 ^- `+ d+ u( F1、: b+ R- p7 ^3 O
在“I/O Control”菜单中选择“Begin command line input session”。( W$ F4 g- U' R9 I
2、 6 s8 K |" T* A$ @0 Y6 n3 C使用“Command Language”选择框将语言更改为python。) Q0 q# f( p) C M$ p% d
3、 - o9 l1 U. o; o7 g( B# c2 ]选择“RunAuto”按钮并选择一个python文件,PSSE会运行那个文件。" Q4 G6 |. H; o: }+ R( B; e4 @! b
注意python命令可以直接在控制台输入。控制台动作同编译python的交互式平台不同,它不自动显示调用方法所返回的结果。要想显示的话必须使用python的print命令,例如:print(psspy.aMethod(myParameters))。 . s8 S; u7 F) l7 e" `2 ~9 Y一个重要的点是所有列出的方法都是psspy方法。所以使用要使用totbus方法返回母线数量时,输入CLI时不能使用ival=totbus(),而应该使用ival=psspy.totbus()。在CLI中使用print(ival)来显示ival。Python语法也可以使其简化,如:from psspy import * 。采用何种编程风格由用户决定。 {" x, `- M) E$ I9 w 9 E4 `# X- x6 c5 H$ g' M/ X在IDLE编译平台测试python代码2 Y3 d$ ~, T/ K3 u! f
我花了让人崩溃的长时间来寻找下面这个加入到python路径的方法。 % ]+ M6 e9 n/ M8 N5 |: J# B( B$ |当你想将自己写的一个模块导入python,或者要把一个处在其他文件夹下的模块加入到python文件中去,那么下面的方法就大有用啦:" e" `1 A: h) s
1、 / `& \/ Y2 V& f* I8 H创建一个扩展名为.pth的文件。我们起个很漂亮比尔盖茨又很喜欢的名字myconfig.pth。当你在使用记事本之类的编辑器时就要小心了,不要保存成myconfig.pth.txt哦。. {/ d' s& x& E3 d Y* F* e
2、 3 Z! a( l( I0 R( O' Z1 I1 |把这个文件放到python根目录下面去,比如我的就是C:\Python23。 ) Z9 H- R' H% C3、 / g6 R1 E P3 q i1 G把每个你想加入PYTHONPATH的文件夹全路径,单独一行的加入到这个文件中去。例如,第一行可能就是:C:\aFolder\work\Python。 9 x& g% E1 W' v. K# C4 p9 d7 q这样可以解决下面的错误,当你导入Spam这个模块的时候就不会出现:ImportError: No module named Spam.) Y7 m/ z. s+ J( M+ \
; V4 [$ Y+ r) q7 S* d 获取和设置网络数据* Z8 i' L# h I0 ?
直接获取数据是很费力费时的事情。在网络中的每个部分都有几个不同的参量,比如负荷。每个参量均必须分别通过函数调用来访问。所以如果要找出每个母线的电压,那么必须对每个母线通过psspy对象调用方法busdat。它的参数通过一个字符串来解释,就如一开始所说的,这些参数可以在IPLAN说明书里找到,同Python里的命令名字相同。 ! ` Q' K$ w8 Y, z生成 - k, k( }# Q' B0 ], A- n: O8 l i字符/文件 1 D2 [1 e1 X5 q格式的报告是可以的,我曾经试图寻找转存这些变量的方法,这样就可以不通过文件系统直接可以通过python代码来访问了,但是没找到。如果有谁找到了这种方法请告诉我。如果西门子能改进一下API的话这将变得很简单,但是我们现在只能根据已有的东西来做。: f9 Q1 S3 o. R5 X; |
反过来,也令人郁闷的是,要设置数据,每个部分的所有参量都要提供出来。幸运的是,有默认的对象_i 和_f,当你不想改变某个值时,插入这些对象即可。当运行和导入我自己的主模块时,我把这些对象存储在psspy对象中,这样每当psspy对象使用的时候,他们就能使用。对于整形和浮点数参数分别有个默认值(对象),我想他们与各自能取到的最大值相等。 / B# {, D$ F ^1 u 9 x" w# [5 u5 M" t/ _在Python中组织PSSE数据 $ [7 k' Z% B( ^# }) m当使用Python扩展PSSE时,经常没有必要抽取所有的PSSE使用的数据。我创建了两个主要的类,一个与一个母线有关,叫做Bus,另一个与两条母线有关,叫做Branch。我所使用的所有层次如下所示:' f2 w% E; k" F" F& r" N
· . p8 W: d4 w1 w5 j/ g5 GBus
o / k! X" c- M9 `! W& LLoad
o ( e: }% j/ ^/ |' I! z4 \* J! SMachine
· - h* e1 c. u0 }, M1 P" S( tBranch
o* M _* ?' w: y: V- U1 T. H
Line
o% Z- r7 v0 f) i7 |
Transformer
我把这些对象做一个列表来标识整个的网络。Python在快速和简化处理对象列表方面非常擅长。选择或者增加方法可以用于大批bus和branch类,这些类包含有用于对象中所有参量的处理方法。这样可以提供一种便利:一个部分的任何参量,通过大量的方法均可以对其他部分可见。可是呢,我正在有目的的在我的工作中避免出现这种情况。! N* y _! N# h4 q& h& @
注意当在Python中创建一个PSSE模型的拷贝时,这些拷贝还处于同步状态。因为潮流计算的原因,一些参数会改变而其他参数不会,例如,改变线路参数并重新计算,貌似改变了复杂(复数)的母线电压,但是不改变负荷。这样必须把从PSSE模型里观察到的数据同存储在python模型中但是在PSSE模型中使用的数据区分开来。 & p' t7 a+ L6 F7 i3 ~6 q9 P - E- F: v7 u* ] q6 ]" Q) o编译更复杂的Python程序! H5 u; M+ z: ` B) u- u
我保留了一个叫做PSSPYStub.py的python文件,它包含一个仿冒的psspy类,其中对应于每个所使用的psspy方法均创建一个短小的仿冒方法。这样当我进行简单测试编译python代码时把这个PSSPYStub类代替psspy类,这样就避免了开启PSSE,可以允许python调试工具的简单使用。 4 D4 W* ]& Q0 U0 s' u这个短小的仿冒方法对于psspy函数来说是微不足道的,但是在使用一些函数时需要注意,例如nxtbus函数,这个函数用来返回 $ t4 e* _7 [* N& w. B+ v7 a- Z7 v调用inibus函数之后还没有输出的下一个载入PSSE的母线节点号。为在这个仿冒方法中实现这个函数,需要在inibus函数中创建一个count变量,并且在nxtbus函数中对这个变量进行递减,并返回一个母线节点号直到其达到0。 & q; K" M; v8 y1 B9 I" f _注意!更难的python内容 $ v( j7 i; ]) K/ i8 L! E/ e1 H调试过后的代码如果能在PSSE中运行同样可以使用IDLE界面。打开PSSE和CLI界面并且输入并运行Runldle.py,不出意外地话会打开IDLE编程环境。通过打开这个调试器运行你的python代码。 ' R6 R t' r9 `3 u使用这个方法有点不同,当你使用import命令时,主要的psspy对象和伴随的_i和_f将在你运行中的模块中不能访问。在PSSE中的“Run Auto”按钮不同于标准python 中的import命令。“”按钮允许运行一个python模块时把psspy作为一个全局变量。但是在你得到的IDLE解释器中的import命令不会把psspy作为导入模块的全局变量。在python中一个全局变量只能在本模块中可见。# D: A7 U: |6 t. F s, U
为了解决这个问题,我在本应在“Run Auto”按钮运行的代码之外创建了一个类,__init__的定义会将psspy对象作为一个参数分配到一个类变量中。这样他在整个类中都会可见。 5 e7 S* l, b( s包含这个类的模块被导入后,一个这种类的对象会被创建,这样这个类的所有函数都能被调用。例如,这个类可能包含如下的函数: + v- Y d8 |* l1 L
· - b, b z5 R; {loadRawFile装载一个raw文件到PSSE中.
·0 `9 G( T% {9 U" n- q
parseDataFile 3 D# b N; K' D- K$ C$ U装载额外的仿真参数.