12 Bit schalten Protokoll idee

Gast #4318555
Lesenswert?

Ich plane gerade eine Bussteuerung. Nun habe ich einige fragen zur 
Kommunikation der Module. Das ganze beruht auf einem Rs485 Bus.

Angedacht Relaiskarten (12 Relais) und einige Schalter jeweils teils mit 
Relais und Bus Anbindung.

Die Schalter haben einstellbare Programme um an mehrere Verbraucher zu 
senden. Dadurch ist die Fehleranfälligkeit geringer als bei einer 
Zentralen Steuerung.

Aber was sende ich eigentlich der Relaiskarte in Binär Signal 12bit 
(+Adresse & crc) wäre kurz und schnell Dafür müsste allerdings der 
Sender wissen wie die Bits gerade stehen welche nicht verändert werden 
sollen. Das wird Schwierig wenn mehrere Sender ein Signal schalten.
Vorher abfragen wie die Bits stehen ?
Oder gleich die zu ändernde Bitnummer senden? da wird der 
Kommunikationsbedarf recht lang.

Gibt es eine Möglichkeit dazwischen die mir gerade nur nicht einfällt?
#4318563
Lesenswert?

Rooolaand schrieb:
> Angedacht Relaiskarten (12 Relais) und einige Schalter jeweils teils mit
> Relais und Bus Anbindung.

ist mir noch zu unklar,

in der Prüftechnik waren die Relais direkt am Controller oder PC und da 
wusste man wie die stehen (ob on oder off)

Das hier liest sich so als wenn jede Relaiskarte einen µC oder 
Controller hat, ergo kann man dem Relais setzen senden oder rücksetzen 
oder abfragen.
Gast #4318580
Lesenswert?

Peter II schrieb:
> [ID][LEN][BitNR][Wert][BitNr2][Wert]...CRC

Aber falls dann 10 Bit geschalten werden sollten besteht die kette schon 
aus 20+ Byte. Finde ich schon recht lang eignetlich.

Jeder Busteilnehmer hat einen Controller (Avr) und die Relaiskarte weiß 
auch was gerade an oder aus ist. Aber die anderen Busteilnehmer (andere 
avr's) wissen das leider nicht.
Gast #4318589
Lesenswert?

Rooolaand schrieb:
> Aber falls dann 10 Bit geschalten werden sollten besteht die kette schon
> aus 20+ Byte. Finde ich schon recht lang eignetlich.

dann übertrage eine Bitmaske. Also zu jeden Bit noch ein Bit was anzeigt 
ob sich der wert ändern soll.

12Bit Maske
001001001011

12bit Daten
000001001000

das sind dann nur 24bit. wobei man die Daten noch kürzen könnte auf die 
Bits die sich ändern sollen.
Gast #4318611
Lesenswert?

Peter II schrieb:
> dann übertrage eine Bitmaske. Also zu jeden Bit noch ein Bit was anzeigt
> ob sich der wert ändern soll.

Genial :) Danke so habe ich nur ganz wenige Byte bei vollem Komfort 3 
Byte + Rest kann ich sicher noch verschmerzen.
Aber dennoch die frage wie könnte man das kürzen? Das geht nur wenn ich 
garnicht bis adresse 12 ändern möchte oder?
Zb 8 bit für nur in den ersten 4 was zu ändern?
Gast #4318619
Lesenswert?

Rooolaand schrieb:
> Genial :) Danke so habe ich nur ganz wenige Byte bei vollem Komfort 3
> Byte + Rest kann ich sicher noch verschmerzen.
warum 3 Byte. 24bit brauchen doch insgesamt nur 3byte?

> Aber dennoch die frage wie könnte man das kürzen? Das geht nur wenn ich
> garnicht bis adresse 12 ändern möchte oder?
> Zb 8 bit für nur in den ersten 4 was zu ändern?
Warum muss es denn so kurz sein? Die 1bit Kompression wurde ja schon 
erfunden nur am entpacken scheitert es ja noch.

Es macht denke ich keine sinn mehr noch mehr zu sparen, dafür müssen man 
wissen wie oft sich welche Anzahl von bits ändert und das Protokoll 
dafür auslegen.
Gast #4318621
Lesenswert?

Rooolaand schrieb:
>> Wie willst du das Problem "Kollision" ohne einen Master lösen?
>
> Über eine Rückantwort (Ack) vom Empfänger. Was mich neben dem Ram daran
> hindert das "fremde" geräte die Zustände sicher mitlesen.

und wenn nichts kommt, dann senden beiden wieder gleichzeitig.
#4319591
Lesenswert?

Warum sendest du nicht einfach, das Schalter X gedrückt wurde und lässt 
den µC bei den Relais entscheiden, welches jetzt an oder aus geschaltet 
wird? Der weiß ja auch den aktuellen Zustand aller seiner Relais...

Wenn ein Schalter auf 3 Relaiskarten Relais schalten soll, musst du dann 
bei einer Änderung zwar drei µC neu programmieren und nicht nur den 
einen im Schalter, aber du wirst auf dem Bus ja sicher eh jedem Board 
einen Bootloader spendieren, da is das dann ja nicht das große 
Problem...

Und wenn du die Relais über den Bus konfigurieren kannst (also sagen, 
Relais1 auf Relaiskarte2 gehört zu Schalter A, usw.), wäre es ja noch 
einfacher...

viele Grüße
Michael
#4319698
Lesenswert?

Warum so kompliziert?

Sende eine Bitmaske, in der alle Bits gesetzt sind, die verändert werden 
sollen. Alle anderen Bits bleiben auf "0". Diese Bitmaske sende an alle 
Relais. An jedem Relais wird diese Information per XOR mit dem 
vorherigen Schaltzustand per XOR verknüpft. Empfängt das Relais auf 
seinem Kanal eine "1", wechselt es den Zustand. Wenn der vorher "an" 
war, wird er "aus" und umgekehrt.

Die Schalter und die Relais können alle identisch sein, es muss nur 
programmieerbar (oder "jumperbar") sein, auf welchem Kanal ein Schalter 
schaltet bzw auf welchem Kanal ein Relais sich angesprochen fühlt.
Gast #4320310
Lesenswert?

Ernst O. schrieb:
> Peter II schrieb:
>> genau die Lösung wurde gestern Abend schon gepostet.
>
> Habe ich gesehen. Aber warum sprichst du von 24 Bits wenn es um 12
> Relais geht?

Weil man dadurch nicht die zustände speichern muss und einfach sagen 
kann, welche an bzw aus geschaltet werden sollen.


Eine weitere möglichkeit wären 14 Bit, 12 Bit für die daten und 2 bit 
für die opperation. Also einschalten, ausschalten oder togglen.
Hat dann allerdings den nachteil, dass du um einen Aktor einzuschalten 
und einen anderen auszuschalten 28 + 2 mal header bit übertragen musst.
Gast #4320559
Lesenswert?

Ernst O. schrieb:

> Empfängt das Relais auf
> seinem Kanal eine "1", wechselt es den Zustand. Wenn der vorher "an"
> war, wird er "aus" und umgekehrt.


Damit kannst Du aber nur Toggeln, wenn mehrere Schalter auf ein Relais 
wirken will man aber vielleicht auch sicher Aus oder Ein schalten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren