1pub type Model702 = DerCapacity;
4#[derive(Debug)]
8#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
9pub struct DerCapacity {
10 pub w_max_rtg: Option<u16>,
16 pub w_ovr_ext_rtg: Option<u16>,
20 pub w_ovr_ext_rtg_pf: Option<u16>,
24 pub w_und_ext_rtg: Option<u16>,
28 pub w_und_ext_rtg_pf: Option<u16>,
32 pub va_max_rtg: Option<u16>,
36 pub var_max_inj_rtg: Option<u16>,
40 pub var_max_abs_rtg: Option<u16>,
44 pub w_cha_rte_max_rtg: Option<u16>,
48 pub w_dis_cha_rte_max_rtg: Option<u16>,
52 pub va_cha_rte_max_rtg: Option<u16>,
56 pub va_dis_cha_rte_max_rtg: Option<u16>,
60 pub v_nom_rtg: Option<u16>,
66 pub v_max_rtg: Option<u16>,
72 pub v_min_rtg: Option<u16>,
78 pub a_max_rtg: Option<u16>,
82 pub pf_ovr_ext_rtg: Option<u16>,
88 pub pf_und_ext_rtg: Option<u16>,
94 pub react_suscept_rtg: Option<u16>,
98 pub nor_op_cat_rtg: Option<NorOpCatRtg>,
102 pub abn_op_cat_rtg: Option<AbnOpCatRtg>,
106 pub ctrl_modes: Option<CtrlModes>,
110 pub int_island_cat_rtg: Option<IntIslandCatRtg>,
114 pub w_max: Option<u16>,
120 pub w_max_ovr_ext: Option<u16>,
124 pub w_ovr_ext_pf: Option<u16>,
128 pub w_max_und_ext: Option<u16>,
132 pub w_und_ext_pf: Option<u16>,
136 pub va_max: Option<u16>,
140 pub var_max_inj: Option<u16>,
144 pub var_max_abs: Option<u16>,
148 pub w_cha_rte_max: Option<u16>,
152 pub w_dis_cha_rte_max: Option<u16>,
156 pub va_cha_rte_max: Option<u16>,
160 pub va_dis_cha_rte_max: Option<u16>,
164 pub v_nom: Option<u16>,
170 pub v_max: Option<u16>,
176 pub v_min: Option<u16>,
182 pub a_max: Option<u16>,
186 pub pf_ovr_ext: Option<u16>,
192 pub pf_und_ext: Option<u16>,
198 pub int_island_cat: Option<IntIslandCat>,
202 pub w_sf: Option<i16>,
208 pub pf_sf: Option<i16>,
212 pub va_sf: Option<i16>,
216 pub var_sf: Option<i16>,
220 pub v_sf: Option<i16>,
224 pub a_sf: Option<i16>,
228 pub s_sf: Option<i16>,
232}
233#[allow(missing_docs)]
234impl DerCapacity {
235 pub const W_MAX_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(0, 1, false);
236 pub const W_OVR_EXT_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(1, 1, false);
237 pub const W_OVR_EXT_RTG_PF: crate::Point<Self, Option<u16>> = crate::Point::new(2, 1, false);
238 pub const W_UND_EXT_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(3, 1, false);
239 pub const W_UND_EXT_RTG_PF: crate::Point<Self, Option<u16>> = crate::Point::new(4, 1, false);
240 pub const VA_MAX_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(5, 1, false);
241 pub const VAR_MAX_INJ_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(6, 1, false);
242 pub const VAR_MAX_ABS_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(7, 1, false);
243 pub const W_CHA_RTE_MAX_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(8, 1, false);
244 pub const W_DIS_CHA_RTE_MAX_RTG: crate::Point<Self, Option<u16>> =
245 crate::Point::new(9, 1, false);
246 pub const VA_CHA_RTE_MAX_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(10, 1, false);
247 pub const VA_DIS_CHA_RTE_MAX_RTG: crate::Point<Self, Option<u16>> =
248 crate::Point::new(11, 1, false);
249 pub const V_NOM_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(12, 1, false);
250 pub const V_MAX_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(13, 1, false);
251 pub const V_MIN_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(14, 1, false);
252 pub const A_MAX_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(15, 1, false);
253 pub const PF_OVR_EXT_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(16, 1, false);
254 pub const PF_UND_EXT_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(17, 1, false);
255 pub const REACT_SUSCEPT_RTG: crate::Point<Self, Option<u16>> = crate::Point::new(18, 1, false);
256 pub const NOR_OP_CAT_RTG: crate::Point<Self, Option<NorOpCatRtg>> =
257 crate::Point::new(19, 1, false);
258 pub const ABN_OP_CAT_RTG: crate::Point<Self, Option<AbnOpCatRtg>> =
259 crate::Point::new(20, 1, false);
260 pub const CTRL_MODES: crate::Point<Self, Option<CtrlModes>> = crate::Point::new(21, 2, false);
261 pub const INT_ISLAND_CAT_RTG: crate::Point<Self, Option<IntIslandCatRtg>> =
262 crate::Point::new(23, 1, false);
263 pub const W_MAX: crate::Point<Self, Option<u16>> = crate::Point::new(24, 1, true);
264 pub const W_MAX_OVR_EXT: crate::Point<Self, Option<u16>> = crate::Point::new(25, 1, true);
265 pub const W_OVR_EXT_PF: crate::Point<Self, Option<u16>> = crate::Point::new(26, 1, true);
266 pub const W_MAX_UND_EXT: crate::Point<Self, Option<u16>> = crate::Point::new(27, 1, true);
267 pub const W_UND_EXT_PF: crate::Point<Self, Option<u16>> = crate::Point::new(28, 1, true);
268 pub const VA_MAX: crate::Point<Self, Option<u16>> = crate::Point::new(29, 1, true);
269 pub const VAR_MAX_INJ: crate::Point<Self, Option<u16>> = crate::Point::new(30, 1, true);
270 pub const VAR_MAX_ABS: crate::Point<Self, Option<u16>> = crate::Point::new(31, 1, true);
271 pub const W_CHA_RTE_MAX: crate::Point<Self, Option<u16>> = crate::Point::new(32, 1, true);
272 pub const W_DIS_CHA_RTE_MAX: crate::Point<Self, Option<u16>> = crate::Point::new(33, 1, true);
273 pub const VA_CHA_RTE_MAX: crate::Point<Self, Option<u16>> = crate::Point::new(34, 1, true);
274 pub const VA_DIS_CHA_RTE_MAX: crate::Point<Self, Option<u16>> = crate::Point::new(35, 1, true);
275 pub const V_NOM: crate::Point<Self, Option<u16>> = crate::Point::new(36, 1, true);
276 pub const V_MAX: crate::Point<Self, Option<u16>> = crate::Point::new(37, 1, true);
277 pub const V_MIN: crate::Point<Self, Option<u16>> = crate::Point::new(38, 1, true);
278 pub const A_MAX: crate::Point<Self, Option<u16>> = crate::Point::new(39, 1, true);
279 pub const PF_OVR_EXT: crate::Point<Self, Option<u16>> = crate::Point::new(40, 1, true);
280 pub const PF_UND_EXT: crate::Point<Self, Option<u16>> = crate::Point::new(41, 1, true);
281 pub const INT_ISLAND_CAT: crate::Point<Self, Option<IntIslandCat>> =
282 crate::Point::new(42, 1, true);
283 pub const W_SF: crate::Point<Self, Option<i16>> = crate::Point::new(43, 1, false);
284 pub const PF_SF: crate::Point<Self, Option<i16>> = crate::Point::new(44, 1, false);
285 pub const VA_SF: crate::Point<Self, Option<i16>> = crate::Point::new(45, 1, false);
286 pub const VAR_SF: crate::Point<Self, Option<i16>> = crate::Point::new(46, 1, false);
287 pub const V_SF: crate::Point<Self, Option<i16>> = crate::Point::new(47, 1, false);
288 pub const A_SF: crate::Point<Self, Option<i16>> = crate::Point::new(48, 1, false);
289 pub const S_SF: crate::Point<Self, Option<i16>> = crate::Point::new(49, 1, false);
290}
291impl crate::Group for DerCapacity {
292 const LEN: u16 = 50;
293}
294impl DerCapacity {
295 fn parse_group(data: &[u16]) -> Result<(&[u16], Self), crate::DecodeError> {
296 let nested_data = data
297 .get(usize::from(<Self as crate::Group>::LEN)..)
298 .unwrap_or(&[]);
299 Ok((
300 nested_data,
301 Self {
302 w_max_rtg: Self::W_MAX_RTG.from_data(data)?,
303 w_ovr_ext_rtg: Self::W_OVR_EXT_RTG.from_data(data)?,
304 w_ovr_ext_rtg_pf: Self::W_OVR_EXT_RTG_PF.from_data(data)?,
305 w_und_ext_rtg: Self::W_UND_EXT_RTG.from_data(data)?,
306 w_und_ext_rtg_pf: Self::W_UND_EXT_RTG_PF.from_data(data)?,
307 va_max_rtg: Self::VA_MAX_RTG.from_data(data)?,
308 var_max_inj_rtg: Self::VAR_MAX_INJ_RTG.from_data(data)?,
309 var_max_abs_rtg: Self::VAR_MAX_ABS_RTG.from_data(data)?,
310 w_cha_rte_max_rtg: Self::W_CHA_RTE_MAX_RTG.from_data(data)?,
311 w_dis_cha_rte_max_rtg: Self::W_DIS_CHA_RTE_MAX_RTG.from_data(data)?,
312 va_cha_rte_max_rtg: Self::VA_CHA_RTE_MAX_RTG.from_data(data)?,
313 va_dis_cha_rte_max_rtg: Self::VA_DIS_CHA_RTE_MAX_RTG.from_data(data)?,
314 v_nom_rtg: Self::V_NOM_RTG.from_data(data)?,
315 v_max_rtg: Self::V_MAX_RTG.from_data(data)?,
316 v_min_rtg: Self::V_MIN_RTG.from_data(data)?,
317 a_max_rtg: Self::A_MAX_RTG.from_data(data)?,
318 pf_ovr_ext_rtg: Self::PF_OVR_EXT_RTG.from_data(data)?,
319 pf_und_ext_rtg: Self::PF_UND_EXT_RTG.from_data(data)?,
320 react_suscept_rtg: Self::REACT_SUSCEPT_RTG.from_data(data)?,
321 nor_op_cat_rtg: Self::NOR_OP_CAT_RTG.from_data(data)?,
322 abn_op_cat_rtg: Self::ABN_OP_CAT_RTG.from_data(data)?,
323 ctrl_modes: Self::CTRL_MODES.from_data(data)?,
324 int_island_cat_rtg: Self::INT_ISLAND_CAT_RTG.from_data(data)?,
325 w_max: Self::W_MAX.from_data(data)?,
326 w_max_ovr_ext: Self::W_MAX_OVR_EXT.from_data(data)?,
327 w_ovr_ext_pf: Self::W_OVR_EXT_PF.from_data(data)?,
328 w_max_und_ext: Self::W_MAX_UND_EXT.from_data(data)?,
329 w_und_ext_pf: Self::W_UND_EXT_PF.from_data(data)?,
330 va_max: Self::VA_MAX.from_data(data)?,
331 var_max_inj: Self::VAR_MAX_INJ.from_data(data)?,
332 var_max_abs: Self::VAR_MAX_ABS.from_data(data)?,
333 w_cha_rte_max: Self::W_CHA_RTE_MAX.from_data(data)?,
334 w_dis_cha_rte_max: Self::W_DIS_CHA_RTE_MAX.from_data(data)?,
335 va_cha_rte_max: Self::VA_CHA_RTE_MAX.from_data(data)?,
336 va_dis_cha_rte_max: Self::VA_DIS_CHA_RTE_MAX.from_data(data)?,
337 v_nom: Self::V_NOM.from_data(data)?,
338 v_max: Self::V_MAX.from_data(data)?,
339 v_min: Self::V_MIN.from_data(data)?,
340 a_max: Self::A_MAX.from_data(data)?,
341 pf_ovr_ext: Self::PF_OVR_EXT.from_data(data)?,
342 pf_und_ext: Self::PF_UND_EXT.from_data(data)?,
343 int_island_cat: Self::INT_ISLAND_CAT.from_data(data)?,
344 w_sf: Self::W_SF.from_data(data)?,
345 pf_sf: Self::PF_SF.from_data(data)?,
346 va_sf: Self::VA_SF.from_data(data)?,
347 var_sf: Self::VAR_SF.from_data(data)?,
348 v_sf: Self::V_SF.from_data(data)?,
349 a_sf: Self::A_SF.from_data(data)?,
350 s_sf: Self::S_SF.from_data(data)?,
351 },
352 ))
353 }
354}
355#[derive(Copy, Clone, Debug, Eq, PartialEq)]
359#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
360pub enum NorOpCatRtg {
361 CatA,
363 CatB,
365 Invalid(u16),
367}
368impl crate::EnumValue for NorOpCatRtg {
369 type Repr = u16;
370 const INVALID: Self::Repr = 65535;
371 fn from_repr(value: Self::Repr) -> Self {
372 match value {
373 0 => Self::CatA,
374 1 => Self::CatB,
375 value => Self::Invalid(value),
376 }
377 }
378 fn to_repr(self) -> Self::Repr {
379 match self {
380 Self::CatA => 0,
381 Self::CatB => 1,
382 Self::Invalid(value) => value,
383 }
384 }
385}
386impl crate::FixedSize for NorOpCatRtg {
387 const SIZE: u16 = 1u16;
388 const INVALID: Self = Self::Invalid(65535);
389 fn is_invalid(&self) -> bool {
390 matches!(self, Self::Invalid(_))
391 }
392}
393#[derive(Copy, Clone, Debug, Eq, PartialEq)]
397#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
398pub enum AbnOpCatRtg {
399 Cat1,
401 Cat2,
403 Cat3,
405 Invalid(u16),
407}
408impl crate::EnumValue for AbnOpCatRtg {
409 type Repr = u16;
410 const INVALID: Self::Repr = 65535;
411 fn from_repr(value: Self::Repr) -> Self {
412 match value {
413 0 => Self::Cat1,
414 1 => Self::Cat2,
415 2 => Self::Cat3,
416 value => Self::Invalid(value),
417 }
418 }
419 fn to_repr(self) -> Self::Repr {
420 match self {
421 Self::Cat1 => 0,
422 Self::Cat2 => 1,
423 Self::Cat3 => 2,
424 Self::Invalid(value) => value,
425 }
426 }
427}
428impl crate::FixedSize for AbnOpCatRtg {
429 const SIZE: u16 = 1u16;
430 const INVALID: Self = Self::Invalid(65535);
431 fn is_invalid(&self) -> bool {
432 matches!(self, Self::Invalid(_))
433 }
434}
435bitflags::bitflags! {
436 #[doc = " Supported Control Modes"] #[doc = " "] #[doc =
437 " Supported control mode functions."] #[derive(Copy, Clone, Debug, Eq, PartialEq)]
438 #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub
439 struct CtrlModes : u32 { #[doc = " Limit Maximum Active Power"] const MaxW = 1; #[doc
440 = " Fixed Active Power"] const FixedW = 2; #[doc = " Fixed Reactive Power"] const
441 FixedVar = 4; #[doc = " Fixed Power Factor"] const FixedPf = 8; #[doc =
442 " Volt-Var Function"] const VoltVar = 16; #[doc = " Freq-Watt Function"] const
443 FreqWatt = 32; #[doc = " Dynamic Reactive Current Function"] const DynReactCurr = 64;
444 #[doc = " Low-Voltage Trip"] const LvTrip = 128; #[doc = " High-Voltage Trip"] const
445 HvTrip = 256; #[doc = " Watt-Var Function"] const WattVar = 512; #[doc =
446 " Volt-Watt Function"] const VoltWatt = 1024; #[doc = " Scheduling"] const Scheduled
447 = 2048; #[doc = " Low-Frequency Trip"] const LfTrip = 4096; #[doc =
448 " High-Frequency Trip"] const HfTrip = 8192; }
449}
450impl crate::Value for CtrlModes {
451 fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
452 let value = u32::decode(data)?;
453 Ok(Self::from_bits_retain(value))
454 }
455 fn encode(self) -> Box<[u16]> {
456 self.bits().encode()
457 }
458}
459impl crate::FixedSize for CtrlModes {
460 const SIZE: u16 = 2u16;
461 const INVALID: Self = Self::from_bits_retain(4294967295u32);
462 fn is_invalid(&self) -> bool {
463 self.bits() == 4294967295u32
464 }
465}
466bitflags::bitflags! {
467 #[doc = " Intentional Island Categories"] #[doc = " "] #[doc =
468 " Intentional island categories."] #[derive(Copy, Clone, Debug, Eq, PartialEq)]
469 #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub
470 struct IntIslandCatRtg : u16 { #[doc = " Uncategorized"] const Uncategorized = 1;
471 #[doc = " Intentional Island-Capable"] const IntIslCapable = 2; #[doc =
472 " Black Start-Capable"] const BlackStartCapable = 4; #[doc = " Isochronous-Capable"]
473 const IsochCapable = 8; }
474}
475impl crate::Value for IntIslandCatRtg {
476 fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
477 let value = u16::decode(data)?;
478 Ok(Self::from_bits_retain(value))
479 }
480 fn encode(self) -> Box<[u16]> {
481 self.bits().encode()
482 }
483}
484impl crate::FixedSize for IntIslandCatRtg {
485 const SIZE: u16 = 1u16;
486 const INVALID: Self = Self::from_bits_retain(65535u16);
487 fn is_invalid(&self) -> bool {
488 self.bits() == 65535u16
489 }
490}
491bitflags::bitflags! {
492 #[doc = " Intentional Island Categories"] #[doc = " "] #[doc =
493 " Intentional island categories."] #[derive(Copy, Clone, Debug, Eq, PartialEq)]
494 #[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))] pub
495 struct IntIslandCat : u16 { #[doc = " Uncategorized"] const Uncategorized = 1; #[doc
496 = " Intentional Island-Capable"] const IntIslCapable = 2; #[doc =
497 " Black Start-Capable"] const BlackStartCapable = 4; #[doc = " Isochronous-Capable"]
498 const IsochCapable = 8; }
499}
500impl crate::Value for IntIslandCat {
501 fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
502 let value = u16::decode(data)?;
503 Ok(Self::from_bits_retain(value))
504 }
505 fn encode(self) -> Box<[u16]> {
506 self.bits().encode()
507 }
508}
509impl crate::FixedSize for IntIslandCat {
510 const SIZE: u16 = 1u16;
511 const INVALID: Self = Self::from_bits_retain(65535u16);
512 fn is_invalid(&self) -> bool {
513 self.bits() == 65535u16
514 }
515}
516impl crate::Model for DerCapacity {
517 const ID: u16 = 702;
518 fn addr(models: &crate::Models) -> crate::ModelAddr<Self> {
519 models.m702
520 }
521 fn parse(data: &[u16]) -> Result<Self, crate::ParseError<Self>> {
522 let (_, model) = Self::parse_group(data)?;
523 Ok(model)
524 }
525}