Skip to main content

cimstructs/
ExcRQB.rs

1/// Excitation system type RQB (four-loop regulator, r?gulateur quatre boucles, developed in France) primarily used in nuclear or thermal generating units. This excitation system shall be always used together with power system stabilizer type PssRQB.
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct ExcRQB {
4    #[serde(flatten)]
5    pub base: super::ExcitationSystemDynamics,
6    /// Voltage reference input gain (Ki0). Typical value = 12,7.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub ki0: Option<f64>,
9    /// Voltage input gain (Ki1). Typical value = -16,8.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub ki1: Option<f64>,
12    /// OEL input gain (KLIR). Typical value = 12,13.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub klir: Option<f64>,
15    /// Limiter gain (KLUS). Typical value = 50.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub klus: Option<f64>,
18    /// Integrator limiter (LSAT). Typical value = 5,73.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub lsat: Option<f64>,
21    /// Setpoint (LUS). Typical value = 0,12.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub lus: Option<f64>,
24    /// Voltage input time constant (MESU) (>= 0). Typical value = 0,02.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub mesu: Option<f64>,
27    /// Input time constant (T4M) (>= 0). Typical value = 5.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub t4m: Option<f64>,
30    /// Lead lag time constant (TC) (>= 0). Typical value = 0,02.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub tc: Option<f64>,
33    /// Lead lag time constant (TE) (>= 0). Typical value = 0,22.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub te: Option<f64>,
36    /// Exciter time constant (TF) (>= 0). Typical value = 0,01.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub tf: Option<f64>,
39    /// Maximum voltage reference limit (UCMAX) (> ExcRQB.ucmin). Typical value = 1,1.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub ucmax: Option<f64>,
42    /// Minimum voltage reference limit (UCMIN) (< ExcRQB.ucmax). Typical value = 0,9.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub ucmin: Option<f64>,
45}
46impl crate::base::CimElement for ExcRQB {
47    fn mrid(&self) -> &str { &self.base.base.base.id }
48    fn type_name(&self) -> &'static str { "ExcRQB" }
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 = "ExcRQB".to_string();
56        if let Some(v) = self.ki0 {
57            block.fields.insert("ExcRQB.ki0".into(), crate::base::FieldValue::Text(v.to_string()));
58        }
59        if let Some(v) = self.ki1 {
60            block.fields.insert("ExcRQB.ki1".into(), crate::base::FieldValue::Text(v.to_string()));
61        }
62        if let Some(v) = self.klir {
63            block.fields.insert("ExcRQB.klir".into(), crate::base::FieldValue::Text(v.to_string()));
64        }
65        if let Some(v) = self.klus {
66            block.fields.insert("ExcRQB.klus".into(), crate::base::FieldValue::Text(v.to_string()));
67        }
68        if let Some(v) = self.lsat {
69            block.fields.insert("ExcRQB.lsat".into(), crate::base::FieldValue::Text(v.to_string()));
70        }
71        if let Some(v) = self.lus {
72            block.fields.insert("ExcRQB.lus".into(), crate::base::FieldValue::Text(v.to_string()));
73        }
74        if let Some(v) = self.mesu {
75            block.fields.insert("ExcRQB.mesu".into(), crate::base::FieldValue::Text(v.to_string()));
76        }
77        if let Some(v) = self.t4m {
78            block.fields.insert("ExcRQB.t4m".into(), crate::base::FieldValue::Text(v.to_string()));
79        }
80        if let Some(v) = self.tc {
81            block.fields.insert("ExcRQB.tc".into(), crate::base::FieldValue::Text(v.to_string()));
82        }
83        if let Some(v) = self.te {
84            block.fields.insert("ExcRQB.te".into(), crate::base::FieldValue::Text(v.to_string()));
85        }
86        if let Some(v) = self.tf {
87            block.fields.insert("ExcRQB.tf".into(), crate::base::FieldValue::Text(v.to_string()));
88        }
89        if let Some(v) = self.ucmax {
90            block.fields.insert("ExcRQB.ucmax".into(), crate::base::FieldValue::Text(v.to_string()));
91        }
92        if let Some(v) = self.ucmin {
93            block.fields.insert("ExcRQB.ucmin".into(), crate::base::FieldValue::Text(v.to_string()));
94        }
95        block
96    }
97}
98
99impl ExcRQB {
100    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
101        let mut obj = Self::default();
102        obj.base.base.base.id.clone_from(&b.mrid);
103        for (key, val) in &b.fields {
104            match key.as_str() {
105                "ExcRQB.ki0" => {
106                    match val {
107                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ki0 = Some(v); } }
108                        crate::base::FieldValue::TextList(svs) => {
109                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ki0 = Some(v); } }
110                        }
111                        _ => {}
112                    }
113                }
114                "ExcRQB.ki1" => {
115                    match val {
116                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ki1 = Some(v); } }
117                        crate::base::FieldValue::TextList(svs) => {
118                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ki1 = Some(v); } }
119                        }
120                        _ => {}
121                    }
122                }
123                "ExcRQB.klir" => {
124                    match val {
125                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.klir = Some(v); } }
126                        crate::base::FieldValue::TextList(svs) => {
127                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.klir = Some(v); } }
128                        }
129                        _ => {}
130                    }
131                }
132                "ExcRQB.klus" => {
133                    match val {
134                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.klus = Some(v); } }
135                        crate::base::FieldValue::TextList(svs) => {
136                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.klus = Some(v); } }
137                        }
138                        _ => {}
139                    }
140                }
141                "ExcRQB.lsat" => {
142                    match val {
143                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.lsat = Some(v); } }
144                        crate::base::FieldValue::TextList(svs) => {
145                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.lsat = Some(v); } }
146                        }
147                        _ => {}
148                    }
149                }
150                "ExcRQB.lus" => {
151                    match val {
152                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.lus = Some(v); } }
153                        crate::base::FieldValue::TextList(svs) => {
154                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.lus = Some(v); } }
155                        }
156                        _ => {}
157                    }
158                }
159                "ExcRQB.mesu" => {
160                    match val {
161                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.mesu = Some(v); } }
162                        crate::base::FieldValue::TextList(svs) => {
163                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.mesu = Some(v); } }
164                        }
165                        _ => {}
166                    }
167                }
168                "ExcRQB.t4m" => {
169                    match val {
170                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t4m = Some(v); } }
171                        crate::base::FieldValue::TextList(svs) => {
172                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t4m = Some(v); } }
173                        }
174                        _ => {}
175                    }
176                }
177                "ExcRQB.tc" => {
178                    match val {
179                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tc = Some(v); } }
180                        crate::base::FieldValue::TextList(svs) => {
181                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tc = Some(v); } }
182                        }
183                        _ => {}
184                    }
185                }
186                "ExcRQB.te" => {
187                    match val {
188                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.te = Some(v); } }
189                        crate::base::FieldValue::TextList(svs) => {
190                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.te = Some(v); } }
191                        }
192                        _ => {}
193                    }
194                }
195                "ExcRQB.tf" => {
196                    match val {
197                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tf = Some(v); } }
198                        crate::base::FieldValue::TextList(svs) => {
199                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tf = Some(v); } }
200                        }
201                        _ => {}
202                    }
203                }
204                "ExcRQB.ucmax" => {
205                    match val {
206                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ucmax = Some(v); } }
207                        crate::base::FieldValue::TextList(svs) => {
208                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ucmax = Some(v); } }
209                        }
210                        _ => {}
211                    }
212                }
213                "ExcRQB.ucmin" => {
214                    match val {
215                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ucmin = Some(v); } }
216                        crate::base::FieldValue::TextList(svs) => {
217                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ucmin = Some(v); } }
218                        }
219                        _ => {}
220                    }
221                }
222                "ExcitationSystemDynamics.SynchronousMachineDynamics" => {
223                    if let crate::base::FieldValue::Resource(sv) = val {
224                        obj.base.synchronous_machine_dynamics = Some(crate::base::MridRef { mrid: sv.clone() });
225                    }
226                }
227                "DynamicsFunctionBlock.enabled" => {
228                    match val {
229                        crate::base::FieldValue::Text(sv) => { obj.base.base.enabled = Some(sv.trim() == "true"); }
230                        crate::base::FieldValue::TextList(svs) => {
231                            if let Some(sv) = svs.last() { obj.base.base.enabled = Some(sv.trim() == "true"); }
232                        }
233                        _ => {}
234                    }
235                }
236                "IdentifiedObject.description" => {
237                    match val {
238                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.description = sv.clone(); }
239                        crate::base::FieldValue::TextList(svs) => {
240                            if let Some(sv) = svs.last() { obj.base.base.base.description = sv.clone(); }
241                        }
242                        _ => {}
243                    }
244                }
245                "IdentifiedObject.energyIdentCodeEic" => {
246                    match val {
247                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.energy_ident_code_eic = sv.clone(); }
248                        crate::base::FieldValue::TextList(svs) => {
249                            if let Some(sv) = svs.last() { obj.base.base.base.energy_ident_code_eic = sv.clone(); }
250                        }
251                        _ => {}
252                    }
253                }
254                "IdentifiedObject.mRID" => {
255                    match val {
256                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.m_rid = sv.clone(); }
257                        crate::base::FieldValue::TextList(svs) => {
258                            if let Some(sv) = svs.last() { obj.base.base.base.m_rid = sv.clone(); }
259                        }
260                        _ => {}
261                    }
262                }
263                "IdentifiedObject.name" => {
264                    match val {
265                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.name = sv.clone(); }
266                        crate::base::FieldValue::TextList(svs) => {
267                            if let Some(sv) = svs.last() { obj.base.base.base.name = sv.clone(); }
268                        }
269                        _ => {}
270                    }
271                }
272                "IdentifiedObject.shortName" => {
273                    match val {
274                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.short_name = sv.clone(); }
275                        crate::base::FieldValue::TextList(svs) => {
276                            if let Some(sv) = svs.last() { obj.base.base.base.short_name = sv.clone(); }
277                        }
278                        _ => {}
279                    }
280                }
281                _ => {}
282            }
283        }
284        obj
285    }
286}