Skip to main content

cimstructs/
ExcDC2A.rs

1/// Modified IEEE DC2A direct current commutator exciter with speed input, one more leg block in feedback loop and without underexcitation limiters (UEL) inputs. DC type 2 excitation system model with added speed multiplier, added lead-lag, and voltage-dependent limits.
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct ExcDC2A {
4    #[serde(flatten)]
5    pub base: super::ExcitationSystemDynamics,
6    /// Exciter voltage at which exciter saturation is defined (Efd1) (> 0). Typical value = 3,05.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub efd1: Option<f64>,
9    /// Exciter voltage at which exciter saturation is defined (Efd2) (> 0). Typical value = 2,29.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub efd2: Option<f64>,
12    /// (exclim). IEEE standard is ambiguous about lower limit on exciter output. true = a lower limit of zero is applied to integrator output false = a lower limit of zero is not applied to integrator output. Typical value = true.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub exclim: Option<bool>,
15    /// Voltage regulator gain (Ka) (> 0). Typical value = 300.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub ka: Option<f64>,
18    /// Exciter constant related to self-excited field (Ke). If Ke is entered as zero, the model calculates an effective value of Ke such that the initial condition value of Vr is zero. The zero value of Ke is not changed. If Ke is entered as non-zero, its value is used directly, without change. Typical value = 1.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub ke: Option<f64>,
21    /// Excitation control system stabilizer gain (Kf) (>= 0). Typical value = 0,1.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub kf: Option<f64>,
24    /// Coefficient to allow different usage of the model-speed coefficient (Ks). Typical value = 0.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub ks: Option<f64>,
27    /// Exciter saturation function value at the corresponding exciter voltage, Efd1 (Se[Efd1]) (>= 0). Typical value = 0,279.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub seefd1: Option<f64>,
30    /// Exciter saturation function value at the corresponding exciter voltage, Efd2 (Se[Efd2]) (>= 0). Typical value = 0,117.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub seefd2: Option<f64>,
33    /// Voltage regulator time constant (Ta) (> 0). Typical value = 0,01.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub ta: Option<f64>,
36    /// Voltage regulator time constant (Tb) (>= 0). Typical value = 0.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub tb: Option<f64>,
39    /// Voltage regulator time constant (Tc) (>= 0). Typical value = 0.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub tc: Option<f64>,
42    /// Exciter time constant, integration rate associated with exciter control (Te) (> 0). Typical value = 1,33.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub te: Option<f64>,
45    /// Excitation control system stabilizer time constant (Tf) (> 0). Typical value = 0,675.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub tf: Option<f64>,
48    /// Excitation control system stabilizer time constant (Tf1) (>= 0). Typical value = 0.
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub tf1: Option<f64>,
51    /// Maximum voltage regulator output (Vrmax) (> ExcDC2A.vrmin). Typical value = 4,95.
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub vrmax: Option<f64>,
54    /// Minimum voltage regulator output (Vrmin) (< 0 and < ExcDC2A.vrmax). Typical value = -4,9.
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub vrmin: Option<f64>,
57    /// (Vtlim). true = limiter at the block (Ka / [1 + sTa]) is dependent on Vt false = limiter at the block is not dependent on Vt. Typical value = true.
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub vtlim: Option<bool>,
60}
61impl crate::base::CimElement for ExcDC2A {
62    fn mrid(&self) -> &str { &self.base.base.base.id }
63    fn type_name(&self) -> &'static str { "ExcDC2A" }
64    fn as_any(&self) -> &dyn std::any::Any { self }
65    fn to_json_value(&self) -> serde_json::Value {
66        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
67    }
68    fn to_block(&self) -> crate::base::RdfBlock {
69        let mut block = self.base.to_block();
70        block.type_name = "ExcDC2A".to_string();
71        if let Some(v) = self.efd1 {
72            block.fields.insert("ExcDC2A.efd1".into(), crate::base::FieldValue::Text(v.to_string()));
73        }
74        if let Some(v) = self.efd2 {
75            block.fields.insert("ExcDC2A.efd2".into(), crate::base::FieldValue::Text(v.to_string()));
76        }
77        if let Some(v) = self.exclim {
78            block.fields.insert("ExcDC2A.exclim".into(), crate::base::FieldValue::Text(v.to_string()));
79        }
80        if let Some(v) = self.ka {
81            block.fields.insert("ExcDC2A.ka".into(), crate::base::FieldValue::Text(v.to_string()));
82        }
83        if let Some(v) = self.ke {
84            block.fields.insert("ExcDC2A.ke".into(), crate::base::FieldValue::Text(v.to_string()));
85        }
86        if let Some(v) = self.kf {
87            block.fields.insert("ExcDC2A.kf".into(), crate::base::FieldValue::Text(v.to_string()));
88        }
89        if let Some(v) = self.ks {
90            block.fields.insert("ExcDC2A.ks".into(), crate::base::FieldValue::Text(v.to_string()));
91        }
92        if let Some(v) = self.seefd1 {
93            block.fields.insert("ExcDC2A.seefd1".into(), crate::base::FieldValue::Text(v.to_string()));
94        }
95        if let Some(v) = self.seefd2 {
96            block.fields.insert("ExcDC2A.seefd2".into(), crate::base::FieldValue::Text(v.to_string()));
97        }
98        if let Some(v) = self.ta {
99            block.fields.insert("ExcDC2A.ta".into(), crate::base::FieldValue::Text(v.to_string()));
100        }
101        if let Some(v) = self.tb {
102            block.fields.insert("ExcDC2A.tb".into(), crate::base::FieldValue::Text(v.to_string()));
103        }
104        if let Some(v) = self.tc {
105            block.fields.insert("ExcDC2A.tc".into(), crate::base::FieldValue::Text(v.to_string()));
106        }
107        if let Some(v) = self.te {
108            block.fields.insert("ExcDC2A.te".into(), crate::base::FieldValue::Text(v.to_string()));
109        }
110        if let Some(v) = self.tf {
111            block.fields.insert("ExcDC2A.tf".into(), crate::base::FieldValue::Text(v.to_string()));
112        }
113        if let Some(v) = self.tf1 {
114            block.fields.insert("ExcDC2A.tf1".into(), crate::base::FieldValue::Text(v.to_string()));
115        }
116        if let Some(v) = self.vrmax {
117            block.fields.insert("ExcDC2A.vrmax".into(), crate::base::FieldValue::Text(v.to_string()));
118        }
119        if let Some(v) = self.vrmin {
120            block.fields.insert("ExcDC2A.vrmin".into(), crate::base::FieldValue::Text(v.to_string()));
121        }
122        if let Some(v) = self.vtlim {
123            block.fields.insert("ExcDC2A.vtlim".into(), crate::base::FieldValue::Text(v.to_string()));
124        }
125        block
126    }
127}
128
129impl ExcDC2A {
130    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
131        let mut obj = Self::default();
132        obj.base.base.base.id.clone_from(&b.mrid);
133        for (key, val) in &b.fields {
134            match key.as_str() {
135                "ExcDC2A.efd1" => {
136                    match val {
137                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.efd1 = Some(v); } }
138                        crate::base::FieldValue::TextList(svs) => {
139                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.efd1 = Some(v); } }
140                        }
141                        _ => {}
142                    }
143                }
144                "ExcDC2A.efd2" => {
145                    match val {
146                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.efd2 = Some(v); } }
147                        crate::base::FieldValue::TextList(svs) => {
148                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.efd2 = Some(v); } }
149                        }
150                        _ => {}
151                    }
152                }
153                "ExcDC2A.exclim" => {
154                    match val {
155                        crate::base::FieldValue::Text(sv) => { obj.exclim = Some(sv.trim() == "true"); }
156                        crate::base::FieldValue::TextList(svs) => {
157                            if let Some(sv) = svs.last() { obj.exclim = Some(sv.trim() == "true"); }
158                        }
159                        _ => {}
160                    }
161                }
162                "ExcDC2A.ka" => {
163                    match val {
164                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ka = Some(v); } }
165                        crate::base::FieldValue::TextList(svs) => {
166                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ka = Some(v); } }
167                        }
168                        _ => {}
169                    }
170                }
171                "ExcDC2A.ke" => {
172                    match val {
173                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ke = Some(v); } }
174                        crate::base::FieldValue::TextList(svs) => {
175                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ke = Some(v); } }
176                        }
177                        _ => {}
178                    }
179                }
180                "ExcDC2A.kf" => {
181                    match val {
182                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.kf = Some(v); } }
183                        crate::base::FieldValue::TextList(svs) => {
184                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.kf = Some(v); } }
185                        }
186                        _ => {}
187                    }
188                }
189                "ExcDC2A.ks" => {
190                    match val {
191                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ks = Some(v); } }
192                        crate::base::FieldValue::TextList(svs) => {
193                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ks = Some(v); } }
194                        }
195                        _ => {}
196                    }
197                }
198                "ExcDC2A.seefd1" => {
199                    match val {
200                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.seefd1 = Some(v); } }
201                        crate::base::FieldValue::TextList(svs) => {
202                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.seefd1 = Some(v); } }
203                        }
204                        _ => {}
205                    }
206                }
207                "ExcDC2A.seefd2" => {
208                    match val {
209                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.seefd2 = Some(v); } }
210                        crate::base::FieldValue::TextList(svs) => {
211                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.seefd2 = Some(v); } }
212                        }
213                        _ => {}
214                    }
215                }
216                "ExcDC2A.ta" => {
217                    match val {
218                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ta = Some(v); } }
219                        crate::base::FieldValue::TextList(svs) => {
220                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ta = Some(v); } }
221                        }
222                        _ => {}
223                    }
224                }
225                "ExcDC2A.tb" => {
226                    match val {
227                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tb = Some(v); } }
228                        crate::base::FieldValue::TextList(svs) => {
229                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tb = Some(v); } }
230                        }
231                        _ => {}
232                    }
233                }
234                "ExcDC2A.tc" => {
235                    match val {
236                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tc = Some(v); } }
237                        crate::base::FieldValue::TextList(svs) => {
238                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tc = Some(v); } }
239                        }
240                        _ => {}
241                    }
242                }
243                "ExcDC2A.te" => {
244                    match val {
245                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.te = Some(v); } }
246                        crate::base::FieldValue::TextList(svs) => {
247                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.te = Some(v); } }
248                        }
249                        _ => {}
250                    }
251                }
252                "ExcDC2A.tf" => {
253                    match val {
254                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tf = Some(v); } }
255                        crate::base::FieldValue::TextList(svs) => {
256                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tf = Some(v); } }
257                        }
258                        _ => {}
259                    }
260                }
261                "ExcDC2A.tf1" => {
262                    match val {
263                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tf1 = Some(v); } }
264                        crate::base::FieldValue::TextList(svs) => {
265                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tf1 = Some(v); } }
266                        }
267                        _ => {}
268                    }
269                }
270                "ExcDC2A.vrmax" => {
271                    match val {
272                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vrmax = Some(v); } }
273                        crate::base::FieldValue::TextList(svs) => {
274                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vrmax = Some(v); } }
275                        }
276                        _ => {}
277                    }
278                }
279                "ExcDC2A.vrmin" => {
280                    match val {
281                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vrmin = Some(v); } }
282                        crate::base::FieldValue::TextList(svs) => {
283                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vrmin = Some(v); } }
284                        }
285                        _ => {}
286                    }
287                }
288                "ExcDC2A.vtlim" => {
289                    match val {
290                        crate::base::FieldValue::Text(sv) => { obj.vtlim = Some(sv.trim() == "true"); }
291                        crate::base::FieldValue::TextList(svs) => {
292                            if let Some(sv) = svs.last() { obj.vtlim = Some(sv.trim() == "true"); }
293                        }
294                        _ => {}
295                    }
296                }
297                "ExcitationSystemDynamics.SynchronousMachineDynamics" => {
298                    if let crate::base::FieldValue::Resource(sv) = val {
299                        obj.base.synchronous_machine_dynamics = Some(crate::base::MridRef { mrid: sv.clone() });
300                    }
301                }
302                "DynamicsFunctionBlock.enabled" => {
303                    match val {
304                        crate::base::FieldValue::Text(sv) => { obj.base.base.enabled = Some(sv.trim() == "true"); }
305                        crate::base::FieldValue::TextList(svs) => {
306                            if let Some(sv) = svs.last() { obj.base.base.enabled = Some(sv.trim() == "true"); }
307                        }
308                        _ => {}
309                    }
310                }
311                "IdentifiedObject.description" => {
312                    match val {
313                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.description = sv.clone(); }
314                        crate::base::FieldValue::TextList(svs) => {
315                            if let Some(sv) = svs.last() { obj.base.base.base.description = sv.clone(); }
316                        }
317                        _ => {}
318                    }
319                }
320                "IdentifiedObject.energyIdentCodeEic" => {
321                    match val {
322                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.energy_ident_code_eic = sv.clone(); }
323                        crate::base::FieldValue::TextList(svs) => {
324                            if let Some(sv) = svs.last() { obj.base.base.base.energy_ident_code_eic = sv.clone(); }
325                        }
326                        _ => {}
327                    }
328                }
329                "IdentifiedObject.mRID" => {
330                    match val {
331                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.m_rid = sv.clone(); }
332                        crate::base::FieldValue::TextList(svs) => {
333                            if let Some(sv) = svs.last() { obj.base.base.base.m_rid = sv.clone(); }
334                        }
335                        _ => {}
336                    }
337                }
338                "IdentifiedObject.name" => {
339                    match val {
340                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.name = sv.clone(); }
341                        crate::base::FieldValue::TextList(svs) => {
342                            if let Some(sv) = svs.last() { obj.base.base.base.name = sv.clone(); }
343                        }
344                        _ => {}
345                    }
346                }
347                "IdentifiedObject.shortName" => {
348                    match val {
349                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.short_name = sv.clone(); }
350                        crate::base::FieldValue::TextList(svs) => {
351                            if let Some(sv) = svs.last() { obj.base.base.base.short_name = sv.clone(); }
352                        }
353                        _ => {}
354                    }
355                }
356                _ => {}
357            }
358        }
359        obj
360    }
361}