Diagnose

In diesem Abschnitt soll beschrieben werden, wie BACnet-Konfigurationen zur Laufzeit analysiert werden können. Hierbei stehen zum einen als Prozessdaten der Device-Status sowie bei BACnet-Clients der Client-Status zur Verfügung (siehe Abschnitt Prozessdaten). Zum anderen können im Reiter "Diagnosis" des BACnet-Device weitere Details analysiert werden. Die Diagnose im Reiter "Diagnosis" soll in diesem Abschnitt zusammen mit zahlreichen Problemlösungsstrategien vorstellt werden.

Diagnose 1:

Die Diagnose des BACnet-Device ist in mehrere Kategorien unterteilt. Diese sollen in den folgenden Abschnitten im Detail vorgestellt werden. Über ein Kontextmenü können verschiedene Optionen aktiviert werden:

Diagnose 2:

Mit der Option "Auto Update" kann die Diagnose-Anzeige im 1-Sekunden-Intervall aktualisiert werden. Die Kategorie "Last Update" zeigt immer den Zeitpunkt an, wann die Diagnose zuletzt ausgelesen wurden. Mit der Option "Enable Time Measurement" kann die Kategorie "ExecutionTime" aktiviert werden, über die Laufzeiten des BACnet-Stack bestimmt werden können. Die Option "Show Changes/s" aktiviert bei einigen Werten eine zusätzliche Anzeige der Veränderungen pro Sekunde. Diese wird über die letzten 10 ausgelesenen Diagnose-Informationen gebildet und funktioniert nur bei aktiviertem "Auto Update". Mit der Option "Reset Values" können alle Diagnosewerte zurückgesetzt werden.

Diagnose 3:

Diagnosedaten in der SPS

Auf die in diesem Abschnitt vorgestellten Diagnosedaten kann auch von der SPS aus über eine ADS-Schnittstelle zugegriffen werden. Mit dem Funktionsbaustein FB_BACnet_GetDiagInfo steht eine einfache Zugriffsmöglichkeit bereit.

Kategorie EthernetDevice

Über die Kategorie EthernetDevice können die Anzahl der versendeten und empfangenen Nachrichten (Frames) sowie Empfangs- und Sende-Fehler ermittelt werden. Diese Informationen werden direkt aus dem Netzwerk-Treiber ausgelesen und werden dadurch beim Neuladen einer BACnet-Konfiguration nicht zurückgesetzt. Die Option "Reset Value" löscht aber auch diese Werte. In dieser Kategorie werden alle Frames gezählt, die über den Netzwerk-Treiber verarbeitet werden. Also auch nicht-BACnet-Frames.

Diagnose 4:

Der Zähler "sendFrames" gibt an wie viele Frames verwendet wurden, "recvFrames" die Anzahl empfangener Frames. "txCnt" und "rxCnt" geben die Anzahl fehlerhaft empfangener bzw. gesendeter Frames an. Sind diese Zähler erhöht kann dies z. B. auf Störungen im Netzwerk oder Überlasten (z. B. CRC-Fehler, Dropped-Frames) hindeuten.

Kategorie ExecutionTime

Diagnose 5:

Mit aktivierter Option "Enable Time Measurement" können Laufzeitinformationen von TwinCAT BACnet/IP ermittelt werden. Es wird jeweils in minimaler (Min), maximaler (Max) und aktueller (Cur)-Wert der Laufzeiten ermittelt. Alle Laufzeiten werden mit 100ns-Auflösung ermittelt. Als Laufzeiten stehen folgende Werte zur Verfügung:

In der oberen Zeile der Kategorie Execution Time wird die Summe der Werte IoIn-, IoOut- und Cycle-XXXExecution-Time jeweils als minimaler, maximaler und aktueller Wert in Mikrosekunden zusammengefasst.

Kategorie ConfirmedServices

In dieser Kategorie kann eine Statistik über versendete und empfangene (bestätigte) BACnet-Nachrichten ermittelt werden. Bestätigte Dienste arbeiten in BACnet nach dem Client-Server-Prinzip. Ein Client sendet einen Request, der Server empfängt diesen Request, verarbeitet ihn und sendet eine Antwort (Acknowledge). Der Client empfängt diese Antwort und kann sie entsprechend weiterverarbeiten. Je nach Diensten kann ein TwinCAT BACnet/IP-Gerät als Client oder Server agieren. Der Ablauf bestätigter Dienste ist in der nachfolgenden Grafik dargestellt.

Diagnose 6:

In der Kategorie ConfirmedServices wird für jeden unterstützen Dienst eine Liste mit der Anzahl versendeter und empfangener Requests sowie versendeter und empfangener Antworten geführt. Dabei wird jeweils aufgeschlüsselt wie viele Requests/Antworten erfolgreich bzw. mit Fehler verarbeitet wurden. Aus diesen Kombinationen ergeben sich die im unteren Screenshot dargestellten 8 Werte je BACnet-Dienst. In der obersten Zeile eines jeden Diensts wird jeweils die Summe von Requests und Antworten die erfolgreich bzw. mit Fehler ausgeführt wurden, dargestellt.

Diagnose 7:

Bei der Klassifikation von Diensten werden in BACnet sogenannte A- und B-Dienste unterschieden, je nachdem welche Rolle (Client bzw. Server) ein Gerät bei einer Dienstnutzung einnimmt. Agiert ein Gerät als Client, stellt also einen Request und empfängt eine Antwort (Ack) nutzt er einen A-Dienst. Empfängt ein Gerät einen Request, verarbeitet ihn und sendet eine Antwort (Ack) stellt er den B-Dienst bereit. Liest z.B. ein Client den Wert einer Property von einem anderen Gerät, wird der Dienst ReadProperty-A verwendet. Die Gegenstelle, der Server, implementiert in diesem Fall den Dienst ReadProperty-B. Für die Diagnose ist es wichtig zwischen A- und B-Diensten zu unterscheiden. Deshalb wird die nachfolgende Tabelle jeweils in diese Dienst-Kategorien aufgeteilt.

Bei bestätigten Diensten gehören also zu einem A-Dienst immer die Zähler ReqSend und AckRecv; zu einem B-Dienst immer ReqRecv und AckSend. In der Tabelle wird bei den möglichen Fehlern jeweils erläutert, in welchen Fällen die Fehler-Zähler inkrementiert werden ( z.B. ReqSendFail>0). Ein wichtiger Fehlerindikator kann aber bei A-Diensten auch eine Abweichung von der Anzahl gesendeter Requests und empfangener Antworten (Ack) sein. Diese Fehlerart wird mit (Req<>Ack) abgekürzt.

Diagnose 8:

Dienstdiagnose

Bei BACnet gilt es zu beachten, dass erhöhte Fehlerzähler in der Diagnose nicht zwangsläufig auf eine Fehlkonfiguration hindeuten. In BACnet-Netzwerken kann es durchaus zu kurzen Lastspitzen und verlorenen Nachrichten kommen. Hierfür existieren entsprechende Wiederholungsmechanismen (ApduRetries und ApduTimeout). Bei hohen Fehlerraten sollten allerdings Probleme von Grund auf behoben werden.

In der folgenden Tabelle werden relevante BACnet-Dienste und ihre Diagnose kurz beschrieben. Dabei wird darauf eingegangen, welche Funktion die Dienste erfüllen, wo die Dienste in TwinCAT BACnet/IP verwendet werden, welche möglichen Fehlerursachen diagnostiziert werden können und wie eine entsprechende Problemlösung aussehen kann.

AcknowledgeAlarm-B

(ReqRecv, AckSend)

Verwendung:

Bestätigung offener Alarme

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (falscher EventState, falscher Timestamp, Instrinsic Reporting für das Objekt ist deaktiviert)
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Gegenstelle überprüfen

ConfirmedCOVNotification-A

(ReqSend, AckRecv)

Verwendung:

Gegenstelle hat Wertänderung abonniert. Dienst sendet Nachricht bei Änderung.

Mögliche Fehler:
ReqSendFail>0 : kein Framespeicher, kein Routerspeicher, keine verfügbaren Invoke-IDs
Req <> Ack: Gegenstelle nicht verfügbar bzw. überlastet

Fehlerbehandlung:
Property COVIncrement bei Analog*-Objekten überprüfen/erhöhen. BACnet-Zykluszeit verringern: bei schreibenden Prozessdaten, werden dann weniger Änderungen generiert. Konfiguration auf ständig ändernde Properties überprüfen. Prüfen ob Gegenstelle nicht-bestätigte COV-Abonnements verwenden kann.

ConfirmedCOVNotification-B

(ReqRecv, AckSend)

Verwendung:

Empfang einer Wertänderung

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (Prozess-ID nicht vorhanden, unbekanntes Objekt, unbekannte Property, Nachricht enthält nicht den erwarteten Datentyp), kein Routerspeicher

Fehlerbehandlung:
Gegenstelle überprüfen

ConfirmedEventNotification-A

(ReqSend, AckRecv)

Verwendung:

Nachricht bei Änderung eines Ereigniszustands (Instrinsic Reporting)

Mögliche Fehler:
ReqSendFail>0: kein Framespeicher, kein Routerspeicher, keine verfügbaren Invoke-IDs
Req <> Ack: Gegenstelle nicht verfügbar bzw. überlastet

Fehlerbehandlung:
Überprüfen, ob das Versenden von Ereignisnachrichten für alle Objekte sinnvoll ist. Ggf. Instrinsic Reporting Properties deaktivieren, Ereignis-Benachrichtigung über Property EventEnable deaktivieren, oder allen Objekten, die keine Ereignisnachrichten verschicken sollen eine NotificationClass ohne Recipients zuordnen. Ggf. unbestätigte Ereignisnachrichten verwenden (issueConfirmedNotifications in NotificationClass:RecipientList.)

ConfirmedEventNotification-B

(ReqRecv, AckSend)

Nicht Bestandteil der Zertifizierung

Verwendung:

Empfang von Ereignismeldungen in der Notification Sink

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (Prozess-ID nicht vorhanden, Empfangspuffer für Ereignisnachrichten voll), kein Routerspeicher

Fehlerbehandlung:
Gegenstelle überprüfen, Puffergröße für EventNotifications erhöhen, Löschintervall für Nachrichtenpuffer erhöhen

GetAlarmSummary-B
(ReqRecv, AckSend)

Verwendung:

Abrufen einer Zusammenfassung aller Objekte im Alarmzustand

Mögliche Fehler:
nReqRecvFail>0: kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

GetEnrollmentSummary-B

Verwendung:

Abrufen einer Zusammenfassung ereignisspezifischer Informationen (mit umfangreichen Filteroptionen)

Mögliche Fehler:
nReqRecvFail>0: kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

SubscribeCOV-A

(ReqSend, AckRecv)

Verwendung:

Dienst zum Abonnieren einer Wertänderung (COV) der Property "PresentValue" und "StatusFlags" bei Analog*-, Binary*- und MultiState*-Objekten. Bei Remote-Objekten für Prozessdaten im COV-Mode. TrendLog für entfernte Objekte mit LogInterval=0. In NotificationSink konfigurierte COV-Abonnements.

Mögliche Fehler:
ReqSendFail>0: Verbindungsdaten können nicht aufgelöst werden (Client-Status nicht Complete), kein Framespeicher, kein Routerspeicher, keine verfügbaren Invoke-IDs
Req <> Ack: Gegenstelle nicht verfügbar bzw. überlastet.

Fehlerbehandlung:
Optimierung der Prozessdaten im "PropertyWizzard" aktivieren, Zykluszeiten größer einstellen, weniger Properties abonnieren, Properties die nicht per COV abonniert werden können, zyklisch auslesen (Polling)

SubscribeCOV-B

(ReqRecv, AckSend)

Verwendung:

Empfang eines Abonnements einer Wertänderung (COV) der Property "PresentValue" und "StatusFlags" bei Analog-*, Binary*- und MultiState*-Objekten.

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, nicht unterstützte Property, ungültiger Array-Index), Anzahl maximal unterstützter COV-Subscriptions für Objekt erreicht, kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Anzahl unterstützter COV-Subscriptions pro Objekt in Advanced Parametern erhöhen (MAX_OBJ_SUBS_COV_ENTRIES)

AtomicReadFile-B

(ReqRecv, AckSend)

Verwendung:

Lesen einer Datei

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, nicht unterstütztes Objekt, ungültige FileStart-Position, Zugriff via Record), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher, lokaler Segmentpuffer voll, zu viele Daten für unterstützte Segmentierung der Gegenstelle

Fehlerbehandlung:
Advanced Parameter MAX_RECV_BAC_SEGM_FRAMES erhöhen

AtomicWriteFile-B

(ReqRecv, AckSend)

Verwendung:

Schreiben einer Datei

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, nicht unterstütztes Objekt, ungültige FileStart-Position, Zugriff via Record), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Advanced Parameter MAX_RECV_BAC_SEGM_FRAMES erhöhen

AddListElement-B

(ReqRecv, AckSend)

Verwendung:

Hinzufügen eines Listenelements

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, nicht unterstützte Property, Property ist keine Liste, Property ist schreibgeschützt ), Property-Speicher überschritten, kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Property-Listenspeicher erhöhen (LIST_ALLOC_MEM_BYTES). Einige Listen werden in TwinCAT BACnet/IP als Arrays verwaltet (z.B. RecipientList, DateList). Hier MAX_PROPERTY_ARRAYELEMENTS erhöhen.

RemoveListElement-B

(ReqRecv, AckSend)

Verwendung:

Entfernen eines Listenelements

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, nicht unterstützte Property, Property ist keine Liste, Property ist schreibgeschützt, Element nicht vorhanden), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

ServiceCreateObject-B

(ReqRecv, AckSend)

Verwendung:

Erzeugen eines dynamischen Objekts

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (nicht unterstützter Objekttyp, ungültige Property-Parameterdaten, Objektname oder ObjectIdentifier schon vorhanden, maximale Objektanzahl überschritten), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Advanced Parameter MAX_OBJECTS erhöhen

ServiceDeleteObject-B

(ReqRecv, AckSend)

Verwendung:

Entladen eines dynamischen Objekts

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, statisches Objekt - nur dynamische Objekte können gelöscht werden), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

ReadProperty-A

(ReqSend, AckRecv)

Verwendung:

Auslesen einer Property eines entfernten Gerätes

Mögliche Fehler:
ReqSendFail>0 : Verbindungsdaten können nicht aufgelöst werden (Client-Status nicht Complete), kein Framespeicher, kein Routerspeicher, keine verfügbaren Invoke-IDs
Req <> Ack: Gegenstelle nicht verfügbar bzw. überlastet.

Fehlerbehandlung:
Optimierung der Prozessdaten im "Property-Wizzard" aktivieren. Zykluszeiten erhöhen. Weniger Properties per Polling abfragen: SubscribeCOV-Dienst verwenden

ReadProperty-B

(ReqRecv, AckSend)

Verwendung:

Auslesen einer lokalen Property

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, unbekannte Property, kein Lesezugriff, ungültiger Array-Index), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher, lokaler Segmentpuffer voll, zu viele Daten für unterstützte Segmentierung der Gegenstelle

ReadPropertyMultiple-B

(ReqRecv, AckSend)

Verwendung:

Auslesen mehrerer lokaler Objekte und Properties mit einem Zugriff

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekannte Objekte, unbekannte Properties, kein Lesezugriff, ungültiger Array-Index), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher, lokaler Segmentpuffer voll, zu viele Daten für unterstützte Segmentierung der Gegenstelle

Fehlerbehandlung:
Bei zu großen Daten, sollte die Gegenstelle ReadProperty verwenden. GGf. Listen- und Array-Properties per Index auslesen. Advanced Parameter MAX_SEND_BAC_SEGM_FRAMES erhöhen

WriteProperty-A

(ReqSend, AckRecv)

Verwendung:

Schreiben einer Property eines entfernten Gerätes

Mögliche Fehler:
ReqSendFail>0: Verbindungsdaten können nicht aufgelöst werden (Client-Status nicht Complete), kein Framespeicher, kein Routerspeicher, keine verfügbaren Invoke-IDs
Req <> Ack: Gegenstelle nicht verfügbar bzw. überlastet.

Fehlerbehandlung:
Optimierung der Prozessdaten im "PropertyWizzard" aktivieren. Zykluszeiten erhöhen. Weniger Properties abonnieren. WriteOnChange in der Prozessdaten Konfiguration aktivieren (Bei WriteOnChange wird maximal WriteProperty pro Client-Property "Cycle Time" ausgeführt.)

WriteProperty-B

(ReqRecv, AckSend)

Verwendung:

Schreiben einer lokalen Property

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, unbekannte Property, kein Schreibzugriff, ungültiger Array-Index, falscher Datentyp), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Property-Listenspeicher erhöhen (LIST_ALLOC_MEM_BYTES). Advanced Parameter MAX_PROPERTY_ARRAYELEMENTS erhöhen. GGf. Schreibschutz entfernen ("Optional Properties"-Reiter). Gegenstelle untersuchen!

WritePropertyMultiple-B

(ReqRecv, AckSend)

Verwendung:

Schreiben mehrerer lokaler Objekte und Properties mit einem Zugriff

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekannte Objekte, unbekannte Properties, kein Schreibzugriff, ungültiger Array-Index, falscher Datentyp), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Property-Listenspeicher erhöhen (LIST_ALLOC_MEM_BYTES). Advanced Parameter MAX_PROPERTY_ARRAYELEMENTS erhöhen. GGf. Schreibschutz entfernen ("Optional Properties"-Reiter). WriteProperty verwenden. Gegenstelle untersuchen!

DeviceCommunicationControl-B

(ReqRecv, AckSend)

Verwendung:

Kommunikationssteuerung eines Gerätes (Abschalten der Nachrichtenverarbeitung)

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (falsches Passwort), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Passwort-Konfiguration in Gegenstelle mit Passwort abgleichen (BACnet Server- "Authentification"). Encoding des Passworts prüfen.

ReinitializeDevice-B

(ReqRecv, AckSend)

Verwendung:

Initiiert einen Geräteneustart oder ändert den Gerätestatus in den Backup- oder Restore-Modus.

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (falsches Passwort, Gerät befindet sich nicht im Zustand "Operational", Gerät kann keinen Neustart ausführen da es sich im Zustand "Backup" oder "Restore" befindet), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Passwort-Konfiguration in Gegenstelle mit Passwort abgleichen (BACnet Server- "Authentification"). Encoding des Passworts prüfen. Einige Funktionen von ReinitializeDevice-B (Backup, Restore, Restart) funktionieren nur im RUN-Modus. Prüfen ob genügend Dateispeicher für Backup/Restore zur Verfügung steht.

ReadRange-B

(ReqRecv, AckSend)

Verwendung:

Auslesen von Listen (speziell die Property LogBuffer)

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, unbekannte Property, Property ist keine Liste, Zugriff mit dem Parameter "TimeRange" und "BySequence" auf nicht unterstützte Properties), kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

SubscribeCOVP-A

(ReqSend, AckRecv)

Verwendung:

Dienst zum Abonnieren einer Wertänderung (COV-P) mit beliebigen Objekten und Properties. Bei Remote-Objekten für Prozessdaten im COV-Mode. Bei TrendLog für entfernte Objekte mit LogInterval=0. In NotificationSink konfigurierte COV-Abonnements.

Mögliche Fehler:
ReqSendFail>0 : Verbindungsdaten können nicht aufgelöst werden (Client-Status nicht Complete), kein Framespeicher, kein Routerspeicher, keine verfügbaren Invoke-IDs
Req <> Ack: Gegenstelle nicht verfügbar bzw. überlastet.

Fehlerbehandlung:
Optimierung der Prozessdaten im "PropertyWizzard" aktivieren. Zykluszeiten erhöhen. Weniger Properties abonnieren. Properties die nicht per COV-P abonniert werden können, zyklisch auslesen (Polling).

SubscribeCOVP-B

(ReqRecv, AckSend)

Verwendung:

Empfang eines Abonnements einer Wertänderung (COV-P) mit beliebigen Objekten und Properties.

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (unbekanntes Objekt, nicht unterstützte Property, ungültiger Array-Index), Anzahl maximal unterstützter COV-Subscriptions für Objekt erreicht, kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Anzahl unterstützter COV-Subscriptions pro Objekt im Advanced Parameter Menü erhöhen (MAX_OBJ_SUBS_COV_ENTRIES).

GetEventInformation-B

(ReqRecv, AckSend)

Verwendung:

Abrufen einer Zusammenfassung aller Objekte im Eventzustand

Mögliche Fehler:
nReqRecvFail>0: kein Routerspeicher
nAckSendFail: kein Framespeicher, kein Routerspeicher

Kategorie UnconfirmedServices

Im Gegensatz zu den bestätigten Diensten arbeiten unbestätigte Dienste nur in eine Richtung. Ein Client sendet also einen Request und ein Server empfängt den Request. In der folgenden Tabelle sind die unbestätigten Dienste der BACnet-Diagnose im Detail beschrieben.

IAm-A

(ReqSend)

Verwendung:

Bekanntmachung des Servers im Netzwerk

Mögliche Fehler:
ReqSendFail>0: kein Framespeicher, kein Routerspeicher

IAm-B

(ReqRecv)

Verwendung:

Bekanntmachung eines Gerätes aus dem Netzwerk

Mögliche Fehler:
nReqRecvFail>0: DeviceAddressBinding Liste ist voll, kein Routerspeicher

Fehlerbehandlung:
Anzahl der unterstützen AddressBindings in den Advanced Parametern erhöhen (MAX_DEVICE_BINDINGS)

IHave-A

(ReqSend)

Verwendung:

Meldet ein im Netzwerk gesuchtes Objekt

Mögliche Fehler:
ReqSendFail>0: kein Framespeicher, kein Routerspeicher

UnconfirmedCOVNotification-A

(ReqSend)

Verwendung:

Gegenstelle hat Wertänderung abonniert. Dienst sendet unbestätigte Nachricht bei Änderung.

Mögliche Fehler:
ReqSendFail>0: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Property COVIncrement bei Analog*-Objekten überprüfen/erhöhen. BACnet-Zykluszeit verringern: bei schreibenden Prozessdaten, werden dann weniger Änderungen generiert. Konfiguration auf ständig ändernde Properties überprüfen.

UnconfirmedCOVNotification-B

(ReqRecv)

Verwendung:

Unbestätigter Empfang einer Wertänderung

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (Prozess-ID nicht vorhanden, unbekanntes Objekt, unbekannte Property, Nachricht enthält nicht den erwarteten Datentyp), kein Routerspeicher

UnconfirmedEventNotification-A

(ReqSend)

Verwendung:

Unbestätigte Nachricht bei Änderung eines Ereigniszustands (Instrinsic Reporting)

Mögliche Fehler:
ReqSendFail>0: kein Framespeicher, kein Routerspeicher

Fehlerbehandlung:
Überprüfen, ob das Versenden von Ereignisnachrichten für alle Objekte sinnvoll ist. Ggf. Instrinsic Reporting Properties deaktivieren, Ereignis-Benachrichtigung über Property EventEnable deaktivieren, oder allen Objekten, die keine Ereignisnachrichten verschicken sollen eine NotificationClass ohne Recipients zuordnen.

UnconfirmedEventNotification-B

(ReqRecv)

Verwendung:

Unbestätigter Empfang von Ereignismeldungen in der Notification Sink

Mögliche Fehler:
nReqRecvFail>0: Fehlerhafte Request-Parameter (Prozess-ID nicht vorhanden, Empfangspuffer für Ereignisnachrichten voll), kein Routerspeicher

TimeSynchronisation-B

(ReqRecv)

Verwendung:

Empfang eines Zeitstempels zur Zeitsynchronisation

Mögliche Fehler:
nReqRecvFail>0: Systemzeit konnte nicht synchronisiert werden da bereits ein Synchronisation läuft oder TwinCAT sich im Free-Run State befindet, kein Routerspeicher

Fehlerbehandlung:
TwinCAT in den State "Run" schalten

WhoHas-B

(ReqRecv)

Verwendung:

Suche nach bestimmten Objekten in einem Netzwerk

Mögliche Fehler:
nReqRecvFail>0: Gerät verarbeitet keine Nachrichten da dies über den Service "DeviceCommunicationControl" abgeschaltet wurde, kein Server angelegt, kein Routerspeicher

WhoIs-A

(ReqSend)

Verwendung:

Scannen eines Netzwerkes nach Teilnehmer und Abfragen der Gerätekommunikationsparameter

Mögliche Fehler:
ReqSendFail>0: kein Framespeicher, kein Routerspeicher

WhoIs-B

(ReqRecv)

Verwendung:

Abfrage des Servers nach Gerätekommunikationsparametern

Mögliche Fehler:
nReqRecvFail>0: Gerät verarbeitet keine Nachrichten da dies über den Service "DeviceCommunicationControl" abgeschaltet wurde, kein Server angelegt, kein Routerspeicher

UTCTimeSynchronisation-A

(ReqSend)

Verwendung:

Senden eines UTC-Zeitstempels zur Zeitsynchronisation

Mögliche Fehler:
ReqSendFail>0: kein Framespeicher, kein Routerspeicher

UTCTimeSynchronisation-B

(ReqRecv)

Verwendung:

Empfang eines UTC-Zeitstempels zur Zeitsynchronisation

Mögliche Fehler:
nReqRecvFail>0: Systemzeit konnte nicht synchronisiert werden da bereits ein Synchronisation läuft oder TwinCAT sich im Free-Run State befindet, kein Routerspeicher

Fehlerbehandlung:
TwinCAT in den State "Run" schalten

Kategorie FrameStatistic

Diese Kategorie fasst Zähler von versendeten und empfangenen BACnet-Nachrichten zusammen. Zusätzlich kann festgestellt werden, wie oft während des Betriebs der physikalische Link des Netzwerkadapters verloren ging.

Diagnose 9:

Die einzelnen Zähler werden im Folgenden näher beschrieben und ggf. mögliche Problemindikatoren aufgezählt.

nSegmSendTimeouts

Zweck:

Gibt an, wie oft es zu Zeitüberschreitungen beim Warten auf die Bestätigung eines Segments kam.

Problemindikator:
Ggf. ist die Gegenstelle überlastet oder nicht mehr erreichbar.

nFrameAllocFailCnt

Zweck:

Gibt an, wie oft kein Speicher zum Versenden von BACnet-Nachrichten allokiert werden konnte.

Problemindikator:
Es werden potenziell zu viele Nachrichten pro Zyklus versendet. Ggf. können die Netzwerk-Adapter-Queues aktiviert werden (siehe Advanced Parameter). Es sollte überprüft werden, ob eine Verbindung zum Netzwerk besteht. Ist dieser Zähler erhöht, deutet dies typischerweise auf eine lokale Überlastsituation hin.

nFrameSendCnt

Zweck:
Gibt an, wie viele BACnet-Nachrichten erfolgreich versendet wurden.

nFrameSendFailCnt

Zweck:

Gibt an, wie viele BACnet-Nachrichten nicht versendet werden konnten.

Problemindikator:
Es werden potentiell zu viele Nachrichten pro Zyklus versendet. Ggf. können die Netzwerk-Adapter-Queues aktiviert werden (siehe Advanced Parameter). Es sollte überprüft werden, ob eine Verbindung zum Netzwerk besteht. Ist dieser Zähler erhöht, deutet dies typischerweise auf eine lokale Überlastsituation hin.

nFrameRecvCnt

Zweck:

Gibt an wie viele BACnet-Nachrichten ohne Fehler empfangen wurden.

nFrameRecvFailCnt

Zweck:

Gibt an, wie viele BACnet-Nachrichten mit Fehler empfangen wurden. Dieser Zähler ist die Summe der AckRecvFail- und ReqRecvFail-Zähler aller Dienste.

Problemindikator:
Eine genaue Problemanalyse sollte über die Kategorien ConfirmedServices und UnconfirmedServices erfolgen.

nLinkStatusChangedCnt

Zweck:

Gibt an, wie oft der LinkStatus des Netzwerk-Adapters gewechselt hat.

Problemindikator:
Im Normalfall hat dieser Zähler den Wert 1 (Link bestand beim Systemstart.)

Kategorie MemoryInfo

Die Kategorie MemoryInfo fasst speicherspezifische Informationen zusammen. In der obersten Zeile werden bei WindowsCe-Geräten der verfügbare Haupt- und Flashspeicher angezeigt. Die einzelnen Zähler werden in der folgenden Tabelle erläutert.

nAmsAlloc

nAmsAllocCntMax
nAmsAllocFailCnt

Zweck:

Diese Zähler repräsentieren das Allokationsverhalten des BACnet-Stack beim Router. nAmsAlloc gibt die aktuelle Anzahl an Allokation an. nAmsAllocCntMax gibt an, wie viele Allokationen maximal zu einem Zeitpunkt aktiv waren. nAmsAllocFailCnt gibt an, wie oft kein Speicher alloziert werden konnte. Diese Zähler treffen keine Aussage über die Menge an alloziertem Speicher.

Problemindikator:
Router-Speicher wird für temporäre Operationen verwendet. Z.B. für die Verarbeitung von Nachrichten und zum Abspeichern von EventNofitications und COV-Notifications in der NotificationSink. Ist der Zähler nAmsAlloc dauerhaft hoch, deutet dies auf eine Überlastsituation hin.

nCeAvailPhysMemBytes

nCeAvailFlashMemBytes

Zweck:

Diese Zähler sind nur für Windows CE implementiert. Sie geben an wie viel Hauptspeicher und Flash-Speicher zur Verfügung steht.

Problemindikator:
Steht nicht genügend Hauptspeicher (nCeAvailPhysMemBytes) zur Verfügung können ggf. keine dynamischen Objekte allokiert werden. Flash-Speicher ist für das Abspeichern persistenter Daten, sowie bei Backup und Restore von Bedeutung.

nRecvFrameFifoSize

nEmptyFrameFifoSize

Zweck:

Bei der Verwendung der Netzwerk-Adapter-Queues geben diese Zähler den verfügbaren Listenspeicher für empfangene (nRecvFrameFifoSize) und zu sendende Nachrichten (nEmptyFrameFifoSize) an.

Problemindikator:
Laufen die Speicher leer, kann über den Parameter Dialog der Netzwerk-Adapter-Queues die Speichergröße erhöht werden.

nRecvSegmUDPFramesListSize
nRecvSegmFramesListSize
nSendSegmFramesListSize

Zweck:

Diese Zähler geben Auskunft über die aktuell zwischengespeicherten Nachrichten-Segmente. Dabei wird zwischen IP-Segmentierung (UDP) und BACnet-NPDU-Segmentierung sowie zwischen Segmenten die zum Versand vorgemerkt wird (Send) und schon empfangenen Segmenten (Recv) unterschieden.

Problemindikator:
Treten Probleme im Zusammenhang mit der Segmentierung auf, können ggf. die Advanced Parameter MAX_RECV_BAC_SEGM_FRAMES und MAX_SEND_BAC_SEGM_FRAMES angepasst werden.

nClientScanListSize

Zweck:

Gibt die Größe der Liste gefundener Geräte im Netzwerk an.

nAdsRequestListSize

Zweck:

ADS-Requests an den BACnet-Stack werden in einer Liste zwischengespeichert und im Kontext der BACnet-Task verarbeitet. Dieser Zähler gibt die aktuelle Anzahl ausstehender ADS-Requests an.

Kategorie ServerInfo

Die Kategorie ServerInfo wird im Detail im Abschnitt Persistente Daten vorgestellt.

Kategorie ClientInfo

In dieser Kategorie werden Informationen zum aktuellen Kommunikationsstatus mit jedem konfigurierten BACnet-Client angezeigt.

instanceNumber

Zweck:
Enthält als Zuordnungsmerkmal die Geräte-ID (Instanznummer des Device-Objekt) des BACnet-Client.

ipAddr udpPort networkNumber

Zweck:

Enthält Informationen zu Kommunikationsadressen. BACnet verwendet allein die Geräte-ID zur Identifikation von Geräten. Die IP-Adresse kann dynamisch zugeordnet sein. Über dieses Diagnose-Feld kann die aktuelle IP-Adresse ermittelt werden. Zusätzlich können hier der verwendetet UDP-Port sowie die Netzwerknummer (bei Kommunikation über BACnet-Router - z.B. MS/TP-Geräte) abgelesen werden.

isReachable clientState

Zweck:
ClientSTMState spiegelt den aktuellen Zustand der Client-Statemachine wieder. ClientSTMState kann folgende Werte annehmen: Init, Connecting, WaitingForConnection, RequestDeviceInformation, Complete. Die genaue Arbeitsweise der ClientState-Machine ist in der Sektion Client-Control beschrieben. clientState gibt an, ob eine Verbindung zum entfernten BACnet-Gerät hergestellt werden konnte. clientState ist TRUE wenn die ClientSTMState den Wert "Complete" erreicht hat.
 

Problemindikator:
Wenn ein BACnet-Gerät nicht erreicht werden kann, verbleibt die ClientState-Maschine im Zustand "WaitingForConnection". Dann sollte geprüft werden, warum der BACnet-Client nicht erreichbar ist:

  •  Stimmen die Subnetzmasken aller Geräte überein (z.B. 255.255.255.0). Dies ist eine wichtige Voraussetzung in BACnet, da die bei der Gerätesuche verwendeten Broadcast-Adressen daraus berechnet werden.
  • Ist ein Gateway konfiguriert; falls sich die Geräte in unterschiedlichen IP-Bereichen befinden. Ist das Gateway erreichbar?!!
  • Ist der Einsatz eines BBMD erforderlich (weil sich die Geräte in unterschiedlichen Netzen (LAN) befinden)
  • Wurde eine physikalische Verbindung hergestellt. (LinkStatus im Device Status des BACnet-Adapter; Stecken alle Kabel)

nOpenRequests nFreeOpenRequestData nRequestRetries nRequestTimeOuts

Zweck:
Diese Gruppe von Diagnosewerten zeigt allgemeine Informationen zum Kommunikationsstatus konfigurierter Prozessdaten des BACnet-Client. nOpenRequests gibt an wie viele abgesendete, bis jetzt unbeantwortete Anfragen für diesen Client existieren. Dieser Wert spiegelt letztendlich die Anzahl verwendeter invokeIDs wieder. nFreeOpenRequestData  gibt an, wie viele verbleibende invokeIds für den Client noch zur Verfügung stehen. nRequestRetries gibt an wie oft bei den prozessdatenspezifischen Requests (ReadProperty, WriteProperty, ReadPropertyMultiple, SubscribeCOV) Wiederholungen gesendet werden mussten. nRequestTimeOuts gibt an wie viele prozessdatenspezifischen Requests trotz Wiederholungen fehlgeschlagen sind. Die Zeitabstände zwischen Request-Wiederholungen wird aus der Property APDU-Timeout des Server-Device-Objekts abgeleitet.
 

Problemindikator:
nRequestTimeOuts sollte niemals einen Wert größer 0 annehmen. Dies deutet auf problematische Kommunikationsstörungen hin. Seltene Wiederholungen (nRequestRetries) können dagegen akzeptabel sein. Problemlösungen können in den folgenden 3 Tabellenreihen abgeleitet werden, die Probleme der einzelnen Kommunikationsdienste detaillierter aufschlüsseln.

nCyclicCovRequests
nCyclicCovPendingCounter
nFailedCovRequests

Zweck:
Diese Werte geben Auskunft über COV spezifische Kommunikationsdienste. Diese Werte beziehen sich auf das Registrieren von COV-Meldungen (SubscribeCOV). nCyclicCovRequests gibt an wie viele Property-Prozessdaten mit dem Modus COV (Confirmed, Unconfirmed, Unsolicited) konfiguriert wurden. nCyclicCovPendingCounter gibt an wie viele offene SubscribeCOV-Requests für diesen BACnet-Client existieren. Die maximale Anzahl paralleler (offener) Requests pro Client kann über den Advanced Parameter  MAX_PARALLEL_COV_SUBSCRIPTIONS festgelegt werden. nFailedCovRequests gibt an wie viele Registrierungen von COV-Meldungen fehlgeschlagen sind.

Problemindikator:
nFailedCovRequests sollte niemals einen Wert ungleich 0 aufweisen. Wenn eine große Anzahl Properties von einem entfernten Gerät abonniert werden soll, kann in manchen Fällen ReadPropertyMultiple eingesetzt werden. Es ggf. geprüft werden, ob die Gegenstelle COV unterstützt bzw. die abonnierten Properties per COV bzw. COV-P unterstützt werden.

nCyclicReadPollingRequests nFailedReadRequests

Zweck:
Diese Werte geben Auskunft über polling-basierte Prozessdaten (ReadProperty, RPM-O, RPM-C). nCyclicReadPollingRequests gibt an wie viele Nachrichten für diese Art der Prozessdaten konfiguriert wurden. Achtung: dieser Wert enthält nicht die Anzahl konfigurierter Properties, sondern die Anzahl der benötigten Nachrichten um die Daten zu übertragen. Bei RPM-O und RPM-C werden mehrere Property-Werte mit einer Nachricht ausgelesen. nFailedReadRequests enthält die Anzahl fehlgeschlagener Leseversuche.

Problemindikator:
nFailedReadRequests sollte möglichst nie einen Wert größer 0 annehmen. Im Fehlerfall sollte überprüft werden, ob die Gegenstelle ggf. RPM unterstützt. Bei Überlasten sollte die Anzahl von Prozessdaten-Properties reduziert bzw. das Polling-Interval erhöht werden.

 nCyclicWriteRequestsnFailedWriteRequests

Zweck:
Diese Werte beziehen sich auf schreibende Prozessdaten. nCyclicWriteRequests gibt an wie viele schreibende Properties unter diesem BACnet-Client konfiguriert wurden. nFailedWriteRequests gibt an wie viele Schreibrequests (WriteProperty) trotz Wiederholungen fehlgeschlagen sind.

Problemindikator:
nFailedWriteRequests sollte niemals einen Wert ungleich 0 besitzen. Bei Überlasten sollte die "Cycle Time" erhöht werden. Diese bestimmt wie oft Änderungen geschrieben werden können. Ggf. sollte geprüft werden, ob nicht vorhandene oder schreibgeschützte BACnet-Properties beschrieben werden.