PROFINET IO Controller Stack 1.0.0
Modern C++ implementation of a PROFINET IO Controller stack
Loading...
Searching...
No Matches
rpc.h
Go to the documentation of this file.
1
20
21#pragma once
22
23#include <array>
24#include <asio.hpp>
25#include <chrono>
26#include <cstdint>
27#include <map>
28#include <optional>
29#include <string>
30#include <vector>
31
32#include "profinet/IRPCCon.h"
33#include "profinet/blocks.h"
34#include "profinet/dcp.h"
35#include "profinet/diagnosis.h"
36#include "profinet/exceptions.h"
37#include "profinet/indices.h"
38#include "profinet/protocol.h"
40#include "profinet/rpcTypes.h"
41#include "profinet/util.h"
42
43namespace profinet::rpc
44{
45
48{
49 std::uint16_t blockType;
50 std::uint16_t blockLength;
51};
52
53inline BlockHeaderView PeekBlockHeader(const Bytes& data, std::size_t offset)
54{
55 return {
56 .blockType = static_cast<std::uint16_t>((data[offset] << OneOctetShift) | data[offset + 1]),
57 .blockLength = static_cast<std::uint16_t>((data[offset + 2] << OneOctetShift) | data[offset + 3])};
58}
59// =============================================================================
60// UUID helpers (DCE/RPC mixed-endian format)
61// =============================================================================
62
66std::string UuidBytesToString(const std::array<std::uint8_t, uuidLenght>& data);
67
72std::array<std::uint8_t, uuidLenght> StringToUuidBytes(const std::string& uuidStr);
73
74// =============================================================================
75// EPM (Endpoint Mapper)
76// =============================================================================
77
80{
82 std::string interfaceUuid;
83
85 std::uint16_t interfaceVersionMajor = 0;
86
88 std::uint16_t interfaceVersionMinor = 0;
89
91 std::string objectUuid;
92
94 std::string protocol;
95
97 std::uint16_t port = 0;
98
100 std::string ipAddress;
101
103 std::string annotation;
104
107 [[nodiscard]] std::string InterfaceName() const;
108};
109
119std::vector<EPMEndpoint> EpmLookup(asio::io_context& ioContext, const std::string& ip, std::uint16_t port = RPC_PORT,
120 double timeoutSec = DEFAULT_TIMEOUT,
121 std::optional<std::string> interfaceFilter = std::nullopt);
122
133 const MacAddress& src,
134 const std::string& name,
135 int timeoutSec = static_cast<int>(DEFAULT_TIMEOUT * 2));
136
137// =============================================================================
138// RPCCon - PROFINET DCE/RPC connection to an IO-Device
139// =============================================================================
149class RPCCon : public IRPCCon
150{
151 public:
153 friend class RpcTest;
154
156 RPCCon(RPCCon&&) = delete;
157
160 RPCCon& operator=(RPCCon&&) = delete;
161
170 explicit RPCCon(const dcp::DCPDeviceDescription& info, RPCConOptions options = {});
171
173 ~RPCCon();
174
176 RPCCon(const RPCCon&) = delete;
177
179 RPCCon& operator=(const RPCCon&) = delete;
180
187 std::optional<ConnectResult> Connect(std::optional<MacAddress> srcMac = std::nullopt,
188 bool withAlarmCr = false,
189 std::optional<IOCRSetup> iocrSetup = std::nullopt) override;
190
198 PNIODHeader Read(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx) override;
199
206 PNIODHeader ReadImplicit(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx) override;
207
214 void Write(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx,
215 const Bytes& data) override;
216
222 std::vector<blocks::WriteMultipleResult> WriteMultiple(const std::vector<WriteItem>& writes) override;
223
229 Bytes ReadRaw(std::uint16_t idx, std::uint16_t slot = 0, std::uint16_t subslot = 1);
230
235 PNInM0 ReadIm0(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
236
241 PNInM1 ReadIm1(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
242
247 PNInM2 ReadIm2(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
248
253 PNInM3 ReadIm3(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
254
259 PNInM4 ReadIm4(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
260
265 PNInM5 ReadIm5(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
266
271 PNInM6 ReadIm6(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
272
277 PNInM7 ReadIm7(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
278
283 PNInM8 ReadIm8(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
284
289 PNInM9 ReadIm9(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
290
295 PNInM10 ReadIm10(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
296
301 PNInM11 ReadIm11(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
302
307 PNInM12 ReadIm12(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
308
313 PNInM13 ReadIm13(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
314
319 PNInM14 ReadIm14(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
320
325 PNInM15 ReadIm15(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
326
331 AllIM ReadAllIm(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
332
333 // =========================================================================
334 // Configuration / diagnosis / topology (built on blocks.h/diagnosis.h)
335 // =========================================================================
336
340
350 diagnosis::DiagnosisData ReadDiagnosis(std::uint16_t slot = 0, std::uint16_t subslot = 0,
351 std::uint16_t index = 0xF000) override;
352
356 std::map<std::uint16_t, diagnosis::DiagnosisData> ReadAllDiagnosis() override;
357
361
365
368 std::vector<blocks::SlotInfo> DiscoverSlots() override;
369
372 std::pair<blocks::PDRealData, blocks::RealIdentificationData> DiscoverTopology() override;
373
381 std::map<std::uint16_t, IndexProbeResult> EnumerateIndices(
382 std::uint16_t slot = 0, std::uint16_t subslot = 1,
383 std::optional<std::vector<std::uint16_t>> customIndices = std::nullopt) override;
384
387 Bytes PrmBegin() override;
388
391 Bytes PrmEnd() override;
392
395 Bytes ReadyForRtClass3() override;
396
402 Bytes ApplicationReady(double timeoutSec = 30.0) override;
403
407 void Disconnect() override;
408
412 void Close() noexcept override;
413
416 [[nodiscard]] bool IsConnected() const override
417 {
418 return live;
419 }
420
423 [[nodiscard]] const dcp::DCPDeviceDescription& Info() const override
424 {
425 return info;
426 }
427
430 [[nodiscard]] const std::array<std::uint8_t, uuidLenght>& ArUuid() const
431 {
432 return arUuid;
433 }
434
437 [[nodiscard]] std::uint16_t SessionKey() const
438 {
439 return sessionKey;
440 }
441
444 [[nodiscard]] std::uint16_t LocalAlarmRef() const override
445 {
446 return alarmRef;
447 }
448
455 [[nodiscard]] int DeviceAlarmRef() const override
456 {
457 return deviceAlarmRef;
458 }
459
462 [[nodiscard]] bool HasAlarmCr() const override
463 {
464 return alarmCrEnabled;
465 }
466
467 [[nodiscard]] asio::io_context& IoContext() override
468 {
469 return ioContext;
470 }
471
472 private:
477 PNRPCHeader CreateRpc(std::uint16_t operation, const Bytes& nrd);
478
482 static PNNRDData CreateNrd(const Bytes& payload);
483
488 [[nodiscard]] Bytes BuildAlarmCrBlock(int transport = 0, int priority = 0) const;
489
493 static int ParseAlarmCrResponse(const Bytes& responseData);
494
500 static Bytes BuildIocrBlock(int iocrType, int iocrReference, const IOCRSetup& setup);
501
505 static Bytes BuildExpectedSubmoduleBlock(const IOCRSetup& setup);
506
508
513 static std::uint16_t ParseIocrResponse(const Bytes& responseData, int iocrType);
514
521 PNRPCHeader SendReceive(const PNRPCHeader& request);
522
524 void CloseSockets() noexcept;
525
527 void CheckTimeout();
528
535 Bytes SendControl(BlockType blockType, ControlCommand controlCommand, bool waitResponse = true,
536 const Bytes& subBlocks = {});
537
540
542 double timeout;
543
545 std::array<std::uint8_t, uuidLenght> arUuid{};
546
548 std::array<std::uint8_t, uuidLenght> activityUuid{};
549
551 std::array<std::uint8_t, uuidLenght> localObjectUuid{};
552
554 std::array<std::uint8_t, uuidLenght> remoteObjectUuid{};
555
557 bool live = false;
558
560 std::chrono::steady_clock::time_point liveMonotonic{};
561
563 std::optional<MacAddress> srcMac;
564
566 std::uint16_t sessionKey = 0;
567
569 // std::uint16_t alarmRef = 1;
570 std::uint16_t alarmRef = 0x8001;
571
574
576 bool alarmCrEnabled = false;
577
579 std::uint32_t sequenceNumber = 0;
580
583
586
589
591 std::uint16_t inputFrameId = 0;
592
594 std::uint16_t outputFrameId = 0;
595
597 std::optional<IOCRSetup> iocrSetup;
598
600 asio::io_context ioContext{};
601
602 std::unique_ptr<RpcTransport> rpcTransport;
603 std::unique_ptr<RpcTransport> ccontrolTransport;
604};
605
606} // namespace profinet::rpc
Interface for PROFINET IO-Device RPC connections.
Declares PROFINET IO connection-management block structures and wire serialization.
A minimal RAII wrapper around a Linux AF_PACKET raw socket bound to an interface.
Definition util.h:196
Parsed PROFINET device information from a DCP response.
Definition dcp.h:426
Abstract interface for a PROFINET RPC connection.
Definition IRPCCon.h:50
Connection to a PROFINET IO-Device: establishes an AR (Application Relationship) and performs acyclic...
Definition rpc.h:150
PNInM13 ReadIm13(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M13 (reserved).
Definition rpc.cpp:2911
PNInM0 ReadIm0(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M0 (mandatory identification data).
Definition rpc.cpp:2859
static std::uint16_t ParseIocrResponse(const Bytes &responseData, int iocrType)
Parse an IOCRBlockRes from a CONNECT response.
Definition rpc.cpp:2519
int DeviceAlarmRef() const override
Device's local alarm reference, from AlarmCRBlockRes.
Definition rpc.h:455
int iocrRefCounter
Counter used to allocate unique IOCR references.
Definition rpc.h:582
std::uint32_t sequenceNumber
Monotonically increasing RPC sequence number.
Definition rpc.h:579
blocks::PDRealData ReadPdRealData() override
Read and parse the device's PDRealData (physical topology).
Definition rpc.cpp:3085
static Bytes BuildUnifiedExpectedSubmoduleBlock(const IOCRSetup &setup)
Definition rpc.cpp:2482
std::array< std::uint8_t, uuidLenght > arUuid
AR UUID for this connection.
Definition rpc.h:545
blocks::ModuleDiffBlock ReadModuleDiff() override
Read and parse the device's ModuleDiffBlock.
Definition rpc.cpp:3016
PNInM2 ReadIm2(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M2 (installation date).
Definition rpc.cpp:2867
RPCCon(RPCCon &&)=delete
Deleted move constructor to prevent moving instances of this class.
asio::io_context & IoContext() override
Returns the underlying Asio I/O context.
Definition rpc.h:467
Bytes BuildAlarmCrBlock(int transport=0, int priority=0) const
Build an AlarmCRBlockReq for inclusion in the CONNECT request.
Definition rpc.cpp:714
static Bytes BuildIocrBlock(int iocrType, int iocrReference, const IOCRSetup &setup)
Build an IOCRBlockReq (header + API object list) for the CONNECT request.
Definition rpc.cpp:1690
double timeout
Default RPC response timeout in seconds.
Definition rpc.h:542
PNInM8 ReadIm8(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M8 (reserved).
Definition rpc.cpp:2891
std::array< std::uint8_t, uuidLenght > localObjectUuid
This controller's own object UUID.
Definition rpc.h:551
~RPCCon()
Disconnect (best-effort) and close the underlying sockets.
Definition rpc.cpp:671
static PNNRDData CreateNrd(const Bytes &payload)
Wrap a payload in an NRD (Network Representation Data) header.
Definition rpc.cpp:702
PNInM4 ReadIm4(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M4 (PROFIsafe signature).
Definition rpc.cpp:2875
PNInM15 ReadIm15(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M15 (reserved).
Definition rpc.cpp:2919
std::uint16_t SessionKey() const
The session key for this connection.
Definition rpc.h:437
bool HasAlarmCr() const override
Whether an AlarmCR was successfully established.
Definition rpc.h:462
AllIM ReadAllIm(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read all I&M records a device supports.
Definition rpc.cpp:2924
std::vector< blocks::SlotInfo > DiscoverSlots() override
Convenience accessor for ReadRealIdentificationData().Slots.
Definition rpc.cpp:3097
friend class RpcTest
FRIEND_CLASS declaration granting access to the specific test case for validating CreateRpc.
Definition rpc.h:153
static int ParseAlarmCrResponse(const Bytes &responseData)
Parse the AlarmCRBlockRes from a CONNECT response.
Definition rpc.cpp:739
Bytes PrmEnd() override
Send PrmEnd (end of the parameterization phase).
Definition rpc.cpp:3230
const dcp::DCPDeviceDescription & Info() const override
The device this connection targets.
Definition rpc.h:423
PNInM6 ReadIm6(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M6 (reserved).
Definition rpc.cpp:2883
static Bytes BuildExpectedSubmoduleBlock(const IOCRSetup &setup)
Build an ExpectedSubmoduleBlockReq for the CONNECT request.
Definition rpc.cpp:2439
Bytes SendControl(BlockType blockType, ControlCommand controlCommand, bool waitResponse=true, const Bytes &subBlocks={})
Send a CONTROL operation and optionally wait for its response.
Definition rpc.cpp:3181
void Disconnect() override
Send Release to terminate the AR.
Definition rpc.cpp:3483
RPCCon(const RPCCon &)=delete
Not copyable because the connection owns non-copyable Asio sockets.
int deviceAlarmRef
Device's local alarm reference, if an AlarmCR was established.
Definition rpc.h:573
PNInM11 ReadIm11(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M11 (reserved).
Definition rpc.cpp:2903
std::pair< blocks::PDRealData, blocks::RealIdentificationData > DiscoverTopology() override
Read both PDRealData and RealIdentificationData in one call.
Definition rpc.cpp:3102
RPCCon & operator=(RPCCon &&)=delete
Deleted move assignment operator to prevent moving instances of this class.
std::array< std::uint8_t, uuidLenght > remoteObjectUuid
The target device's object UUID.
Definition rpc.h:554
dcp::DCPDeviceDescription info
DCP-discovered description of the target device.
Definition rpc.h:539
RPCCon & operator=(const RPCCon &)=delete
Not copyable because the connection owns non-copyable Asio sockets.
std::uint16_t LocalAlarmRef() const override
Controller's own local alarm reference.
Definition rpc.h:444
diagnosis::DiagnosisData ReadDiagnosis(std::uint16_t slot=0, std::uint16_t subslot=0, std::uint16_t index=0xF000) override
Read and parse diagnosis data at the given location/index.
Definition rpc.cpp:3022
asio::io_context ioContext
Asio execution context used by the RPC transport.
Definition rpc.h:600
PNInM14 ReadIm14(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M14 (reserved).
Definition rpc.cpp:2915
void Close() noexcept override
Disconnect() and close the underlying sockets.
Definition rpc.cpp:3521
std::unique_ptr< RpcTransport > rpcTransport
Definition rpc.h:602
PNInM12 ReadIm12(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M12 (reserved).
Definition rpc.cpp:2907
int inputIocrRef
IOCR reference for the input (device -> controller) IOCR.
Definition rpc.h:585
bool IsConnected() const override
Whether the AR is currently established.
Definition rpc.h:416
std::optional< MacAddress > srcMac
Source MAC address used to establish the AR.
Definition rpc.h:563
std::map< std::uint16_t, diagnosis::DiagnosisData > ReadAllDiagnosis() override
Read diagnosis from all standard diagnosis indices.
Definition rpc.cpp:3055
std::map< std::uint16_t, IndexProbeResult > EnumerateIndices(std::uint16_t slot=0, std::uint16_t subslot=1, std::optional< std::vector< std::uint16_t > > customIndices=std::nullopt) override
Probe a set of indices and report which are readable/empty/erroring.
Definition rpc.cpp:3107
bool alarmCrEnabled
Whether an AlarmCR was successfully established.
Definition rpc.h:576
std::chrono::steady_clock::time_point liveMonotonic
Timestamp of the last successful RPC exchange, for CONNECTION_TIMEOUT tracking.
Definition rpc.h:560
void CheckTimeout()
Reconnect if the AR has been idle longer than CONNECTION_TIMEOUT.
Definition rpc.cpp:2600
Bytes PrmBegin() override
Send PrmBegin (start of the parameterization phase).
Definition rpc.cpp:3226
int outputIocrRef
IOCR reference for the output (controller -> device) IOCR.
Definition rpc.h:588
std::uint16_t outputFrameId
Frame ID assigned to the output IOCR.
Definition rpc.h:594
PNInM5 ReadIm5(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M5 (free-text annotation).
Definition rpc.cpp:2879
PNInM9 ReadIm9(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M9 (reserved).
Definition rpc.cpp:2895
std::uint16_t alarmRef
Controller's own local alarm reference.
Definition rpc.h:570
PNInM10 ReadIm10(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M10 (reserved).
Definition rpc.cpp:2899
PNInM3 ReadIm3(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M3 (free-text descriptor).
Definition rpc.cpp:2871
std::uint16_t inputFrameId
Frame ID assigned to the input IOCR.
Definition rpc.h:591
std::unique_ptr< RpcTransport > ccontrolTransport
Definition rpc.h:603
blocks::RealIdentificationData ReadRealIdentificationData() override
Read and parse the device's RealIdentificationData (logical structure).
Definition rpc.cpp:3091
void CloseSockets() noexcept
Close the RPC and CControl UDP sockets.
std::optional< ConnectResult > Connect(std::optional< MacAddress > srcMac=std::nullopt, bool withAlarmCr=false, std::optional< IOCRSetup > iocrSetup=std::nullopt) override
Establish (or re-establish) the AR with the device.
Definition rpc.cpp:2612
PNInM1 ReadIm1(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M1 (tag function/location).
Definition rpc.cpp:2863
PNIODHeader Read(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx) override
Read a data record via slot/subslot/index (AR must be connected).
Definition rpc.cpp:2748
void Write(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx, const Bytes &data) override
Write a data record via slot/subslot/index (AR must be connected).
Definition rpc.cpp:2818
std::uint16_t sessionKey
Session key for this connection.
Definition rpc.h:566
PNRPCHeader CreateRpc(std::uint16_t operation, const Bytes &nrd)
Build an RPC header for the given operation and NRD body.
Definition rpc.cpp:676
Bytes ReadRaw(std::uint16_t idx, std::uint16_t slot=0, std::uint16_t subslot=1)
Read a raw record payload by index (convenience wrapper over Read()).
Definition rpc.cpp:2854
PNRPCHeader SendReceive(const PNRPCHeader &request)
Send an RPC request and synchronously wait for its response.
Definition rpc.cpp:2547
PNInM7 ReadIm7(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M7 (reserved).
Definition rpc.cpp:2887
Bytes ReadyForRtClass3() override
Send ReadyForRTClass3 (isochronous real-time readiness).
Definition rpc.cpp:3234
std::vector< blocks::WriteMultipleResult > WriteMultiple(const std::vector< WriteItem > &writes) override
Write multiple records atomically via IODWriteMultipleReq (0xE040).
Definition rpc.cpp:2968
bool live
Whether the AR is currently established.
Definition rpc.h:557
const std::array< std::uint8_t, uuidLenght > & ArUuid() const
The AR UUID for this connection.
Definition rpc.h:430
PNIODHeader ReadImplicit(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx) override
Read a data record without an established AR.
Definition rpc.cpp:2784
std::optional< IOCRSetup > iocrSetup
Cyclic IO configuration used for the current AR, if any.
Definition rpc.h:597
std::array< std::uint8_t, uuidLenght > activityUuid
Activity UUID for the current RPC exchange.
Definition rpc.h:548
PROFINET DCP discovery and device configuration interface.
PROFINET diagnosis data structures, error decoding, and parsers.
Declares exceptions and error types used by the PROFINET IO controller stack.
PROFINET record-data indices, block types, and protocol enumerations.
std::string UuidBytesToString(const std::array< std::uint8_t, uuidLenght > &data)
Format a 16-byte DCE/RPC UUID as a canonical string.
Definition rpc.cpp:122
constexpr double DEFAULT_TIMEOUT
Default RPC response timeout in seconds.
Definition rpcTypes.h:51
constexpr std::uint16_t RPC_PORT
PROFINET IO RPC port (34964).
Definition rpcTypes.h:27
dcp::DCPDeviceDescription GetStationInfo(const EthernetSocket &sock, const MacAddress &src, const std::string &name, int timeoutSec=static_cast< int >(DEFAULT_TIMEOUT *2))
Resolve a device by PROFINET station name via DCP.
Definition rpc.cpp:588
BlockHeaderView PeekBlockHeader(const Bytes &data, std::size_t offset)
Definition rpc.h:53
std::vector< EPMEndpoint > EpmLookup(asio::io_context &ioContext, const std::string &ip, std::uint16_t port=RPC_PORT, double timeoutSec=DEFAULT_TIMEOUT, std::optional< std::string > interfaceFilter=std::nullopt)
Query a device's Endpoint Mapper for available RPC endpoints.
Definition rpc.cpp:389
std::array< std::uint8_t, uuidLenght > StringToUuidBytes(const std::string &uuidStr)
Parse a canonical UUID string into 16 raw DCE/RPC UUID bytes.
Definition rpc.cpp:159
BlockType
PROFINET block types.
Definition indices.h:91
std::array< std::uint8_t, macAddressLength > MacAddress
A 6-byte Ethernet MAC address.
Definition util.h:67
ControlCommand
PROFINET IOD control command values.
Definition indices.h:60
@ ApplicationReady
Application Ready command.
static constexpr int OneOctetShift
The bit-shift distance required to move data across a single octet.
Definition util.h:50
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.
UDP transport abstraction for PROFINET DCE/RPC.
Shared data types used by the PROFINET DCE/RPC layer.
Bytes payload
Definition rpc.cpp:3254
IOD read/write request/response header (RPC body for READ/WRITE/IMPLICIT_READ).
Definition protocol.h:758
I&M0: mandatory identification data (vendor, order ID, serial number, revisions).
Definition protocol.h:1076
I&M1: user-assigned tag function and location strings.
Definition protocol.h:1178
I&M2: installation date.
Definition protocol.h:1222
I&M3: free-text descriptor.
Definition protocol.h:1263
I&M4: PROFIsafe signature (binary, not text).
Definition protocol.h:1303
I&M5: free-text annotation.
Definition protocol.h:1343
I&M6-I&M15: reserved for future use per IEC 61158-6-10.
Definition protocol.h:1387
NRD (Network Representation Data) wrapper carrying the actual IOD payload.
Definition protocol.h:695
DCE/RPC PDU header used to carry PROFINET connect/read/write/control requests.
Definition protocol.h:465
Parsed ModuleDiffBlock (0x8104).
Definition blocks.h:415
Parsed PDRealData (0xF841) structure.
Definition blocks.h:221
Parsed RealIdentificationData (0xF000/0x0013) structure.
Definition blocks.h:244
Complete diagnosis data for one slot/subslot.
Definition diagnosis.h:282
All I&M records a device supports, read in one call.
Definition rpcTypes.h:227
Generic block header (type + length) used to scan response blocks.
Definition rpc.h:48
std::uint16_t blockType
Definition rpc.h:49
std::uint16_t blockLength
Definition rpc.h:50
One RPC endpoint advertised by a device's Endpoint Mapper.
Definition rpc.h:80
std::string protocol
Transport protocol, e.g. "ncadg_ip_udp".
Definition rpc.h:94
std::uint16_t interfaceVersionMinor
Minor version of the interface.
Definition rpc.h:88
std::string ipAddress
IPv4 address the endpoint listens on.
Definition rpc.h:100
std::uint16_t port
UDP/TCP port the endpoint listens on.
Definition rpc.h:97
std::uint16_t interfaceVersionMajor
Major version of the interface.
Definition rpc.h:85
std::string annotation
Free-text annotation supplied by the device (e.g. a model name).
Definition rpc.h:103
std::string InterfaceName() const
Human-readable interface name.
Definition rpc.cpp:249
std::string objectUuid
Object UUID this endpoint entry is registered under.
Definition rpc.h:91
std::string interfaceUuid
Interface UUID this endpoint serves.
Definition rpc.h:82
Configuration for establishing cyclic IO alongside an AR.
Definition rpcTypes.h:134
Configuration options for an RPC connection.
Definition rpcTypes.h:292
Declares Linux Ethernet, addressing, timing, and utility helpers used by the PROFINET stack.