Skip to main content

cimstructs/
PssWECC.rs

1/// Dual input power system stabilizer, based on IEEE type 2, with modified output limiter defined by WECC (Western Electricity Coordinating Council, USA).
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct PssWECC {
4    #[serde(flatten)]
5    pub base: super::PowerSystemStabilizerDynamics,
6    /// Type of input signal #1 (rotorAngularFrequencyDeviation, busFrequencyDeviation, generatorElectricalPower, generatorAcceleratingPower, busVoltage, or busVoltageDerivative - shall be different than PssWECC.inputSignal2Type). Typical value = rotorAngularFrequencyDeviation.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub input_signal1type: Option<super::base::UriRef>,
9    /// Type of input signal #2 (rotorAngularFrequencyDeviation, busFrequencyDeviation, generatorElectricalPower, generatorAcceleratingPower, busVoltage, busVoltageDerivative - shall be different than PssWECC.inputSignal1Type). Typical value = busVoltageDerivative.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub input_signal2type: Option<super::base::UriRef>,
12    /// Input signal 1 gain (K1). Typical value = 1,13.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub k1: Option<f64>,
15    /// Input signal 2 gain (K2). Typical value = 0,0.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub k2: Option<f64>,
18    /// Input signal 1 transducer time constant (T1) (>= 0). Typical value = 0,037.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub t1: Option<f64>,
21    /// Lag time constant (T10) (>= 0). Typical value = 0.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub t10: Option<f64>,
24    /// Input signal 2 transducer time constant (T2) (>= 0). Typical value = 0,0.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub t2: Option<f64>,
27    /// Stabilizer washout time constant (T3) (>= 0). Typical value = 9,5.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub t3: Option<f64>,
30    /// Stabilizer washout time lag constant (T4) (>= 0). Typical value = 9,5.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub t4: Option<f64>,
33    /// Lead time constant (T5) (>= 0). Typical value = 1,7.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub t5: Option<f64>,
36    /// Lag time constant (T6) (>= 0). Typical value = 1,5.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub t6: Option<f64>,
39    /// Lead time constant (T7) (>= 0). Typical value = 1,7.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub t7: Option<f64>,
42    /// Lag time constant (T8) (>= 0). Typical value = 1,5.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub t8: Option<f64>,
45    /// Lead time constant (T9) (>= 0). Typical value = 0.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub t9: Option<f64>,
48    /// Minimum value for voltage compensator output (VCL). Typical value = 0.
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub vcl: Option<f64>,
51    /// Maximum value for voltage compensator output (VCU). Typical value = 0.
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub vcu: Option<f64>,
54    /// Maximum output signal (Vsmax) (> PssWECC.vsmin). Typical value = 0,05.
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub vsmax: Option<f64>,
57    /// Minimum output signal (Vsmin) (< PssWECC.vsmax). Typical value = -0,05.
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub vsmin: Option<f64>,
60}
61impl crate::base::CimElement for PssWECC {
62    fn mrid(&self) -> &str { &self.base.base.base.id }
63    fn type_name(&self) -> &'static str { "PssWECC" }
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 = "PssWECC".to_string();
71        if let Some(ref v) = self.input_signal1type {
72            block.fields.insert("PssWECC.inputSignal1Type".into(), crate::base::FieldValue::Resource(v.uri.clone()));
73        }
74        if let Some(ref v) = self.input_signal2type {
75            block.fields.insert("PssWECC.inputSignal2Type".into(), crate::base::FieldValue::Resource(v.uri.clone()));
76        }
77        if let Some(v) = self.k1 {
78            block.fields.insert("PssWECC.k1".into(), crate::base::FieldValue::Text(v.to_string()));
79        }
80        if let Some(v) = self.k2 {
81            block.fields.insert("PssWECC.k2".into(), crate::base::FieldValue::Text(v.to_string()));
82        }
83        if let Some(v) = self.t1 {
84            block.fields.insert("PssWECC.t1".into(), crate::base::FieldValue::Text(v.to_string()));
85        }
86        if let Some(v) = self.t10 {
87            block.fields.insert("PssWECC.t10".into(), crate::base::FieldValue::Text(v.to_string()));
88        }
89        if let Some(v) = self.t2 {
90            block.fields.insert("PssWECC.t2".into(), crate::base::FieldValue::Text(v.to_string()));
91        }
92        if let Some(v) = self.t3 {
93            block.fields.insert("PssWECC.t3".into(), crate::base::FieldValue::Text(v.to_string()));
94        }
95        if let Some(v) = self.t4 {
96            block.fields.insert("PssWECC.t4".into(), crate::base::FieldValue::Text(v.to_string()));
97        }
98        if let Some(v) = self.t5 {
99            block.fields.insert("PssWECC.t5".into(), crate::base::FieldValue::Text(v.to_string()));
100        }
101        if let Some(v) = self.t6 {
102            block.fields.insert("PssWECC.t6".into(), crate::base::FieldValue::Text(v.to_string()));
103        }
104        if let Some(v) = self.t7 {
105            block.fields.insert("PssWECC.t7".into(), crate::base::FieldValue::Text(v.to_string()));
106        }
107        if let Some(v) = self.t8 {
108            block.fields.insert("PssWECC.t8".into(), crate::base::FieldValue::Text(v.to_string()));
109        }
110        if let Some(v) = self.t9 {
111            block.fields.insert("PssWECC.t9".into(), crate::base::FieldValue::Text(v.to_string()));
112        }
113        if let Some(v) = self.vcl {
114            block.fields.insert("PssWECC.vcl".into(), crate::base::FieldValue::Text(v.to_string()));
115        }
116        if let Some(v) = self.vcu {
117            block.fields.insert("PssWECC.vcu".into(), crate::base::FieldValue::Text(v.to_string()));
118        }
119        if let Some(v) = self.vsmax {
120            block.fields.insert("PssWECC.vsmax".into(), crate::base::FieldValue::Text(v.to_string()));
121        }
122        if let Some(v) = self.vsmin {
123            block.fields.insert("PssWECC.vsmin".into(), crate::base::FieldValue::Text(v.to_string()));
124        }
125        block
126    }
127}
128
129impl PssWECC {
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                "PssWECC.inputSignal1Type" => {
136                    if let crate::base::FieldValue::Resource(sv) = val {
137                        obj.input_signal1type = Some(crate::base::UriRef { uri: sv.clone() });
138                    }
139                }
140                "PssWECC.inputSignal2Type" => {
141                    if let crate::base::FieldValue::Resource(sv) = val {
142                        obj.input_signal2type = Some(crate::base::UriRef { uri: sv.clone() });
143                    }
144                }
145                "PssWECC.k1" => {
146                    match val {
147                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.k1 = Some(v); } }
148                        crate::base::FieldValue::TextList(svs) => {
149                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.k1 = Some(v); } }
150                        }
151                        _ => {}
152                    }
153                }
154                "PssWECC.k2" => {
155                    match val {
156                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.k2 = Some(v); } }
157                        crate::base::FieldValue::TextList(svs) => {
158                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.k2 = Some(v); } }
159                        }
160                        _ => {}
161                    }
162                }
163                "PssWECC.t1" => {
164                    match val {
165                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t1 = Some(v); } }
166                        crate::base::FieldValue::TextList(svs) => {
167                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t1 = Some(v); } }
168                        }
169                        _ => {}
170                    }
171                }
172                "PssWECC.t10" => {
173                    match val {
174                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t10 = Some(v); } }
175                        crate::base::FieldValue::TextList(svs) => {
176                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t10 = Some(v); } }
177                        }
178                        _ => {}
179                    }
180                }
181                "PssWECC.t2" => {
182                    match val {
183                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t2 = Some(v); } }
184                        crate::base::FieldValue::TextList(svs) => {
185                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t2 = Some(v); } }
186                        }
187                        _ => {}
188                    }
189                }
190                "PssWECC.t3" => {
191                    match val {
192                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t3 = Some(v); } }
193                        crate::base::FieldValue::TextList(svs) => {
194                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t3 = Some(v); } }
195                        }
196                        _ => {}
197                    }
198                }
199                "PssWECC.t4" => {
200                    match val {
201                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t4 = Some(v); } }
202                        crate::base::FieldValue::TextList(svs) => {
203                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t4 = Some(v); } }
204                        }
205                        _ => {}
206                    }
207                }
208                "PssWECC.t5" => {
209                    match val {
210                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t5 = Some(v); } }
211                        crate::base::FieldValue::TextList(svs) => {
212                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t5 = Some(v); } }
213                        }
214                        _ => {}
215                    }
216                }
217                "PssWECC.t6" => {
218                    match val {
219                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t6 = Some(v); } }
220                        crate::base::FieldValue::TextList(svs) => {
221                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t6 = Some(v); } }
222                        }
223                        _ => {}
224                    }
225                }
226                "PssWECC.t7" => {
227                    match val {
228                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t7 = Some(v); } }
229                        crate::base::FieldValue::TextList(svs) => {
230                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t7 = Some(v); } }
231                        }
232                        _ => {}
233                    }
234                }
235                "PssWECC.t8" => {
236                    match val {
237                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t8 = Some(v); } }
238                        crate::base::FieldValue::TextList(svs) => {
239                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t8 = Some(v); } }
240                        }
241                        _ => {}
242                    }
243                }
244                "PssWECC.t9" => {
245                    match val {
246                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t9 = Some(v); } }
247                        crate::base::FieldValue::TextList(svs) => {
248                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t9 = Some(v); } }
249                        }
250                        _ => {}
251                    }
252                }
253                "PssWECC.vcl" => {
254                    match val {
255                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vcl = Some(v); } }
256                        crate::base::FieldValue::TextList(svs) => {
257                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vcl = Some(v); } }
258                        }
259                        _ => {}
260                    }
261                }
262                "PssWECC.vcu" => {
263                    match val {
264                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vcu = Some(v); } }
265                        crate::base::FieldValue::TextList(svs) => {
266                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vcu = Some(v); } }
267                        }
268                        _ => {}
269                    }
270                }
271                "PssWECC.vsmax" => {
272                    match val {
273                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vsmax = Some(v); } }
274                        crate::base::FieldValue::TextList(svs) => {
275                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vsmax = Some(v); } }
276                        }
277                        _ => {}
278                    }
279                }
280                "PssWECC.vsmin" => {
281                    match val {
282                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vsmin = Some(v); } }
283                        crate::base::FieldValue::TextList(svs) => {
284                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vsmin = Some(v); } }
285                        }
286                        _ => {}
287                    }
288                }
289                "PowerSystemStabilizerDynamics.ExcitationSystemDynamics" => {
290                    if let crate::base::FieldValue::Resource(sv) = val {
291                        obj.base.excitation_system_dynamics = Some(crate::base::MridRef { mrid: sv.clone() });
292                    }
293                }
294                "DynamicsFunctionBlock.enabled" => {
295                    match val {
296                        crate::base::FieldValue::Text(sv) => { obj.base.base.enabled = Some(sv.trim() == "true"); }
297                        crate::base::FieldValue::TextList(svs) => {
298                            if let Some(sv) = svs.last() { obj.base.base.enabled = Some(sv.trim() == "true"); }
299                        }
300                        _ => {}
301                    }
302                }
303                "IdentifiedObject.description" => {
304                    match val {
305                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.description = sv.clone(); }
306                        crate::base::FieldValue::TextList(svs) => {
307                            if let Some(sv) = svs.last() { obj.base.base.base.description = sv.clone(); }
308                        }
309                        _ => {}
310                    }
311                }
312                "IdentifiedObject.energyIdentCodeEic" => {
313                    match val {
314                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.energy_ident_code_eic = sv.clone(); }
315                        crate::base::FieldValue::TextList(svs) => {
316                            if let Some(sv) = svs.last() { obj.base.base.base.energy_ident_code_eic = sv.clone(); }
317                        }
318                        _ => {}
319                    }
320                }
321                "IdentifiedObject.mRID" => {
322                    match val {
323                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.m_rid = sv.clone(); }
324                        crate::base::FieldValue::TextList(svs) => {
325                            if let Some(sv) = svs.last() { obj.base.base.base.m_rid = sv.clone(); }
326                        }
327                        _ => {}
328                    }
329                }
330                "IdentifiedObject.name" => {
331                    match val {
332                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.name = sv.clone(); }
333                        crate::base::FieldValue::TextList(svs) => {
334                            if let Some(sv) = svs.last() { obj.base.base.base.name = sv.clone(); }
335                        }
336                        _ => {}
337                    }
338                }
339                "IdentifiedObject.shortName" => {
340                    match val {
341                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.short_name = sv.clone(); }
342                        crate::base::FieldValue::TextList(svs) => {
343                            if let Some(sv) = svs.last() { obj.base.base.base.short_name = sv.clone(); }
344                        }
345                        _ => {}
346                    }
347                }
348                _ => {}
349            }
350        }
351        obj
352    }
353}