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 |
|
|
-
|
schaltet das Relais aus, wenn das Relais
nicht für den übermittelten Absendetyp gesperrt ist und
wenn nicht in Notstellung |
0x01 |
RelaisEin |
|
|
-
|
schaltet das Relais ein, wenn das Relais nicht für
den übermittelten Absendetyp gesperrt ist und wenn nicht in Notstellung |
0x02 |
RelaisUm |
|
|
-
|
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.
|