Skip to main content

cimstructs/
EquivalentInjection.rs

1/// This class represents equivalent injections (generation or load). Voltage regulation is allowed only at the point of connection.
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct EquivalentInjection {
4    #[serde(flatten)]
5    pub base: super::EquivalentEquipment,
6    /// The reactive capability curve used by this equivalent injection.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub reactive_capability_curve: Option<super::base::MridRef>,
9    /// Maximum active power of the injection.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub max_p: Option<f64>,
12    /// Maximum reactive power of the injection. Used for modelling of infeed for load flow exchange. Not used for short circuit modelling. If maxQ and minQ are not used ReactiveCapabilityCurve can be used.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub max_q: Option<f64>,
15    /// Minimum active power of the injection.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub min_p: Option<f64>,
18    /// Minimum reactive power of the injection. Used for modelling of infeed for load flow exchange. Not used for short circuit modelling. If maxQ and minQ are not used ReactiveCapabilityCurve can be used.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub min_q: Option<f64>,
21    /// Equivalent active power injection. Load sign convention is used, i.e. positive sign means flow out from a node. Starting value for steady state solutions.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub p: Option<f64>,
24    /// Equivalent reactive power injection. Load sign convention is used, i.e. positive sign means flow out from a node. Starting value for steady state solutions.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub q: Option<f64>,
27    /// Positive sequence resistance. Used to represent Extended-Ward (IEC 60909). Usage : Extended-Ward is a result of network reduction prior to the data exchange.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub r: Option<f64>,
30    /// Zero sequence resistance. Used to represent Extended-Ward (IEC 60909). Usage : Extended-Ward is a result of network reduction prior to the data exchange.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub r0: Option<f64>,
33    /// Negative sequence resistance. Used to represent Extended-Ward (IEC 60909). Usage : Extended-Ward is a result of network reduction prior to the data exchange.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub r2: Option<f64>,
36    /// Specifies whether or not the EquivalentInjection has the capability to regulate the local voltage. If true the EquivalentInjection can regulate. If false the EquivalentInjection cannot regulate. ReactiveCapabilityCurve can only be associated with EquivalentInjection if the flag is true.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub regulation_capability: Option<bool>,
39    /// Specifies the regulation status of the EquivalentInjection. True is regulating. False is not regulating.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub regulation_status: Option<bool>,
42    /// The target voltage for voltage regulation. The attribute shall be a positive value.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub regulation_target: Option<f64>,
45    /// Positive sequence reactance. Used to represent Extended-Ward (IEC 60909). Usage : Extended-Ward is a result of network reduction prior to the data exchange.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub x: Option<f64>,
48    /// Zero sequence reactance. Used to represent Extended-Ward (IEC 60909). Usage : Extended-Ward is a result of network reduction prior to the data exchange.
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub x0: Option<f64>,
51    /// Negative sequence reactance. Used to represent Extended-Ward (IEC 60909). Usage : Extended-Ward is a result of network reduction prior to the data exchange.
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub x2: Option<f64>,
54}
55impl crate::base::CimElement for EquivalentInjection {
56    fn mrid(&self) -> &str { &self.base.base.base.base.base.id }
57    fn type_name(&self) -> &'static str { "EquivalentInjection" }
58    fn as_any(&self) -> &dyn std::any::Any { self }
59    fn to_json_value(&self) -> serde_json::Value {
60        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
61    }
62    fn to_block(&self) -> crate::base::RdfBlock {
63        let mut block = self.base.to_block();
64        block.type_name = "EquivalentInjection".to_string();
65        if let Some(ref v) = self.reactive_capability_curve {
66            block.fields.insert("EquivalentInjection.ReactiveCapabilityCurve".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
67        }
68        if let Some(v) = self.max_p {
69            block.fields.insert("EquivalentInjection.maxP".into(), crate::base::FieldValue::Text(v.to_string()));
70        }
71        if let Some(v) = self.max_q {
72            block.fields.insert("EquivalentInjection.maxQ".into(), crate::base::FieldValue::Text(v.to_string()));
73        }
74        if let Some(v) = self.min_p {
75            block.fields.insert("EquivalentInjection.minP".into(), crate::base::FieldValue::Text(v.to_string()));
76        }
77        if let Some(v) = self.min_q {
78            block.fields.insert("EquivalentInjection.minQ".into(), crate::base::FieldValue::Text(v.to_string()));
79        }
80        if let Some(v) = self.p {
81            block.fields.insert("EquivalentInjection.p".into(), crate::base::FieldValue::Text(v.to_string()));
82        }
83        if let Some(v) = self.q {
84            block.fields.insert("EquivalentInjection.q".into(), crate::base::FieldValue::Text(v.to_string()));
85        }
86        if let Some(v) = self.r {
87            block.fields.insert("EquivalentInjection.r".into(), crate::base::FieldValue::Text(v.to_string()));
88        }
89        if let Some(v) = self.r0 {
90            block.fields.insert("EquivalentInjection.r0".into(), crate::base::FieldValue::Text(v.to_string()));
91        }
92        if let Some(v) = self.r2 {
93            block.fields.insert("EquivalentInjection.r2".into(), crate::base::FieldValue::Text(v.to_string()));
94        }
95        if let Some(v) = self.regulation_capability {
96            block.fields.insert("EquivalentInjection.regulationCapability".into(), crate::base::FieldValue::Text(v.to_string()));
97        }
98        if let Some(v) = self.regulation_status {
99            block.fields.insert("EquivalentInjection.regulationStatus".into(), crate::base::FieldValue::Text(v.to_string()));
100        }
101        if let Some(v) = self.regulation_target {
102            block.fields.insert("EquivalentInjection.regulationTarget".into(), crate::base::FieldValue::Text(v.to_string()));
103        }
104        if let Some(v) = self.x {
105            block.fields.insert("EquivalentInjection.x".into(), crate::base::FieldValue::Text(v.to_string()));
106        }
107        if let Some(v) = self.x0 {
108            block.fields.insert("EquivalentInjection.x0".into(), crate::base::FieldValue::Text(v.to_string()));
109        }
110        if let Some(v) = self.x2 {
111            block.fields.insert("EquivalentInjection.x2".into(), crate::base::FieldValue::Text(v.to_string()));
112        }
113        block
114    }
115}
116
117impl EquivalentInjection {
118    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
119        let mut obj = Self::default();
120        obj.base.base.base.base.base.id.clone_from(&b.mrid);
121        for (key, val) in &b.fields {
122            match key.as_str() {
123                "EquivalentInjection.ReactiveCapabilityCurve" => {
124                    if let crate::base::FieldValue::Resource(sv) = val {
125                        obj.reactive_capability_curve = Some(crate::base::MridRef { mrid: sv.clone() });
126                    }
127                }
128                "EquivalentInjection.maxP" => {
129                    match val {
130                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.max_p = Some(v); } }
131                        crate::base::FieldValue::TextList(svs) => {
132                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.max_p = Some(v); } }
133                        }
134                        _ => {}
135                    }
136                }
137                "EquivalentInjection.maxQ" => {
138                    match val {
139                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.max_q = Some(v); } }
140                        crate::base::FieldValue::TextList(svs) => {
141                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.max_q = Some(v); } }
142                        }
143                        _ => {}
144                    }
145                }
146                "EquivalentInjection.minP" => {
147                    match val {
148                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.min_p = Some(v); } }
149                        crate::base::FieldValue::TextList(svs) => {
150                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.min_p = Some(v); } }
151                        }
152                        _ => {}
153                    }
154                }
155                "EquivalentInjection.minQ" => {
156                    match val {
157                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.min_q = Some(v); } }
158                        crate::base::FieldValue::TextList(svs) => {
159                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.min_q = Some(v); } }
160                        }
161                        _ => {}
162                    }
163                }
164                "EquivalentInjection.p" => {
165                    match val {
166                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.p = Some(v); } }
167                        crate::base::FieldValue::TextList(svs) => {
168                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.p = Some(v); } }
169                        }
170                        _ => {}
171                    }
172                }
173                "EquivalentInjection.q" => {
174                    match val {
175                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.q = Some(v); } }
176                        crate::base::FieldValue::TextList(svs) => {
177                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.q = Some(v); } }
178                        }
179                        _ => {}
180                    }
181                }
182                "EquivalentInjection.r" => {
183                    match val {
184                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.r = Some(v); } }
185                        crate::base::FieldValue::TextList(svs) => {
186                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.r = Some(v); } }
187                        }
188                        _ => {}
189                    }
190                }
191                "EquivalentInjection.r0" => {
192                    match val {
193                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.r0 = Some(v); } }
194                        crate::base::FieldValue::TextList(svs) => {
195                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.r0 = Some(v); } }
196                        }
197                        _ => {}
198                    }
199                }
200                "EquivalentInjection.r2" => {
201                    match val {
202                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.r2 = Some(v); } }
203                        crate::base::FieldValue::TextList(svs) => {
204                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.r2 = Some(v); } }
205                        }
206                        _ => {}
207                    }
208                }
209                "EquivalentInjection.regulationCapability" => {
210                    match val {
211                        crate::base::FieldValue::Text(sv) => { obj.regulation_capability = Some(sv.trim() == "true"); }
212                        crate::base::FieldValue::TextList(svs) => {
213                            if let Some(sv) = svs.last() { obj.regulation_capability = Some(sv.trim() == "true"); }
214                        }
215                        _ => {}
216                    }
217                }
218                "EquivalentInjection.regulationStatus" => {
219                    match val {
220                        crate::base::FieldValue::Text(sv) => { obj.regulation_status = Some(sv.trim() == "true"); }
221                        crate::base::FieldValue::TextList(svs) => {
222                            if let Some(sv) = svs.last() { obj.regulation_status = Some(sv.trim() == "true"); }
223                        }
224                        _ => {}
225                    }
226                }
227                "EquivalentInjection.regulationTarget" => {
228                    match val {
229                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.regulation_target = Some(v); } }
230                        crate::base::FieldValue::TextList(svs) => {
231                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.regulation_target = Some(v); } }
232                        }
233                        _ => {}
234                    }
235                }
236                "EquivalentInjection.x" => {
237                    match val {
238                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.x = Some(v); } }
239                        crate::base::FieldValue::TextList(svs) => {
240                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.x = Some(v); } }
241                        }
242                        _ => {}
243                    }
244                }
245                "EquivalentInjection.x0" => {
246                    match val {
247                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.x0 = Some(v); } }
248                        crate::base::FieldValue::TextList(svs) => {
249                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.x0 = Some(v); } }
250                        }
251                        _ => {}
252                    }
253                }
254                "EquivalentInjection.x2" => {
255                    match val {
256                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.x2 = Some(v); } }
257                        crate::base::FieldValue::TextList(svs) => {
258                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.x2 = Some(v); } }
259                        }
260                        _ => {}
261                    }
262                }
263                "EquivalentEquipment.EquivalentNetwork" => {
264                    if let crate::base::FieldValue::Resource(sv) = val {
265                        obj.base.equivalent_network = Some(crate::base::MridRef { mrid: sv.clone() });
266                    }
267                }
268                "ConductingEquipment.BaseVoltage" => {
269                    if let crate::base::FieldValue::Resource(sv) = val {
270                        obj.base.base.base_voltage = Some(crate::base::MridRef { mrid: sv.clone() });
271                    }
272                }
273                "Equipment.EquipmentContainer" => {
274                    if let crate::base::FieldValue::Resource(sv) = val {
275                        obj.base.base.base.equipment_container = Some(crate::base::MridRef { mrid: sv.clone() });
276                    }
277                }
278                "Equipment.aggregate" => {
279                    match val {
280                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.aggregate = Some(sv.trim() == "true"); }
281                        crate::base::FieldValue::TextList(svs) => {
282                            if let Some(sv) = svs.last() { obj.base.base.base.aggregate = Some(sv.trim() == "true"); }
283                        }
284                        _ => {}
285                    }
286                }
287                "Equipment.inService" => {
288                    match val {
289                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.in_service = Some(sv.trim() == "true"); }
290                        crate::base::FieldValue::TextList(svs) => {
291                            if let Some(sv) = svs.last() { obj.base.base.base.in_service = Some(sv.trim() == "true"); }
292                        }
293                        _ => {}
294                    }
295                }
296                "Equipment.normallyInService" => {
297                    match val {
298                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.normally_in_service = Some(sv.trim() == "true"); }
299                        crate::base::FieldValue::TextList(svs) => {
300                            if let Some(sv) = svs.last() { obj.base.base.base.normally_in_service = Some(sv.trim() == "true"); }
301                        }
302                        _ => {}
303                    }
304                }
305                "IdentifiedObject.description" => {
306                    match val {
307                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.description = sv.clone(); }
308                        crate::base::FieldValue::TextList(svs) => {
309                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.description = sv.clone(); }
310                        }
311                        _ => {}
312                    }
313                }
314                "IdentifiedObject.energyIdentCodeEic" => {
315                    match val {
316                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.energy_ident_code_eic = sv.clone(); }
317                        crate::base::FieldValue::TextList(svs) => {
318                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.energy_ident_code_eic = sv.clone(); }
319                        }
320                        _ => {}
321                    }
322                }
323                "IdentifiedObject.mRID" => {
324                    match val {
325                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.m_rid = sv.clone(); }
326                        crate::base::FieldValue::TextList(svs) => {
327                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.m_rid = sv.clone(); }
328                        }
329                        _ => {}
330                    }
331                }
332                "IdentifiedObject.name" => {
333                    match val {
334                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.name = sv.clone(); }
335                        crate::base::FieldValue::TextList(svs) => {
336                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.name = sv.clone(); }
337                        }
338                        _ => {}
339                    }
340                }
341                "IdentifiedObject.shortName" => {
342                    match val {
343                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.short_name = sv.clone(); }
344                        crate::base::FieldValue::TextList(svs) => {
345                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.short_name = sv.clone(); }
346                        }
347                        _ => {}
348                    }
349                }
350                _ => {}
351            }
352        }
353        obj
354    }
355}