Skip to main content

cimstructs/
PssIEEE2B.rs

1/// IEEE 421.5-2005 type PSS2B power system stabilizer model. This stabilizer model is designed to represent a variety of dual-input stabilizers, which normally use combinations of power and speed or frequency to derive the stabilizing signal. Reference: IEEE 2B 421.5-2005, 8.2.
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct PssIEEE2B {
4    #[serde(flatten)]
5    pub base: super::PowerSystemStabilizerDynamics,
6    /// Type of input signal #1 (rotorAngularFrequencyDeviation, busFrequencyDeviation). 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 (generatorElectricalPower). Typical value = generatorElectricalPower.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub input_signal2type: Option<super::base::UriRef>,
12    /// Stabilizer gain (Ks1). Typical value = 12.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub ks1: Option<f64>,
15    /// Gain on signal #2 (Ks2). Typical value = 0,2.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub ks2: Option<f64>,
18    /// Gain on signal #2 input before ramp-tracking filter (Ks3). Typical value = 1.
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub ks3: Option<f64>,
21    /// Denominator order of ramp tracking filter (M). Typical value = 5.
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub m: Option<i64>,
24    /// Order of ramp tracking filter (N). Typical value = 1.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub n: Option<i64>,
27    /// Lead/lag time constant (T1) (>= 0). Typical value = 0,12.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub t1: Option<f64>,
30    /// Lead/lag time constant (T10) (>= 0). Typical value = 0.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub t10: Option<f64>,
33    /// Lead/lag time constant (T11) (>= 0). Typical value = 0.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub t11: Option<f64>,
36    /// Lead/lag time constant (T2) (>= 0). Typical value = 0,02.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub t2: Option<f64>,
39    /// Lead/lag time constant (T3) (>= 0). Typical value = 0,3.
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub t3: Option<f64>,
42    /// Lead/lag time constant (T4) (>= 0). Typical value = 0,02.
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub t4: Option<f64>,
45    /// Time constant on signal #1 (T6) (>= 0). Typical value = 0.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub t6: Option<f64>,
48    /// Time constant on signal #2 (T7) (>= 0). Typical value = 2.
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub t7: Option<f64>,
51    /// Lead of ramp tracking filter (T8) (>= 0). Typical value = 0,2.
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub t8: Option<f64>,
54    /// Lag of ramp tracking filter (T9) (>= 0). Typical value = 0,1.
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub t9: Option<f64>,
57    /// First washout on signal #1 (Tw1) (>= 0). Typical value = 2.
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub tw1: Option<f64>,
60    /// Second washout on signal #1 (Tw2) (>= 0). Typical value = 2.
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub tw2: Option<f64>,
63    /// First washout on signal #2 (Tw3) (>= 0). Typical value = 2.
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub tw3: Option<f64>,
66    /// Second washout on signal #2 (Tw4) (>= 0). Typical value = 0.
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub tw4: Option<f64>,
69    /// Input signal #1 maximum limit (Vsi1max) (> PssIEEE2B.vsi1min). Typical value = 2.
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub vsi1max: Option<f64>,
72    /// Input signal #1 minimum limit (Vsi1min) (< PssIEEE2B.vsi1max). Typical value = -2.
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub vsi1min: Option<f64>,
75    /// Input signal #2 maximum limit (Vsi2max) (> PssIEEE2B.vsi2min). Typical value = 2.
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub vsi2max: Option<f64>,
78    /// Input signal #2 minimum limit (Vsi2min) (< PssIEEE2B.vsi2max). Typical value = -2.
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub vsi2min: Option<f64>,
81    /// Stabilizer output maximum limit (Vstmax) (> PssIEEE2B.vstmin). Typical value = 0,1.
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub vstmax: Option<f64>,
84    /// Stabilizer output minimum limit (Vstmin) (< PssIEEE2B.vstmax). Typical value = -0,1.
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub vstmin: Option<f64>,
87}
88impl crate::base::CimElement for PssIEEE2B {
89    fn mrid(&self) -> &str { &self.base.base.base.id }
90    fn type_name(&self) -> &'static str { "PssIEEE2B" }
91    fn as_any(&self) -> &dyn std::any::Any { self }
92    fn to_json_value(&self) -> serde_json::Value {
93        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
94    }
95    fn to_block(&self) -> crate::base::RdfBlock {
96        let mut block = self.base.to_block();
97        block.type_name = "PssIEEE2B".to_string();
98        if let Some(ref v) = self.input_signal1type {
99            block.fields.insert("PssIEEE2B.inputSignal1Type".into(), crate::base::FieldValue::Resource(v.uri.clone()));
100        }
101        if let Some(ref v) = self.input_signal2type {
102            block.fields.insert("PssIEEE2B.inputSignal2Type".into(), crate::base::FieldValue::Resource(v.uri.clone()));
103        }
104        if let Some(v) = self.ks1 {
105            block.fields.insert("PssIEEE2B.ks1".into(), crate::base::FieldValue::Text(v.to_string()));
106        }
107        if let Some(v) = self.ks2 {
108            block.fields.insert("PssIEEE2B.ks2".into(), crate::base::FieldValue::Text(v.to_string()));
109        }
110        if let Some(v) = self.ks3 {
111            block.fields.insert("PssIEEE2B.ks3".into(), crate::base::FieldValue::Text(v.to_string()));
112        }
113        if let Some(v) = self.m {
114            block.fields.insert("PssIEEE2B.m".into(), crate::base::FieldValue::Text(v.to_string()));
115        }
116        if let Some(v) = self.n {
117            block.fields.insert("PssIEEE2B.n".into(), crate::base::FieldValue::Text(v.to_string()));
118        }
119        if let Some(v) = self.t1 {
120            block.fields.insert("PssIEEE2B.t1".into(), crate::base::FieldValue::Text(v.to_string()));
121        }
122        if let Some(v) = self.t10 {
123            block.fields.insert("PssIEEE2B.t10".into(), crate::base::FieldValue::Text(v.to_string()));
124        }
125        if let Some(v) = self.t11 {
126            block.fields.insert("PssIEEE2B.t11".into(), crate::base::FieldValue::Text(v.to_string()));
127        }
128        if let Some(v) = self.t2 {
129            block.fields.insert("PssIEEE2B.t2".into(), crate::base::FieldValue::Text(v.to_string()));
130        }
131        if let Some(v) = self.t3 {
132            block.fields.insert("PssIEEE2B.t3".into(), crate::base::FieldValue::Text(v.to_string()));
133        }
134        if let Some(v) = self.t4 {
135            block.fields.insert("PssIEEE2B.t4".into(), crate::base::FieldValue::Text(v.to_string()));
136        }
137        if let Some(v) = self.t6 {
138            block.fields.insert("PssIEEE2B.t6".into(), crate::base::FieldValue::Text(v.to_string()));
139        }
140        if let Some(v) = self.t7 {
141            block.fields.insert("PssIEEE2B.t7".into(), crate::base::FieldValue::Text(v.to_string()));
142        }
143        if let Some(v) = self.t8 {
144            block.fields.insert("PssIEEE2B.t8".into(), crate::base::FieldValue::Text(v.to_string()));
145        }
146        if let Some(v) = self.t9 {
147            block.fields.insert("PssIEEE2B.t9".into(), crate::base::FieldValue::Text(v.to_string()));
148        }
149        if let Some(v) = self.tw1 {
150            block.fields.insert("PssIEEE2B.tw1".into(), crate::base::FieldValue::Text(v.to_string()));
151        }
152        if let Some(v) = self.tw2 {
153            block.fields.insert("PssIEEE2B.tw2".into(), crate::base::FieldValue::Text(v.to_string()));
154        }
155        if let Some(v) = self.tw3 {
156            block.fields.insert("PssIEEE2B.tw3".into(), crate::base::FieldValue::Text(v.to_string()));
157        }
158        if let Some(v) = self.tw4 {
159            block.fields.insert("PssIEEE2B.tw4".into(), crate::base::FieldValue::Text(v.to_string()));
160        }
161        if let Some(v) = self.vsi1max {
162            block.fields.insert("PssIEEE2B.vsi1max".into(), crate::base::FieldValue::Text(v.to_string()));
163        }
164        if let Some(v) = self.vsi1min {
165            block.fields.insert("PssIEEE2B.vsi1min".into(), crate::base::FieldValue::Text(v.to_string()));
166        }
167        if let Some(v) = self.vsi2max {
168            block.fields.insert("PssIEEE2B.vsi2max".into(), crate::base::FieldValue::Text(v.to_string()));
169        }
170        if let Some(v) = self.vsi2min {
171            block.fields.insert("PssIEEE2B.vsi2min".into(), crate::base::FieldValue::Text(v.to_string()));
172        }
173        if let Some(v) = self.vstmax {
174            block.fields.insert("PssIEEE2B.vstmax".into(), crate::base::FieldValue::Text(v.to_string()));
175        }
176        if let Some(v) = self.vstmin {
177            block.fields.insert("PssIEEE2B.vstmin".into(), crate::base::FieldValue::Text(v.to_string()));
178        }
179        block
180    }
181}
182
183impl PssIEEE2B {
184    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
185        let mut obj = Self::default();
186        obj.base.base.base.id.clone_from(&b.mrid);
187        for (key, val) in &b.fields {
188            match key.as_str() {
189                "PssIEEE2B.inputSignal1Type" => {
190                    if let crate::base::FieldValue::Resource(sv) = val {
191                        obj.input_signal1type = Some(crate::base::UriRef { uri: sv.clone() });
192                    }
193                }
194                "PssIEEE2B.inputSignal2Type" => {
195                    if let crate::base::FieldValue::Resource(sv) = val {
196                        obj.input_signal2type = Some(crate::base::UriRef { uri: sv.clone() });
197                    }
198                }
199                "PssIEEE2B.ks1" => {
200                    match val {
201                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ks1 = Some(v); } }
202                        crate::base::FieldValue::TextList(svs) => {
203                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ks1 = Some(v); } }
204                        }
205                        _ => {}
206                    }
207                }
208                "PssIEEE2B.ks2" => {
209                    match val {
210                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ks2 = Some(v); } }
211                        crate::base::FieldValue::TextList(svs) => {
212                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ks2 = Some(v); } }
213                        }
214                        _ => {}
215                    }
216                }
217                "PssIEEE2B.ks3" => {
218                    match val {
219                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.ks3 = Some(v); } }
220                        crate::base::FieldValue::TextList(svs) => {
221                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.ks3 = Some(v); } }
222                        }
223                        _ => {}
224                    }
225                }
226                "PssIEEE2B.m" => {
227                    match val {
228                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.m = Some(v); } }
229                        crate::base::FieldValue::TextList(svs) => {
230                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.m = Some(v); } }
231                        }
232                        _ => {}
233                    }
234                }
235                "PssIEEE2B.n" => {
236                    match val {
237                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.n = Some(v); } }
238                        crate::base::FieldValue::TextList(svs) => {
239                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.n = Some(v); } }
240                        }
241                        _ => {}
242                    }
243                }
244                "PssIEEE2B.t1" => {
245                    match val {
246                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t1 = Some(v); } }
247                        crate::base::FieldValue::TextList(svs) => {
248                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t1 = Some(v); } }
249                        }
250                        _ => {}
251                    }
252                }
253                "PssIEEE2B.t10" => {
254                    match val {
255                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t10 = Some(v); } }
256                        crate::base::FieldValue::TextList(svs) => {
257                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t10 = Some(v); } }
258                        }
259                        _ => {}
260                    }
261                }
262                "PssIEEE2B.t11" => {
263                    match val {
264                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t11 = Some(v); } }
265                        crate::base::FieldValue::TextList(svs) => {
266                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t11 = Some(v); } }
267                        }
268                        _ => {}
269                    }
270                }
271                "PssIEEE2B.t2" => {
272                    match val {
273                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t2 = Some(v); } }
274                        crate::base::FieldValue::TextList(svs) => {
275                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t2 = Some(v); } }
276                        }
277                        _ => {}
278                    }
279                }
280                "PssIEEE2B.t3" => {
281                    match val {
282                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t3 = Some(v); } }
283                        crate::base::FieldValue::TextList(svs) => {
284                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t3 = Some(v); } }
285                        }
286                        _ => {}
287                    }
288                }
289                "PssIEEE2B.t4" => {
290                    match val {
291                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t4 = Some(v); } }
292                        crate::base::FieldValue::TextList(svs) => {
293                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t4 = Some(v); } }
294                        }
295                        _ => {}
296                    }
297                }
298                "PssIEEE2B.t6" => {
299                    match val {
300                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t6 = Some(v); } }
301                        crate::base::FieldValue::TextList(svs) => {
302                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t6 = Some(v); } }
303                        }
304                        _ => {}
305                    }
306                }
307                "PssIEEE2B.t7" => {
308                    match val {
309                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t7 = Some(v); } }
310                        crate::base::FieldValue::TextList(svs) => {
311                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t7 = Some(v); } }
312                        }
313                        _ => {}
314                    }
315                }
316                "PssIEEE2B.t8" => {
317                    match val {
318                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t8 = Some(v); } }
319                        crate::base::FieldValue::TextList(svs) => {
320                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t8 = Some(v); } }
321                        }
322                        _ => {}
323                    }
324                }
325                "PssIEEE2B.t9" => {
326                    match val {
327                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.t9 = Some(v); } }
328                        crate::base::FieldValue::TextList(svs) => {
329                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.t9 = Some(v); } }
330                        }
331                        _ => {}
332                    }
333                }
334                "PssIEEE2B.tw1" => {
335                    match val {
336                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tw1 = Some(v); } }
337                        crate::base::FieldValue::TextList(svs) => {
338                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tw1 = Some(v); } }
339                        }
340                        _ => {}
341                    }
342                }
343                "PssIEEE2B.tw2" => {
344                    match val {
345                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tw2 = Some(v); } }
346                        crate::base::FieldValue::TextList(svs) => {
347                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tw2 = Some(v); } }
348                        }
349                        _ => {}
350                    }
351                }
352                "PssIEEE2B.tw3" => {
353                    match val {
354                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tw3 = Some(v); } }
355                        crate::base::FieldValue::TextList(svs) => {
356                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tw3 = Some(v); } }
357                        }
358                        _ => {}
359                    }
360                }
361                "PssIEEE2B.tw4" => {
362                    match val {
363                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.tw4 = Some(v); } }
364                        crate::base::FieldValue::TextList(svs) => {
365                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.tw4 = Some(v); } }
366                        }
367                        _ => {}
368                    }
369                }
370                "PssIEEE2B.vsi1max" => {
371                    match val {
372                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vsi1max = Some(v); } }
373                        crate::base::FieldValue::TextList(svs) => {
374                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vsi1max = Some(v); } }
375                        }
376                        _ => {}
377                    }
378                }
379                "PssIEEE2B.vsi1min" => {
380                    match val {
381                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vsi1min = Some(v); } }
382                        crate::base::FieldValue::TextList(svs) => {
383                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vsi1min = Some(v); } }
384                        }
385                        _ => {}
386                    }
387                }
388                "PssIEEE2B.vsi2max" => {
389                    match val {
390                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vsi2max = Some(v); } }
391                        crate::base::FieldValue::TextList(svs) => {
392                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vsi2max = Some(v); } }
393                        }
394                        _ => {}
395                    }
396                }
397                "PssIEEE2B.vsi2min" => {
398                    match val {
399                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vsi2min = Some(v); } }
400                        crate::base::FieldValue::TextList(svs) => {
401                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vsi2min = Some(v); } }
402                        }
403                        _ => {}
404                    }
405                }
406                "PssIEEE2B.vstmax" => {
407                    match val {
408                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vstmax = Some(v); } }
409                        crate::base::FieldValue::TextList(svs) => {
410                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vstmax = Some(v); } }
411                        }
412                        _ => {}
413                    }
414                }
415                "PssIEEE2B.vstmin" => {
416                    match val {
417                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.vstmin = Some(v); } }
418                        crate::base::FieldValue::TextList(svs) => {
419                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.vstmin = Some(v); } }
420                        }
421                        _ => {}
422                    }
423                }
424                "PowerSystemStabilizerDynamics.ExcitationSystemDynamics" => {
425                    if let crate::base::FieldValue::Resource(sv) = val {
426                        obj.base.excitation_system_dynamics = Some(crate::base::MridRef { mrid: sv.clone() });
427                    }
428                }
429                "DynamicsFunctionBlock.enabled" => {
430                    match val {
431                        crate::base::FieldValue::Text(sv) => { obj.base.base.enabled = Some(sv.trim() == "true"); }
432                        crate::base::FieldValue::TextList(svs) => {
433                            if let Some(sv) = svs.last() { obj.base.base.enabled = Some(sv.trim() == "true"); }
434                        }
435                        _ => {}
436                    }
437                }
438                "IdentifiedObject.description" => {
439                    match val {
440                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.description = sv.clone(); }
441                        crate::base::FieldValue::TextList(svs) => {
442                            if let Some(sv) = svs.last() { obj.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.energy_ident_code_eic = sv.clone(); }
450                        crate::base::FieldValue::TextList(svs) => {
451                            if let Some(sv) = svs.last() { obj.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.m_rid = sv.clone(); }
459                        crate::base::FieldValue::TextList(svs) => {
460                            if let Some(sv) = svs.last() { obj.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.name = sv.clone(); }
468                        crate::base::FieldValue::TextList(svs) => {
469                            if let Some(sv) = svs.last() { obj.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.short_name = sv.clone(); }
477                        crate::base::FieldValue::TextList(svs) => {
478                            if let Some(sv) = svs.last() { obj.base.base.base.short_name = sv.clone(); }
479                        }
480                        _ => {}
481                    }
482                }
483                _ => {}
484            }
485        }
486        obj
487    }
488}