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:
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. 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:
|
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:
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 |
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:
|
0x81000000 | immer 0 | Dynamisch erzeugtes Objekt löschen. Folgende Daten müssen beim Write-Request übergeben werden:
|
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
| 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. |
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:
- Der IndexOffset enthält die Objekt-ID des gewünschten Objekts
- Bit 0-21 der IndexGroup enthält die Property-ID der gewünschten BACnet-Property
- Bit 22-30 der IndexGroup enthält den Gruppentyp, der die jeweilige Funktionalität beschreibt
- Bit 31 der IndexGroup ist immer 1 und aktiviert den Gruppentyp-Modus für die Nutzung der Property-spezifischen Dienste
ADS-Read
IndexGroup | IndexOffset | Beschreibung |
---|---|---|
0x80000000 + Property-ID Gruppentyp (Bit 22-30): 0 | Objekt-ID
| 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
| 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
| Auslesen der Datenlänge des aktuellen Property-Wertes. |
0x80C00000 + Property-ID Gruppentyp (Bit 22-30): 3 | Objekt-ID
| Auslesen der Schreibschutzeigenschaft einer Property. Die ausgelesenen Daten werden wie folgt interpretiert:
|
0x81400000 + Property-ID Gruppentyp (Bit 22-30): 5 | Objekt-ID
| Auslesen der Anzahl der Elemente von Listen- und Arraytypen. |
AdsWrite
IndexGroup | IndexOffset | Beschreibung |
---|---|---|
0x80000000 + Property-ID | Objekt-ID
| 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
| Schreibzugriff mit Priorität 1. |
... |
|
|
0xC0000000 + Property-ID | Objekt-ID
| 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.