nrg007 Geschrieben August 10, 2014 at 10:19 Geschrieben August 10, 2014 at 10:19 Hallo zusammen, ich bin auf der Suche nach einem Beispiel für den "Robusten Ansatz" in vb.net. Die Doku dazu habe ich grundlegend verstanden, aber umsetzen kann ichs derzeit noch nicht. Wenn vielleicht jemand einen Codeschnipsel für mich hätte... ciao nrg007 Zitieren
Andu Geschrieben August 11, 2014 at 05:11 Geschrieben August 11, 2014 at 05:11 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 Zitieren
Nic Geschrieben August 11, 2014 at 10:43 Geschrieben August 11, 2014 at 10:43 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. Zitieren
nrg007 Geschrieben August 15, 2014 at 23:10 Autor Geschrieben August 15, 2014 at 23:10 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 Zitieren
JoergK Geschrieben August 22, 2014 at 07:23 Geschrieben August 22, 2014 at 07:23 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 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.