Jump to content

Reihenfolger der ipcon.EnumerateCallback


Recommended Posts

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...

Link zu diesem Kommentar
Share on other sites

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

Link zu diesem Kommentar
Share on other sites

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.

 

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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. ;)

Link zu diesem Kommentar
Share on other sites

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.

 

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...