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
13
14#pragma once
15
16#include <array>
17#include <asio.hpp>
18#include <chrono>
19#include <cstdint>
20#include <map>
21#include <optional>
22#include <string>
23#include <vector>
24
26#include "profinet/IRPCCon.h"
27#include "profinet/blocks.h"
28#include "profinet/dcp.h"
29#include "profinet/diagnosis.h"
30#include "profinet/exceptions.h"
31#include "profinet/indices.h"
32#include "profinet/protocol.h"
34#include "profinet/rpcTypes.h"
35#include "profinet/util.h"
36
37namespace profinet::rpc
38{
39// NOLINTBEGIN(readability-identifier-naming)
40// RPC blocks
42inline constexpr std::uint8_t VERSION_HIGH = 0x01;
44inline constexpr std::uint8_t VERSION_LOW = 0x00;
45// NOLINTEND(readability-identifier-naming)
46
49{
50 std::uint16_t blockType;
51 std::uint16_t blockLength;
52};
53
54inline BlockHeaderView PeekBlockHeader(const Bytes& data, std::size_t offset)
55{
56 wire::Reader r(data);
57 r.SkipTo(offset);
58 return {
59 .blockType = r.U16(),
60 .blockLength = r.U16()};
61}
62// =============================================================================
63// UUID helpers (DCE/RPC mixed-endian format)
64// =============================================================================
85std::array<std::uint8_t, uuidLenght> BuildObjectUuid(
86 std::uint8_t b10, std::uint8_t b11, std::uint8_t b12,
87 std::uint8_t b13, std::uint8_t b14, std::uint8_t b15);
88
92std::string UuidBytesToString(const std::array<std::uint8_t, uuidLenght>& data);
93
98std::array<std::uint8_t, uuidLenght> StringToUuidBytes(const std::string& uuidStr);
99
100// =============================================================================
101// EPM (Endpoint Mapper)
102// =============================================================================
109std::optional<EPMEndpoint> ParseEpmTower(const Bytes& towerData);
110
121 const MacAddress& src,
122 const std::string& name,
123 double timeoutSec = DEFAULT_TIMEOUT * 2);
124
125// =============================================================================
126// RPCCon - PROFINET DCE/RPC connection to an IO-Device
127// =============================================================================
137class RPCCon : public IRPCCon
138{
139 public:
141 friend class RpcTests;
142
144 RPCCon(RPCCon&&) = delete;
145
148 RPCCon& operator=(RPCCon&&) = delete;
149
160 explicit RPCCon(const dcp::DCPDeviceDescription& info, RPCConOptions options = {},
161 std::unique_ptr<IRpcTransport> rpcTransport = nullptr,
162 std::unique_ptr<IRpcTransport> ccontrolTransport = nullptr,
163 asio::io_context* context = nullptr);
164
166 ~RPCCon();
167
169 RPCCon(const RPCCon&) = delete;
170
172 RPCCon& operator=(const RPCCon&) = delete;
173
180 std::optional<ConnectResult> Connect(std::optional<MacAddress> srcMac = std::nullopt,
181 bool withAlarmCr = false,
182 std::optional<IOCRSetup> iocrSetup = std::nullopt) override;
183
191 PNIODHeader Read(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx) override;
192
199 PNIODHeader ReadImplicit(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx) override;
200
207 void Write(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx,
208 const Bytes& data) override;
209
215 std::vector<blocks::WriteMultipleResult> WriteMultiple(const std::vector<WriteItem>& writes) override;
216
222 Bytes ReadRaw(std::uint16_t idx, std::uint16_t slot = 0, std::uint16_t subslot = 1);
223
228 PNInM0 ReadIm0(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
229
234 PNInM1 ReadIm1(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
235
240 PNInM2 ReadIm2(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
241
246 PNInM3 ReadIm3(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
247
252 PNInM4 ReadIm4(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
253
258 PNInM5 ReadIm5(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
259
264 PNInM6 ReadIm6(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
265
270 PNInM7 ReadIm7(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
271
276 PNInM8 ReadIm8(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
277
282 PNInM9 ReadIm9(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
283
288 PNInM10 ReadIm10(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
289
294 PNInM11 ReadIm11(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
295
300 PNInM12 ReadIm12(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
301
306 PNInM13 ReadIm13(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
307
312 PNInM14 ReadIm14(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
313
318 PNInM15 ReadIm15(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
319
324 AllIM ReadAllIm(std::uint16_t slot = 0, std::uint16_t subslot = 1) override;
325
326 // =========================================================================
327 // Configuration / diagnosis / topology (built on blocks.h/diagnosis.h)
328 // =========================================================================
329
333
342 diagnosis::DiagnosisData ReadDiagnosis(std::uint16_t slot = 0, std::uint16_t subslot = 0,
343 std::uint16_t index = 0xF000) override;
344
348 std::map<std::uint16_t, diagnosis::DiagnosisData> ReadAllDiagnosis() override;
349
353
357
360 std::vector<blocks::SlotInfo> DiscoverSlots() override;
361
364 std::pair<blocks::PDRealData, blocks::RealIdentificationData> DiscoverTopology() override;
365
373 std::map<std::uint16_t, IndexProbeResult> EnumerateIndices(
374 std::uint16_t slot = 0, std::uint16_t subslot = 1,
375 std::optional<std::vector<std::uint16_t>> customIndices = std::nullopt) override;
376
379 Bytes PrmBegin() override;
380
383 Bytes PrmEnd() override;
384
387 Bytes ReadyForRtClass3() override;
388
394 Bytes ApplicationReady(double timeoutSec = 30.0) override;
395
399 void Disconnect() override;
400
403 void Close() noexcept override;
404
407 [[nodiscard]] bool IsConnected() const override
408 {
409 return live;
410 }
411
414 [[nodiscard]] const dcp::DCPDeviceDescription& Info() const override
415 {
416 return info;
417 }
418
421 [[nodiscard]] const std::array<std::uint8_t, uuidLenght>& ArUuid() const
422 {
423 return arUuid;
424 }
425
428 [[nodiscard]] std::uint16_t SessionKey() const
429 {
430 return sessionKey;
431 }
432
435 [[nodiscard]] std::uint16_t LocalAlarmRef() const override
436 {
437 return alarmRef;
438 }
439
446 [[nodiscard]] int DeviceAlarmRef() const override
447 {
448 return deviceAlarmRef;
449 }
450
453 [[nodiscard]] bool HasAlarmCr() const override
454 {
455 return alarmCrEnabled;
456 }
457
466 std::vector<EPMEndpoint> EpmLookup(const std::string& ip, std::uint16_t port = RPC_PORT,
467 double timeoutSec = DEFAULT_TIMEOUT,
468 std::optional<std::string> interfaceFilter = std::nullopt) override;
469
470 private:
475 PNRPCHeader CreateRpc(std::uint16_t operation, const Bytes& nrd);
476
480 static PNNRDData CreateNrd(const Bytes& payload);
481
486 [[nodiscard]] Bytes BuildAlarmCrBlock(int transport = 0, int priority = 0) const;
487
491 static int ParseAlarmCrResponse(const Bytes& responseData);
492
497 static Bytes BuildIocrBlock(IocrType iocrType, const IOCRSetup& setup);
498
502 static Bytes BuildExpectedSubmoduleBlock(const IOCRSetup& setup);
503
508 static std::uint16_t ParseIocrResponse(const Bytes& responseData, int iocrType);
509
516 PNRPCHeader SendReceive(const PNRPCHeader& request);
517
519 void CloseSockets() noexcept;
520
522 void CheckTimeout();
523
530 Bytes SendControl(BlockType blockType, ControlCommand controlCommand, bool waitResponse = true,
531 const Bytes& subBlocks = {});
532
535
537 double timeout;
538
540 std::array<std::uint8_t, 3> dataRepresentation{0x00, 0x00, 0x00};
541
543 std::array<std::uint8_t, uuidLenght> arUuid{};
544
546 std::array<std::uint8_t, uuidLenght> activityUuid{};
547
549 std::array<std::uint8_t, uuidLenght> interfaceUuid{};
550
552 std::array<std::uint8_t, uuidLenght> localObjectUuid{};
553
555 std::array<std::uint8_t, uuidLenght> remoteObjectUuid{};
556
558 bool live = false;
559
561 bool reconnecting = false;
562
564 std::chrono::steady_clock::time_point liveMonotonic{};
565
567 std::optional<MacAddress> srcMac;
568
570 std::uint16_t sessionKey = 0;
571
573 // std::uint16_t alarmRef = 1;
574 std::uint16_t alarmRef = 0x8001;
575
578
580 bool alarmCrEnabled = false;
581
583 std::uint32_t sequenceNumber = 0;
584
587
590
592 std::uint16_t inputFrameId = 0;
593
595 std::uint16_t outputFrameId = 0;
596
598 std::optional<IOCRSetup> iocrSetup;
599
600 std::unique_ptr<asio::io_context> rpcContext;
601 std::unique_ptr<IAsioIoContextRunner> rpcContextRunner;
603 asio::io_context& ioContext;
604
605 std::unique_ptr<IRpcTransport> rpcTransport;
606 std::unique_ptr<IRpcTransport> ccontrolTransport;
607 std::unique_ptr<IRpcTransport> ccontrolResponseTransport;
608};
609
610} // namespace profinet::rpc
Runs an Asio I/O context on a dedicated worker thread.
Interface for PROFINET IO-Device RPC connections.
Declares PROFINET IO connection-management block structures and wire serialization.
Abstract interface for raw Ethernet frame transport.
Parsed PROFINET device information from a DCP response.
Definition dcp.h:268
Abstract interface for a PROFINET RPC connection.
Definition IRPCCon.h:81
Connection to a PROFINET IO-Device: establishes an AR (Application Relationship) and performs acyclic...
Definition rpc.h:138
PNInM13 ReadIm13(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M13 (reserved).
Definition rpc.cpp:1527
PNInM0 ReadIm0(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M0 (mandatory identification data).
Definition rpc.cpp:1475
std::unique_ptr< IRpcTransport > ccontrolResponseTransport
Definition rpc.h:607
static std::uint16_t ParseIocrResponse(const Bytes &responseData, int iocrType)
Parse an IOCRBlockRes from a CONNECT response.
Definition rpc.cpp:1132
int DeviceAlarmRef() const override
Device's local alarm reference, from AlarmCRBlockRes.
Definition rpc.h:446
std::uint32_t sequenceNumber
Monotonically increasing RPC sequence number.
Definition rpc.h:583
blocks::PDRealData ReadPdRealData() override
Read and parse the device's PDRealData (physical topology).
Definition rpc.cpp:1701
std::array< std::uint8_t, uuidLenght > arUuid
AR UUID for this connection.
Definition rpc.h:543
blocks::ModuleDiffBlock ReadModuleDiff() override
Read and parse the device's ModuleDiffBlock.
Definition rpc.cpp:1632
PNInM2 ReadIm2(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M2 (installation date).
Definition rpc.cpp:1483
RPCCon(RPCCon &&)=delete
Deleted move constructor to prevent moving instances of this class.
Bytes BuildAlarmCrBlock(int transport=0, int priority=0) const
Build an AlarmCRBlockReq for inclusion in the CONNECT request.
Definition rpc.cpp:653
double timeout
Default RPC response timeout in seconds.
Definition rpc.h:537
PNInM8 ReadIm8(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M8 (reserved).
Definition rpc.cpp:1507
std::array< std::uint8_t, uuidLenght > localObjectUuid
This controller's own object UUID.
Definition rpc.h:552
~RPCCon()
Disconnect (best-effort) and close the underlying sockets.
Definition rpc.cpp:610
static PNNRDData CreateNrd(const Bytes &payload)
Wrap a payload in an NRD (Network Representation Data) header.
Definition rpc.cpp:641
PNInM4 ReadIm4(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M4 (PROFIsafe signature).
Definition rpc.cpp:1491
PNInM15 ReadIm15(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M15 (reserved).
Definition rpc.cpp:1535
std::uint16_t SessionKey() const
The session key for this connection.
Definition rpc.h:428
bool HasAlarmCr() const override
Whether an AlarmCR was successfully established.
Definition rpc.h:453
AllIM ReadAllIm(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read all I&M records a device supports.
Definition rpc.cpp:1540
std::vector< blocks::SlotInfo > DiscoverSlots() override
Convenience accessor for ReadRealIdentificationData().Slots.
Definition rpc.cpp:1713
static int ParseAlarmCrResponse(const Bytes &responseData)
Parse the AlarmCRBlockRes from a CONNECT response.
Definition rpc.cpp:679
Bytes PrmEnd() override
Send PrmEnd (end of the parameterization phase).
Definition rpc.cpp:1847
const dcp::DCPDeviceDescription & Info() const override
The device this connection targets.
Definition rpc.h:414
PNInM6 ReadIm6(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M6 (reserved).
Definition rpc.cpp:1499
static Bytes BuildExpectedSubmoduleBlock(const IOCRSetup &setup)
Build an ExpectedSubmoduleBlockReq for the CONNECT request.
Definition rpc.cpp:1079
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:1797
void Disconnect() override
Send Release to terminate the AR.
Definition rpc.cpp:2101
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:577
std::vector< EPMEndpoint > EpmLookup(const std::string &ip, std::uint16_t port=RPC_PORT, double timeoutSec=DEFAULT_TIMEOUT, std::optional< std::string > interfaceFilter=std::nullopt) override
Query a device's Endpoint Mapper for available RPC endpoints.
Definition rpc.cpp:330
std::unique_ptr< asio::io_context > rpcContext
Definition rpc.h:600
PNInM11 ReadIm11(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M11 (reserved).
Definition rpc.cpp:1519
std::pair< blocks::PDRealData, blocks::RealIdentificationData > DiscoverTopology() override
Read both PDRealData and RealIdentificationData in one call.
Definition rpc.cpp:1718
std::unique_ptr< IAsioIoContextRunner > rpcContextRunner
Definition rpc.h:601
std::array< std::uint8_t, 3 > dataRepresentation
AR DREP for this connection.
Definition rpc.h:540
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:555
dcp::DCPDeviceDescription info
DCP-discovered description of the target device.
Definition rpc.h:534
bool reconnecting
Whether timeout has occured and reconnection is needed.
Definition rpc.h:561
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:435
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:1638
PNInM14 ReadIm14(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M14 (reserved).
Definition rpc.cpp:1531
void Close() noexcept override
Disconnect() and close the underlying sockets.
Definition rpc.cpp:2139
PNInM12 ReadIm12(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M12 (reserved).
Definition rpc.cpp:1523
int inputIocrRef
IOCR reference for the input (device -> controller) IOCR.
Definition rpc.h:586
bool IsConnected() const override
Whether the AR is currently established.
Definition rpc.h:407
std::optional< MacAddress > srcMac
Source MAC address used to establish the AR.
Definition rpc.h:567
std::map< std::uint16_t, diagnosis::DiagnosisData > ReadAllDiagnosis() override
Read diagnosis from all standard diagnosis indices.
Definition rpc.cpp:1671
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:1723
static Bytes BuildIocrBlock(IocrType iocrType, const IOCRSetup &setup)
Build an IOCRBlockReq (header + API object list) for the CONNECT request.
Definition rpc.cpp:703
bool alarmCrEnabled
Whether an AlarmCR was successfully established.
Definition rpc.h:580
std::chrono::steady_clock::time_point liveMonotonic
Timestamp of the last successful RPC exchange, for CONNECTION_TIMEOUT tracking.
Definition rpc.h:564
void CheckTimeout()
Reconnect if the AR has been idle longer than CONNECTION_TIMEOUT.
Definition rpc.cpp:1210
Bytes PrmBegin() override
Send PrmBegin (start of the parameterization phase).
Definition rpc.cpp:1843
int outputIocrRef
IOCR reference for the output (controller -> device) IOCR.
Definition rpc.h:589
std::uint16_t outputFrameId
Frame ID assigned to the output IOCR.
Definition rpc.h:595
PNInM5 ReadIm5(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M5 (free-text annotation).
Definition rpc.cpp:1495
PNInM9 ReadIm9(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M9 (reserved).
Definition rpc.cpp:1511
std::unique_ptr< IRpcTransport > rpcTransport
Definition rpc.h:605
std::uint16_t alarmRef
Controller's own local alarm reference.
Definition rpc.h:574
std::array< std::uint8_t, uuidLenght > interfaceUuid
Interface UUID for the current RPC exchange.
Definition rpc.h:549
PNInM10 ReadIm10(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M10 (reserved).
Definition rpc.cpp:1515
PNInM3 ReadIm3(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M3 (free-text descriptor).
Definition rpc.cpp:1487
asio::io_context & ioContext
Asio execution context used by the RPC transport.
Definition rpc.h:603
std::uint16_t inputFrameId
Frame ID assigned to the input IOCR.
Definition rpc.h:592
blocks::RealIdentificationData ReadRealIdentificationData() override
Read and parse the device's RealIdentificationData (logical structure).
Definition rpc.cpp:1707
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:1223
PNInM1 ReadIm1(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M1 (tag function/location).
Definition rpc.cpp:1479
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:1364
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:1434
std::uint16_t sessionKey
Session key for this connection.
Definition rpc.h:570
PNRPCHeader CreateRpc(std::uint16_t operation, const Bytes &nrd)
Build an RPC header for the given operation and NRD body.
Definition rpc.cpp:615
std::unique_ptr< IRpcTransport > ccontrolTransport
Definition rpc.h:606
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:1470
PNRPCHeader SendReceive(const PNRPCHeader &request)
Send an RPC request and synchronously wait for its response.
Definition rpc.cpp:1160
PNInM7 ReadIm7(std::uint16_t slot=0, std::uint16_t subslot=1) override
Read I&M7 (reserved).
Definition rpc.cpp:1503
Bytes ReadyForRtClass3() override
Send ReadyForRTClass3 (isochronous real-time readiness).
Definition rpc.cpp:1851
std::vector< blocks::WriteMultipleResult > WriteMultiple(const std::vector< WriteItem > &writes) override
Write multiple records atomically via IODWriteMultipleReq (0xE040).
Definition rpc.cpp:1584
bool live
Whether the AR is currently established.
Definition rpc.h:558
const std::array< std::uint8_t, uuidLenght > & ArUuid() const
The AR UUID for this connection.
Definition rpc.h:421
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:1400
std::optional< IOCRSetup > iocrSetup
Cyclic IO configuration used for the current AR, if any.
Definition rpc.h:598
std::array< std::uint8_t, uuidLenght > activityUuid
Activity UUID for the current RPC exchange.
Definition rpc.h:546
Lightweight cursor for parsing a big-endian byte buffer without copies.
Definition wire.h:192
void SkipTo(std::size_t offset)
Move the read position to an absolute byte offset.
Definition wire.h:343
std::uint16_t U16()
Read and consume a big-endian 16-bit value.
Definition wire.h:258
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::array< std::uint8_t, uuidLenght > BuildObjectUuid(std::uint8_t b10, std::uint8_t b11, std::uint8_t b12, std::uint8_t b13, std::uint8_t b14, std::uint8_t b15)
Builds a PROFINET object UUID.
Definition rpc.cpp:56
constexpr std::uint8_t VERSION_HIGH
Version high.
Definition rpc.h:42
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:106
dcp::DCPDeviceDescription GetStationInfo(IRawEthernetSocket &sock, const MacAddress &src, const std::string &name, double timeoutSec=DEFAULT_TIMEOUT *2)
Resolve a device by PROFINET station name via DCP.
Definition rpc.cpp:509
constexpr double DEFAULT_TIMEOUT
Default RPC response timeout in seconds.
Definition rpcTypes.h:56
constexpr std::uint16_t RPC_PORT
PROFINET IO RPC port (34964).
Definition rpcTypes.h:28
std::optional< EPMEndpoint > ParseEpmTower(const Bytes &towerData)
Parses a DCE/RPC EPM tower into a PROFINET endpoint.
Definition rpc.cpp:239
BlockHeaderView PeekBlockHeader(const Bytes &data, std::size_t offset)
Definition rpc.h:54
constexpr std::uint8_t VERSION_LOW
Version low.
Definition rpc.h:44
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:126
BlockType
PROFINET block types.
Definition indices.h:89
std::array< std::uint8_t, macAddressLength > MacAddress
A 6-byte Ethernet MAC address.
Definition util.h:48
IocrType
PROFINET IOCR types.
Definition indices.h:463
ControlCommand
PROFINET IOD control command values.
Definition indices.h:61
@ ApplicationReady
Application Ready command.
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.
UDP transport abstraction for PROFINET DCE/RPC.
Shared data types used by the PROFINET DCE/RPC layer.
IOD read/write request/response header (RPC body for READ/WRITE/IMPLICIT_READ).
Definition protocol.h:1190
I&M0: mandatory identification data (vendor, order ID, serial number, revisions).
Definition protocol.h:1517
I&M1: user-assigned tag function and location strings.
Definition protocol.h:1624
I&M2: installation date.
Definition protocol.h:1668
I&M3: free-text descriptor.
Definition protocol.h:1709
I&M4: PROFIsafe signature (binary, not text).
Definition protocol.h:1749
I&M5: free-text annotation.
Definition protocol.h:1789
I&M6-I&M15: reserved for future use per IEC 61158-6-10.
Definition protocol.h:1833
NRD (Network Representation Data) wrapper carrying the actual IOD payload.
Definition protocol.h:1128
DCE/RPC PDU header used to carry PROFINET connect/read/write/control requests.
Definition protocol.h:860
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:275
All I&M records a device supports, read in one call.
Definition rpcTypes.h:451
Generic block header (type + length) used to scan response blocks.
Definition rpc.h:49
std::uint16_t blockType
Definition rpc.h:50
std::uint16_t blockLength
Definition rpc.h:51
Configuration for establishing cyclic IO alongside an AR.
Definition rpcTypes.h:149
Configuration options for an RPC connection.
Definition rpcTypes.h:516
Bytes payload
Definition test_dcp.cpp:392
Declares Linux Ethernet, addressing, timing, and utility helpers used by the PROFINET stack.