Skip to main content

cimstructs/
VsConverter.rs

1/// DC side of the voltage source converter (VSC).
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct VsConverter {
4    #[serde(flatten)]
5    pub base: super::ACDCConverter,
6    /// Capability curve of this converter.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub capability_curve: Option<super::base::MridRef>,
9    /// Angle between VsConverter.uv and ACDCConverter.uc. It is converter’s state variable used in power flow. The attribute shall be a positive value or zero.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub delta: Option<f64>,
12    /// Droop constant. The pu value is obtained as D [kV/MW] x Sb / Ubdc. The attribute shall be a positive value.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub droop: Option<f64>,
15    /// Compensation constant. Used to compensate for voltage drop when controlling voltage at a distant bus. The attribute shall be a positive value.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub droop_compensation: Option<f64>,
18    /// The maximum quotient between the AC converter voltage (Uc) and DC voltage (Ud). A factor typically less than 1. It is converter’s configuration data used in power flow.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub max_modulation_index: Option<f64>,
21    /// Kind of control of real power and/or DC voltage.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub p_pcc_control: Option<super::base::UriRef>,
24    /// Kind of reactive power control.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub q_pcc_control: Option<super::base::UriRef>,
27    /// Reactive power sharing factor among parallel converters on Uac control. The attribute shall be a positive value or zero.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub q_share: Option<f64>,
30    /// Magnitude of pulse-modulation factor. The attribute shall be a positive value.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub target_pw_mfactor: Option<f64>,
33    /// Phase target at AC side, at point of common coupling. The attribute shall be a positive value.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub target_phase_pcc: Option<f64>,
36    /// Power factor target at the AC side, at point of common coupling. The attribute shall be a positive value.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub target_power_factor_pcc: Option<f64>,
39    /// Reactive power injection target in AC grid, at point of common coupling. Load sign convention is used, i.e. positive sign means flow out from a node.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub target_qpcc: Option<f64>,
42    /// Voltage target in AC grid, at point of common coupling. The attribute shall be a positive value.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub target_upcc: Option<f64>,
45    /// Line-to-line voltage on the valve side of the converter transformer. It is converter’s state variable, result from power flow. The attribute shall be a positive value.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub uv: Option<f64>,
48}
49impl crate::base::CimElement for VsConverter {
50    fn mrid(&self) -> &str { &self.base.base.base.base.base.id }
51    fn type_name(&self) -> &'static str { "VsConverter" }
52    fn as_any(&self) -> &dyn std::any::Any { self }
53    fn to_json_value(&self) -> serde_json::Value {
54        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
55    }
56    fn to_block(&self) -> crate::base::RdfBlock {
57        let mut block = self.base.to_block();
58        block.type_name = "VsConverter".to_string();
59        if let Some(ref v) = self.capability_curve {
60            block.fields.insert("VsConverter.CapabilityCurve".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
61        }
62        if let Some(v) = self.delta {
63            block.fields.insert("VsConverter.delta".into(), crate::base::FieldValue::Text(v.to_string()));
64        }
65        if let Some(v) = self.droop {
66            block.fields.insert("VsConverter.droop".into(), crate::base::FieldValue::Text(v.to_string()));
67        }
68        if let Some(v) = self.droop_compensation {
69            block.fields.insert("VsConverter.droopCompensation".into(), crate::base::FieldValue::Text(v.to_string()));
70        }
71        if let Some(v) = self.max_modulation_index {
72            block.fields.insert("VsConverter.maxModulationIndex".into(), crate::base::FieldValue::Text(v.to_string()));
73        }
74        if let Some(ref v) = self.p_pcc_control {
75            block.fields.insert("VsConverter.pPccControl".into(), crate::base::FieldValue::Resource(v.uri.clone()));
76        }
77        if let Some(ref v) = self.q_pcc_control {
78            block.fields.insert("VsConverter.qPccControl".into(), crate::base::FieldValue::Resource(v.uri.clone()));
79        }
80        if let Some(v) = self.q_share {
81            block.fields.insert("VsConverter.qShare".into(), crate::base::FieldValue::Text(v.to_string()));
82        }
83        if let Some(v) = self.target_pw_mfactor {
84            block.fields.insert("VsConverter.targetPWMfactor".into(), crate::base::FieldValue::Text(v.to_string()));
85        }
86        if let Some(v) = self.target_phase_pcc {
87            block.fields.insert("VsConverter.targetPhasePcc".into(), crate::base::FieldValue::Text(v.to_string()));
88        }
89        if let Some(v) = self.target_power_factor_pcc {
90            block.fields.insert("VsConverter.targetPowerFactorPcc".into(), crate::base::FieldValue::Text(v.to_string()));
91        }
92        if let Some(v) = self.target_qpcc {
93            block.fields.insert("VsConverter.targetQpcc".into(), crate::base::FieldValue::Text(v.to_string()));
94        }
95        if let Some(v) = self.target_upcc {
96            block.fields.insert("VsConverter.targetUpcc".into(), crate::base::FieldValue::Text(v.to_string()));
97        }
98        if let Some(v) = self.uv {
99            block.fields.insert("VsConverter.uv".into(), crate::base::FieldValue::Text(v.to_string()));
100        }
101        block
102    }
103}
104
105impl VsConverter {
106    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
107        let mut obj = Self::default();
108        obj.base.base.base.base.base.id.clone_from(&b.mrid);
109        for (key, val) in &b.fields {
110            match key.as_str() {
111                "VsConverter.CapabilityCurve" => {
112                    if let crate::base::FieldValue::Resource(sv) = val {
113                        obj.capability_curve = Some(crate::base::MridRef { mrid: sv.clone() });
114                    }
115                }
116                "VsConverter.delta" => {
117                    match val {
118                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.delta = Some(v); } }
119                        crate::base::FieldValue::TextList(svs) => {
120                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.delta = Some(v); } }
121                        }
122                        _ => {}
123                    }
124                }
125                "VsConverter.droop" => {
126                    match val {
127                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.droop = Some(v); } }
128                        crate::base::FieldValue::TextList(svs) => {
129                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.droop = Some(v); } }
130                        }
131                        _ => {}
132                    }
133                }
134                "VsConverter.droopCompensation" => {
135                    match val {
136                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.droop_compensation = Some(v); } }
137                        crate::base::FieldValue::TextList(svs) => {
138                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.droop_compensation = Some(v); } }
139                        }
140                        _ => {}
141                    }
142                }
143                "VsConverter.maxModulationIndex" => {
144                    match val {
145                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.max_modulation_index = Some(v); } }
146                        crate::base::FieldValue::TextList(svs) => {
147                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.max_modulation_index = Some(v); } }
148                        }
149                        _ => {}
150                    }
151                }
152                "VsConverter.pPccControl" => {
153                    if let crate::base::FieldValue::Resource(sv) = val {
154                        obj.p_pcc_control = Some(crate::base::UriRef { uri: sv.clone() });
155                    }
156                }
157                "VsConverter.qPccControl" => {
158                    if let crate::base::FieldValue::Resource(sv) = val {
159                        obj.q_pcc_control = Some(crate::base::UriRef { uri: sv.clone() });
160                    }
161                }
162                "VsConverter.qShare" => {
163                    match val {
164                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.q_share = Some(v); } }
165                        crate::base::FieldValue::TextList(svs) => {
166                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.q_share = Some(v); } }
167                        }
168                        _ => {}
169                    }
170                }
171                "VsConverter.targetPWMfactor" => {
172                    match val {
173                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.target_pw_mfactor = Some(v); } }
174                        crate::base::FieldValue::TextList(svs) => {
175                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.target_pw_mfactor = Some(v); } }
176                        }
177                        _ => {}
178                    }
179                }
180                "VsConverter.targetPhasePcc" => {
181                    match val {
182                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.target_phase_pcc = Some(v); } }
183                        crate::base::FieldValue::TextList(svs) => {
184                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.target_phase_pcc = Some(v); } }
185                        }
186                        _ => {}
187                    }
188                }
189                "VsConverter.targetPowerFactorPcc" => {
190                    match val {
191                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.target_power_factor_pcc = Some(v); } }
192                        crate::base::FieldValue::TextList(svs) => {
193                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.target_power_factor_pcc = Some(v); } }
194                        }
195                        _ => {}
196                    }
197                }
198                "VsConverter.targetQpcc" => {
199                    match val {
200                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.target_qpcc = Some(v); } }
201                        crate::base::FieldValue::TextList(svs) => {
202                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.target_qpcc = Some(v); } }
203                        }
204                        _ => {}
205                    }
206                }
207                "VsConverter.targetUpcc" => {
208                    match val {
209                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.target_upcc = Some(v); } }
210                        crate::base::FieldValue::TextList(svs) => {
211                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.target_upcc = Some(v); } }
212                        }
213                        _ => {}
214                    }
215                }
216                "VsConverter.uv" => {
217                    match val {
218                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.uv = Some(v); } }
219                        crate::base::FieldValue::TextList(svs) => {
220                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.uv = Some(v); } }
221                        }
222                        _ => {}
223                    }
224                }
225                "ACDCConverter.PccTerminal" => {
226                    if let crate::base::FieldValue::Resource(sv) = val {
227                        obj.base.pcc_terminal = Some(crate::base::MridRef { mrid: sv.clone() });
228                    }
229                }
230                "ACDCConverter.baseS" => {
231                    match val {
232                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.base_s = Some(v); } }
233                        crate::base::FieldValue::TextList(svs) => {
234                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.base_s = Some(v); } }
235                        }
236                        _ => {}
237                    }
238                }
239                "ACDCConverter.idc" => {
240                    match val {
241                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.idc = Some(v); } }
242                        crate::base::FieldValue::TextList(svs) => {
243                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.idc = Some(v); } }
244                        }
245                        _ => {}
246                    }
247                }
248                "ACDCConverter.idleLoss" => {
249                    match val {
250                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.idle_loss = Some(v); } }
251                        crate::base::FieldValue::TextList(svs) => {
252                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.idle_loss = Some(v); } }
253                        }
254                        _ => {}
255                    }
256                }
257                "ACDCConverter.maxP" => {
258                    match val {
259                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.max_p = Some(v); } }
260                        crate::base::FieldValue::TextList(svs) => {
261                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.max_p = Some(v); } }
262                        }
263                        _ => {}
264                    }
265                }
266                "ACDCConverter.maxUdc" => {
267                    match val {
268                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.max_udc = Some(v); } }
269                        crate::base::FieldValue::TextList(svs) => {
270                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.max_udc = Some(v); } }
271                        }
272                        _ => {}
273                    }
274                }
275                "ACDCConverter.minP" => {
276                    match val {
277                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.min_p = Some(v); } }
278                        crate::base::FieldValue::TextList(svs) => {
279                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.min_p = Some(v); } }
280                        }
281                        _ => {}
282                    }
283                }
284                "ACDCConverter.minUdc" => {
285                    match val {
286                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.min_udc = Some(v); } }
287                        crate::base::FieldValue::TextList(svs) => {
288                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.min_udc = Some(v); } }
289                        }
290                        _ => {}
291                    }
292                }
293                "ACDCConverter.numberOfValves" => {
294                    match val {
295                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.number_of_valves = Some(v); } }
296                        crate::base::FieldValue::TextList(svs) => {
297                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.number_of_valves = Some(v); } }
298                        }
299                        _ => {}
300                    }
301                }
302                "ACDCConverter.p" => {
303                    match val {
304                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.p = Some(v); } }
305                        crate::base::FieldValue::TextList(svs) => {
306                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.p = Some(v); } }
307                        }
308                        _ => {}
309                    }
310                }
311                "ACDCConverter.poleLossP" => {
312                    match val {
313                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.pole_loss_p = Some(v); } }
314                        crate::base::FieldValue::TextList(svs) => {
315                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.pole_loss_p = Some(v); } }
316                        }
317                        _ => {}
318                    }
319                }
320                "ACDCConverter.q" => {
321                    match val {
322                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.q = Some(v); } }
323                        crate::base::FieldValue::TextList(svs) => {
324                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.q = Some(v); } }
325                        }
326                        _ => {}
327                    }
328                }
329                "ACDCConverter.ratedUdc" => {
330                    match val {
331                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.rated_udc = Some(v); } }
332                        crate::base::FieldValue::TextList(svs) => {
333                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.rated_udc = Some(v); } }
334                        }
335                        _ => {}
336                    }
337                }
338                "ACDCConverter.resistiveLoss" => {
339                    match val {
340                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.resistive_loss = Some(v); } }
341                        crate::base::FieldValue::TextList(svs) => {
342                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.resistive_loss = Some(v); } }
343                        }
344                        _ => {}
345                    }
346                }
347                "ACDCConverter.switchingLoss" => {
348                    match val {
349                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.switching_loss = Some(v); } }
350                        crate::base::FieldValue::TextList(svs) => {
351                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.switching_loss = Some(v); } }
352                        }
353                        _ => {}
354                    }
355                }
356                "ACDCConverter.targetPpcc" => {
357                    match val {
358                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.target_ppcc = Some(v); } }
359                        crate::base::FieldValue::TextList(svs) => {
360                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.target_ppcc = Some(v); } }
361                        }
362                        _ => {}
363                    }
364                }
365                "ACDCConverter.targetUdc" => {
366                    match val {
367                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.target_udc = Some(v); } }
368                        crate::base::FieldValue::TextList(svs) => {
369                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.target_udc = Some(v); } }
370                        }
371                        _ => {}
372                    }
373                }
374                "ACDCConverter.uc" => {
375                    match val {
376                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.uc = Some(v); } }
377                        crate::base::FieldValue::TextList(svs) => {
378                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.uc = Some(v); } }
379                        }
380                        _ => {}
381                    }
382                }
383                "ACDCConverter.udc" => {
384                    match val {
385                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.udc = Some(v); } }
386                        crate::base::FieldValue::TextList(svs) => {
387                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.udc = Some(v); } }
388                        }
389                        _ => {}
390                    }
391                }
392                "ACDCConverter.valveU0" => {
393                    match val {
394                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.base.valve_u0 = Some(v); } }
395                        crate::base::FieldValue::TextList(svs) => {
396                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.base.valve_u0 = Some(v); } }
397                        }
398                        _ => {}
399                    }
400                }
401                "ConductingEquipment.BaseVoltage" => {
402                    if let crate::base::FieldValue::Resource(sv) = val {
403                        obj.base.base.base_voltage = Some(crate::base::MridRef { mrid: sv.clone() });
404                    }
405                }
406                "Equipment.EquipmentContainer" => {
407                    if let crate::base::FieldValue::Resource(sv) = val {
408                        obj.base.base.base.equipment_container = Some(crate::base::MridRef { mrid: sv.clone() });
409                    }
410                }
411                "Equipment.aggregate" => {
412                    match val {
413                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.aggregate = Some(sv.trim() == "true"); }
414                        crate::base::FieldValue::TextList(svs) => {
415                            if let Some(sv) = svs.last() { obj.base.base.base.aggregate = Some(sv.trim() == "true"); }
416                        }
417                        _ => {}
418                    }
419                }
420                "Equipment.inService" => {
421                    match val {
422                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.in_service = Some(sv.trim() == "true"); }
423                        crate::base::FieldValue::TextList(svs) => {
424                            if let Some(sv) = svs.last() { obj.base.base.base.in_service = Some(sv.trim() == "true"); }
425                        }
426                        _ => {}
427                    }
428                }
429                "Equipment.normallyInService" => {
430                    match val {
431                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.normally_in_service = Some(sv.trim() == "true"); }
432                        crate::base::FieldValue::TextList(svs) => {
433                            if let Some(sv) = svs.last() { obj.base.base.base.normally_in_service = Some(sv.trim() == "true"); }
434                        }
435                        _ => {}
436                    }
437                }
438                "IdentifiedObject.description" => {
439                    match val {
440                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.description = sv.clone(); }
441                        crate::base::FieldValue::TextList(svs) => {
442                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.description = sv.clone(); }
443                        }
444                        _ => {}
445                    }
446                }
447                "IdentifiedObject.energyIdentCodeEic" => {
448                    match val {
449                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.energy_ident_code_eic = sv.clone(); }
450                        crate::base::FieldValue::TextList(svs) => {
451                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.energy_ident_code_eic = sv.clone(); }
452                        }
453                        _ => {}
454                    }
455                }
456                "IdentifiedObject.mRID" => {
457                    match val {
458                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.m_rid = sv.clone(); }
459                        crate::base::FieldValue::TextList(svs) => {
460                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.m_rid = sv.clone(); }
461                        }
462                        _ => {}
463                    }
464                }
465                "IdentifiedObject.name" => {
466                    match val {
467                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.name = sv.clone(); }
468                        crate::base::FieldValue::TextList(svs) => {
469                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.name = sv.clone(); }
470                        }
471                        _ => {}
472                    }
473                }
474                "IdentifiedObject.shortName" => {
475                    match val {
476                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.base.base.short_name = sv.clone(); }
477                        crate::base::FieldValue::TextList(svs) => {
478                            if let Some(sv) = svs.last() { obj.base.base.base.base.base.short_name = sv.clone(); }
479                        }
480                        _ => {}
481                    }
482                }
483                _ => {}
484            }
485        }
486        obj
487    }
488}