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
21#pragma once
22
23#include <cstdint>
24#include <optional>
25#include <string>
26#include <vector>
27
28#include "profinet/protocol.h"
29
31{
32
33// =============================================================================
34// ChannelProperties bit-field constants
35// =============================================================================
36
38enum class ChannelType : std::uint8_t
39{
41 Reserved = 0,
43 Specific = 1,
45 All = 2,
47 Submodule = 3,
48};
49
51enum class ChannelAccumulative : std::uint8_t
52{
54 No = 0,
56 MainFault = 1,
59};
60
62enum class ChannelSpecifier : std::uint8_t
63{
65 AllDisappears = 0,
67 Appears = 1,
69 Disappears = 2,
72};
73
75enum class ChannelDirection : std::uint8_t
76{
78 Manufacturer = 0,
80 Input = 1,
82 Output = 2,
84 Bidirectional = 3,
85};
86
89{
91 std::uint16_t raw = 0;
92
95
98
101
104
107
110
114 static ChannelProperties FromUint16(std::uint16_t value);
115
118 [[nodiscard]] std::string ChannelTypeName() const;
119
122 [[nodiscard]] std::string SpecifierName() const;
123
126 [[nodiscard]] std::string DirectionName() const;
127
133 bool operator==(const ChannelProperties&) const = default;
134};
135
136// =============================================================================
137// Error type decoding
138// =============================================================================
139
146std::string DecodeChannelErrorType(std::uint16_t errorType);
147
157std::string DecodeExtChannelErrorType(std::uint16_t channelErrorType, std::uint16_t extErrorType);
158
159// =============================================================================
160// Data Classes
161// =============================================================================
162
166{
168 std::uint32_t api = 0;
169
171 std::uint16_t slot = 0;
172
174 std::uint16_t subslot = 0;
175
177 std::uint16_t channelNumber = 0;
178
181
183 std::uint16_t errorType = 0;
184
186 std::string errorTypeName;
187
190 [[nodiscard]] bool IsSubmoduleLevel() const
191 {
192 return channelNumber == static_cast<std::uint16_t>(Usi::Bit15OfChannelNumber);
193 }
199 bool operator==(const ChannelDiagnosis&) const = default;
200};
201
206{
208 std::uint16_t extErrorType = 0;
209
211 std::string extErrorTypeName;
212
214 std::uint32_t extAddValue = 0;
215};
216
220{
222 std::uint32_t qualifier = 0;
223};
224
230{
233
238
240 std::optional<ExtChannelDiagnosis> ext;
241
243 std::optional<QualifiedChannelDiagnosis> qualified;
244
247 [[nodiscard]] bool IsChannelDiagnosis() const
248 {
250 }
251
254 [[nodiscard]] bool IsExtChannelDiagnosis() const
255 {
257 }
258
261 [[nodiscard]] bool IsQualifiedChannelDiagnosis() const
262 {
264 }
270 bool operator==(const AnyChannelDiagnosis&) const = default;
271};
272
275{
277 std::uint32_t api = 0;
278
280 std::uint16_t slot = 0;
281
283 std::uint16_t subslot = 0;
284
286 std::vector<AnyChannelDiagnosis> entries;
287
290
293 [[nodiscard]] bool HasErrors() const
294 {
295 return !entries.empty();
296 }
297
300 [[nodiscard]] bool HasMaintenanceRequired() const
301 {
302 for (const auto& e : entries)
303 {
304 if (e.base.properties.maintenanceRequired)
305 {
306 return true;
307 }
308 }
309 return false;
310 }
311
314 [[nodiscard]] bool HasMaintenanceDemanded() const
315 {
316 for (const auto& e : entries)
317 {
318 if (e.base.properties.naintenanceDemanded)
319 {
320 return true;
321 }
322 }
323 return false;
324 }
325
329 [[nodiscard]] std::vector<const AnyChannelDiagnosis*> GetByChannel(std::uint16_t channel) const
330 {
331 std::vector<const AnyChannelDiagnosis*> result;
332 for (const auto& e : entries)
333 {
334 if (e.base.channelNumber == channel)
335 {
336 result.push_back(&e);
337 }
338 }
339 return result;
340 }
346 bool operator==(const DiagnosisData&) const = default;
347};
348
349// =============================================================================
350// Parsing Functions
351// =============================================================================
352
368DiagnosisData ParseDiagnosisBlock(const Bytes& data, std::uint32_t api = 0, std::uint16_t slot = 0,
369 std::uint16_t subslot = 0);
370
382DiagnosisData ParseDiagnosisSimple(const Bytes& data, std::uint32_t api = 0, std::uint16_t slot = 0,
383 std::uint16_t subslot = 0);
384
385} // 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:76
@ 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:39
@ 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:52
ChannelSpecifier
Diagnosis specifier, packed into ChannelProperties bits 8-10.
Definition diagnosis.h:63
@ 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.
Usi
PROFINET User Structure Identifiers (USI).
Definition indices.h:526
@ Bit15AndExternalChannelDiagnosisOfChannelNumber
Check diagnosis is in external channel diagnosis (bit 15 of ChannelNumber + 0x02).
@ Bit15OfChannelNumber
Check diagnosis is accumulative (bit 15 of ChannelNumber).
@ NoIdentifier
No identifier.
@ 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:55
PROFINET protocol wire-format structures and serialization helpers.
Any diagnosis entry (USI 0x8000, 0x8002, or 0x8003).
Definition diagnosis.h:230
bool IsExtChannelDiagnosis() const
Whether this is the ExtChannelDiagnosis variant.
Definition diagnosis.h:254
bool IsQualifiedChannelDiagnosis() const
Whether this is the QualifiedChannelDiagnosis variant.
Definition diagnosis.h:261
Usi usi
The USI that determined which entry type was parsed.
Definition diagnosis.h:232
bool IsChannelDiagnosis() const
Whether this is the plain ChannelDiagnosis variant.
Definition diagnosis.h:247
ChannelDiagnosis base
Common fields, always populated.
Definition diagnosis.h:237
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:243
std::optional< ExtChannelDiagnosis > ext
Extended fields, populated only for USI 0x8002/0x8003.
Definition diagnosis.h:240
ChannelDiagnosis entry (USI 0x8000).
Definition diagnosis.h:166
std::uint16_t subslot
Subslot number.
Definition diagnosis.h:174
std::uint16_t channelNumber
Channel number, with the accumulative bit packed into bit 15.
Definition diagnosis.h:177
std::string errorTypeName
Human-readable name for ErrorType.
Definition diagnosis.h:186
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:190
std::uint16_t slot
Slot number.
Definition diagnosis.h:171
std::uint16_t errorType
Channel error type code.
Definition diagnosis.h:183
ChannelProperties properties
Decoded channel properties.
Definition diagnosis.h:180
std::uint32_t api
API number.
Definition diagnosis.h:168
Parsed ChannelProperties word (16 bits).
Definition diagnosis.h:89
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:100
bool naintenanceDemanded
Maintenance demanded flag (bit 6).
Definition diagnosis.h:103
std::string ChannelTypeName() const
Human-readable name for ChannelTypeValue.
Definition diagnosis.cpp:46
ChannelAccumulative accumulative
Accumulative info (bits 2-4).
Definition diagnosis.h:97
ChannelType channelTypeValue
Channel type (bits 0-1).
Definition diagnosis.h:94
ChannelDirection direction
Data direction (bits 11-12).
Definition diagnosis.h:109
ChannelSpecifier specifier
Diagnosis specifier (bits 8-10).
Definition diagnosis.h:106
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:91
bool operator==(const ChannelProperties &) const =default
Compares two ChannelProperties for equality.
Complete diagnosis data for one slot/subslot.
Definition diagnosis.h:275
bool HasMaintenanceRequired() const
Whether any entry has its maintenance-required flag set.
Definition diagnosis.h:300
bool HasMaintenanceDemanded() const
Whether any entry has its maintenance-demanded flag set.
Definition diagnosis.h:314
std::vector< AnyChannelDiagnosis > entries
Parsed diagnosis entries.
Definition diagnosis.h:286
std::vector< const AnyChannelDiagnosis * > GetByChannel(std::uint16_t channel) const
Find every entry for a specific channel number.
Definition diagnosis.h:329
bool operator==(const DiagnosisData &) const =default
Compares two DiagnosisData for equality.
Bytes rawData
Raw, undecoded source data.
Definition diagnosis.h:289
std::uint32_t api
API number.
Definition diagnosis.h:277
std::uint16_t subslot
Subslot number.
Definition diagnosis.h:283
bool HasErrors() const
Whether any diagnosis entries were found.
Definition diagnosis.h:293
std::uint16_t slot
Slot number.
Definition diagnosis.h:280
ExtChannelDiagnosis entry (USI 0x8002).
Definition diagnosis.h:206
std::uint32_t extAddValue
Extended channel additional value.
Definition diagnosis.h:214
std::string extErrorTypeName
Human-readable name for ExtErrorType.
Definition diagnosis.h:211
std::uint16_t extErrorType
Extended channel error type code.
Definition diagnosis.h:208
QualifiedChannelDiagnosis entry (USI 0x8003).
Definition diagnosis.h:220
std::uint32_t qualifier
Qualifier bitmask providing additional severity/context info.
Definition diagnosis.h:222