62std::optional<MacAddress>
ParseMac(
const std::string& macStr);
89 std::uint32_t
api = 0;
128 std::optional<PNInM0>
im0;
142 [[nodiscard]] std::string
OrderId()
const;
180 double timeoutSec = 5.0,
181 std::unique_ptr<rpc::IRPCCon>
rpc =
nullptr, std::unique_ptr<IAlarmListener>
alarmListener =
nullptr);
211 double timeoutSec = 10.0);
228 double timeoutSec = 5.0);
261 [[nodiscard]]
const std::string&
Name()
const
268 [[nodiscard]]
const std::string&
Ip()
const
275 [[nodiscard]] std::string
Mac()
const
299 Bytes Read(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, std::uint32_t api = 0);
330 Bytes ReadImplicit(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, std::uint32_t api = 0);
339 void Write(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index,
const Bytes& data,
340 std::uint32_t api = 0);
345 std::vector<blocks::WriteMultipleResult>
WriteMultiple(
const std::vector<WriteItem>& writes);
355 PNInM0 ReadIm0(std::uint16_t slot = 0, std::uint16_t subslot = 1);
361 PNInM1 ReadIm1(std::uint16_t slot = 0, std::uint16_t subslot = 1);
367 PNInM2 ReadIm2(std::uint16_t slot = 0, std::uint16_t subslot = 1);
373 PNInM3 ReadIm3(std::uint16_t slot = 0, std::uint16_t subslot = 1);
379 PNInM4 ReadIm4(std::uint16_t slot = 0, std::uint16_t subslot = 1);
385 PNInM5 ReadIm5(std::uint16_t slot = 0, std::uint16_t subslot = 1);
400 void WriteIm1(
const std::string& tagFunction,
const std::string& tagLocation, std::uint16_t slot = 0,
401 std::uint16_t subslot = 1);
408 void WriteIm2(
const std::string& date, std::uint16_t slot = 0, std::uint16_t subslot = 1);
415 void WriteIm3(
const std::string& descriptor, std::uint16_t slot = 0, std::uint16_t subslot = 1);
431 std::uint16_t index = 0xF000);
456 std::optional<AlarmNotification>
ReadAlarm(std::uint16_t slot = 0, std::uint16_t subslot = 0,
457 std::uint16_t index = 0x800C);
497 int maxConsecutiveTimeouts = 3,
498 std::unique_ptr<cyclic::ICyclicController> controller =
nullptr);
508 std::map<std::uint16_t, rpc::IndexProbeResult>
EnumerateIndices(std::uint16_t slot = 0,
509 std::uint16_t subslot = 1);
513 [[nodiscard]] std::string
ToString()
const;
553 std::unique_ptr<rpc::IRPCCon>
rpc;
574std::vector<ProfinetDevice>
Scan(
const std::string& interface =
"eth0",
double timeoutSec = 3.0);
581std::map<std::string, DeviceInfo>
ScanDict(
const std::string& interface =
"eth0",
double timeoutSec = 3.0);
Declares the PROFINET RTA alarm listener and AlarmAck transmission support.
Declares PROFINET alarm, diagnosis, maintenance, and USI payload types and parsers.
Declares PROFINET IO connection-management block structures and wire serialization.
Parsed PROFINET device information from a DCP response.
std::string name
Station name.
std::string mac
Device's MAC address, formatted as a string.
std::string ip
IPv4 address, or "0.0.0.0" if unset.
High-level PROFINET device interface.
std::string ToString() const
Human-readable summary of this device, for logging/debugging.
PNInM0 ReadIm0(std::uint16_t slot=0, std::uint16_t subslot=1)
Read I&M0 (mandatory identification data).
std::string Mac() const
The device's MAC address.
rpc::AllIM ReadAllIm(std::uint16_t slot=0, std::uint16_t subslot=1)
Read all I&M records the device supports.
void ReleaseAr(rpc::IRPCCon &releaseRpc)
Release a PROFINET Application Relationship.
blocks::ModuleDiffBlock ReadModuleDiff()
Read and parse the device's ModuleDiffBlock.
~ProfinetDevice()
Close() the connection and release resources.
static ProfinetDevice Discover(const std::string &identifier, const std::string &interface, double timeoutSec=10.0)
Discover a device by station name or MAC address.
std::map< std::uint16_t, rpc::IndexProbeResult > EnumerateIndices(std::uint16_t slot=0, std::uint16_t subslot=1)
Probe standard indices and report which are readable/empty/erroring.
std::vector< blocks::WriteMultipleResult > WriteMultiple(const std::vector< WriteItem > &writes)
Write multiple records atomically.
PNInM5 ReadIm5(std::uint16_t slot=0, std::uint16_t subslot=1)
Read I&M5 (free-text annotation).
std::string interface
Network interface name in use.
void StopAlarmListener()
Stop the alarm listener.
PNInM4 ReadIm4(std::uint16_t slot=0, std::uint16_t subslot=1)
Read I&M4 (PROFIsafe signature).
blocks::PDRealData ReadTopology()
Read the device's physical topology.
void StartAlarmListener()
Start the background alarm listener.
void WriteIm1(const std::string &tagFunction, const std::string &tagLocation, std::uint16_t slot=0, std::uint16_t subslot=1)
Write I&M1 (tag function + location).
std::unique_ptr< IAlarmListener > alarmListener
Background alarm listener, created lazily by StartAlarmListener().
void OnAlarm(std::function< void(const AlarmNotification &)> callback)
Register a callback for alarm notifications.
void WriteIm3(const std::string &descriptor, std::uint16_t slot=0, std::uint16_t subslot=1)
Write I&M3 (free-text descriptor).
void Write(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, const Bytes &data, std::uint32_t api=0)
Write a raw record.
ProfinetDevice(ProfinetDevice &&)=default
Move-construct, transferring ownership of the connection.
PNInM2 ReadIm2(std::uint16_t slot=0, std::uint16_t subslot=1)
Read I&M2 (installation date).
Bytes ReadImplicit(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, std::uint32_t api=0)
Read a record using the AR-less Read Implicit service.
std::unique_ptr< rpc::IRPCCon > rpc
Underlying RPC connection, created lazily on first use.
void Close()
Stop the alarm listener (if running) and fully close the RPC connection.
bool connected
Whether the AR is currently established.
ProfinetDevice & operator=(const ProfinetDevice &)=delete
Not copyable (owns an RPC connection and alarm listener).
PNInM1 ReadIm1(std::uint16_t slot=0, std::uint16_t subslot=1)
Read I&M1 (tag function/location).
diagnosis::DiagnosisData ReadDiagnosis(std::uint16_t slot=0, std::uint16_t subslot=0, std::uint16_t index=0xF000)
Read and parse diagnosis data at the given location/index.
void Connect()
Establish the AR.
const std::string & Ip() const
The device's IPv4 address.
ProfinetDevice(const ProfinetDevice &)=delete
Not copyable (owns an RPC connection and alarm listener).
Bytes Read(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, std::uint32_t api=0)
Read a raw record.
void WriteIm2(const std::string &date, std::uint16_t slot=0, std::uint16_t subslot=1)
Write I&M2 (installation date).
static ProfinetDevice FromDcpInfo(dcp::DCPDeviceDescription info, const std::string &interface, double timeoutSec=5.0)
Wrap an already-discovered DCPDeviceDescription.
ProfinetDevice & operator=(ProfinetDevice &&)=default
Move-assign, transferring ownership of the connection.
std::unique_ptr< cyclic::ICyclicController > StartCyclic(const rpc::IOCRSetup &iocrSetup, int maxConsecutiveTimeouts=3, std::unique_ptr< cyclic::ICyclicController > controller=nullptr)
Establish cyclic IO end-to-end.
std::vector< blocks::SlotInfo > DiscoverSlots()
List the device's populated slots.
PNInM3 ReadIm3(std::uint16_t slot=0, std::uint16_t subslot=1)
Read I&M3 (free-text descriptor).
std::optional< AlarmNotification > ReadAlarm(std::uint16_t slot=0, std::uint16_t subslot=0, std::uint16_t index=0x800C)
Attempt to read an alarm notification at the given location.
MacAddress srcMac
This host's MAC address.
static ProfinetDevice FromIp(const std::string &ip, const std::string &interface, double timeoutSec=10.0)
Discover a device by IP address.
bool IsConnected() const
Whether the AR is currently established.
void Disconnect()
Gracefully disconnect (sends Release).
bool AlarmListenerRunning() const
Whether the alarm listener is currently running.
double timeout
Default RPC response timeout in seconds.
std::vector< std::function< void(const AlarmNotification &)> > alarmCallbacks
Callbacks registered via OnAlarm(), applied to alarmListener once started.
rpc::IRPCCon & EnsureConnected()
Return the underlying RPCCon, connecting first if necessary.
const std::string & Name() const
The device's station name.
DeviceInfo GetInfo(bool includeTopology=false)
Gather a complete device information summary.
dcp::DCPDeviceDescription info
DCP-discovered description of this device.
std::map< std::uint16_t, diagnosis::DiagnosisData > ReadAllDiagnosis()
Read diagnosis from all standard diagnosis indices.
Abstract interface for a PROFINET RPC connection.
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.
bool IsMacAddress(const std::string &identifier)
Whether a string parses as a MAC address.
std::optional< MacAddress > ParseMac(const std::string &macStr)
Parse a MAC address string in any common separator style.
std::map< std::string, DeviceInfo > ScanDict(const std::string &interface="eth0", double timeoutSec=3.0)
Scan the network and return a name -> DeviceInfo map.
std::vector< ProfinetDevice > Scan(const std::string &interface="eth0", double timeoutSec=3.0)
Scan the network for PROFINET devices via DCP Identify.
std::array< std::uint8_t, macAddressLength > MacAddress
A 6-byte Ethernet MAC address.
std::vector< std::uint8_t > Bytes
Generic byte buffer alias used throughout the library for raw wire data.
PROFINET protocol wire-format structures and serialization helpers.
PROFINET DCE/RPC protocol structures and IO-Device connection API.
Declares PROFINET RT_CLASS_1 cyclic frame and IOCR data structures.
Complete parsed AlarmNotification PDU: header fields + parsed items.
I&M0: mandatory identification data (vendor, order ID, serial number, revisions).
I&M1: user-assigned tag function and location strings.
I&M3: free-text descriptor.
I&M4: PROFIsafe signature (binary, not text).
I&M5: free-text annotation.
Parsed ModuleDiffBlock (0x8104).
Parsed PDRealData (0xF841) structure.
Complete device information summary.
std::uint16_t deviceId
PROFINET device ID (from DCP).
std::string name
Station name (from DCP).
std::string deviceType
Device type string (from DCP).
std::string netmask
IPv4 subnet mask (from DCP).
std::string annotation
Device model, if the EPM endpoint advertised one.
std::string mac
MAC address, formatted as a string (from DCP).
std::string SerialNumber() const
Serial number from I&M0, trimmed.
std::vector< std::string > deviceRoles
Decoded device role names (from DCP).
std::string vendorName
Human-readable vendor name (from DCP).
std::optional< PNInM0 > im0
I&M0 identification data, if it was read successfully.
std::string gateway
IPv4 default gateway (from DCP).
std::uint16_t vendorId
PROFINET vendor ID (from DCP).
std::uint16_t HardwareRevision() const
Hardware revision from I&M0.
std::string OrderId() const
Order ID from I&M0, trimmed.
std::string ip
IPv4 address (from DCP).
std::string SoftwareRevision() const
Software revision string from I&M0.
std::optional< blocks::PDRealData > topology
Physical topology, if it was read successfully.
A single write operation for ProfinetDevice::WriteMultiple().
std::uint16_t subslot
Subslot number.
std::uint16_t index
Record data index to write.
std::uint32_t api
API number.
Bytes data
Record data to write.
std::uint16_t slot
Slot number.
Complete diagnosis data for one slot/subslot.
All I&M records a device supports, read in one call.
Configuration for establishing cyclic IO alongside an AR.
Declares Linux Ethernet, addressing, timing, and utility helpers used by the PROFINET stack.