tatzemax Geschrieben November 9, 2018 at 21:20 Geschrieben November 9, 2018 at 21:20 Hallo zusammen, In welcher Reihenfolge melden sich die Bricks und Bricklets über dem EnumerateCallback wenn ein ipcon.Enumerater() ausgelöst wird? Zitieren
borg Geschrieben November 10, 2018 at 10:14 Geschrieben November 10, 2018 at 10:14 Die Reihenfolge ist nicht fest. Bei einem Stapel hängt das davon ab welchen Brick der Master des Stapels als letztes angesprochen hat, da dieser die Teilnehmer immer "Round-Robin" abfragt. Zitieren
tatzemax Geschrieben November 11, 2018 at 20:44 Autor Geschrieben November 11, 2018 at 20:44 Das heist Ich kann während der enumerate Phase nicht überprüfen kann ob des Bricklen am bsp. Obersten Master angeschlossen ist? Ich möchte gerne überprüfen ob der stapel so zusammengebaut wurde wie es vorgesehen ist. Das geht dann nur nach der enumerate Phase. Mir würde es allerding schon reichen wenn wenigstens die Master sich als erstes melden würden... Zitieren
FlyingDoc Geschrieben November 11, 2018 at 22:07 Geschrieben November 11, 2018 at 22:07 Doch. Das kann man sehrwohl. Ich baue meine Programme so auf. Der Callback gibt ja die Position (char position) zurück und wenn es ein Bricklet ist an welchem Master (char *connected_uid) es verbunden ist. void cb_enumerate(const char *uid, const char *connected_uid, char position, uint8_t hardware_version[3], uint8_t firmware_version[3], uint16_t device_identifier, uint8_t enumeration_type, void *user_data) Ich sammle alles in einer Tabelle und sortiere dann zum Schluß. Die RS232 oder RS485 bekommen bei mir der Reihenfolge nach einen Namen verpasst. COM1 , COM2 ....... So spreche ich sie dann auch an. Genau so verfahre ich mit allen Bricklet. Aus den Eingängen wird dann DI0 DI1 DI........ Ausgängen DO0 DO1 DO...... Mir ist egal an welchem Master diese hängen. Wichtig ist nur die Reihenfolge. Also z.B. Der erste DI der gefunden wird ist DI0. Egal an welchem Master im Stack. Wobei ich beim ersten Master anfange zu sortieren. Wo die Master im Stack hängen bekommt man beim Callback mitgeteilt. Der Callback empfängt sieben Parameter: uid: Die UID des Bricks/Bricklets. connected_uid: Die UID des Bricks mit dem das Brick/Bricklet verbunden ist. Für ein Bricklet ist dies die UID des Bricks mit dem es verbunden ist. Für einen Brick ist es die UID des untersten Master Bricks in einem Stapel. Der unterste Master Brick hat die Connected-UID "0". Mit diesen Informationen sollte es möglich sein die komplette Netzwerktopologie zu rekonstruieren. position: Für Bricks: '0' - '8' (Position in Stapel). Für Bricklets: 'a' - 'd' (Position an Brick). hardware_version: Major, Minor und Release Nummer der Hardwareversion. firmware_version: Major, Minor und Release Nummer der Firmwareversion. device_identifier: Eine Zahl, welche den Brick/Bricklet repräsentiert. enumeration_type: Art der Enumerierung Zitieren
tatzemax Geschrieben November 12, 2018 at 00:24 Autor Geschrieben November 12, 2018 at 00:24 Vielleicht stehe ich noch etwas auf dem Schlauch. Ich habe 3 Master Master[0] soll bei mir auf alles Ports IndustrialOut haben Master[1] & [2] bekommen IndustrialIN Ich möchte überprüfen das Master[0] auch wirklich die IndustrialOut's hat. Ich habe mir mitlerweile dafür eine Sperate funktion gebaut in der ich die Master UID mit der IndustrialOut.connectedUID vergleiche. Allerding funktioniert die Funktion nicht solllage wie alle Enumerate Callbacks ausgelöst nicht wurden. Dann anders Problem ich wollte die durchführung der Funktion per Thread.Sleep() verzögern. Dann werden aber leider die Callbacks nicht mehr angenommen. Zitieren
borg Geschrieben November 12, 2018 at 00:38 Geschrieben November 12, 2018 at 00:38 Dann anders Problem ich wollte die durchführung der Funktion per Thread.Sleep() verzögern. Dann werden aber leider die Callbacks nicht mehr angenommen. Wo machst du das Thread.Sleep denn? Im Main Thread sollte das kein Problem Sein. Wenn du dein Sleep in einem Callback aufrufst werden in der Zeit in der Tat keine weiteren Callbacks mehr aufgerufen. Es gibt nur einen Thread für Callbacks in den Bindings. Zitieren
FlyingDoc Geschrieben November 12, 2018 at 09:11 Geschrieben November 12, 2018 at 09:11 Allerding funktioniert die Funktion nicht solllage wie alle Enumerate Callbacks ausgelöst nicht wurden. Das habe ich ganz einfach gelöst. Ich habe einen Timer der bei einem EnumerateCallback gestartet wird. Dieser läuft als Singel Shot. Jedesmal wenn ein EnumerateCallback kommt, wird er wieder angeschubst. Das Timout ist so groß gewählt, das der Timer sein Callback erst auslösen kann wenn kein EnumerateCallback mehr eintrifft. Dann wird die Sortierfunktion ausgelöst. Mit der Zeit musst du dann experimentieren. All zu groß muss sie aber nicht sein. Alles im Bereich von msec. Zitieren
tatzemax Geschrieben November 13, 2018 at 20:29 Autor Geschrieben November 13, 2018 at 20:29 Wo machst du das Thread.Sleep denn? Ich mache das nach dem Verbindungsaufbau durch ipcon.Connect(); Das habe ich ganz einfach gelöst. Ich habe einen Timer der bei einem EnumerateCallback gestartet wird. Dieser läuft als Singel Shot. Jedesmal wenn ein EnumerateCallback kommt, wird er wieder angeschubst. Das Timout ist so groß gewählt, das der Timer sein Callback erst auslösen kann wenn kein EnumerateCallback mehr eintrifft. Dann wird die Sortierfunktion ausgelöst. Mit der Zeit musst du dann experimentieren. All zu groß muss sie aber nicht sein. Alles im Bereich von msec. Das klingt nach eine Lösung mit der ich leben mag danke für eure Hilfe. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.