Skip to main content

cimstructs/
PowerTransformerEnd.rs

1/// A PowerTransformerEnd is associated with each Terminal of a PowerTransformer. The impedance values r, r0, x, and x0 of a PowerTransformerEnd represents a star equivalent as follows. 1) for a two Terminal PowerTransformer the high voltage (TransformerEnd.endNumber=1) PowerTransformerEnd has non zero values on r, r0, x, and x0 while the low voltage (TransformerEnd.endNumber=2) PowerTransformerEnd has zero values for r, r0, x, and x0. Parameters are always provided, even if the PowerTransformerEnds have the same rated voltage. In this case, the parameters are provided at the PowerTransformerEnd which has TransformerEnd.endNumber equal to 1. 2) for a three Terminal PowerTransformer the three PowerTransformerEnds represent a star equivalent with each leg in the star represented by r, r0, x, and x0 values. 3) For a three Terminal transformer each PowerTransformerEnd shall have g, g0, b and b0 values corresponding to the no load losses distributed on the three PowerTransformerEnds. The total no load loss shunt impedances may also be placed at one of the PowerTransformerEnds, preferably the end numbered 1, having the shunt values on end 1. This is the preferred way. 4) for a PowerTransformer with more than three Terminals the PowerTransformerEnd impedance values cannot be used. Instead use the TransformerMeshImpedance or split the transformer into multiple PowerTransformers. Each PowerTransformerEnd must be contained by a PowerTransformer. Because a PowerTransformerEnd (or any other object) can not be contained by more than one parent, a PowerTransformerEnd can not have an association to an EquipmentContainer (Substation, VoltageLevel, etc).
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct PowerTransformerEnd {
4    #[serde(flatten)]
5    pub base: super::TransformerEnd,
6    /// The power transformer of this power transformer end.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub power_transformer: Option<super::base::MridRef>,
9    /// Magnetizing branch susceptance (B mag). The value can be positive or negative.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub b: Option<f64>,
12    /// Zero sequence magnetizing branch susceptance.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub b0: Option<f64>,
15    /// Kind of connection.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub connection_kind: Option<super::base::UriRef>,
18    /// Magnetizing branch conductance.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub g: Option<f64>,
21    /// Zero sequence magnetizing branch conductance (star-model).
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub g0: Option<f64>,
24    /// Terminal voltage phase angle displacement where 360 degrees are represented with clock hours. The valid values are 0 to 11. For example, for the secondary side end of a transformer with vector group code of 'Dyn11', specify the connection kind as wye with neutral and specify the phase angle of the clock as 11. The clock value of the transformer end number specified as 1, is assumed to be zero. Note the transformer end number is not assumed to be the same as the terminal sequence number.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub phase_angle_clock: Option<i64>,
27    /// Resistance (star-model) of the transformer end. The attribute shall be equal to or greater than zero for non-equivalent transformers.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub r: Option<f64>,
30    /// Zero sequence series resistance (star-model) of the transformer end.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub r0: Option<f64>,
33    /// Normal apparent power rating. The attribute shall be a positive value. For a two-winding transformer the values for the high and low voltage sides shall be identical.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub rated_s: Option<f64>,
36    /// Rated voltage: phase-phase for three-phase windings, and either phase-phase or phase-neutral for single-phase windings. A high voltage side, as given by TransformerEnd.endNumber, shall have a ratedU that is greater than or equal to ratedU for the lower voltage sides. The attribute shall be a positive value.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub rated_u: Option<f64>,
39    /// Positive sequence series reactance (star-model) of the transformer end.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub x: Option<f64>,
42    /// Zero sequence series reactance of the transformer end.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub x0: Option<f64>,
45}
46impl crate::base::CimElement for PowerTransformerEnd {
47    fn mrid(&self) -> &str { &self.base.base.id }
48    fn type_name(&self) -> &'static str { "PowerTransformerEnd" }
49    fn as_any(&self) -> &dyn std::any::Any { self }
50    fn to_json_value(&self) -> serde_json::Value {
51        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
52    }
53    fn to_block(&self) -> crate::base::RdfBlock {
54        let mut block = self.base.to_block();
55        block.type_name = "PowerTransformerEnd".to_string();
56        if let Some(ref v) = self.power_transformer {
57            block.fields.insert("PowerTransformerEnd.PowerTransformer".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
58        }
59        if let Some(v) = self.b {
60            block.fields.insert("PowerTransformerEnd.b".into(), crate::base::FieldValue::Text(v.to_string()));
61        }
62        if let Some(v) = self.b0 {
63            block.fields.insert("PowerTransformerEnd.b0".into(), crate::base::FieldValue::Text(v.to_string()));
64        }
65        if let Some(ref v) = self.connection_kind {
66            block.fields.insert("PowerTransformerEnd.connectionKind".into(), crate::base::FieldValue::Resource(v.uri.clone()));
67        }
68        if let Some(v) = self.g {
69            block.fields.insert("PowerTransformerEnd.g".into(), crate::base::FieldValue::Text(v.to_string()));
70        }
71        if let Some(v) = self.g0 {
72            block.fields.insert("PowerTransformerEnd.g0".into(), crate::base::FieldValue::Text(v.to_string()));
73        }
74        if let Some(v) = self.phase_angle_clock {
75            block.fields.insert("PowerTransformerEnd.phaseAngleClock".into(), crate::base::FieldValue::Text(v.to_string()));
76        }
77        if let Some(v) = self.r {
78            block.fields.insert("PowerTransformerEnd.r".into(), crate::base::FieldValue::Text(v.to_string()));
79        }
80        if let Some(v) = self.r0 {
81            block.fields.insert("PowerTransformerEnd.r0".into(), crate::base::FieldValue::Text(v.to_string()));
82        }
83        if let Some(v) = self.rated_s {
84            block.fields.insert("PowerTransformerEnd.ratedS".into(), crate::base::FieldValue::Text(v.to_string()));
85        }
86        if let Some(v) = self.rated_u {
87            block.fields.insert("PowerTransformerEnd.ratedU".into(), crate::base::FieldValue::Text(v.to_string()));
88        }
89        if let Some(v) = self.x {
90            block.fields.insert("PowerTransformerEnd.x".into(), crate::base::FieldValue::Text(v.to_string()));
91        }
92        if let Some(v) = self.x0 {
93            block.fields.insert("PowerTransformerEnd.x0".into(), crate::base::FieldValue::Text(v.to_string()));
94        }
95        block
96    }
97}
98
99impl PowerTransformerEnd {
100    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
101        let mut obj = Self::default();
102        obj.base.base.id.clone_from(&b.mrid);
103        for (key, val) in &b.fields {
104            match key.as_str() {
105                "PowerTransformerEnd.PowerTransformer" => {
106                    if let crate::base::FieldValue::Resource(sv) = val {
107                        obj.power_transformer = Some(crate::base::MridRef { mrid: sv.clone() });
108                    }
109                }
110                "PowerTransformerEnd.b" => {
111                    match val {
112                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.b = Some(v); } }
113                        crate::base::FieldValue::TextList(svs) => {
114                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.b = Some(v); } }
115                        }
116                        _ => {}
117                    }
118                }
119                "PowerTransformerEnd.b0" => {
120                    match val {
121                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.b0 = Some(v); } }
122                        crate::base::FieldValue::TextList(svs) => {
123                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.b0 = Some(v); } }
124                        }
125                        _ => {}
126                    }
127                }
128                "PowerTransformerEnd.connectionKind" => {
129                    if let crate::base::FieldValue::Resource(sv) = val {
130                        obj.connection_kind = Some(crate::base::UriRef { uri: sv.clone() });
131                    }
132                }
133                "PowerTransformerEnd.g" => {
134                    match val {
135                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.g = Some(v); } }
136                        crate::base::FieldValue::TextList(svs) => {
137                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.g = Some(v); } }
138                        }
139                        _ => {}
140                    }
141                }
142                "PowerTransformerEnd.g0" => {
143                    match val {
144                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.g0 = Some(v); } }
145                        crate::base::FieldValue::TextList(svs) => {
146                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.g0 = Some(v); } }
147                        }
148                        _ => {}
149                    }
150                }
151                "PowerTransformerEnd.phaseAngleClock" => {
152                    match val {
153                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.phase_angle_clock = Some(v); } }
154                        crate::base::FieldValue::TextList(svs) => {
155                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.phase_angle_clock = Some(v); } }
156                        }
157                        _ => {}
158                    }
159                }
160                "PowerTransformerEnd.r" => {
161                    match val {
162                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.r = Some(v); } }
163                        crate::base::FieldValue::TextList(svs) => {
164                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.r = Some(v); } }
165                        }
166                        _ => {}
167                    }
168                }
169                "PowerTransformerEnd.r0" => {
170                    match val {
171                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.r0 = Some(v); } }
172                        crate::base::FieldValue::TextList(svs) => {
173                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.r0 = Some(v); } }
174                        }
175                        _ => {}
176                    }
177                }
178                "PowerTransformerEnd.ratedS" => {
179                    match val {
180                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.rated_s = Some(v); } }
181                        crate::base::FieldValue::TextList(svs) => {
182                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.rated_s = Some(v); } }
183                        }
184                        _ => {}
185                    }
186                }
187                "PowerTransformerEnd.ratedU" => {
188                    match val {
189                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.rated_u = Some(v); } }
190                        crate::base::FieldValue::TextList(svs) => {
191                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.rated_u = Some(v); } }
192                        }
193                        _ => {}
194                    }
195                }
196                "PowerTransformerEnd.x" => {
197                    match val {
198                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.x = Some(v); } }
199                        crate::base::FieldValue::TextList(svs) => {
200                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.x = Some(v); } }
201                        }
202                        _ => {}
203                    }
204                }
205                "PowerTransformerEnd.x0" => {
206                    match val {
207                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.x0 = Some(v); } }
208                        crate::base::FieldValue::TextList(svs) => {
209                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.x0 = Some(v); } }
210                        }
211                        _ => {}
212                    }
213                }
214                "TransformerEnd.BaseVoltage" => {
215                    if let crate::base::FieldValue::Resource(sv) = val {
216                        obj.base.base_voltage = Some(crate::base::MridRef { mrid: sv.clone() });
217                    }
218                }
219                "TransformerEnd.Terminal" => {
220                    if let crate::base::FieldValue::Resource(sv) = val {
221                        obj.base.terminal = Some(crate::base::MridRef { mrid: sv.clone() });
222                    }
223                }
224                "TransformerEnd.endNumber" => {
225                    match val {
226                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.end_number = Some(v); } }
227                        crate::base::FieldValue::TextList(svs) => {
228                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.end_number = Some(v); } }
229                        }
230                        _ => {}
231                    }
232                }
233                "TransformerEnd.grounded" => {
234                    match val {
235                        crate::base::FieldValue::Text(sv) => { obj.base.grounded = Some(sv.trim() == "true"); }
236                        crate::base::FieldValue::TextList(svs) => {
237                            if let Some(sv) = svs.last() { obj.base.grounded = Some(sv.trim() == "true"); }
238                        }
239                        _ => {}
240                    }
241                }
242                "TransformerEnd.rground" => {
243                    match val {
244                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.rground = Some(v); } }
245                        crate::base::FieldValue::TextList(svs) => {
246                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.rground = Some(v); } }
247                        }
248                        _ => {}
249                    }
250                }
251                "TransformerEnd.xground" => {
252                    match val {
253                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.xground = Some(v); } }
254                        crate::base::FieldValue::TextList(svs) => {
255                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.xground = Some(v); } }
256                        }
257                        _ => {}
258                    }
259                }
260                "IdentifiedObject.description" => {
261                    match val {
262                        crate::base::FieldValue::Text(sv) => { obj.base.base.description = sv.clone(); }
263                        crate::base::FieldValue::TextList(svs) => {
264                            if let Some(sv) = svs.last() { obj.base.base.description = sv.clone(); }
265                        }
266                        _ => {}
267                    }
268                }
269                "IdentifiedObject.energyIdentCodeEic" => {
270                    match val {
271                        crate::base::FieldValue::Text(sv) => { obj.base.base.energy_ident_code_eic = sv.clone(); }
272                        crate::base::FieldValue::TextList(svs) => {
273                            if let Some(sv) = svs.last() { obj.base.base.energy_ident_code_eic = sv.clone(); }
274                        }
275                        _ => {}
276                    }
277                }
278                "IdentifiedObject.mRID" => {
279                    match val {
280                        crate::base::FieldValue::Text(sv) => { obj.base.base.m_rid = sv.clone(); }
281                        crate::base::FieldValue::TextList(svs) => {
282                            if let Some(sv) = svs.last() { obj.base.base.m_rid = sv.clone(); }
283                        }
284                        _ => {}
285                    }
286                }
287                "IdentifiedObject.name" => {
288                    match val {
289                        crate::base::FieldValue::Text(sv) => { obj.base.base.name = sv.clone(); }
290                        crate::base::FieldValue::TextList(svs) => {
291                            if let Some(sv) = svs.last() { obj.base.base.name = sv.clone(); }
292                        }
293                        _ => {}
294                    }
295                }
296                "IdentifiedObject.shortName" => {
297                    match val {
298                        crate::base::FieldValue::Text(sv) => { obj.base.base.short_name = sv.clone(); }
299                        crate::base::FieldValue::TextList(svs) => {
300                            if let Some(sv) = svs.last() { obj.base.base.short_name = sv.clone(); }
301                        }
302                        _ => {}
303                    }
304                }
305                _ => {}
306            }
307        }
308        obj
309    }
310}