Home

News

Schnelleinstieg

Hintergrund

Doku

Bilder

Download

Forum

Kontakt

appl_relais.c: Relaisverarbeitung

Die Relais können eine Vielzahl an Kommandos abarbeiten, einige davon sind Telegramme an das Relais, auf die keine Antwort erwartet wird, andere wiederum erfodern ein Antworttelegramm. Die folgende Tabelle gibt eine Übersicht über die Kommandos, die ein Relais verarbeiten kann. Die anschließende Tabelle legt das Format der Antworttelegramme fest. Einige Kommandos erfordern eine genauere Erklärung, die durch den Link in den beiden Tabellen bzw. durch herunterscrollen erreichbar ist.

Kommando-Anfragetelegramme

Der interessierte Knoten stellt seine Anfrage/Kommando in folgendem Format an das Relais. Nicht alle Kommandos erhalten als Reaktion eine Antwort des Relais:

Byte0 Kommando Byte1 Byte2 Antwort-
telegramm
Bedeutung
0x00 RelaisAus
Absendestyp Bit15-8
Absendetyp Bit 7-0
-
schaltet das Relais aus, wenn das Relais nicht für den übermittelten Absendetyp gesperrt ist und wenn nicht in Notstellung
0x01 RelaisEin
Absendestyp Bit 15-8
Absendetyp Bit 7-0
-
schaltet das Relais ein, wenn das Relais nicht für den übermittelten Absendetyp gesperrt ist und wenn nicht in Notstellung
0x02 RelaisUm
Absendestyp Bit 15-8
Absendetyp Bit 7-0
-
schaltet das Relais um (toggeln), wenn das Relais nicht für den übermittelten Absendetyp gesperrt ist und wenn nicht in Notstellung
0x03 Statusabfrage AntwIDB0 AntwIDB1
X
Statusabfrage (liefert den Relaisschaltzustand)
0x04 SetSchaltspiele AnzSchaltpiele
Bit31-24
AnzSchaltpiele
Bit23-16
-
Übermittelt die Anzahl der Schaltspiele (z.B. bei Relaiswechsel...) Achtung in Byte3/4 sind die Bits 15-8/7-0 untergebracht!
0x05 GetSchaltspiele

AntwCanId High

AntwCanId Low
X
Abfrage Schaltspiele (ab v3.x)
0x06 SetEinZeit    
-
RelaisEinschaltzeit [s] übermitteln
Beschreibung siehe unten
0x07 GetEinZeit AntwCanId High AntwCanId Low
X
Abfrage RelaisEinschaltzeit [s]
0x08 SetNotstellung Notstellung Relaiszustand:
0: Relais aus
1: Relais ein
-
-
Notstellung vorgeben/festlegen. Dieser Relaiszustand wird eingenommen, wenn ein "Notstellung"-Kommando eintrifft.
0x09 GetNotstellung
-
-
X
Relaiszustand für Notstellung abfragen
0x0A Notstellung

0x00:
Notstellung verlassen und Relais wieder zum Schalten freigeben
0x01:
Notstellung einnehmen und verriegeln

-
-

Bei Eintreffen des Notstellung-Kommandos wird das Relais in die zuvor festgelegte Notstellung (ein oder aus) geschaltet und gleichzeitig verriegelt, damit es nicht mit dem nächsten Schaltkommando sofort wieder schalten kann. Um das Relais wieder benutzen zu können, muß mittels Notstellung(Byte1=0x01) die Sperrung wieder aufgehoben werden.

0x0B SetRelaisLock       Relaissperre für verschiedene Absendetypen eintragen
Relais darf nicht schalten, wenn es für diesen Typen gesperrt/gelockt ist (außer Kommando Notstellung)
Beschreibung siehe unten
0x0C GetRelaisLock
-
-
X
Relaissperre abfragen
Beschreibung siehe unten
0x0D SetTimer    
-
Beschreibung siehe unten
0x0E StopTimer
-
-
-
Timer anhalten
0x0F StartTimer
-
-
-
Timer weiterlaufen lassen
0x10 ClearTimer
-
-
-
Timer auf 0s setzen und aktuellen Relaisschaltzustand beibehalten
0x11 GetTimer    
X
Beschreibung siehe unten
           

Kommando-Antworttelegramme

Das Relais bzw. die Relaisapplikation antwortet auf die Anfrage/Kommando in folgendem Format. Das Kommando wird dabei als Echo zurückgeliefert:

Byte0 Kommando Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Bedeutung
0x03 Statusabfrage AntwIDB0 AntwIDB1 0x00 Zustand:
0x00: Relais aus
0x01: Relais ein
- - Statusabfrage
0x05 GetSchaltspiele Absende
CanIdHigh
Absende
CanIdLow
AnzSchaltpiele
Bit31-24
AnzSchaltpiele
Bit 23-16
AnzSchaltpiele
Bit 15-8
AnzSchaltpiele
Bit 7-0
Abfrage Schaltspiele (ab v3.x)
0x07 GetEinZeit Absende
CanIdHigh
Absende
CanIdLow
Einzeit
Bit31-24
Einzeit
Bit23-16
Einzeit
Bit15-8
Einzeit
Bit7-0
Abfrage EinZeit [s]
0x09 GetNotstellung NotstellungRelaiszustand:
0: Relais aus
1: Relais ein

Nostellung:
0: nicht in Notstellung
1: Notstellung momentan eingenommen

-
-
-
-
Relaiszustand für Notstellung abfragen
0x0C GetRelaisLock             Relaissperrtypen abfragen
0x11 GetTimer             Beschreibung siehe unten
0x13 GetSendMessage             Beschreibung siehe unten

Anmerkung: Die Kommandos (>= 0x04) sind erst ab v3.x implementiert.

 

Statusabfrage

Mittels Statusabfrage-Telegramm läßt sich der aktuelle Relaiszustand herausfinden. Dies kann zum Beispiel für PC-Visualisierungen von Interesse sein. Dazu wird ein Telegramm mit folgendem Format an die CAN-ID des Relais geschickt.

Datenbyte0 Datenbyte1 Datenbyte2 Datenbyte3 Datenbyte4 Bedeutung
0x03 Antw. ID Byte0 Antw. ID Byte1 - - Statusabfrage Relaiszustand
Tabelle 4.2.2.4.1

Datenbyte1 und 2 enthält die Adresse (Antwort IDB0 und IDB1) des anfragenden Knotens. Schließlich muß der befragte Knoten wissen an welche Adresse er die Antwort senden soll.

Beispiel: Der PC (repräsentiert durch RS232Applikation mit Knotennummer 2, MO13 -> ID 245 ->IDB0=0x1E, IDB1=0xA8) interessiert sich für den Zustand des Relais Nr. 3 (-> MO3) an Knotennr. 1 (-> ID: 219). Dazu verschickt er ein CAN-Telegramm mit der ID 219 und folgendem Inhalt:
0x03 0x1E 0xA8

Das Antworttelegramm des angesprochenen Relais sieht so aus:

Parameterbyte/
Datenbyte0
Datenbyte1 Datenbyte2 Datenbyte3 Datenbyte 4 Bedeutung
0x03 (Echo) ID Byte0 ID Byte1 0 0x00 Antwort Relaiszustand: aus
0x03 (Echo) ID Byte0 ID Byte1 0 0x01 Antwort Relaiszustand: ein

Datenbyte 1 und 2 enthält hier die Adresse (CAN-ID) des Relais. So kann der Empfänger festellen welches Relais gerade geantwortet hat.

Im obigen Beispiel ergäbe sich folgende Antwort:
an CAN-ID 245: 0x03 0x1E 0xA8 0x00 (Relais aus)

 

SetEinzeit

Mit SetEinzeit kann die Einschaltzeit eines Relais neu gestellt werden. Dies kann bei Auswechseln des Relais notwendig sein. Die Einschaltzeit in Sekunden wird hochgezählt, wenn das Relais eingeschaltet ist. So kann jederzeit die Zeit ermittelt werden, in der der Verbraucher am Relais eingeschaltet war. Die maximale Einzeit beträgt 2^32 Sekunden (=~140Jahre). 24Bit hierfür wäre nur ca. 1/2 Jahr.

Datenbyte0 Datenbyte1 Datenbyte2 Datenbyte3 Datenbyte4 Bedeutung
0x06 Einzeit [s]
Bit31-24
Einzeit [s]
Bit23-16
Einzeit [s]
Bit15-8
Einzeit [s]
Bit7-0
SetEinzeit

 

SetRelaisLock

Hiermit können die verschiedenen Absendetypen eingestellt werden, denen ein Relaisschalten verboten werden soll. Dabei bedeutet ein gesetztes Bit, daß der Absende[r|typ] des Kommandos das Schalten nicht ausführen darf. (Schalten ist für diesen Typ "gelockt"). Ein nicht gesetztes Bit bedeutet, daß dieser Absende[r|typ] den gewünschten Schaltvorgang auslösen darf. Für verschiedene Absendetypen steht ein zwei Byte großes Bitfeld zu Verfügung.
Die Sperren werden berücksichtigt bei folgenden Kommandos:

  • RelaisEin
  • RelaisAus
  • RelaisUm
  • SetTimer
  • StartTimer

Datenbyte0 Datenbyte1 Datenbyte2 Bedeutung
0x0B Relaissperrtypenfeld Bit 15-8 Relaissperrtypenfeld Bit 7-0 Relaissperre für verschiedene Absendetypen eintragen


Relaissperrtypenfeld (bzw. aus anderer Betrachtungsweise: Absendetypen):

Relaissperrtypenfeld Initiator/Absendetyp des Schaltenkommandos (RelaisAus, RelaisEin, RelaisUm, Timer...):
Bit15 (frei)
Bit14 (frei)
Bit13 (frei)
Bit12 (frei)
Bit11 (frei)
Bit10 (frei)
Bit9 (frei)
Bit8 (frei)
Bit7 (frei)
Bit6 (frei)
Bit5 (frei) (denkbar wäre z.B. automatischer Regel-/Steuereingriff (z.B. Heizungsabschaltung aufgrund vom Temperaturmeßwerten))
Bit4 Relaiseigener Timer
Bit3 Zeitschaltuhr
Bit2 priorisierter Schalter
Bit1 Kinderschalter, "öffentlicher Schalter"
Bit0 normaler Schalter

Beispiel: SetRelaisLock(0x0000) übermittelt. Somit darf jedes kommende z.B. RelaisEin-Kommando das Relais schalten.
Beispiel: SetRelaisLock(0xFFFB) übermittelt. Somit dürfen nur mit Typ "priorisierter Schalter" gekennzeichnete Kommandos das Relais schalten.
Beispiel: SetRelaisLock(0xFFFF) übermittelt. Kein Kommando darf Relais schalten. Relais gesperrt bis Sperre wieder aufgehoben wird!
Beispiel: SetRelaisLock(0x0008) übermittelt. Alle Absender, außer Zeitschaltuhr dürfen Relais schalten.
Beispiel: SetRelaisLock(0x0018) übermittelt. Alle Absender, außer Timer und Zeitschaltuhr dürfen Relais schalten.

Eine Priorisierung mit verschiedenen Leveln macht hier weniger Sinn, da so schon von vornherein die Priorität festgelegt wäre. So könnte dann z.B. nicht unterschieden werden, bzw. wäre schon festgelegt, ob Zeitschaltuhr oder Kinderschalter "wichtiger" wäre und somit der jeweils andere Typ ausgeschlossen werden würde. In der vorliegenden Implementation bleibt die Reihenfolge/Priorisierung offen und dem Bediener zur Laufzeit überlassen.

 

GetRelaisLock

Liefert das eingestellte Relaissperrtypenfeld an den anfragenden Knoten zurück.

Anfragetelegramm:

Datenbyte0 Datenbyte1 Datenbyte2 Bedeutung
0x0C

Antwort CanIdHigh

Antwort CanIdLow Relaissperrtypen abfragen


Antworttelegramm:

Datenbyte0 Byte1 Byte2 Byte3 Byte4 Bedeutung
0x0C Absende
CanIdHigh
(Relais CanId)

Absende
CanIdLow
(Relais CanId)

Relaissperrtypenfeld Bit 15-8

Relaissperrtypenfeld Bit 7-0 Relaissperrtypen abfragen

 

SetTimer

Das Relais kann für eine zu übermittelnde Zeit in einen gewünschten Zustand gebracht werden, danach fällt es in den anderen übermittelten Zustand. So lassen sich z.B. Lampen für eine gewisse Zeit einschalten. Nach Ablauf geht diese dann automatisch aus. Trifft ein weiteres Telegramm mit "SetTimer" ein, so wird die vorherige Zeit überschrieben und der neue Zähler beginnt. Der Timer kann jederzeit mit StopTimer angehalten werden. Dabei verändert sich der Relaiszustand nicht. Mit StartTimer läuft der Zähler wieder weiter. Soll der Zähler wieder von der Anfangszeit beginnen zu zählen, dann muß diese mittels SetTimer wieder neu übermittelt werden. ClearTimer schaltet den Timer ab (setzt ihn auf 0) und behält den momentanen Schaltzustand bei. Das Relaisschalten wird dabei nur durchgeführt, wenn das nicht durch die Sperrtypenmaske verboten wird - in diesem Falle wird das Kommando ignoriert.

Datenbyte0 Datenbyte1 Datenbyte2 Datenbyte3 Datenbyte4 Datenbyte5 Bedeutung
0x0D

Relaissollzustand vor Beginn des Timers
(upper Nibble):
0x0n: Relais aus
0x1n: Relais ein
0x2n: Relais um
0x3n: unverändert

Relaissollzustand nach Ablauf des Timers
(lower Nibble):
0xn0: Relais aus
0xn1: Relais ein
0xn2: Relais um
0xn3: unverändert

Zeit [s]
Bit 31-24

Zeit [s]
Bit 23-16

Zeit [s]
Bit15-8

Zeit [s]
Bit 7-0

SetTimer
und starte


GetTimer

Die verbleibende Restlaufzeit des Timers kann über GetTimer ermittelt werden. Ist die Restlaufzeit abgelaufen, oder ist kein Timer aktiv, so wird 0s zurückgeliefert.

Anfragetelegramm:

Datenbyte0 Datenbyte1 Datenbyte2 Bedeutung
0x11

Antwort CanIdHigh

Antwort CanIdLow GetTimer


Antworttelegramm:

Datenbyte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Bedeutung
0x11 Absende
CanIdHigh
(Relais CanId)

Absende
CanIdLow
(Relais CanId)

Zeit [s]
Bit 31-24

Zeit [s]
Bit 23-16

Zeit [s]
Bit15-8

Zeit [s]
Bit 7-0

Bit7: Timer läuft?
0: nein -> Timer steht
1: ja -> Timer läuft

Bit6: Restzeit vorhanden?
0: nein -> Restzeit = 0s
1: ja -> Restzeit != 0s

Bit5..4:
aktueller RelaisISTzustand
00: Relais aus
01: Relais ein

Bit1..0
Relaissollzustand nach Ablauf des Timers
00: Relais aus
01: Relais ein
10: Relais um
11: Relais unverändert

Timer

Lesebeispiel zu Byte 7:
0b0101xx11 bedeutet: Der Timer steht momentan, aber nicht auf 0s, d.h. es ist noch Restlaufzeit vorhanden. Der Timer muß dazu mittels SetTimer/StartTimer wieder gestartet werden. Der Istzustand des Relais ist ein, nach Ablauf des Timers soll es unverändert (ein) bleiben.