ADS-Interface

Sämtliche azyklischen Daten werden mit ADS-Read, ADS-Write, ADS-ReadWrite oder ADS-Write-Control an ein BACnet-Device, eine Notification Sink, einen BACnet-Server bzw. einen BACnet-Client übertragen. Ein BACnet-Device hat eine eigene Net-ID, die über den Reiter "Settings" angezeigt wird und unterstützt die folgenden Ports:

Port

Beschreibung

0xFFFF

damit wird das BACnet-Device selbst adressiert, d.h. Daten die nicht spezifisch für einen BACnet-Server, eine Notification Sink oder einen BACnet-Client sind

1000 - 8192

damit wird ein BACnet-Server, eine Notification Sink oder BACnet-Client adressiert, wobei z.B. der erste angelegte BACnet-Server/Client über den Port 1000 erreicht werden kann, der 2. BACnet-Client über Port 1001. Das Löschen eines BACnet-Server/Client führt nicht zum Verschieben der Ports, die Zuordnung der ADS-Ports kann also nicht zwangsläufig an der Reihenfolge im System-Manager abgeleitet werden. Der jeweilige Port kann über den Reiter "Settings" eines BACnet-Server/Client eingesehen werden.

IndexGroup/IndexOffset bei lokaler Adressierung des BACnet-Device (Port 0xFFFF)

ADS-Read

Es folgt eine Übersicht der von einem BACnet-Device unterstützten IndexGroup/IndexOffset bei ADS-Read.

IndexGroup (Lo-Word)

IndexOffset

Beschreibung

0x80000006

immer 0

Starten eines Scans nach anderen BACnet-Geräten im Netzwerk.

0x80000008

immer 0

Stoppen eines Scans nach anderen BACnet-Geräten im Netzwerk. Vorbereitung auf das Auslesen der Ergebnisliste.

0x80000007

0 : Anzahl der Einträge in der Ergebnisliste

(Anzahl der Clients*2)

2*n : IP-Adresse von Gerät n

2*n+1: Device-ID von Gerät n

0xffffffff

Ein Scan-Vorgang mit Hilfe des BACnet-Device erfolgt nach dem Schema:

  1. Starten des Scans
  2. Abwarten eines beliebigen Timeouts
  3. Stoppen des Scans
  4. Lesen der Scan-Ergebnisliste

Das Auslesen der Scan-Ergebnisse erfolgt über diese IndexGruppe. Über den IndexOffset 0 kann die Anzahl der Einträge in der Ergebnisliste ermittelt werden. Diese entspricht der doppelten Anzahl der gefundenen BACnet-Geräte im Netzwerk. Gerade IndexOffset > 0 adressieren die IP-Adresse eines Geräts; ungerade IndexOffset adressieren die Device-ID des Geräts. Vor dem Auslesen der Ergebnisliste muss der Scan-Vorgang gestoppt werden.

Werden z.B. in einem Netzwerk 2 Geräte gefunden, ergibt die Abfrage von Index 0 eine 4. Über IndexOffset 1 die Device-ID von Gerät 1, IndexOffset die IP-Adresse von Gerät 1, IndexOffset 3 die Device-ID von Gerät 2 und IndexOffset 4 die IP-Adresse von Gerät 2.

Auslesen der im Server vorhandenen Objekte. Es wird ein Array vom Typ BACnetScanResult mit der Anzahl der gefundenen Clients zurückgegeben:

enum BACnetAddressChoice { Ethernet,Arcnet,MsTp,LonTalk,LonTalkNeuronId, Address_3,Address_4,Address_5,Broadcast }

struct BACnetAddress { BACnetAddressChoice choice; BYTE layerAddress[7]; // MS/TP...LonTalk BYTE reserved; USHORT network_number; }

structBACnetScanResult { BACnetObjectIdentifier deviceObjIdentifier; BACnetAddress netAddress; ULONG IPadress; WORD UdpPort; WORD vendorId; BYTE ethernetMacAddr[6]; }

0x8000000A

immer 0

Starten eines Backup. (Auslösen des BACnet-Dienstes Backup Start)

0x8000001A

immer 0

Beenden eines Backup. (Auslösen des BACnet-Dienstes Backup End) Zwischen Backup-Start und -End können mit Hilfe der Property ConfigurationFiles des Device-Objekts und des ADS-File-Dienstes die erzeugten Backup-Dateien gesichert werden.

0x8000002A

immer 0

Starten eines Restore. (Auslösen des BACnet-Dienstes Restore Start)

0x8000003A

immer 0

Beenden eines Restore (Auslösen des BACnet-Dienstes Restore End)

0x8000004A

immer 0

Abbruch eines Restore (Auslösen des BACnet-Dienstes Restore Abort)

0x8000005A

immer 0

Neustart des TwinCAT-Rechners (Auslösen des BACnet-Dienstes Cold Start)

0x8000006A

immer 0

Restart von TwinCAT (Auslösen des BACnet-Dienstes Warm Start)

0x8000000C

immer 0

Auslesen des Supplement-Key Status:

  • 0x0000000 - Supplement-Key ist nicht gültig
  • 0x0000001 - Supplement-Key ist gültig

0x8000000D

immer 0

Auslesen der aktuellen Foreign Device Table (FDT) als Array vom Typ FDTEntry:

struct FDTEntry { ULONG ipAddr; USHORT udpPort; USHORT nTtlSecs; USHORT nPurgeSecs; // seconds until entry is deleted USHORT reserved; // alignment }

0x8000000E

immer 0

Auslesen der aktuellen Broadcast Distribution Table (BDT) als Array vom Typ BDTEntry:

struct BDTEntry { ULONG ipAddr; ULONG mask; USHORT udpPort; USHORT reserved; // alignment }

0x8000000F

immer 0

Auslesen der BACnet-Diagnose der Form BACnetDiagnosis. (Siehe Reiter "Diagnosis" vom BACnet-Device)

0x8000001F

immer 0

Auslesen der Advanced Parameter in der Form Advanced Parameters

struct AdvancedParameters { ULONG ap_MAX_SUBSCRIBE_COV_ENTRIES; ULONG ap_MAX_PROPERTY_ELEMENTS; ULONG ap_LIST_ALLOC_MEM_BYTES; ULONG ap_MAX_DEVICE_BINDINGS; ULONG ap_HASHTABLE_MAX_OBJECTS; ULONG ap_HASHTABLE_MAX_CLIENTS; ULONG ap_MAX_TASK_LIST_ENTRIES; ULONG ap_MAX_TRENDLOG_ENTRYSIZE; ULONG ap_DYN_TRENDLOG_BUFFERSIZE; ULONG ap_MAX_MULTISTATE_DYNSTATES; ULONG ap_BACNET_MAX_RECV_BAC_SEGM_FRAMES; ULONG ap_BACNET_MAX_SEND_BAC_SEGM_FRAMES; ULONG ap_IO_STARTUP_TIMEOUT; }

ADS-Write

Es folgt eine Übersicht der von einem BACnet-Device unterstützten IndexGroup/IndexOffset bei ADS-Write.

IndexGroup

IndexOffset

Beschreibung

0x8000002D

immer 0

Auslösen einer globalen Broadcast UTC-Synchronisation. Als Daten muss ein gültiger BACnetDateTime-Zeitstempel übergeben werden.

struct BACnetTime { BYTE hour; BYTE minute; BYTE second; BYTE hundredths; }

structBACnetDate { BYTE year; BYTE month; BYTE day; BYTE dayOfWeek; }

structBACnetDateTime { BACnetDate date; BACnetTime time; }

0x8000000F

immer 0

BACnet Diagnose Steuerung:

Übergebene Datengröße 4:

  • 0x00000000 : Zeitmessung deaktivieren
  • 0x00000001 : Zeitmessung aktivieren

Datengröße ungleich 4: Zurücksetzen der BACnet Diagnose

0x8000000E

immer 0

Schreiben der Broadcast Distribution Table (BDT) als Array der Form BDTEntry:

struct BDTEntry { ULONG ipAddr; ULONG mask; USHORT udpPort; USHORT reserved; // alignment }

IndexGroup/IndexOffset bei Adressierung eines BACnet-Server (Port 1000-8191)

ADS-Read

IndexGroup

IndexOffset

Beschreibung

0x82400000

0 Anzahl der Listeneinträge

> 0 und < 0xffffffff

Auslesen der im Server vorhandenen Objekte. Die auf einem Server angelegten Objekte können zusätzlich durch das Auslesen der Property ObjectList des Device-Objekts ermittelt werden.

Index 0: Anzahl der Einträge
Index n*2: Objekt-Typ für Eintrag n
Index n*2+1: Objekt-Instanz für Eintrag n

0x83400000

immer 0

Auslesen der Liste der dynamisch erzeugten Objekte. Pro Objekt enthält die Liste einen 4 Byte Eintrag, der die jeweilige Objekt-ID enthält.

ADS-Write

IndexGroup

IndexOffset

Beschreibung

0x80800000

immer 0

Objekt dynamisch erzeugen. Folgende Daten müssen beim Write-Request übergeben werden, um die Objekterzeugung zu parametrieren:

  • 4 Byte Objekttyp
  • 4 Byte Objekt-ID (Objekttyp der Objekt-ID muss dem Objekttyp übereinstimmen)
  • 4 Byte Flags (0x00000001 entferntes Objekt (bei Client) , 0x00000000 lokales Objekt (bei Server))
  • 8 Byte 0x00 für eine leere Liste von initialen Parametern; bzw. eine Liste mit initialen Parametern mit dem Datentyp ReadPropertyMultipleResult

0x81000000

immer 0

Dynamisch erzeugtes Objekt löschen. Folgende Daten müssen beim Write-Request übergeben werden:

  • 4 Byte Objekttyp
  • 4 Byte Objekt-ID (Objekttyp der Objekt-ID muss mit dem Objekttyp übereinstimmen)
  • 4 Byte Flags (0x00000001 entferntes Objekt (bei Client) , 0x00000000 lokales Objekt (bei Server))
  • 8 Byte 0x00

0x80C00000

immer 0

Abspeichern der persistenten Daten auslösen. Nur gültig für BACnet-Server wenn Persist Online Data aktiv ist.

ADS-ReadWrite

IndexGroup

IndexOffset

Beschreibung

0x82C00000

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Auslesen der Property-Liste eines Objekts. Mit diesem Dienst werden alle Properties eines Objekts ähnlich des BACnet-Dienstes ReadPropertyMultiple zusammenfasst. Beim Aufruf des ADS-ReadWrite-Kommandos muss eine Liste mit den gewünschten Properties übergeben werden.

Momentan wird nur das Auslösen der kompletten Liste unterstützt. Hierfür müssen 4 Bytes mit dem Wert 0x00000008 übergeben werden.
Als Ergebnis wird eine Liste vom Typ ReadPropertyMultipleResult übergeben. Die Liste enthält jeweils einen Listen-Header, eine Property-ID gefolgt von den Daten der Property.

0x8B800000

immer 0

Abfrage der Objekt-ID mit dem Namen eines Objekts. Es muss der Name des gesuchten Objekts als ASCII-String geschrieben werden. Als Rückgabe wird die zugehörige Objekt-ID (4 Byte) zurückgegeben. Wird ein Objekt nicht gefunden wird der ADS-Fehler NOT_FOUND zurückgegeben.

IndexGroup bei Adressierung eines BACnet-Server/Client (Port 1000-8191) - Property-Zugriff

Property-spezifische ADS-Dienste können mit einer IndexGroup/IndexOffset mit folgendem Schema verwendet werden:

ADS-Read

IndexGroup

IndexOffset

Beschreibung

0x80000000 + Property-ID

Gruppentyp (Bit 22-30): 0

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Auslesen der aktuellen Daten einer Property.

Beispiel: Die Property PresentValue des Objekts BinaryInput:42 kann via: IndexGroup: 0x80000055 und IndexOffset: 0x00C0002A ausgelesen werden.

0x80400000 + Property-ID

Gruppentyp (Bit 22-30): 1

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Auslesen des BACnet-Datentyps einer Property. Die Liste der Datentyp-Codierung findet sich im Anhang.

0x80800000 + Property-ID

Gruppentyp (Bit 22-30): 2

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Auslesen der Datenlänge des aktuellen Property-Wertes.

0x80C00000 + Property-ID

Gruppentyp (Bit 22-30): 3

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Auslesen der Schreibschutzeigenschaft einer Property. Die ausgelesenen Daten werden wie folgt interpretiert:

  • 0x00 Property-Wert kann beschrieben werden
  • 0x01 Property-Wert ist schreibgeschützt

0x81400000 + Property-ID

Gruppentyp (Bit 22-30): 5

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Auslesen der Anzahl der Elemente von Listen- und Arraytypen.

AdsWrite

IndexGroup

IndexOffset

Beschreibung

0x80000000 + Property-ID

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Schreiben eines Property-Wertes. Über die Bits 22-30 der IndexGroup kann auch ein priorisierter Schreibzugriff erfolgen. Priorität 1 (höchste Priorität in BACnet) kann über den Wert 0x010 in den Bits 22-30 definiert werden. Priorität 16 (die niedrigste Priorität in BACnet) mit dem Wert 0x100.

0x84000000 + Property-ID

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Schreibzugriff mit Priorität 1.

...

 

 

0xC0000000 + Property-ID

Objekt-ID

  • Bit 0 - 21 : Objektinstanz
  • Bit 22-31 : Objekttyp

Schreibzugriff mit Priorität 16.

IndexGroup bei Adressierung einer Notification Sink (Port 1000-8191)

Über die ADS-Schnittstelle der Notification Sink können u.a. empfangene Event- und COV-Notifications (Meldungen) ausgelesen werden. Bei der Verarbeitung der einzelnen Meldungen werden zwei verschiedene Adressierungsverfahren verwendet. Zum einen kann die Position der Meldung im Puffer verwendet werden (per Nummer). Bei rotierendem Puffer kann es sinnvoll sein die Adressierung der Sequenz-ID zu verwenden. Hierbei wird jeder Meldung beim Empfang eine eindeutige 32-Bit-Nummer zugeordnet. Gehen sehr viele Nachrichten ein, kann so erkannt werden, ob Meldungen verloren gegangen sind. Beim Löschen kann über die Sequenz-ID sichergestellt werden, dass keine durch Rotation verschobene Meldung "aus Versehen" gelöscht wird. Die Sequenz-ID ist beim Auslesen der EventNotifications an Byte-Offset 312 zu finden. Bei COV-Notifications an Byte-Offset 24.

ADS-Read

IndexGroup

IndexOffset

Beschreibung

0x00000001

immer 0

Auslesen der aktuellen Anzahl von Event-Nofitications im Event-Notification-Puffer

0x00000002

immer 0

Auslesen der aktuellen Anzahl von COV-Nofitications im COV-Notification-Puffer

0x00000003

Nummer der Event-Notification

(0 .. Anzahl-1)

Auslesen einer Event-Notification. Die Struktur von Event-Notifications kann u.a. im Online-Dialog der Notification Sink ermittelt werden.

0x00000004

Nummer der COV-Notification

(0 .. Anzahl-1)

Auslesen einer COV-Notification. Die Struktur von COV-Notifications kann u.a. im Online-Dialog der Notification Sink ermittelt werden.

0x00000005

Nummer der Event-Notification

(0 .. Anzahl-1)

Löschen einer Event-Notification

0x00000006

Nummer der COV-Notification

(0 .. Anzahl-1)

Löschen einer COV-Notification

0x00000007

Nummer der Event-Notification

(0 .. Anzahl-1)

Auslesen des Empfangszeitpunkts einer Event-Notification

0x00000008

Nummer der COV-Notification

(0 .. Anzahl-1)

Auslesen des Empfangszeitpunkts einer COV-Notification

0x0000000C

Sequenz-Nr. der Event-Notification

Auslesen einer Event-Notification über eine Sequenz-Nummer

0x0000000D

Sequenz-Nr. der COV-Notification

Auslesen einer COV-Notification über eine Sequenz-Nummer

0x0000000E

Sequenz-Nr. der Event-Notification

Löschen einer Event-Notification über eine Sequenz-Nummer

0x0000000F

Sequenz-Nr. der COV-Notification

Löschen einer COV-Notification über eine Sequenz-Nummer

AdsWrite

IndexGroup

IndexOffset

Beschreibung

0x0000000A

Sequenz-Nr. der zu bestätigenden Event-Notification

Bestätigen einer EventNotification (AcknowledgeAlarm Service). Es wird eine AcknowledgeAlarm-Meldung für die mit der übergebenen Sequenz-Nr. übergegebenen EventNotification gesendet.

0x0000000B

EventNotification-Daten

Bestätigen einer EventNotification (AcknowledgeAlarm Service). Als Daten wird die empfangene EventNotification übergeben, die zuvor ausgelesen wurde.

ADS-Fehlercodes

Der 32-Bit-ADS-Fehlercode besteht immer aus einem allgemeinen ADS-Fehlercode (Lo-Word, siehe ADS-Dokumentation). Die entsprechende Meldung wird auch im Logger des TwinCAT System Managers textuell angezeigt.