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.
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:
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.
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.
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
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:
- IoInXXXExecutionTime : Ermittelt die Laufzeit der Funktion InputUpdate des BACnet-Device, die auch die InputUpdate-Funktionen aller BACnet-Objekte ausführt. Hier werden u.a. Prozessdaten von BACnet zur SPS/IO kopiert. Zusätzlich wird im BACnet-Server der IoBusStatus überprüft und in den BACnet-Objekten aktualisiert. Für BACnet-Remote-Objekte werden ReadProperty-Requests und CovSubscriptions für aktivierte Property-Prozessdaten aus diesem Kontext versendet.
- IoOutXXXExecutionTime: Ermittelt die Laufzeit der Funktion OutputUpdate des BACnet-Device, die auch die OutputUpdate-Funktionen aller BACnet-Objekte ausführt. In Objekten werden Prozessdaten von der SPS/IO nach BACnet kopiert und auf Änderung verglichen. Bei Änderung können je nach BACnet-Property EventState-Machines ausgeführt werden und potentiell COV-Meldungen und Event-Nachrichten versendet werden. Für BACnet-Remote-Objekte werden Write-Property-Requests für aktivierte Property-Prozessdaten versendet und im Falle von "WriteOnChange" Änderung relevanter Properties erkannt (Vergleich).
- CycleXXXExecutionTime: Ermittelt die Laufzeit der Funktion CycleUpdate des BACnet-Device, die auch die CycleUpdate-Funktionen aller BACnet-Objekte ausführt. Im CycleUpdate-Kontext werden:
- Device-, Client-, Server-Statemachines ausgeführt,
- Empfangene Frames verarbeitet,
- Potentiell Objekt-EventState-Machines ausgeführt ( bei Property-Änderungen ),
- COV-Meldungen und Event-Nachrichten versendet,
- ADS-Requests verarbeitet,
- Segmentierte Frames verarbeitet,
- und Persistente Daten geschrieben.
- InputXXXDistanceTime: Gibt den Abstand zwischen zwei Aufrufen der Funktion InputUpdate des BACnet-Device an. Hiermit kann im Falle von "Exceeds" der BACnet-Task ermittelt werden, in welchem maximalen Abstand der BACnet-Stack ausgeführt wird.
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.
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.
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.
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: Fehlerbehandlung: |
ConfirmedCOVNotification-A (ReqSend, AckRecv) | Verwendung: Gegenstelle hat Wertänderung abonniert. Dienst sendet Nachricht bei Änderung. Mögliche Fehler: Fehlerbehandlung: |
ConfirmedCOVNotification-B (ReqRecv, AckSend) | Verwendung: Empfang einer Wertänderung Mögliche Fehler: Fehlerbehandlung: |
ConfirmedEventNotification-A (ReqSend, AckRecv) | Verwendung: Nachricht bei Änderung eines Ereigniszustands (Instrinsic Reporting) Mögliche Fehler: Fehlerbehandlung: |
ConfirmedEventNotification-B (ReqRecv, AckSend) Nicht Bestandteil der Zertifizierung | Verwendung: Empfang von Ereignismeldungen in der Notification Sink Mögliche Fehler: Fehlerbehandlung: |
GetAlarmSummary-B | Verwendung: Abrufen einer Zusammenfassung aller Objekte im Alarmzustand Mögliche Fehler: |
GetEnrollmentSummary-B | Verwendung: Abrufen einer Zusammenfassung ereignisspezifischer Informationen (mit umfangreichen Filteroptionen) Mögliche Fehler: |
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: Fehlerbehandlung: |
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: Fehlerbehandlung: |
AtomicReadFile-B (ReqRecv, AckSend) | Verwendung: Lesen einer Datei Mögliche Fehler: Fehlerbehandlung: |
AtomicWriteFile-B (ReqRecv, AckSend) | Verwendung: Schreiben einer Datei Mögliche Fehler: Fehlerbehandlung: |
AddListElement-B (ReqRecv, AckSend) | Verwendung: Hinzufügen eines Listenelements Mögliche Fehler: Fehlerbehandlung: |
RemoveListElement-B (ReqRecv, AckSend) | Verwendung: Entfernen eines Listenelements Mögliche Fehler: |
ServiceCreateObject-B (ReqRecv, AckSend) | Verwendung: Erzeugen eines dynamischen Objekts Mögliche Fehler: Fehlerbehandlung: |
ServiceDeleteObject-B (ReqRecv, AckSend) | Verwendung: Entladen eines dynamischen Objekts Mögliche Fehler: |
ReadProperty-A (ReqSend, AckRecv) | Verwendung: Auslesen einer Property eines entfernten Gerätes Mögliche Fehler: Fehlerbehandlung: |
ReadProperty-B (ReqRecv, AckSend) | Verwendung: Auslesen einer lokalen Property Mögliche Fehler: |
ReadPropertyMultiple-B (ReqRecv, AckSend) | Verwendung: Auslesen mehrerer lokaler Objekte und Properties mit einem Zugriff Mögliche Fehler: Fehlerbehandlung: |
WriteProperty-A (ReqSend, AckRecv) | Verwendung: Schreiben einer Property eines entfernten Gerätes Mögliche Fehler: Fehlerbehandlung: |
WriteProperty-B (ReqRecv, AckSend) | Verwendung: Schreiben einer lokalen Property Mögliche Fehler: Fehlerbehandlung: |
WritePropertyMultiple-B (ReqRecv, AckSend) | Verwendung: Schreiben mehrerer lokaler Objekte und Properties mit einem Zugriff Mögliche Fehler: Fehlerbehandlung: |
DeviceCommunicationControl-B (ReqRecv, AckSend) | Verwendung: Kommunikationssteuerung eines Gerätes (Abschalten der Nachrichtenverarbeitung) Mögliche Fehler: Fehlerbehandlung: |
ReinitializeDevice-B (ReqRecv, AckSend) | Verwendung: Initiiert einen Geräteneustart oder ändert den Gerätestatus in den Backup- oder Restore-Modus. Mögliche Fehler: Fehlerbehandlung: |
ReadRange-B (ReqRecv, AckSend) | Verwendung: Auslesen von Listen (speziell die Property LogBuffer) Mögliche Fehler: |
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: Fehlerbehandlung: |
SubscribeCOVP-B (ReqRecv, AckSend) | Verwendung: Empfang eines Abonnements einer Wertänderung (COV-P) mit beliebigen Objekten und Properties. Mögliche Fehler: Fehlerbehandlung: |
GetEventInformation-B (ReqRecv, AckSend) | Verwendung: Abrufen einer Zusammenfassung aller Objekte im Eventzustand Mögliche Fehler: |
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: |
IAm-B (ReqRecv) | Verwendung: Bekanntmachung eines Gerätes aus dem Netzwerk Mögliche Fehler: Fehlerbehandlung: |
IHave-A (ReqSend) | Verwendung: Meldet ein im Netzwerk gesuchtes Objekt Mögliche Fehler: |
UnconfirmedCOVNotification-A (ReqSend) | Verwendung: Gegenstelle hat Wertänderung abonniert. Dienst sendet unbestätigte Nachricht bei Änderung. Mögliche Fehler: Fehlerbehandlung: |
UnconfirmedCOVNotification-B (ReqRecv) | Verwendung: Unbestätigter Empfang einer Wertänderung Mögliche Fehler: |
UnconfirmedEventNotification-A (ReqSend) | Verwendung: Unbestätigte Nachricht bei Änderung eines Ereigniszustands (Instrinsic Reporting) Mögliche Fehler: Fehlerbehandlung: |
UnconfirmedEventNotification-B (ReqRecv) | Verwendung: Unbestätigter Empfang von Ereignismeldungen in der Notification Sink Mögliche Fehler: |
TimeSynchronisation-B (ReqRecv) | Verwendung: Empfang eines Zeitstempels zur Zeitsynchronisation Mögliche Fehler: Fehlerbehandlung: |
WhoHas-B (ReqRecv) | Verwendung: Suche nach bestimmten Objekten in einem Netzwerk Mögliche Fehler: |
WhoIs-A (ReqSend) | Verwendung: Scannen eines Netzwerkes nach Teilnehmer und Abfragen der Gerätekommunikationsparameter Mögliche Fehler: |
WhoIs-B (ReqRecv) | Verwendung: Abfrage des Servers nach Gerätekommunikationsparametern Mögliche Fehler: |
UTCTimeSynchronisation-A (ReqSend) | Verwendung: Senden eines UTC-Zeitstempels zur Zeitsynchronisation Mögliche Fehler: |
UTCTimeSynchronisation-B (ReqRecv) | Verwendung: Empfang eines UTC-Zeitstempels zur Zeitsynchronisation Mögliche Fehler: Fehlerbehandlung: |
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.
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: |
nFrameAllocFailCnt | Zweck: Gibt an, wie oft kein Speicher zum Versenden von BACnet-Nachrichten allokiert werden konnte. Problemindikator: |
nFrameSendCnt | Zweck: |
nFrameSendFailCnt | Zweck: Gibt an, wie viele BACnet-Nachrichten nicht versendet werden konnten. Problemindikator: |
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: |
nLinkStatusChangedCnt | Zweck: Gibt an, wie oft der LinkStatus des Netzwerk-Adapters gewechselt hat. Problemindikator: |
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 | 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: |
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: |
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: |
nRecvSegmUDPFramesListSize | 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: |
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: |
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: Problemindikator:
|
nOpenRequests nFreeOpenRequestData nRequestRetries nRequestTimeOuts | Zweck: Problemindikator: |
nCyclicCovRequests | Zweck: |
nCyclicReadPollingRequests nFailedReadRequests | Zweck: |
nCyclicWriteRequestsnFailedWriteRequests | Zweck: |