PROFINET IO Controller Stack 1.0.0
Modern C++ implementation of a PROFINET IO Controller stack
Loading...
Searching...
No Matches
diagnosis.h
Go to the documentation of this file.
1
23//
24// Note: diagnosis.py's USI/alarm-type enums and alarms.h's USI_*
25// constants name the same values. Both coexist without conflict; the
26// canonical single-source-of-truth for future new code is
27// indices.h/indices.cpp, which was ported after both.
28#pragma once
29
30#include <cstdint>
31#include <optional>
32#include <string>
33#include <vector>
34
35#include "profinet/protocol.h"
36
38{
39
40// =============================================================================
41// ChannelProperties bit-field constants
42// =============================================================================
43
45enum class ChannelType : std::uint8_t
46{
48 Reserved = 0,
50 Specific = 1,
52 All = 2,
54 Submodule = 3,
55};
56
58enum class ChannelAccumulative : std::uint8_t
59{
61 No = 0,
63 MainFault = 1,
66};
67
69enum class ChannelSpecifier : std::uint8_t
70{
72 AllDisappears = 0,
74 Appears = 1,
76 Disappears = 2,
79};
80
82enum class ChannelDirection : std::uint8_t
83{
85 Manufacturer = 0,
87 Input = 1,
89 Output = 2,
91 Bidirectional = 3,
92};
93
96{
98 std::uint16_t raw = 0;
99
102
105
108
111
114
117
121 static ChannelProperties FromUint16(std::uint16_t value);
122
125 [[nodiscard]] std::string ChannelTypeName() const;
126
129 [[nodiscard]] std::string SpecifierName() const;
130
133 [[nodiscard]] std::string DirectionName() const;
134
140 bool operator==(const ChannelProperties&) const = default;
141};
142
143// =============================================================================
144// Error type decoding
145// =============================================================================
146
153std::string DecodeChannelErrorType(std::uint16_t errorType);
154
164std::string DecodeExtChannelErrorType(std::uint16_t channelErrorType, std::uint16_t extErrorType);
165
166// =============================================================================
167// Data Classes
168// =============================================================================
169
173{
175 std::uint32_t api = 0;
176
178 std::uint16_t slot = 0;
179
181 std::uint16_t subslot = 0;
182
184 std::uint16_t channelNumber = 0;
185
188
190 std::uint16_t errorType = 0;
191
193 std::string errorTypeName;
194
197 [[nodiscard]] bool IsSubmoduleLevel() const
198 {
199 return channelNumber == static_cast<std::uint16_t>(Usi::Bit15OfChannelNumber);
200 }
206 bool operator==(const ChannelDiagnosis&) const = default;
207};
208
213{
215 std::uint16_t extErrorType = 0;
216
218 std::string extErrorTypeName;
219
221 std::uint32_t extAddValue = 0;
222};
223
227{
229 std::uint32_t qualifier = 0;
230};
231
237{
239 std::uint16_t usi = 0;
240
245
247 std::optional<ExtChannelDiagnosis> ext;
248
250 std::optional<QualifiedChannelDiagnosis> qualified;
251
254 [[nodiscard]] bool IsChannelDiagnosis() const
255 {
256 return usi == static_cast<std::uint16_t>(Usi::Bit15OfChannelNumber) || usi == 0;
257 }
258
261 [[nodiscard]] bool IsExtChannelDiagnosis() const
262 {
263 return usi == static_cast<std::uint16_t>(Usi::Bit15AndExternalChannelDiagnosisOfChannelNumber);
264 }
265
268 [[nodiscard]] bool IsQualifiedChannelDiagnosis() const
269 {
270 return usi == static_cast<std::uint16_t>(Usi::Bit15AndQualifiedChannelDiagnosisOfChannelNumber);
271 }
277 bool operator==(const AnyChannelDiagnosis&) const = default;
278};
279
282{
284 std::uint32_t api = 0;
285
287 std::uint16_t slot = 0;
288
290 std::uint16_t subslot = 0;
291
293 std::vector<AnyChannelDiagnosis> entries;
294
297
300 [[nodiscard]] bool HasErrors() const
301 {
302 return !entries.empty();
303 }
304
307 [[nodiscard]] bool HasMaintenanceRequired() const
308 {
309 for (const auto& e : entries)
310 {
311 if (e.base.properties.maintenanceRequired)
312 {
313 return true;
314 }
315 }
316 return false;
317 }
318
321 [[nodiscard]] bool HasMaintenanceDemanded() const
322 {
323 for (const auto& e : entries)
324 {
325 if (e.base.properties.naintenanceDemanded)
326 {
327 return true;
328 }
329 }
330 return false;
331 }
332
336 [[nodiscard]] std::vector<const AnyChannelDiagnosis*> GetByChannel(std::uint16_t channel) const
337 {
338 std::vector<const AnyChannelDiagnosis*> result;
339 for (const auto& e : entries)
340 {
341 if (e.base.channelNumber == channel)
342 {
343 result.push_back(&e);
344 }
345 }
346 return result;
347 }
353 bool operator==(const DiagnosisData&) const = default;
354};
355
356// =============================================================================
357// Parsing Functions
358// =============================================================================
359
376DiagnosisData ParseDiagnosisBlock(const Bytes& data, std::uint32_t api = 0, std::uint16_t slot = 0,
377 std::uint16_t subslot = 0);
378
390DiagnosisData ParseDiagnosisSimple(const Bytes& data, std::uint32_t api = 0, std::uint16_t slot = 0,
391 std::uint16_t subslot = 0);
392
393} // namespace profinet::diagnosis
std::string DecodeChannelErrorType(std::uint16_t errorType)
Decode a ChannelErrorType to a human-readable string.
ChannelDirection
Data direction, packed into ChannelProperties bits 11-12.
Definition diagnosis.h:83
@ Manufacturer
Manufacturer-specific direction.
DiagnosisData ParseDiagnosisSimple(const Bytes &data, std::uint32_t api=0, std::uint16_t slot=0, std::uint16_t subslot=0)
Parse a simple, fixed-format diagnosis block.
DiagnosisData ParseDiagnosisBlock(const Bytes &data, std::uint32_t api=0, std::uint16_t slot=0, std::uint16_t subslot=0)
Parse a full DiagnosisData block from raw bytes.
ChannelType
Channel type, packed into ChannelProperties bits 0-1.
Definition diagnosis.h:46
@ All
All channels of the submodule.
@ Submodule
The whole submodule.
@ Specific
A specific, individually addressed channel.
ChannelAccumulative
Accumulative info, packed into ChannelProperties bits 2-4.
Definition diagnosis.h:59
ChannelSpecifier
Diagnosis specifier, packed into ChannelProperties bits 8-10.
Definition diagnosis.h:70
@ Disappears
Diagnosis disappears.
@ AllDisappears
All diagnosis of the submodule disappears.
@ DisappearsOther
Diagnosis disappears but others remain.
std::string DecodeExtChannelErrorType(std::uint16_t channelErrorType, std::uint16_t extErrorType)
Decode an ExtChannelErrorType given its ChannelErrorType context.
@ Bit15AndExternalChannelDiagnosisOfChannelNumber
Check diagnosis is in external channel diagnosis (bit 15 of ChannelNumber + 0x02).
@ Bit15OfChannelNumber
Check diagnosis is accumulative (bit 15 of ChannelNumber).
@ Bit15AndQualifiedChannelDiagnosisOfChannelNumber
Check diagnosis is in qualified channel diagnosis (bit 15 of ChannelNumber + 0x03).
std::vector< std::uint8_t > Bytes
Generic byte buffer alias used throughout the library for raw wire data.
Definition protocol.h:52
PROFINET protocol wire-format structures and serialization helpers.
Any diagnosis entry (USI 0x8000, 0x8002, or 0x8003).
Definition diagnosis.h:237
bool IsExtChannelDiagnosis() const
Whether this is the ExtChannelDiagnosis variant.
Definition diagnosis.h:261
bool IsQualifiedChannelDiagnosis() const
Whether this is the QualifiedChannelDiagnosis variant.
Definition diagnosis.h:268
std::uint16_t usi
The USI that determined which entry type was parsed.
Definition diagnosis.h:239
bool IsChannelDiagnosis() const
Whether this is the plain ChannelDiagnosis variant.
Definition diagnosis.h:254
ChannelDiagnosis base
Common fields, always populated.
Definition diagnosis.h:244
bool operator==(const AnyChannelDiagnosis &) const =default
Compares two AnyChannelDiagnosis for equality.
std::optional< QualifiedChannelDiagnosis > qualified
Qualified fields, populated only for USI 0x8003.
Definition diagnosis.h:250
std::optional< ExtChannelDiagnosis > ext
Extended fields, populated only for USI 0x8002/0x8003.
Definition diagnosis.h:247
ChannelDiagnosis entry (USI 0x8000).
Definition diagnosis.h:173
std::uint16_t subslot
Subslot number.
Definition diagnosis.h:181
std::uint16_t channelNumber
Channel number, with the accumulative bit packed into bit 15.
Definition diagnosis.h:184
std::string errorTypeName
Human-readable name for ErrorType.
Definition diagnosis.h:193
bool operator==(const ChannelDiagnosis &) const =default
Compares two ChannelDiagnosis for equality.
bool IsSubmoduleLevel() const
Whether this diagnosis applies to the whole submodule.
Definition diagnosis.h:197
std::uint16_t slot
Slot number.
Definition diagnosis.h:178
std::uint16_t errorType
Channel error type code.
Definition diagnosis.h:190
ChannelProperties properties
Decoded channel properties.
Definition diagnosis.h:187
std::uint32_t api
API number.
Definition diagnosis.h:175
Parsed ChannelProperties word (16 bits).
Definition diagnosis.h:96
std::string SpecifierName() const
Human-readable name for Specifier.
Definition diagnosis.cpp:62
std::string DirectionName() const
Human-readable name for Direction.
Definition diagnosis.cpp:78
bool maintenanceRequired
Maintenance required flag (bit 5).
Definition diagnosis.h:107
bool naintenanceDemanded
Maintenance demanded flag (bit 6).
Definition diagnosis.h:110
std::string ChannelTypeName() const
Human-readable name for ChannelTypeValue.
Definition diagnosis.cpp:46
ChannelAccumulative accumulative
Accumulative info (bits 2-4).
Definition diagnosis.h:104
ChannelType channelTypeValue
Channel type (bits 0-1).
Definition diagnosis.h:101
ChannelDirection direction
Data direction (bits 11-12).
Definition diagnosis.h:116
ChannelSpecifier specifier
Diagnosis specifier (bits 8-10).
Definition diagnosis.h:113
static ChannelProperties FromUint16(std::uint16_t value)
Decode a raw 16-bit ChannelProperties value.
Definition diagnosis.cpp:19
std::uint16_t raw
Raw 16-bit ChannelProperties value.
Definition diagnosis.h:98
bool operator==(const ChannelProperties &) const =default
Compares two ChannelProperties for equality.
Complete diagnosis data for one slot/subslot.
Definition diagnosis.h:282
bool HasMaintenanceRequired() const
Whether any entry has its maintenance-required flag set.
Definition diagnosis.h:307
bool HasMaintenanceDemanded() const
Whether any entry has its maintenance-demanded flag set.
Definition diagnosis.h:321
std::vector< AnyChannelDiagnosis > entries
Parsed diagnosis entries.
Definition diagnosis.h:293
std::vector< const AnyChannelDiagnosis * > GetByChannel(std::uint16_t channel) const
Find every entry for a specific channel number.
Definition diagnosis.h:336
bool operator==(const DiagnosisData &) const =default
Compares two DiagnosisData for equality.
Bytes rawData
Raw, undecoded source data.
Definition diagnosis.h:296
std::uint32_t api
API number.
Definition diagnosis.h:284
std::uint16_t subslot
Subslot number.
Definition diagnosis.h:290
bool HasErrors() const
Whether any diagnosis entries were found.
Definition diagnosis.h:300
std::uint16_t slot
Slot number.
Definition diagnosis.h:287
ExtChannelDiagnosis entry (USI 0x8002).
Definition diagnosis.h:213
std::uint32_t extAddValue
Extended channel additional value.
Definition diagnosis.h:221
std::string extErrorTypeName
Human-readable name for ExtErrorType.
Definition diagnosis.h:218
std::uint16_t extErrorType
Extended channel error type code.
Definition diagnosis.h:215
QualifiedChannelDiagnosis entry (USI 0x8003).
Definition diagnosis.h:227
std::uint32_t qualifier
Qualifier bitmask providing additional severity/context info.
Definition diagnosis.h:229