- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: RS485 - Automatische Addressierung

  1. #1

    RS485 - Automatische Addressierung

    Anzeige

    Powerstation Test
    Hallo! hat jemand Erfarung mit dem Bussystem. Also Ein Master und mehrere Slave mit 2 Leitungen also RS485, die Slaves sollen selbst adressiert werden. Ich habe mir so gedacht, dass ich per SW ein zufallsgenerator zu schreiben, der ein zufällige Zahl zum Master schickt, und Master nimmt diese Zahl und gibt eine Addresse zurück so in dieser Richtung,hat jemand anderen Vorschlag? oder hat jemand so was gemacht? (Erläuterung: ich habe mehere Slave, sie sind alle gleich, und ich möchte nicht einzeln adressieren, also der Master übernimmt automatische Addressierung )

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    40
    Beiträge
    237
    Hi,

    Ich versteh nicht ganz wofür du die Zufallszahl
    brauchst.

    Ich würd einfach einen bestimmten Befehl definieren, der vom slave an den Master gesendet wird und der Master sendet dann eine Adresse an den Slave. Der Master muss sich dann nur merken, welche adressen er ergeben hat. Er sollte dann hin und wieder überprüfen ob der Slave noch da ist, und wenn nicht die Adresse wieder als frei markieren.

    Das wär so meine Vorgehensweise, aber ich hab noch nie was mit rs485 gemacht, wiess nicht ob es da noch andere Probleme gibt.


    mfg
    Thorsten
    Open Minds. Open Sources. Open Future

  3. #3
    Hi Thorsten!
    das Problem liegt darin, dass 2 oder mehrere Slaves auf keinen Fall zusammen gleiche Adresse haben zu dürfen, (Bus konflikt), und 2 slaves dürfen nicht gleichzeitig aktiv werden (kurzschluss gefahr).

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    40
    Beiträge
    237
    Hi Piconet,

    Das zwei Slaves die gleiche Adresse bekommen, kannst du verhindern indem der Master sich die vergebenen Adressen merkt.
    Verhindern dass zwei Slaves niemals zur gleichen Zeit senden ist schon schwieriger. Werden alle Slaves zur gleichen Zeit eingeschaltet?
    Dann kannst du per zufallsgenerator jeden zu einer anderen Zeit die Anfrage schicken lassen. Aber 100% sicher ist das auch nicht.

    mfg
    Thorsten
    Open Minds. Open Sources. Open Future

  5. #5
    Hi!
    also mehr Erläuterung! Ich habe n Module, stellen wir vor sie sind alle geleich.
    und sie sind alle an einen RS485 angeschlossen. Jedes Modul besitzt
    einen Mikrokontroller ATmega128. so dann geht jetzt los, man schliesst
    der PC durch RS232 an einer von n Module. Dieser wird als Master definiert.
    Dieses Modul (als Master) fragt erstmal nach adresse der Slaves.
    Die Slaves schicken eine beliebige Adresse, diese Adresse wird im Master gespeichert,
    und Master schick eine gültige Adresse zum Slave, diese Adresse gilt als gültige
    Adresse. und läuft weiter bis alle Slave adressiert werden.
    -
    1- wenn man als Master befehl schickt und fordert, dass die Slave
    eine beliebige Zahl(adresse) schicken soll, welcher von Slaves muss als erstes aktiv und welche
    inaktiv werden müssen.(Maßnahme gegen zusammenaktivierung der Slaves)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    40
    Beiträge
    237
    Hi,
    wenn alles Slaves gleich sind werden auch alle zur gleichen Zeit antworten . Bei Ethernet wird IMO aus der MAC eine Zeit berechnet. Nach einer Kollision warten alle beteiligten ihre Zeit ab und antworten erst dann. Da jede mac weltweit nur einmal vergeben wurde kommt es dann zu keiner kollision.
    Aber wenn du erst unterschiedliche macs in die Slaves programmieren musst kannst du auch gleich Slave Adressen Programmieren

    Ich würde die Slaves einfach eine zufällige Zeit warten lassen bis sie an den Master antworten. Wenn in dieser Zeit ein anderer Slave aktiv wird muss der mit der längeren Zeit halt warten.

    Allerdings kannn dabei auch eine kollision auftreten wenn zufällig zwei Slaves die gleiche Zeit wählen ( passiert genau dann wenn du das Ding deinem Chef vorführst).

    Darf bei rs485 keine Kollision auftreten weil dann Bus kaputt, oder nur weil dann Daten kaputt? Im zweiten Fall müsste man nur die Kollision erkennen, und die Slaves wieder eine zufällige Zeit warten lassen. Der schnellere gewinnt dann. Werd mir mal bei Gelegenheit den Bus anschauen, das Projekt wird mitlerweile Recht interessant (Auch für andere Protokolle wie I²C).

    mfg
    Thorsten
    Open Minds. Open Sources. Open Future

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Für I²C hätt ich eine Idee, vielleicht kann man die ja aufs RS485 übertragen?
    1. Der Master (Chef) sendet einen General Call (GCALL).
    2. Der Chef wird zum Slave.
    3. Nach dem GCALL bestimmt jeder Slave eine Zufallszahl Z (zB aus uninitialisiertem RAM-Inhalt).
    4. Der Slave wird zum Master und versucht, Z an den Chef zu senden.
    5. Verliert er die Arbitration, wartet er bis der Bus frei ist und geht zurück zu 4.
    6. Kommt der Slave (momentan ein Master) zum Chef (momentan Slave) durch, bekommt er eine Adresse A vom Master zugewiesen.
    7. Wenn alle Slaves zum Master durchgekommen sind, ist man fertig.
    8. Falls sich scheinbar weniger als die vorhandenen N Slaves (Chef muß N kennen) gemeldet haben, dann haben 2 oder mehr Slaves genau das selbe Z geschickt, ohne daß einer die Arbitration verloren hat.
      Das ist möglich, wenn beide (oder mehrere) zur gleichen Zeit die gleichen Daten mit der selben Geschwindigkeit schicken.
      Durch Vergrößern von Z kann man die Wahrscheinlichkeit dafür aber beliebig klein machen. Tritt dieser Fall auf (kann man wohl nur über einen Timeout erkennen), dann startet das ganze von vorne bei 1.
    Disclaimer: none. Sue me.

  8. #8
    Hallo Thorsten!
    ich habe eine Lösung gefunden:
    1- nehme ich ATmega128 mit 2 USART
    2- überprufe ob ein Signel gekommen ist
    3- von welcher Seite ( RS232 oder RS485)
    4 -Wenn von RS232 gekommen ist dann:
    4.1- Wird als Master erkannt
    4.2- setze Umschalter RS485 vomMaster auf 1, d.h. SENDEN
    4.2- Abfrage nach der Slaves-Adresse
    4.3- Anwort?
    4.4- nein, warte auf die Antwort
    4.4-ja, die Zahl wird gespeichert, und vergliechen
    4.5- die Zahl vorhanden
    4.6- ja, Zahl löschen, springr zu 4.2
    4.6- nein schicke bestätiging zum Slave

    5- Wenn von RS485 gekommen ist dann:
    5.1- setze Umschalter RS485 vom Slave auf 0, d.h. EMPFANGEN
    5.2- finde eine Zahl zwischen 01 bis 255, ( 00 ist breits Master)
    5.3- Multipliziere Zahl mit ms
    5.4- ist die Zeit vorbei?
    5.5- nein, springe zu 5.4
    5.5- ja, schicke die Zahl als Adresse zum Master, setze Umschalter auf 1
    5.6- Umschalter zurück setzen-
    5.7- Bestätigung?
    5.8- nein, ende , nix
    5.9- ja, die Adresse ist gültig
    ///////////////////////////////////////////////////////////////////////////////

    für den Fall, dass zwei Slave nicht gleichzeitig was los schicken, wird eine Pausezeit dazwischen vor gesehen , d.h, ganze routine dauert z.B 4ms
    dann wird nur die Zahlen, die abstand 4 haben angenommen, z.B 4, 8, 12,...
    das ist meine Idee, kannst du bei programmieren helfen?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen