Jump to content

Robuster Ansatz für vb.net


nrg007

Recommended Posts

Hallo alleine,

was genau hast du denn vor? Das Beispiel "Robuster Ansatz" stellt nach einem Verbindungsabbruch automatisch eine neue Verbindung her. In VB.net hast du ja deine Userform, wenn du, während dein Programm läuft, die Verbindung verlierst könnte man das ganze in einem Try-Catch Block machen. Der Spring dann, bei verlorener Verbindung, in den den Fehler Zweig und stellt eine neue Verbindung her. Aber ob das Sinn macht hängt natürlich davon ab was du anstellen willst.

 

Gruß Thomas

Link zu diesem Kommentar
Share on other sites

Ich würde versuchen den Pseudocode unter

http://www.tinkerforge.com/de/doc/Tutorials/Tutorial_Rugged/Tutorial.html als grobe Vorlage zu nehmen und diese in vb.net zu "übersetzen". Und ein wenig vom C# Beispiel abschauen.

 

Abschl. deine ersten Gehversuche komplett mit Code ins Forum posten, damit die vb.net Experten dir hier eine Hilfestellung geben können.

Link zu diesem Kommentar
Share on other sites

Hallo,

 

vielen Dank für die Anregungen. Mit Try/Catch habe ich keine Erfolge erzielen können, aber mit ein paar alten C-Kenntnissen, dem Pseudocode, ein paar Abenden Zeit und viel Kaffee konnte ich den robusten Ansatz in vb.net lauffähig umsetzen. Entgegen den bisherigen Beispielen habe ich den Code so umgebaut, dass ich kein LCD- oder Temperaturbricklet benötige, sondern mit einem vorhandenen RotaryPoti auskomme (ist in dem Beispiel dem Temperaturbricklet sehr ähnlich).

 

Imports Tinkerforge

Module Module1
    Const HOST As String = "localhost"
    Const PORT As Integer = 4223

    Sub Main()

        Dim ipcon As New IPConnection() ' Create IP connection

        'Register IP Connection callbacks
        AddHandler ipcon.EnumerateCallback, AddressOf EnumerateCB
        AddHandler ipcon.Connected, AddressOf ConnectedCB

        'Connect to brickd, will trigger cb_connected
        ipcon.Connect(HOST, PORT)
        'Don't use device before ipcon is connected

        ipcon.Enumerate()

        System.Console.WriteLine("Press key to exit")
        System.Console.ReadKey()
        ipcon.Disconnect()

    End Sub

    ' Callback function for position callback (parameter has range -150 to 150)
    Sub PositionCB(ByVal sender As BrickletRotaryPoti, ByVal position As Short)
        System.Console.WriteLine("Position: " + position.ToString())
    End Sub

    ' Callback function for Enumerate callback 
    Sub EnumerateCB(ByVal sender As IPConnection, ByVal UID As String, ByVal connectedUID As String, _
                             ByVal position As Char, ByVal hardwareVersion() As Short, _
                             ByVal firmwareVersion() As Short, ByVal deviceIdentifier As Integer, _
                             ByVal enumerationType As Short)

        If enumerationType = IPConnection.ENUMERATION_TYPE_CONNECTED Or _
            enumerationType = IPConnection.ENUMERATION_TYPE_AVAILABLE Then

            ' Enumeration is for Poti Bricklet
            If deviceIdentifier = BrickletRotaryPoti.DEVICE_IDENTIFIER Then

                ' Create temperature device object
                Dim temp As New BrickletRotaryPoti(UID, sender)
                AddHandler temp.Position, AddressOf PositionCB

                ' Set Period for position callback to 0.05s (50ms)
                ' Note: The position callback is only called every 50ms if the
                '       position has changed since the last call!
                temp.SetPositionCallbackPeriod(50)
            End If
        End If

    End Sub

    ' Callback handles reconnection of IP Connection
    Sub ConnectedCB(ByVal sender As IPConnection, ByVal connectReason As Short)
        'Enumerate devices again. If we reconnected, the Bricks/Bricklets
        'may have been offline and the configuration may be lost.
        'In this case we don't care for the reason of the connection

        sender.Enumerate()

    End Sub

End Module

 

So weit so gut. Was sagen die Experten?

 

ciao

nrg007

Link zu diesem Kommentar
Share on other sites

Hallo,

 

darf ich Fragen, welche Kenntnisse du in der Entwicklung von Software du hast?

Wenn ich es richtig verstanden habe, dann hast du mal irgendwann C programmiert.

 

Unter der Annahme, dass du wenig Kenntnisse hast, empfehle ich nicht VB.NET zu nehmen. Du kannst neu anfangen und solltest nicht eine Sprache wählen, in der man leicht in alte Schemen zurück fällt.

Hier eignet sich meines Erachtens C# viel besser, um in die Objekt-orientierte Entwicklung einzutauchen. Just my 2 cents...

 

Zum angegebenen Code kann ich nur sagen, das dort keinerlei Robustheit vorhanden ist.

 

Du stellst eine Verbindung her, aber wenn die nicht etabliert werden kann, dann bricht dein Programm hart ab. Versuch es mal, nimm TF vom Rechner und starte dein Programm. Ergebnis: BigBang...

 

Besser:

AddHandler ipcon.Connected, AddressOf TinkerforgeConnected

AddHandler ipcon.Disconnected, AddressOf TinkerforgeDisconnected

try

  ipcon.Connect(HOST, PORT)

  ...

catch Exception e

  System.Console.WriteLine("Sorry, couldn't establish connection. Program ends...")

finally

  ' Dies hier nur im finally, wenn Disconnect keine Exception bei nicht

  ' vorhandener Verbindung wirft. Müsste ich nachschauen...

  ipcon.Disconnect()

end try

 

Dann die beiden Methoden der EventHandler implementieren.

In TinkerforgeConnected würde ich mir merken, dass die Verbindung besteht und somit etwas in PositionCB ankommt. (Später wenn du eine GUI hast, kann dann irgendwo ein Hinweis stehen).

In TinkerforgeDisconnected kannst entsprechend connected verfahren. Ggfs. musst du den PositionCB-Handler entfernen (RemoveHandler) und in TinkerforgeConnected den Handler wieder hinzufügen. Das kommt auf das Verhalten der API an, das habe ich selber noch nicht im Detail geprüft.

 

Ob du ein enumrate ausführst, um dein Bricklet zu finden oder nicht, ist Geschmacksache. Ich persönlich programmiere immer von der Hardware losgelöst. D.h. ich habe in Settings die entsprechenden Daten hinterlegt (Bricklet-UID etc.). In den entsprechenden Konstruktoren erstelle ich dann die Bricklet-Objekte und nutze die Connected und Disconnected-Events, um ein Semaphor zu haben, ob ich auf die Bricklets zugreifen darf oder nicht. Das ist schneller, als wenn ich bei jeden Brickletaufruf ein Try-Catch baue. Aber das kommt auf die Anwendung und Laufzeitverhalten an.

 

Beste Grüße

Jörg

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