PROFINET IO Controller Stack 1.0.0
Modern C++ implementation of a PROFINET IO Controller stack
Loading...
Searching...
No Matches
alarms.h
Go to the documentation of this file.
1
10
11#pragma once
12
13#include <cstdint>
14#include <stdexcept>
15#include <string>
16#include <utility>
17#include <variant>
18#include <vector>
19
20#include "profinet/indices.h"
21#include "profinet/protocol.h"
22
23namespace profinet
24{
29{
32
35
38 [[nodiscard]] std::string UsiName() const
39 {
41 }
42};
43
48{
51
53 std::uint16_t channelNumber = 0;
54
56 std::uint16_t channelProperties = 0;
57
59 std::uint16_t channelErrorType = 0;
60
62 std::uint16_t extChannelErrorType = 0;
63
65 std::uint32_t extChannelAddValue = 0;
66
68 std::uint32_t qualifiedChannelQualifier = 0;
69
72 [[nodiscard]] std::string UsiName() const
73 {
75 }
76
79 [[nodiscard]] std::uint16_t ChannelNumberValue() const
80 {
81 return channelNumber & static_cast<uint16_t>(Usi::Bit0till14OfChannelNumber);
82 }
83
86 [[nodiscard]] bool IsAccumulative() const
87 {
88 return (channelNumber & static_cast<uint16_t>(Usi::Bit15OfChannelNumber)) != 0;
89 }
90
93 [[nodiscard]] std::uint8_t ChannelTypeValue() const
94 {
95 return static_cast<std::uint8_t>(channelProperties);
96 }
97
104
107 [[nodiscard]] bool IsQualified() const
108 {
110 }
111};
112
115{
118
121
123 std::uint16_t blockLength = 0;
124
126 std::uint16_t blockVersion = 0;
127
129 std::uint32_t maintenanceStatus = 0;
130
133 [[nodiscard]] std::string UsiName() const
134 {
136 }
137
140 [[nodiscard]] bool MaintenanceRequired() const
141 {
142 return (maintenanceStatus & 0x01) != 0;
143 }
144
147 [[nodiscard]] bool MaintenanceDemanded() const
148 {
149 return (maintenanceStatus & 0x02) != 0;
150 }
151};
152
158{
161
164
166 std::uint16_t blockLength = 0;
167
169 std::uint16_t blockVersion = 0;
170
172 std::uint32_t urRecordIndex = 0;
173
175 std::uint32_t urRecordLength = 0;
176
179 [[nodiscard]] std::string UsiName() const
180 {
182 }
183
186 [[nodiscard]] bool IsUpload() const
187 {
189 }
190
193 [[nodiscard]] bool IsRetrieval() const
194 {
196 }
197};
198
204{
207
209 std::uint16_t blockType = 0;
210
212 std::uint16_t blockLength = 0;
213
215 std::uint16_t blockVersion = 0;
216
218 std::uint32_t iParReqHeader = 0;
219
221 std::uint32_t maxSegmentSize = 0;
222
224 std::uint32_t transferIndex = 0;
225
227 std::uint32_t totalIparSize = 0;
228
231 [[nodiscard]] std::string UsiName() const
232 {
234 }
235};
236
239{
242
245
247 std::uint16_t blockLength = 0;
248
250 std::uint16_t blockVersion = 0;
251
253 std::uint8_t peOperationalMode = 0;
254
257 [[nodiscard]] std::string UsiName() const
258 {
260 }
261
264 [[nodiscard]] std::string ModeName() const
265 {
267 }
268};
269
272{
275
277 std::uint16_t rsAlarmInfo = 0;
278
281 [[nodiscard]] std::string UsiName() const
282 {
284 }
285
288 [[nodiscard]] std::uint16_t RsSpecifier() const
289 {
290 return rsAlarmInfo & static_cast<std::uint16_t>(Usi::Low11BitsOfRsAlarmInfo);
291 }
292
295 [[nodiscard]] std::uint16_t RsSequenceNumber() const
296 {
297 return RsSpecifier();
298 }
299};
300
303{
306
308 std::uint16_t channelNumber = 0;
309
311 std::uint16_t propAlChannelProperties = 0;
312
314 std::uint16_t prAlReason = 0;
315
317 std::uint16_t prAlExtReason = 0;
318
321
324 [[nodiscard]] std::string UsiName() const
325 {
327 }
328};
329
335
339Usi UsiOf(const AlarmItemVariant& item);
340
344std::string UsiNameOf(const AlarmItemVariant& item);
345
352std::pair<AlarmItemVariant, std::size_t> ParseAlarmItem(const Bytes& data, std::size_t offset = 0);
353
356{
359
361 std::pair<std::uint8_t, std::uint8_t> blockVersion{1, 0};
362
365
367 std::uint32_t api = 0;
368
370 std::uint16_t slotNumber = 0;
371
373 std::uint16_t subslotNumber = 0;
374
376 std::uint32_t moduleIdentNumber = 0;
377
379 std::uint32_t submoduleIdentNumber = 0;
380
382 std::uint16_t alarmSequenceNumber = 0;
383
385 bool channelDiagnosis = false;
386
389
392
394 bool arDiagnosisState = false;
395
397 std::vector<AlarmItemVariant> items;
398
401
404 [[nodiscard]] bool IsHighPriority() const
405 {
407 }
408
411 [[nodiscard]] bool IsLowPriority() const
412 {
414 }
415
418 [[nodiscard]] std::string AlarmTypeName() const
419 {
421 }
422
425 [[nodiscard]] std::string Location() const;
426};
427
436AlarmNotification ParseAlarmNotification(const Bytes& data);
437
442enum class AlarmNotificationBitmask : std::uint16_t
443{
445 None = 0x0000,
446
448 AlarmSequenceNumber = 0x07FF,
449
451 ManufacturerSpecific = 0x1000,
452
455
457 ArDiagnosisState = 0x4000, // kan misschien ook 0x8000 zijn
458
460 ChannelDiagnosis = 0x0800
461};
462
463// ============================================================================
464// Enum <-> Enum Bitwise Operators
465// ============================================================================
466
472{
473 return static_cast<AlarmNotificationBitmask>(static_cast<std::uint16_t>(lhs) | static_cast<std::uint16_t>(rhs));
474}
475
481{
482 return static_cast<AlarmNotificationBitmask>(static_cast<std::uint16_t>(lhs) & static_cast<std::uint16_t>(rhs));
483}
484
489constexpr std::uint16_t operator&(std::uint16_t lhs, AlarmNotificationBitmask rhs) noexcept
490{
491 return lhs & static_cast<std::uint16_t>(rhs);
492}
493
498constexpr std::uint16_t operator&(AlarmNotificationBitmask lhs, std::uint16_t rhs) noexcept
499{
500 return static_cast<std::uint16_t>(lhs) & rhs;
501}
502
507constexpr std::uint16_t operator|(std::uint16_t lhs, AlarmNotificationBitmask rhs) noexcept
508{
509 return lhs | static_cast<std::uint16_t>(rhs);
510}
511
516constexpr std::uint16_t operator|(AlarmNotificationBitmask lhs, std::uint16_t rhs) noexcept
517{
518 return static_cast<std::uint16_t>(lhs) | rhs;
519}
520} // namespace profinet
PROFINET record-data indices, block types, and protocol enumerations.
constexpr AlarmNotificationBitmask operator&(AlarmNotificationBitmask lhs, AlarmNotificationBitmask rhs) noexcept
Bitwise AND operator for intersecting two AlarmNotificationBitmask values.
Definition alarms.h:480
BlockType
PROFINET block types.
Definition indices.h:89
@ AlarmNotificationHigh
Alarm notification high block.
@ AlarmNotificationLow
Alarm notification low block.
AlarmNotificationBitmask
Represents bitwise flags and bitmasks for alarm notification headers.
Definition alarms.h:443
@ ManufacturerSpecific
Bit 12: Indicates manufacturer-specific alarm details are present.
@ AlarmSequenceNumber
Bit mask extracting the alarm sequence number (bits 0–10, range 0–2047).
@ SubmoduleDiagnosisState
Bit 13: Indicates submodule diagnosis state is present.
@ ArDiagnosisState
Bit 14: Indicates Application Relation (AR) diagnosis state is present.
@ ChannelDiagnosis
Bit 15: Indicates channel diagnosis details are present.
std::pair< AlarmItemVariant, std::size_t > ParseAlarmItem(const Bytes &data, std::size_t offset=0)
Parse a single alarm item starting at an offset.
Definition alarms.cpp:191
AlarmNotification ParseAlarmNotification(const Bytes &data)
Parse a complete AlarmNotification PDU (BlockHeader + body + items).
Definition alarms.cpp:245
AlarmType
PROFINET Alarm Types used in AlarmNotification blocks.
Definition indices.h:382
std::string GetUsiName(Usi usi)
Get the human-readable name for a User Structure Identifier.
Definition indices.cpp:386
std::string GetPeModeName(std::uint8_t mode)
Get the human-readable name for a PROFIenergy operational mode.
Definition indices.cpp:470
constexpr AlarmNotificationBitmask operator|(AlarmNotificationBitmask lhs, AlarmNotificationBitmask rhs) noexcept
Bitwise OR operator for combining two AlarmNotificationBitmask values.
Definition alarms.h:471
std::string UsiNameOf(const AlarmItemVariant &item)
Get the human-readable USI name for any AlarmItemVariant alternative.
Definition alarms.cpp:19
Usi
PROFINET User Structure Identifiers (USI).
Definition indices.h:526
@ Maintenance
Maintenance item.
@ Bit0till14OfChannelNumber
The channel number (bits 0-14).
@ IParameter
iParameter item.
@ Bit15OfChannelNumber
Check diagnosis is accumulative (bit 15 of ChannelNumber).
@ PralAlarm
PRAL alarm item.
@ Upload
Upload record.
@ NoIdentifier
No identifier.
@ ExtendedChannelDiagnosis
Extended channel diagnosis.
@ PeAlarm
PE alarm item.
@ Low11BitsOfRsAlarmInfo
The low 11 bits of RsAlarmInfo, so the RS specifier can be extracted from RsAlarmInfo.
@ QualifiedChannelDiagnosis
Qualified channel diagnosis.
std::vector< std::uint8_t > Bytes
Generic byte buffer alias used throughout the library for raw wire data.
Definition protocol.h:55
std::string GetAlarmTypeName(AlarmType alarmType)
Get the human-readable name for an alarm type.
Definition indices.cpp:278
Usi UsiOf(const AlarmItemVariant &item)
Get the USI shared by every AlarmItemVariant alternative.
Definition alarms.cpp:13
std::variant< AlarmItem, DiagnosisItem, MaintenanceItem, UploadRetrievalItem, PEAlarmItem, RSAlarmItem, PRALAlarmItem > AlarmItemVariant
A parsed alarm payload item; the held alternative is selected by USI.
Definition alarms.h:334
PROFINET protocol wire-format structures and serialization helpers.
Generic/unknown alarm item.
Definition alarms.h:29
std::string UsiName() const
Human-readable name for this item's USI.
Definition alarms.h:38
Usi userStructureId
User Structure Identifier for this item.
Definition alarms.h:31
Bytes rawData
Raw, undecoded item payload.
Definition alarms.h:34
Complete parsed AlarmNotification PDU: header fields + parsed items.
Definition alarms.h:356
bool manufacturerSpecific
Whether the alarm specifier indicates a manufacturer-specific diagnosis.
Definition alarms.h:388
std::vector< AlarmItemVariant > items
Parsed alarm items carried by this notification.
Definition alarms.h:397
std::uint16_t slotNumber
Slot number where the alarm originated.
Definition alarms.h:370
bool IsLowPriority() const
Whether this is a low-priority notification.
Definition alarms.h:411
std::uint16_t alarmSequenceNumber
Sequence number extracted from the alarm specifier.
Definition alarms.h:382
BlockType blockType
Block type (high or low priority notification).
Definition alarms.h:358
std::uint32_t api
API number.
Definition alarms.h:367
Bytes rawPayload
Raw, undecoded payload the items were parsed from.
Definition alarms.h:400
std::string Location() const
Location string identifying where the alarm originated.
Definition alarms.cpp:240
AlarmType alarmType
Alarm type (Diagnosis/Process/Pull/Plug/...).
Definition alarms.h:364
std::pair< std::uint8_t, std::uint8_t > blockVersion
Block format version.
Definition alarms.h:361
std::uint32_t submoduleIdentNumber
Submodule ident number of the affected submodule.
Definition alarms.h:379
std::uint16_t subslotNumber
Subslot number where the alarm originated.
Definition alarms.h:373
bool IsHighPriority() const
Whether this is a high-priority notification.
Definition alarms.h:404
bool channelDiagnosis
Whether the alarm specifier indicates channel diagnosis is present.
Definition alarms.h:385
std::uint32_t moduleIdentNumber
Module ident number of the affected module.
Definition alarms.h:376
std::string AlarmTypeName() const
Human-readable name for AlarmType.
Definition alarms.h:418
bool arDiagnosisState
Whether the alarm specifier indicates AR diagnosis state.
Definition alarms.h:394
bool submoduleDiagnosisState
Whether the alarm specifier indicates submodule diagnosis state.
Definition alarms.h:391
Diagnosis alarm item.
Definition alarms.h:48
std::uint16_t extChannelErrorType
Extended channel error type code (Ext/Qualified variants only).
Definition alarms.h:62
std::uint16_t channelProperties
Channel properties bitfield (type, direction, specifier, maintenance flags).
Definition alarms.h:56
std::uint16_t ChannelNumberValue() const
Channel number with the accumulative bit masked off.
Definition alarms.h:79
bool IsExtended() const
Whether this is the Ext or Qualified variant.
Definition alarms.h:100
std::uint32_t qualifiedChannelQualifier
Qualifier bitmask (Qualified variant only).
Definition alarms.h:68
Usi userStructureId
User Structure Identifier for this item.
Definition alarms.h:50
bool IsAccumulative() const
Whether this diagnosis is accumulative (bit 15 of ChannelNumber).
Definition alarms.h:86
std::string UsiName() const
Human-readable name for this item's USI.
Definition alarms.h:72
std::uint8_t ChannelTypeValue() const
Channel type extracted from ChannelProperties.
Definition alarms.h:93
std::uint16_t channelNumber
Channel number, with the accumulative bit packed into bit 15.
Definition alarms.h:53
bool IsQualified() const
Whether this is the Qualified variant.
Definition alarms.h:107
std::uint16_t channelErrorType
Channel error type code.
Definition alarms.h:59
std::uint32_t extChannelAddValue
Extended channel additional value (Ext/Qualified variants only).
Definition alarms.h:65
iParameter alarm item (USI 0x8201).
Definition alarms.h:204
std::uint16_t blockVersion
Nested block version.
Definition alarms.h:215
std::uint16_t blockType
Nested block type.
Definition alarms.h:209
Usi userStructureId
User Structure Identifier for this item.
Definition alarms.h:206
std::uint32_t maxSegmentSize
Maximum segment size for the transfer.
Definition alarms.h:221
std::uint16_t blockLength
Nested block length.
Definition alarms.h:212
std::uint32_t totalIparSize
Total iParameter data size in bytes.
Definition alarms.h:227
std::uint32_t iParReqHeader
iParameter request header.
Definition alarms.h:218
std::string UsiName() const
Human-readable name for this item's USI.
Definition alarms.h:231
std::uint32_t transferIndex
Transfer index.
Definition alarms.h:224
Maintenance alarm item (USI 0x8100).
Definition alarms.h:115
std::uint32_t maintenanceStatus
Maintenance status bitmask.
Definition alarms.h:129
std::string UsiName() const
Human-readable name for this item's USI.
Definition alarms.h:133
bool MaintenanceRequired() const
Whether maintenance is required.
Definition alarms.h:140
std::uint16_t blockLength
Nested block length.
Definition alarms.h:123
bool MaintenanceDemanded() const
Whether maintenance is demanded (more urgent than required).
Definition alarms.h:147
BlockType blockType
Nested block type.
Definition alarms.h:120
Usi userStructureId
User Structure Identifier for this item.
Definition alarms.h:117
std::uint16_t blockVersion
Nested block version.
Definition alarms.h:126
PROFIenergy alarm item (USI 0x8310).
Definition alarms.h:239
std::uint8_t peOperationalMode
Current PROFIenergy operational mode.
Definition alarms.h:253
std::string ModeName() const
Human-readable name for PeOperationalMode.
Definition alarms.h:264
Usi userStructureId
User Structure Identifier for this item.
Definition alarms.h:241
std::string UsiName() const
Human-readable name for this item's USI.
Definition alarms.h:257
BlockType blockType
Nested block type.
Definition alarms.h:244
std::uint16_t blockLength
Nested block length.
Definition alarms.h:247
std::uint16_t blockVersion
Nested block version.
Definition alarms.h:250
Pull Request Alarm item (USI 0x8320).
Definition alarms.h:303
std::uint16_t channelNumber
Channel number.
Definition alarms.h:308
std::string UsiName() const
Human-readable name for this item's USI.
Definition alarms.h:324
std::uint16_t prAlExtReason
Extended pull-request reason code.
Definition alarms.h:317
std::uint16_t prAlReason
Pull-request reason code.
Definition alarms.h:314
Bytes prAlReasonAddValue
Additional reason-specific data.
Definition alarms.h:320
std::uint16_t propAlChannelProperties
Channel properties bitfield.
Definition alarms.h:311
Usi userStructureId
User Structure Identifier for this item.
Definition alarms.h:305
Reporting System alarm item (USI 0x8300-0x8302).
Definition alarms.h:272
std::string UsiName() const
Human-readable name for this item's USI.
Definition alarms.h:281
std::uint16_t RsSequenceNumber() const
RS sequence number (alias for RsSpecifier()).
Definition alarms.h:295
std::uint16_t RsSpecifier() const
RS specifier extracted from RsAlarmInfo.
Definition alarms.h:288
std::uint16_t rsAlarmInfo
RS alarm info bitfield.
Definition alarms.h:277
Usi userStructureId
User Structure Identifier for this item.
Definition alarms.h:274
Upload/Retrieval alarm item (USI 0x8200, 0x8201).
Definition alarms.h:158
std::string UsiName() const
Human-readable name for this item's USI.
Definition alarms.h:179
std::uint32_t urRecordIndex
Record index the upload/retrieval refers to.
Definition alarms.h:172
bool IsUpload() const
Whether this is an upload record.
Definition alarms.h:186
BlockType blockType
Nested block type.
Definition alarms.h:163
bool IsRetrieval() const
Whether this is an iParameter retrieval record.
Definition alarms.h:193
std::uint32_t urRecordLength
Record length in bytes.
Definition alarms.h:175
Usi userStructureId
User Structure Identifier for this item.
Definition alarms.h:160
std::uint16_t blockLength
Nested block length.
Definition alarms.h:166
std::uint16_t blockVersion
Nested block version.
Definition alarms.h:169