PROFINET IO Controller Stack 1.0.0
Modern C++ implementation of a PROFINET IO Controller stack
Loading...
Searching...
No Matches
IRPCCon.h
Go to the documentation of this file.
1
12
13#pragma once
14
15#include <asio/io_context.hpp>
16#include <cstdint>
17#include <map>
18#include <optional>
19#include <string>
20#include <vector>
21
22#include "profinet/blocks.h"
23#include "profinet/cyclic.h"
24#include "profinet/dcp.h"
25#include "profinet/diagnosis.h"
26#include "profinet/protocol.h"
27#include "profinet/rpcTypes.h"
28#include "profinet/util.h"
29
31{
34{
36 std::string interfaceUuid;
37
39 std::uint16_t interfaceVersionMajor = 0;
40
42 std::uint16_t interfaceVersionMinor = 0;
43
45 std::string objectUuid;
46
48 std::string protocol;
49
51 std::uint16_t port = 0;
52
54 std::string ipAddress;
55
57 std::string annotation;
58
61 [[nodiscard]] std::string InterfaceName() const;
62};
63
81{
82 public:
88 virtual ~IRPCCon() = default;
89
101 virtual std::optional<ConnectResult> Connect(std::optional<MacAddress> srcMac = std::nullopt, bool withAlarmCr = false, std::optional<IOCRSetup> iocrSetup = std::nullopt) = 0;
102
108 virtual void Disconnect() = 0;
109
115 virtual void Close() noexcept = 0;
116
121 [[nodiscard]] virtual bool IsConnected() const = 0;
122
134 virtual PNIODHeader Read(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx) = 0;
135
147 virtual PNIODHeader ReadImplicit(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx) = 0;
148
159 virtual void Write(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx, const Bytes& data) = 0;
160
169 virtual std::vector<blocks::WriteMultipleResult> WriteMultiple(const std::vector<WriteItem>& writes) = 0;
170
177 virtual PNInM0 ReadIm0(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
178
185 virtual PNInM1 ReadIm1(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
186
193 virtual PNInM2 ReadIm2(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
194
201 virtual PNInM3 ReadIm3(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
202
209 virtual PNInM4 ReadIm4(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
210
217 virtual PNInM5 ReadIm5(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
218
225 virtual PNInM6 ReadIm6(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
226
233 virtual PNInM7 ReadIm7(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
234
241 virtual PNInM8 ReadIm8(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
242
249 virtual PNInM9 ReadIm9(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
250
257 virtual PNInM10 ReadIm10(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
258
265 virtual PNInM11 ReadIm11(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
266
273 virtual PNInM12 ReadIm12(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
274
281 virtual PNInM13 ReadIm13(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
282
289 virtual PNInM14 ReadIm14(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
290
297 virtual PNInM15 ReadIm15(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
298
305 virtual AllIM ReadAllIm(std::uint16_t slot = 0, std::uint16_t subslot = 1) = 0;
306
310 virtual blocks::ModuleDiffBlock ReadModuleDiff() = 0;
311
319 virtual diagnosis::DiagnosisData ReadDiagnosis(std::uint16_t slot = 0, std::uint16_t subslot = 0, std::uint16_t index = 0xF000) = 0;
320
324 virtual std::map<std::uint16_t, diagnosis::DiagnosisData> ReadAllDiagnosis() = 0;
325
329 virtual blocks::PDRealData ReadPdRealData() = 0;
330
335
339 virtual std::vector<blocks::SlotInfo> DiscoverSlots() = 0;
340
344 virtual std::pair<blocks::PDRealData, blocks::RealIdentificationData> DiscoverTopology() = 0;
345
353 virtual std::map<std::uint16_t, IndexProbeResult> EnumerateIndices(std::uint16_t slot = 0,
354 std::uint16_t subslot = 1,
355 std::optional<std::vector<std::uint16_t>> customIndices = std::nullopt) = 0;
356
360 virtual Bytes PrmBegin() = 0;
361
365 virtual Bytes PrmEnd() = 0;
366
370 virtual Bytes ReadyForRtClass3() = 0;
371
380 virtual Bytes ApplicationReady(double timeoutSec = 30.0) = 0;
381
385 [[nodiscard]] virtual const dcp::DCPDeviceDescription& Info() const = 0;
386
390 [[nodiscard]] virtual std::uint16_t LocalAlarmRef() const = 0;
391
396 [[nodiscard]] virtual int DeviceAlarmRef() const = 0;
397
401 [[nodiscard]] virtual bool HasAlarmCr() const = 0;
402
411 [[nodiscard]] virtual std::vector<EPMEndpoint> EpmLookup(const std::string& ip, std::uint16_t port = RPC_PORT,
412 double timeoutSec = DEFAULT_TIMEOUT,
413 std::optional<std::string> interfaceFilter = std::nullopt) = 0;
414};
415
416} // namespace profinet::rpc
Declares PROFINET IO connection-management block structures and wire serialization.
Abstract interface for a PROFINET RPC connection.
Definition IRPCCon.h:81
virtual const dcp::DCPDeviceDescription & Info() const =0
Returns the device's DCP description.
virtual PNInM5 ReadIm5(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M5 free-text annotation data.
virtual int DeviceAlarmRef() const =0
Returns the device's alarm reference.
virtual PNInM9 ReadIm9(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M9 data.
virtual std::vector< blocks::WriteMultipleResult > WriteMultiple(const std::vector< WriteItem > &writes)=0
Writes multiple PROFINET records in one operation.
virtual diagnosis::DiagnosisData ReadDiagnosis(std::uint16_t slot=0, std::uint16_t subslot=0, std::uint16_t index=0xF000)=0
Reads diagnosis information.
virtual PNInM2 ReadIm2(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M2 installation date data.
virtual bool HasAlarmCr() const =0
Indicates whether an AlarmCR was established.
virtual AllIM ReadAllIm(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads all supported I&M records.
virtual PNInM8 ReadIm8(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M8 data.
virtual Bytes PrmBegin()=0
Sends the PrmBegin control operation.
virtual PNInM13 ReadIm13(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M13 data.
virtual PNIODHeader ReadImplicit(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx)=0
Reads a PROFINET data record without an established AR.
virtual PNInM6 ReadIm6(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M6 data.
virtual PNInM15 ReadIm15(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M15 data.
virtual ~IRPCCon()=default
Virtual destructor.
virtual PNInM14 ReadIm14(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M14 data.
virtual PNIODHeader Read(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx)=0
Reads a PROFINET data record through the established AR.
virtual std::uint16_t LocalAlarmRef() const =0
Returns the controller's local alarm reference.
virtual PNInM3 ReadIm3(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M3 free-text descriptor data.
virtual 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)=0
Query a device's Endpoint Mapper for available RPC endpoints.
virtual Bytes PrmEnd()=0
Sends the PrmEnd control operation.
virtual PNInM12 ReadIm12(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M12 data.
virtual PNInM4 ReadIm4(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M4 PROFIsafe signature data.
virtual PNInM1 ReadIm1(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M1 tag function and location data.
virtual std::pair< blocks::PDRealData, blocks::RealIdentificationData > DiscoverTopology()=0
Reads physical and logical topology information.
virtual void Close() noexcept=0
Disconnects and closes the underlying RPC sockets.
virtual void Disconnect()=0
Disconnects the Application Relationship.
virtual PNInM0 ReadIm0(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M0 identification data.
virtual std::map< std::uint16_t, diagnosis::DiagnosisData > ReadAllDiagnosis()=0
Reads diagnosis information for all standard indices.
virtual blocks::RealIdentificationData ReadRealIdentificationData()=0
Reads logical slot and subslot information.
virtual PNInM10 ReadIm10(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M10 data.
virtual std::optional< ConnectResult > Connect(std::optional< MacAddress > srcMac=std::nullopt, bool withAlarmCr=false, std::optional< IOCRSetup > iocrSetup=std::nullopt)=0
Establishes an Application Relationship with the IO-Device.
virtual void Write(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t idx, const Bytes &data)=0
Writes a PROFINET data record through the established AR.
virtual PNInM7 ReadIm7(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M7 data.
virtual Bytes ReadyForRtClass3()=0
Sends the ReadyForRTClass3 control operation.
virtual blocks::ModuleDiffBlock ReadModuleDiff()=0
Reads the ModuleDiffBlock.
virtual blocks::PDRealData ReadPdRealData()=0
Reads physical-device topology information.
virtual 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)=0
Enumerates readable PROFINET record indices.
virtual PNInM11 ReadIm11(std::uint16_t slot=0, std::uint16_t subslot=1)=0
Reads I&M11 data.
virtual std::vector< blocks::SlotInfo > DiscoverSlots()=0
Discovers the populated device slots.
virtual bool IsConnected() const =0
Indicates whether the Application Relationship is established.
Declares the PROFINET RTC1 cyclic IO controller and process-data exchange API.
PROFINET DCP discovery and device configuration interface.
PROFINET diagnosis data structures, error decoding, and parsers.
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
@ DiagnosisData
Diagnosis data block.
@ RealIdentificationData
Real identification data block.
@ 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.
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
All I&M records a device supports, read in one call.
Definition rpcTypes.h:451
One RPC endpoint advertised by a device's Endpoint Mapper.
Definition IRPCCon.h:34
std::string protocol
Transport protocol, e.g. "ncadg_ip_udp".
Definition IRPCCon.h:48
std::uint16_t interfaceVersionMinor
Minor version of the interface.
Definition IRPCCon.h:42
std::string ipAddress
IPv4 address the endpoint listens on.
Definition IRPCCon.h:54
std::uint16_t port
UDP/TCP port the endpoint listens on.
Definition IRPCCon.h:51
std::uint16_t interfaceVersionMajor
Major version of the interface.
Definition IRPCCon.h:39
std::string annotation
Free-text annotation supplied by the device (e.g. a model name).
Definition IRPCCon.h:57
std::string InterfaceName() const
Human-readable interface name.
Definition rpc.cpp:211
std::string objectUuid
Object UUID this endpoint entry is registered under.
Definition IRPCCon.h:45
std::string interfaceUuid
Interface UUID this endpoint serves.
Definition IRPCCon.h:36
Result of probing one index in EnumerateIndices().
Definition rpcTypes.h:494
A single write operation for WriteMultiple().
Definition rpcTypes.h:434
Declares Linux Ethernet, addressing, timing, and utility helpers used by the PROFINET stack.