Repository navigation
Expand file tree
/
Copy pathIec61850StandardEnumRegistry.cs
More file actions
133 lines (115 loc) · 4.78 KB
/
Copy pathIec61850StandardEnumRegistry.cs
File metadata and controls
133 lines (115 loc) · 4.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
namespace AR.Iec61850.Discovery;
public sealed record Iec61850StandardEnumValue(int Ord, string Symbol);
public sealed record Iec61850StandardEnumDefinition(
string Id,
string Description,
IReadOnlyList<Iec61850StandardEnumValue> Values);
/// <summary>
/// Small IEC 61850-oriented enum registry used when SCL synthesis emits standard status/control
/// values that are transported online as integers but are normally represented in SCL as Enum.
/// The entries are conservative generated engineering enums; they are not vendor-original IDs.
/// </summary>
public static class Iec61850StandardEnumRegistry
{
private static readonly Iec61850StandardEnumDefinition GenericStatus = new(
"ARIEC61850_GenEnumStatusKind",
"Generic enumerated status fallback for live-discovered status objects.",
[
new(0, "unknown"),
new(1, "value1"),
new(2, "value2"),
new(3, "value3"),
new(4, "value4")
]);
private static readonly Iec61850StandardEnumDefinition Behaviour = new(
"ARIEC61850_BehaviourKind",
"IEC 61850 behaviour/mode style enumeration.",
[
new(1, "off"),
new(2, "blocked"),
new(3, "test"),
new(4, "testBlocked"),
new(5, "on")
]);
private static readonly Iec61850StandardEnumDefinition Health = new(
"ARIEC61850_HealthKind",
"IEC 61850 health style enumeration.",
[
new(1, "ok"),
new(2, "warning"),
new(3, "alarm")
]);
private static readonly Iec61850StandardEnumDefinition BreakerOperationCapability = new(
"ARIEC61850_CbOpCapKind",
"Breaker operation capability style enumeration.",
[
new(1, "none"),
new(2, "open"),
new(3, "close"),
new(4, "openClose")
]);
private static readonly Iec61850StandardEnumDefinition ControlModel = new(
"ARIEC61850_CtlModelKind",
"IEC 61850 ctlModel style enumeration.",
[
new(0, "statusOnly"),
new(1, "directWithNormalSecurity"),
new(2, "sboWithNormalSecurity"),
new(3, "directWithEnhancedSecurity"),
new(4, "sboWithEnhancedSecurity")
]);
public static bool RequiresEnumType(string cdc, string attributeName)
=> TryResolve(string.Empty, string.Empty, cdc, attributeName, out _);
public static Iec61850StandardEnumDefinition Resolve(string logicalNodeClass, string dataObjectName, string cdc, string attributeName)
=> TryResolve(logicalNodeClass, dataObjectName, cdc, attributeName, out var definition)
? definition
: GenericStatus;
public static bool TryResolve(string logicalNodeClass, string dataObjectName, string cdc, string attributeName, out Iec61850StandardEnumDefinition definition)
{
definition = default!;
if (string.IsNullOrWhiteSpace(cdc) || string.IsNullOrWhiteSpace(attributeName))
return false;
var cdcValue = cdc.Trim();
var daName = attributeName.Trim();
var doName = dataObjectName?.Trim() ?? string.Empty;
if (daName.Equals("ctlModel", StringComparison.OrdinalIgnoreCase))
{
definition = ControlModel;
return true;
}
if (!daName.Equals("stVal", StringComparison.OrdinalIgnoreCase) &&
!daName.Equals("ctlVal", StringComparison.OrdinalIgnoreCase) &&
!daName.Equals("setVal", StringComparison.OrdinalIgnoreCase))
{
return false;
}
if (doName.Equals("Beh", StringComparison.OrdinalIgnoreCase) ||
doName.Equals("Mod", StringComparison.OrdinalIgnoreCase))
{
definition = Behaviour;
return true;
}
if (doName.Equals("Health", StringComparison.OrdinalIgnoreCase) ||
doName.Equals("PhyHealth", StringComparison.OrdinalIgnoreCase))
{
definition = Health;
return true;
}
if (doName.Equals("CBOpCap", StringComparison.OrdinalIgnoreCase))
{
definition = BreakerOperationCapability;
return true;
}
// ENC/ENS/ENG are explicit enumerated CDC families. Keep a fallback enum when the
// object-specific enum is not known yet. INS is intentionally not fallback-enumerated:
// many INS objects (FltNum, OpCnt, integer counters) must remain INT32.
if (cdcValue.Equals("ENS", StringComparison.OrdinalIgnoreCase) ||
cdcValue.Equals("ENC", StringComparison.OrdinalIgnoreCase) ||
cdcValue.Equals("ENG", StringComparison.OrdinalIgnoreCase))
{
definition = GenericStatus;
return true;
}
return false;
}
}