BACnet Objekte und Properties
Allgemeines zur Handhabung
Zu jedem BACnet-Objekt gehören eine definierte Anzahl Properties. Diese Properties werden auf BACnet-Serverseite offline konfiguriert und im Betrieb (RUN oder Free RUN) anderen BACnet-Teilnehmern im BACnet-Netzwerk zur Verfügung gestellt. Im Reiter "Settings" werden diese Offline-Daten, bzw. Initialwerte, der Objekt-Properties angezeigt. Im Reiter "Online" sind die aktuellen Werte der Objekt-Properties zur Laufzeit zu sehen. Einige Properties sind schreibgeschützt und an dem Schloss-Symbol erkennbar , diese sind nicht änderbar.

Jede Objekt-Property hat eine eindeutige Nummer. Anhand der Nummerierung werden Properties in TwinCAT BACnet/IP in folgende Gruppen unterteilt:
- Property-Identifier 0...511: BACnet standardkonforme Properties:
- definiert in ISO 16484-5
- festgelegtes definiertes herstellerübergreifendes Verhalten
- teilweise offline projektierbar, teilweise nur Repräsentation eines online Zustands
- Property-Identifier 512...799: Herstellerspezifische Properties mit BACnet Sichtbarkeit:
- im BACnet-Netzwerk als Properties der entsprechenden Objekte sichtbar
- Property-Identifier 800...1000: Herstellerspezifische Properties ohne BACnet Sichtbarkeit:
- dienen der Konfiguration interner Parameter die ohne BACnet Relevanz sind, aber Objekten als Parameter zugeordnet sind
- Konfigurierbar im Reiter "Settings" entsprechender Objekte; im Reiter "Online" nicht sichtbar
- u.a. Fallbackwerte für I/O-Module
- Property-Identifier >1000: Interne Properties ohne BACnet Sichtbarkeit:
- weder im "Settings"- noch "Online"-Dialog sichtbar
- interne Verwendung für spezielle Prozessdaten (z.B. "RawIo*")
- Verwendung im SPS-Automapping für prioritätsbasierte Verknüpfungen sowie einer Device-ID
In der Online Ansicht kann mit einem Mausrechtsklick ein Kontextmenü geöffnet werden.
Mit dem Menüeintrag „Read Property Data“ kann der Wert einer einzelnen Property eingelesen werden.
![]() | ReadPropertyAll Die Gesamtansicht wird mit dem BACnet-Dienst ReadPropertyAll gelesen. Wird dieser Dienst von einem Gerät nicht unterstützt, dann werden die Properties einzeln gelesen. |
Mit der Funktion Auto-Update werden alle Properties in einem Intervall von 1 Sekunde neu eingelesen und dargestellt. Damit müssen die einzelnen Properties nicht mehr mit dem Menüeintrag "Read Property Data" explizit gelesen werden. Diese Funktion ist per Default aktiviert.
Bei Listen- und Array- Properties können mit Hilfe von „Add“ und „Remove“ Elemente hinzugefügt bzw. entfernt werden.

Im Default-Fall werden Änderungen der Property-Daten sofort geschrieben. Mit der Deaktivierung der Funktion „Auto Commit“, können Daten manipuliert werden, ohne ein sofortiges Schreiben auszulösen. Damit können komplexe Änderungen an Properties vorgenommen werden (z. B. an der Property ExceptionSchedule) und die Änderungen anschließend insgesamt geschrieben werden. Derart editierte Properties sind mit einem Stift auf der linken Seite markiert bis die Änderungen geschrieben wurden. Mit dem Kontextmenü „Write Property Data“ können die Änderungen dann geschrieben werden. Bitte beachten: Momentan wird hier nicht WritePropertyMultiple verwendet, sondern einzelne WriteProperty-Aufrufe.

Hinweis | |
Auto Update deaktivieren! Bei deaktiviertem „Auto Commit“ sollte auch die Funktion „Auto Update“ deaktiviert werden, da sonst schon editierte Daten beim Wiederauslesen überschrieben werden. |
Bestimmte Objekte besitzen kommandierbare Properties. Bei diesen kann mit Angabe einer Priorität die Wertigkeit eines Schreibzugriffs festgelegt werden. Dieser Wert wird über den mit der Priorität verknüpften Index in das PriorityArray geschrieben.

Das PriorityArray kann zudem direkt beschrieben werden. Alle Einträge mit dem Wert "(Null)" werden nicht berücksichtigt. Einträge mit konkretem Datentyp und gültigem Wert wirken, je nach Priorisierung, auf das zugehörige, kommandierbare Property oder werden von einem anderen Eintrag mit höherer Priorität übersteuert. Die Einträge aus dem PriorityArray bestimmen dann z. B. den Wert das PresentValue eines BinaryOutput-Objekts.

Um einen Eintrag aus dem PriorityArray zu entfernen, muss der Typ in der Spalte "Type" auf NULL gestellt werden. Zudem kann ein Eintrag aus dem PriorityArray mittels Kontextmenü der kommandierbaren Property gelöscht werden. Dazu muss als Typ NULL angewählt und mittels "Write Property Data" auf die entsprechende Priorität geschrieben bzw. mit "Auto Commit" automatisch geschrieben werden.
Konfiguration optionaler Properties und Property-Schreibschutz
Im BACnet-Standard sind die Standardobjekte und deren Properties definiert (Property-Identifier 0 - 511). Einige Properties sind dort als optional gekennzeichnet und andere als "Pflicht-Properties". Um eine möglichst hohe Flexibilität bei der Konfiguration von Objekten zu erreichen, besteht in der Objektansicht im Reiter "Optional Properties" die Möglichkeit, optionale Properties ein- bzw. auszublenden und die Zugriffsart, soweit erlaubt, einzuschränken (nur lesend oder lesend/schreibend).

![]() | Angaben hinter dem Property-Namen (R/W/O) Die Angabe hinter dem Property-Namen (R/W/O) gibt die minimale Zugriffsberechtigung laut BACnet-Spezifikation an. Dabei steht "R" für lesbare (oder höhere) Properties, "W" für schreib- und lesbare und "O" für optional les- und/oder schreibbare Properties. Die Zahlenkennzeichnung von optionalen Properties gibt die Abhängigkeit zueinander an. Optionale Properties mit derselben Nummer können nur als Gruppe aktiviert oder deaktiviert werden. Abweichend von der BACnet-Spezifikation sind einige optionale Properties in TwinCAT BACnet/IP Pflicht und damit nicht abwählbar. Dies ist in der internen Implementierung begründet. |
Bei einigen Properties kann zudem der Schreibzugriff festgelegt werden. Das Symbol "grünes, geöffnetes Schloss" symbolisiert Schreibberechtigung. Das Symbol "rotes, geschlossenes Schloss"
bedeutet nur Leseberechtigung. Durch Klick auf das Symbol toggelt der Zustand. Bei "ausgegrautem" Symbol ist die Umstellung der Berechtigung nicht möglich. Die Zugriffsberechtigung ist an der Kennzeichnung "W" bzw. "R" oder am ausgegrauten Schlosssymbol erkennbar ("W" bzw. "geöffnetes, graues Schloss = Schreib- und Leseberechtigung / "R" bzw. geschlossenes, graues Schloss = nur Leseberechtigung).
Die Verfügbarkeit von optionalen Properties kann durch Klick auf das Checkbox-Symbol gesteuert werden. Durch Abwahl der Checkbox wird die zugehörige Property deaktiviert.
Herstellerspezifische Properties
TwinCAT BACnet/IP verwendet eine Reihe herstellerspezifischer Properties, die im Folgenden genauer erläutert werden sollen. Dabei werden herstellerspezifische Properties unterschieden durch ihre Property-IDs. Properties im Bereich 512 bis 799 sind BACnet-weit sichtbar. Properties in höheren Bereichen werden für die Konfiguration innerhalb von TwinCAT BACnet/IP verwendet; via BACnet aber nicht angezeigt. Diese Properties sind nur im Reiter "Settings" sichtbar - nicht aber im Reiter "Online".
ScaleOffset (512) | ScaleOffset wird bei AnalogInput- und AnalogOutput-Objekten verwendet und bestimmt den Offset bei der Umrechnung vom Hardware-Wertbereich nach BACnet und umgekehrt. Für AnalogInput-Objekte gilt: PresentValue = RawIoSingedValue * Resolution + ScaleOffset Die gleichen Berechnungsalgorithmen gelten für die Prozessdaten-Properties RawIoUnsingedValue. |
IoBusNr [0..255] (513) | IoBusNr wird für die Abbildung eines Feldbus-Zustands u.a. beim K-Bus I/O-Automapping verwendet. Details hierzu können in den Abschnitten IO Automapping und Prozessdaten nachgelesen werden. Der 255 gibt an, dass ein BACnet-Objekt keinem IoBus zugeordnet ist. |
IoModuleNr [0..65535] (514) | IoModuleNr gibt die Position einer Klemme innerhalb eines I/O-Bus an. Beim I/O-Automapping wird mit 1 beginnend durchnummeriert. Diese Property hat rein informativen Charakter und wird im BACnet-Stack nicht verwendet. |
IoModuleChn [0..255] (515) | IoModuleChn gibt die Kanalnummer einer I/O-Klemme an. Beim I/O-Automapping wird mit 1 beginnend durchnummeriert. Diese Property hat rein informativen Charakter und wird im BACnet-Stack nicht verwendet. |
PersistentData (516) | PersistentData gibt an, ob seit dem letzten Speichern persistenter Daten Änderungen aufgetreten sind. Zusätzlich kann über diese Property via BACnet das Speichern persistenter Daten ausgelöst werden. Details zu dieser Property finden sich im Abschnitt Persistente Daten. Diese Property ist nur sichtbar, wenn persistente Daten aktiviert wurden und die Konfiguration im RUN Modus geladen wurde. |
ActivePriority (517) | ActivePriority gibt bei Objekten mit kommandierbaren PresentValue-Properties an, welche Prioritätsstufe gerade aktiv ist. Sind alle Einträge im PriorityArray = NULL ist der Wert von ActivePriority = 17 und ReliquishDefault wird als Wert für das PresentValue verwendet. |
LastConfirmedServiceAccess (518) | Mit Hilfe der Property LastConfirmedServiceAccess des Device-Objekts wird in Form einer Zeichenkette die IP-Adresse des letzten erfolgreich ausgeführten bestätigten Dienstens (z.B. Property lesen, schreiben) angezeigt. Über ein TrendLog-Objekt im COV-Modus kann so ein Zugriffslog eingerichtet werden, der die Zugriffe im Netzwerk dokumentiert. |
DataRequestMode (519) | Beim EventEnrollment-Objekt externe Objekte überwacht werden. Mit Hilfe dieser Properties kann die Datenübertragungsmethode eines EventEnrollment-Objektes konfiguriert werden. Die Property DataRequestMode vom Datentyp Enum legt fest über welchen Dienst Daten gelesen werden (ReadProperty, COV, ReadPropertyMultiple). Die Property DataPollingInterval legt fest in welchem zeitlich Abstand bei den Übertragungsarten ReadProperty und ReadPropertyMultiple Daten angefordert werden. EnrollmentCovResubscriptionInterval legt das ResubscriptionIntervall für den Modus COV fest. |
FileName (522) | Beim File-Objekt wird die zugehörige Datei über die Property ObjectName identifiziert. Wird aber vom Betreiber ein festes Namensschema auch für File-Objekt vorgeschrieben, ist die Zuordnung der Datei über die Property ObjectName nicht mehr möglich. Die Property FileName kann optional aktiviert werden. Wenn diese Property aktiv ist, wird über den Wert der Zeichenkette die zugehörige Datei, die sich immer relativ zum Boot-Ordner befindet, zugeordnet und die Property ObjectName kann frei verwendet werden. |
Voraussetzungen
FaultFallbackRealValue (802) | FaultFallbackRealValue kann bei AnalogInput-Objekten verwendet werden, um im Falle eines I/O-Bus-Fehlers einer übergelagerten SPS bzw. BACnet gültige Werte zu liefern. Wird ein IoBus-Fehler festgestellt werden von TwinCAT BACnet/IP nicht mehr die entsprechenden Prozessdaten des Feldbus, sondern die konfigurierte Fallbackwert kopiert.
Der Fallbackwert kann im Reiter "Settings" aktiviert werden indem der entsprechende Haken des optionalen Wertes aktiviert wird. Ist ein Fallbackwert nicht aktiv, werden bei einem IoBus-Fehler keine Prozessdaten mehr kopiert und der letzte gültige Wert ist aktiv. | |
FaultFallbackBinaryValue (803) | FaultFallbackBinaryValue hat die gleiche Bedeutung wie FaultFallbackValueReal und wird bei BinaryInput-Objekten verwendet. | |
OutOfServiceFallbackRealValue (804) | OutOfServiceFallbackRealValue kann verwendet werden um gültige Ausgangsprozessdaten zu erzeugen wenn ein AnalogOutput-Objekt OutOfService geschaltet wird. Ist OutOfServiceFallbackRealValue aktiv wird der entsprechende Wert für die I/O-Prozessdaten verwendet, andernfalls wird beim aktivem OutOfService der letzte gültige PresentValue-Wert verwendet. | |
OutOfServiceFallbackBinaryValue (805) | OutOfServiceFallbackBinaryValue hat die gleiche Bedeutung wie OutOfServiceFallbackRealValue und wird bei BinaryOutput-Objekten verwendet. | |
TimeSynchronizationUseUTC (806) | TimeSynchronizationUseUTC wird bei Konfiguration eines TimeMasters verwendet und gibt an ob beim Versenden von Synchronizationstelegrammen an die TimeSynchronizationRecipients der TimeSynchronization-Dienst oder UTCTimeSynchronization-Dienst verwendet wird. TimeMaster-spezifische Properties sind in der von TwinCAT BACnet/IP implementierten Revision 6 noch nicht vorhanden. In diesem Zusammenhang werden von TwinCAT BACnet/IP aber die standardkonformen Properties AlignIntervals, IntervalOffset und TimeSynchronizationInterval ohne BACnet-Sichtbarkeit implementiert. Die Property TimeSynchronizationInterval (204) gibt an in welchem Abstand (in Minuten) Zeitsynchronisationstelegramme versendet werden. Ist der Wert dieser Property 0 ist die TimeMaster-Funktion deaktiviert. Mit Hilfe der Property AlignIntervals (193) wird die Property IntervalOffset (195) freigeschaltet, über die festgelegt werden kann wann genau Zeitsynchronisationstelegramme versendet werden. Hat die Property TimeSynchronizationInterval einen durch 60 teilbaren Wert, werden Zeitsynchronisationstelegramme versendet, wenn die aktuelle Uhrzeit in Minuten Modulo dem Wert von TimeSynchronizationInterval dem Wert von IntervalOffset entspricht. Im folgenden Beispiel ist die Konfiguration eines Timemasters erläutert, der jeden Tag um 2 Uhr Nachts UTC-Zeitsynchronisationstelegramme an alle BACnet-Geräte im Netzwerk versendet: TimeSynchronizationUseUTC = TRUE | |
PredictScheduleValueTime [sec] (807) | In der Gebäudeautomatisierung können heiz- und klimatechnische Anlagen durch ein "optimiertes/gleitendes" Einschalten Energie sparen. Wird z.B. eine Solltemperatur von 21°C um 8.00 Uhr gefordert, kann eine Heizung je nach Jahreszeit früher oder später aktiviert werden. Bei sehr niedrigen Außentemperaturen muss früher als bei höheren Außentemperaturen geheizt werden. Mit entsprechenden mathematischen Formel oder lernenden Systemen kann berechnet werden wieviel im Voraus eine Analage aktiviert werden muss. | |
AccumulatorIntegrationMode (811) | Mit dem Accumulator-Objekt können über die Prozessdaten-Property RawIoAccumulatorValueUSINT Zählwerte akkumuliert werden. Im normalen Modus wird dabei der Zählwert des Accumulators um 1 erhöht wenn sich der Wert von RawIoAccumulatorValueUSINT um 1 erhöht. Für die Messung von Mengen pro Zeit kann der Integrationsmodus akiviert werden. Dann wird der Zählwert des Accumulators erhöht wenn der Wert von RawIoAccumulatorValueUSINT über eine Millisekunde 1 war. Mit dieser Funktionalität kann z.B. eine Luftmenge berechnet werden, wenn RawIoAccumulatorValueUSINT mit dem aktuellen Luftstrom verknüpft wird. Die Zeitbasis ist dabei 1 ms. Mit Hilfe der BACnet-Property PreScale können Skalierungen z.B. auf eine Stundenbasis vorgenommen werden. | |
AvgFilterCycles (812) | Bei analogen Eingangswerten kann es auf Grund von langen Leitungen oder Störeinflüssen leicht zu schwankenden Werten kommen. BACnet bietet bei AnalogInput-Objekten die Möglichkeit die Übertragung von Wertänderungen durch die Property CovIncrement zu begrenzen. Liegen die Schwankungen aber über der darzustellenden Auflösung von Werten kann es sinnvoll sein, die analogen Eingangswerte durch Filter zu glätten. Mit der Property AvgFilterCycles kann ein mittelwertbildender Filter für AnalogInput-Objekte aktiviert werden, der über AvgFilterCycles Zyklen den Mittelwert des Raw-Wertes bildet. Bei ein BACnet-Zykluszeit von 50ms, bedeutet ein Wert von AvgFilterCycles = 20 einen Filter über 1 Sekunde. | |
FaultDeadband (813) | Ein weiteres Problem von schwankenden Analogwerten, ist ein mögliches Verlassen eines als gültig definierten Wertebereichs. Beim AnalogInput-Objekten bestimmen die Properties MinPresValue und MaxPresValue ein gültiges Band innerhalb dessen sich der Wert der Property PresentValue befinden darf. Liegt der aus dem Raw*-Wert sklalierte Wert außerhalb des definierten Bereichs geht das BACnet-Objekt in den Fault-State. Da die Properties MinPresValue und MaxPresValue auch von der Leittechnik als Wertebereich ausgelesen werden, sollten diese Grenzwerte nicht verschoben werden, um leicht unter die Grenze schwankende Werte noch als gültig zu tolerieren. Mit Hilfe der Property FaultDeadband kann ähnlich der Property Deadband, die den Übergang in den OffNormal-Zustand bestimmt, eine erweiterte Grenze des Fault-Zustandes festgelegt werden. Unterschreitet der durch die Skalierung berechnete Wert den Wert von MinPresValue um weniger als FaultDeadband, wird das PresentValue den Wert MinPresValue annehmen und das Objekt nicht in den Fault-Zustand wechseln. Die genaue Berechnungsformel ist wie folgt implementiert: | |
Beispiel: |
| |
Pt1DampFactor [0..1] (814) | Ähnlich der Property AvgFilterCycles kann mit Hilfe der Property Pt1DampFactor ein analoger Eingangsfilter aktiviert werden. Der Pt1-Filter wird nach der Skalierung angewendet und dämpft den Analogwert. Der Dämpfungsfaktor kann Werte zwischen 0 und 1 annehmen. Bei 1 findet keine Filterung statt, bei einem Wert von 0 wird der neue Eingangswert erst im Unendlichen angenommen. Sinnvolle Werte können z.B. 0,01 oder 0,001 sein. Über ein TrendLog-Objekt kann die Wirkung des Filters leicht für eine einfache Impulsantwort überprüft werden. (Raw-Wert von 0 auf 1 ändern). Die implementierte Formel lautet: | |
EnableInternalLoopCtrl (815) | Über die Property EnableInternalLoopCtrl kann ein interner Regelungsalgorithmus im Loop-Objekt aktiviert werden. Im Normalfall wurde das Loop als leere Hülle für einen in der SPS implementierten Regler umgesetzt. Um auch die dynamische Erzeugung von Loop-Objekten unterstützen zu können, wurde eine Basisregelung in den BACnet-Stack integriert. Dieser PID-Regler verknüpft die P,I und D-Anteile additive und setzt eine Begrenzung für den Integral- sowie den Summenanteil um. Im folgende ist die implementierte Formel des Loop-Objekts bei aktvierter (und auf TRUE gesetzer) Property EnableInternalLoopCtrl dargestellt: IF (Action = = direct) E = W - X IF (Action = = reverse) E = X - W Yp = Kp * E // Proportional Yi = Yi(n-1) + (Ki * tCycle * E) // Integral Max >= Yi >= Min // Anti-Wind-Up Yd = Kd * (E – E(n-1)) / tCycle // Differenzial Y = Yp + Yi + Yd + Bias Max >= Y >= Min // Ausgangslimitierung | |
Pt1DerivativeDampFactor [0..∞] (816) | Um Sprünge bei der Sollwertvorgabe des intern implementierten Regelalgorithmus im Loop-Objekt abzufangen, kann der Fehlerwert (E) des D-Anteils über einen Pt1-Faktor gedämpft werden. Dies ermöglicht die Wirkung des D-Anteils bei Sollwertsprüngen zu verstärken. |