61std::optional<MacAddress>
ParseMac(
const std::string& macStr);
88 std::uint32_t
api = 0;
127 std::optional<PNInM0>
im0;
141 [[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);
246 void Close() noexcept;
261 [[nodiscard]]
const std::string&
Name()
const
268 [[nodiscard]]
const std::string&
Ip()
const
275 [[nodiscard]] std::string
Mac()
const
298 Bytes Read(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, std::uint32_t api = 0);
329 Bytes ReadImplicit(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, std::uint32_t api = 0);
338 void Write(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index,
const Bytes& data,
339 std::uint32_t api = 0);
344 std::vector<blocks::WriteMultipleResult>
WriteMultiple(
const std::vector<WriteItem>& writes);
354 PNInM0 ReadIm0(std::uint16_t slot = 0, std::uint16_t subslot = 1);
360 PNInM1 ReadIm1(std::uint16_t slot = 0, std::uint16_t subslot = 1);
366 PNInM2 ReadIm2(std::uint16_t slot = 0, std::uint16_t subslot = 1);
372 PNInM3 ReadIm3(std::uint16_t slot = 0, std::uint16_t subslot = 1);
378 PNInM4 ReadIm4(std::uint16_t slot = 0, std::uint16_t subslot = 1);
384 PNInM5 ReadIm5(std::uint16_t slot = 0, std::uint16_t subslot = 1);
399 void WriteIm1(
const std::string& tagFunction,
const std::string& tagLocation, std::uint16_t slot = 0,
400 std::uint16_t subslot = 1);
407 void WriteIm2(
const std::string& date, std::uint16_t slot = 0, std::uint16_t subslot = 1);
414 void WriteIm3(
const std::string& descriptor, std::uint16_t slot = 0, std::uint16_t subslot = 1);
430 std::uint16_t index = 0xF000);
454 std::optional<AlarmNotification>
ReadAlarm(std::uint16_t slot = 0, std::uint16_t subslot = 0,
455 std::uint16_t index = 0x800C);
495 int maxConsecutiveTimeouts = 3,
496 std::unique_ptr<cyclic::ICyclicController>
controller =
nullptr);
506 std::map<std::uint16_t, rpc::IndexProbeResult>
EnumerateIndices(std::uint16_t slot = 0,
507 std::uint16_t subslot = 1);
511 [[nodiscard]] std::string
ToString()
const;
551 std::unique_ptr<rpc::IRPCCon>
rpc;
607std::vector<ProfinetDevice>
Scan(
const std::string& interface =
"eth0",
double timeoutSec = 3.0,
608 std::unique_ptr<IDcpScanner> dcpScanner =
nullptr, std::unique_ptr<IMacAddressProvider> macAddressProvider =
nullptr);
617std::map<std::string, DeviceInfo>
ScanDict(
const std::string& interface =
"eth0",
double timeoutSec = 3.0,
618 std::unique_ptr<IDcpScanner> dcpScanner =
nullptr, std::unique_ptr<IMacAddressProvider> macAddressProvider =
nullptr);
Runs an Asio I/O context on a dedicated worker thread.
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.
Keeps an Asio I/O context running on a dedicated worker thread.
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.
Production implementation of IDcpScanner using DCP over Ethernet.
dcp::ResponseMap Scan(const std::string &interface, double timeoutSec) override
Discover PROFINET devices using DCP.
Interface for PROFINET DCP device discovery.
virtual ~IDcpScanner()=default
virtual dcp::ResponseMap Scan(const std::string &interface, double timeoutSec)=0
Discover PROFINET devices using DCP.
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.
AsioIoContextRunner ioContextRunner
Keeps the Asio execution context running.
~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.
void Close() noexcept
Stop the alarm listener (if running) and fully close the RPC connection.
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.
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.
bool connected
Whether the AR is currently established.
asio::io_context ioContext
Asio execution context.
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.
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.
Test fixture for ProfinetScanner.
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.
std::map< MacAddress, std::map< BlockKey, std::vector< std::uint8_t > > > ResponseMap
Result of ReadResponse(): MAC address -> parsed (option,suboption) -> payload blocks.
bool IsMacAddress(const std::string &identifier)
Whether a string parses as a MAC address.
std::vector< ProfinetDevice > Scan(const std::string &interface="eth0", double timeoutSec=3.0, std::unique_ptr< IDcpScanner > dcpScanner=nullptr, std::unique_ptr< IMacAddressProvider > macAddressProvider=nullptr)
Scan the network for PROFINET devices via DCP Identify.
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, std::unique_ptr< IDcpScanner > dcpScanner=nullptr, std::unique_ptr< IMacAddressProvider > macAddressProvider=nullptr)
Scan the network and return a name -> DeviceInfo map.
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.
std::unique_ptr< cyclic::CyclicController > controller
Declares Linux Ethernet, addressing, timing, and utility helpers used by the PROFINET stack.