Devices Monitor (Reference) provides real-time visibility into Device Node status, communication health, and error diagnostics during runtime operation.
The Device Monitor displays:
Access via Devices → Device Monitor when solution is running.
Property | Description | Access |
---|---|---|
ActivityCounter | Increments on any node activity | @Device.Node.NodeName.ActivityCounter |
Disable | Node disabled status | @Device.Node.NodeName.Disable |
LastErrorCode | Error code (0 = success) | @Device.Node.NodeName.LastErrorCode |
LastErrorDateTime | Timestamp of last error | @Device.Node.NodeName.LastErrorDateTime |
InvalidAddresses | Unresolved device addresses | @Device.Node.NodeName.InvalidAddresses |
csharp
// Check node status
int errorCode = @Device.Node.PLC1.LastErrorCode;
if (errorCode != 0)
{
DateTime errorTime = @Device.Node.PLC1.LastErrorDateTime;
@Info.Trace($"Node error {errorCode} at {errorTime}");
}
// Monitor activity
int activity = @Device.Node.PLC1.ActivityCounter;
bool isActive = activity > 0;
xml
<!-- Show node status -->
<TextBlock Text="{Device.Node.PLC1.LastErrorCode}" />
<TextBlock Text="{Device.Node.PLC1.LastErrorDateTime}" />
<!-- Activity indicator -->
<Ellipse Fill="{Binding Device.Node.PLC1.ActivityCounter,
Converter=ActivityToColorConverter}" />
Code | Error | Description |
---|---|---|
-1 | BuildCommandException | Command creation failed |
-2 | ParseCommandUnsolicitedException | Unexpected command received |
-3 | ParseReplyException | Response parsing failed |
-4 | BuildReplyUnsolicitedException | Unsolicited reply error |
-5 | ChannelException | Channel-level error |
-6 | NodeException | Node-level error |
Code | Error | Description |
---|---|---|
-100 | Base Send Error | Generic send failure |
-101 | Base SendAndWait Error | Send/wait operation failed |
-102 to -104 | TCP Create Error | Socket creation failed |
-105 | TCP Connect Callback | Connection callback error |
-106 | TCP Receive Error | TCP data receive failed |
-107 | UDP Create Error | UDP socket creation failed |
-108 | UDP Receive Error | UDP data receive failed |
-109 | Serial Create Error | Serial port initialization failed |
-110 | Serial Receive Error | Serial data receive failed |
-111 | TCP NotConnected | TCP connection lost |
-112 | Start Message Timeout | Message start not received |
-113 | Receiving Bytes Timeout | Data timeout during receive |
-114 | End Message Timeout | Message end not received |
-115 | Connect Timeout | Connection attempt timeout |
Code | Error | Description |
---|---|---|
-200 | ProtocolError | Generic protocol error |
-201 | InvalidProtocol | Protocol mismatch |
-202 | InvalidStation | Station address invalid |
-203 | InvalidCommand | Command not recognized |
-204 | InvalidMsgSequence | Message sequence error |
-205 | InvalidCheckSum | Checksum validation failed |
-206 | InvalidAddress | Device address invalid |
-207 | InvalidModifiers | Modifier configuration error |
-208 | ProtocolErrorCloseSocket | Protocol error requiring reconnection |
Protocol-specific errors - consult driver documentation
Access channel status for additional diagnostics:
csharp
// Channel status
int channelStatus = @Device.Channel.ChannelName.Status;
// Interpret status using error code table
string statusMessage = GetStatusMessage(channelStatus);
Monitor and handle unresolved addresses:
csharp
// Get invalid addresses
string[] invalid = @Device.Node.PLC1.InvalidAddresses;
if (invalid.Length > 0)
{
foreach(string address in invalid)
{
@Info.Trace($"Invalid address: {address}");
}
}
csharp
public bool IsNodeHealthy(string nodeName)
{
var node = @Device.Node[nodeName];
return node.LastErrorCode == 0 &&
node.ActivityCounter > 0 &&
!node.Disable;
}
csharp
public void HandleNodeError(string nodeName)
{
var node = @Device.Node[nodeName];
int error = node.LastErrorCode;
switch(error)
{
case -111: // Not connected
RestartChannel();
break;
case -115: // Timeout
IncreaseTimeout();
break;
default:
LogError(error);
break;
}
}