1 # Copyright (C) 2010-2011 Richard Lincoln
3 # Permission is hereby granted, free of charge, to any person obtaining a copy
4 # of this software and associated documentation files (the "Software"), to
5 # deal in the Software without restriction, including without limitation the
6 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 # sell copies of the Software, and to permit persons to whom the Software is
8 # furnished to do so, subject to the following conditions:
10 # The above copyright notice and this permission notice shall be included in
11 # all copies or substantial portions of the Software.
13 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 from CIM14
.CPSM
.Equipment
.Wires
.RegulatingCondEq
import RegulatingCondEq
23 class SynchronousMachine(RegulatingCondEq
):
24 """An electromechanical device that operates synchronously with the network. It is a single machine operating either as a generator or synchronous condenser or pump.- [R7.2] and [R9.3] are satisfied by navigation to ConnectivityNode and Substation. - If a SynchronousMachine is not associated with a ReactiveCapabilityCurve, then the minQ and maxQ attributes will be used. - If a ReactiveCapabilityCurve is supplied, then the minQ and maxQ attributes are not required. - If a synchronous condenser is being modeled so that there is no capability for real power output, the SynchronousMachine is not required to be associated with a GeneratingUnit. In this case, the type and operatingMode attributes must both be set to “condenser”. - Attributes qPercent, r, r0, r2, x, x0, x2, ratedS and referencePriority are not required. SynchronousMachine.GeneratingUnit is required for this profile - need to change UML to reflect this.
27 def __init__(self
, x0
=0.0, qPercent
=0.0, x2
=0.0, r
=0.0, operatingMode
="condenser", r0
=0.0, type="condenser", r2
=0.0, maxQ
=0.0, x
=0.0, ratedS
=0.0, minQ
=0.0, InitialReactiveCapabilityCurve
=None, HydroPump
=None, GeneratingUnit
=None, *args
, **kw_args
):
28 """Initialises a new 'SynchronousMachine' instance.
30 @param x0: Zero sequence reactance of the synchronous machine.
31 @param qPercent: Percent of the coordinated reactive control that comes from this machine.
32 @param x2: Negative sequence reactance.
33 @param r: Positive sequence resistance of the synchronous machine.
34 @param operatingMode: Current mode of operation. Values are: "condenser", "generator"
35 @param r0: Zero sequence resistance of the synchronous machine.
36 @param type: Modes that this synchronous machine can operate in. Values are: "condenser", "generator_or_condenser", "generator"
37 @param r2: Negative sequence resistance.
38 @param maxQ: Maximum reactive power limit. This is the maximum (nameplate) limit for the unit.
39 @param x: Positive sequence reactance of the synchronous machine.
40 @param ratedS: Nameplate apparent power rating for the unit
41 @param minQ: Minimum reactive power limit for the unit.
42 @param InitialReactiveCapabilityCurve: The default ReactiveCapabilityCurve for use by a SynchronousMachine
43 @param HydroPump: The synchronous machine drives the turbine which moves the water from a low elevation to a higher elevation. The direction of machine rotation for pumping may or may not be the same as for generating.
44 @param GeneratingUnit: A synchronous machine may operate as a generator and as such becomes a member of a generating unit
46 #: Zero sequence reactance of the synchronous machine.
49 #: Percent of the coordinated reactive control that comes from this machine.
50 self
.qPercent
= qPercent
52 #: Negative sequence reactance.
55 #: Positive sequence resistance of the synchronous machine.
58 #: Current mode of operation. Values are: "condenser", "generator"
59 self
.operatingMode
= operatingMode
61 #: Zero sequence resistance of the synchronous machine.
64 #: Modes that this synchronous machine can operate in. Values are: "condenser", "generator_or_condenser", "generator"
67 #: Negative sequence resistance.
70 #: Maximum reactive power limit. This is the maximum (nameplate) limit for the unit.
73 #: Positive sequence reactance of the synchronous machine.
76 #: Nameplate apparent power rating for the unit
79 #: Minimum reactive power limit for the unit.
82 self
._InitialReactiveCapabilityCurve
= None
83 self
.InitialReactiveCapabilityCurve
= InitialReactiveCapabilityCurve
85 self
._HydroPump
= None
86 self
.HydroPump
= HydroPump
88 self
._GeneratingUnit
= None
89 self
.GeneratingUnit
= GeneratingUnit
91 super(SynchronousMachine
, self
).__init
__(*args
, **kw_args
)
93 _attrs
= ["x0", "qPercent", "x2", "r", "operatingMode", "r0", "type", "r2", "maxQ", "x", "ratedS", "minQ"]
94 _attr_types
= {"x0": float, "qPercent": float, "x2": float, "r": float, "operatingMode": str, "r0": float, "type": str, "r2": float, "maxQ": float, "x": float, "ratedS": float, "minQ": float}
95 _defaults
= {"x0": 0.0, "qPercent": 0.0, "x2": 0.0, "r": 0.0, "operatingMode": "condenser", "r0": 0.0, "type": "condenser", "r2": 0.0, "maxQ": 0.0, "x": 0.0, "ratedS": 0.0, "minQ": 0.0}
96 _enums
= {"operatingMode": "SynchronousMachineOperatingMode", "type": "SynchronousMachineType"}
97 _refs
= ["InitialReactiveCapabilityCurve", "HydroPump", "GeneratingUnit"]
100 def getInitialReactiveCapabilityCurve(self
):
101 """The default ReactiveCapabilityCurve for use by a SynchronousMachine
103 return self
._InitialReactiveCapabilityCurve
105 def setInitialReactiveCapabilityCurve(self
, value
):
106 if self
._InitialReactiveCapabilityCurve
is not None:
107 filtered
= [x
for x
in self
.InitialReactiveCapabilityCurve
.InitiallyUsedBySynchronousMachines
if x
!= self
]
108 self
._InitialReactiveCapabilityCurve
._InitiallyUsedBySynchronousMachines
= filtered
110 self
._InitialReactiveCapabilityCurve
= value
111 if self
._InitialReactiveCapabilityCurve
is not None:
112 if self
not in self
._InitialReactiveCapabilityCurve
._InitiallyUsedBySynchronousMachines
:
113 self
._InitialReactiveCapabilityCurve
._InitiallyUsedBySynchronousMachines
.append(self
)
115 InitialReactiveCapabilityCurve
= property(getInitialReactiveCapabilityCurve
, setInitialReactiveCapabilityCurve
)
117 def getHydroPump(self
):
118 """The synchronous machine drives the turbine which moves the water from a low elevation to a higher elevation. The direction of machine rotation for pumping may or may not be the same as for generating.
120 return self
._HydroPump
122 def setHydroPump(self
, value
):
123 if self
._HydroPump
is not None:
124 self
._HydroPump
._SynchronousMachine
= None
126 self
._HydroPump
= value
127 if self
._HydroPump
is not None:
128 self
._HydroPump
.SynchronousMachine
= None
129 self
._HydroPump
._SynchronousMachine
= self
131 HydroPump
= property(getHydroPump
, setHydroPump
)
133 def getGeneratingUnit(self
):
134 """A synchronous machine may operate as a generator and as such becomes a member of a generating unit
136 return self
._GeneratingUnit
138 def setGeneratingUnit(self
, value
):
139 if self
._GeneratingUnit
is not None:
140 filtered
= [x
for x
in self
.GeneratingUnit
.SynchronousMachines
if x
!= self
]
141 self
._GeneratingUnit
._SynchronousMachines
= filtered
143 self
._GeneratingUnit
= value
144 if self
._GeneratingUnit
is not None:
145 if self
not in self
._GeneratingUnit
._SynchronousMachines
:
146 self
._GeneratingUnit
._SynchronousMachines
.append(self
)
148 GeneratingUnit
= property(getGeneratingUnit
, setGeneratingUnit
)