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?
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.
Rooolaand schrieb: > Oder gleich die zu ändernde Bitnummer senden? da wird der > Kommunikationsbedarf recht lang. warum? kann man ja in ein Packet stecken. [ID][LEN][BitNR][Wert][BitNr2][Wert]...CRC
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.
Rooolaand schrieb: > 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. die anderen können ja auch am Bus lauschen und wissen es dann müssen sich ja nicht angesprochen fühlen.
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.
Überlege mal, was passiert, wenn du die bits die du ändern willst auf 1 setzt und da so entstandene "Datenwort" per logischer Operation bit für bit mit dem bestehenden Zustand verknüpfst. Welche gefällt dir am besten?
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?
Peter II 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.
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.
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.
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
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.
Ernst O. schrieb: > Sende eine Bitmaske, in der alle Bits gesetzt sind, die verändert werden > sollen. genau die Lösung wurde gestern Abend schon gepostet.
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?
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.
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.
Tek schrieb: > Damit kannst Du aber nur Toggeln, wenn mehrere Schalter auf ein Relais > wirken will man aber vielleicht auch sicher Aus oder Ein schalten. klarer Fall. Aber für ein Beleuchtungsprojekt reicht das in den meisten Fällen.
Ich habe kuerzlich auch ein kommerzielle Relaiskarte gebaut. Das Protokoll ist von der Sorte SYN STX len dest cmd data CRC wobei data hier 16 bit in binaer darstellen. Es werden zZ 10 Relais gesteuert. Das Protokoll koennte is dieser ausfuehrung 16.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.