Dienstag, 28. September 2021

Error Text ausgeben bei einer Stored Procedure in C# Anwendung


Vielleicht ist das, worauf ich diesmal eingehe selbstverständlich, aber ich habe zu dem Thema ein wenig gesucht und mal wieder nichts gefunden. Wenn ich in meiner Anwendung eine Stored Procedure ausführe, dann würde bei einem Fehler keine Rückmeldung von der Ausgeführten Prozedur kommen und der Eindruck entsteht, dass die gespeicherte Prozedur normal durchgelaufen ist. Nun kann man auch einen Output Wert einrichten und erwarten, das ein entsprechender Wert herauskomm. Käme nun ein Standard Wert heraus, könnte daraus geschlossen werden, dass etwas in der Prozedur nicht gemacht macht wurde. Ohne Detail Information, kann man alles vermute. Fehler im Script, keine Ausreichende Berechtigung vergeben oder Datensatz hat einen Fehler. Was auch immer. Schöner wäre einen Fehlertext zu erhalten.

 

Benötigt

  • MS SQL Datenbank
  • Visual Studio 2019

 

Ziel

Das Beispiel soll ein Wert zurück geben, wenn die Stored Procedure ohne Fehler ausgeführt wurde. Bei einem Ausnahmefehler soll wiederum der Fehler Text Ausgeben werden in der Anwendung.

 

Beispiel Prozedur anlegen

Die Folgende Prozedur kann in ihrer Ausführung normal durchlaufen und den erwarteten Ausgangs Wert in 'myGetStatusMessage' ausgeben. Wird der Parameter 'showMeErrorMessage' auf 1 gesetzt, dann wird eine Ausnahme geworfen.

 USE [example-data]   
 GO  
 SET Ansi_Nulls ON  
 GO  
 CREATE PROCEDURE [dbo].[myStoredProcedure]    
   @showMeErrorMessage AS BIT,   
   @myGetStatusMessage AS NVARCHAR(20) OUTPUT,     
   @myStoredProcedureErrorMessage NVARCHAR(100) OUTPUT   
 AS  
 Begin Try  
   IF @showMeErrorMessage = 1  
   Begin  
     THROW 123, 'Eine Ausnahme wurde geworfen', 1;   
   end  
   SELECT @myGetStatusMessage = 'Alles in Ordnung!'   
 end try  
 begin catch  
   SELECT @myStoredProcedureErrorMessage = ERROR_MESSAGE();  
 end catch  

 

Beispiel C# Anwendung

Nun zu einer Consolen Anwendung, die den Aufruf einer gespeicherten Prozedure ausführen kann und auch unter Ziel Bedingungen den Fehlertext ausgeben kann, dass durch den Catch Block der Prozedur ausgefüllt wurde.

 

 using System;  
 using System.Data.SqlClient;  
 Console.WriteLine("Ein Beispiel wie man eine Error Meldung aus einer Store Procedure ausgegeben werden kann");  
 Console.WriteLine("Store Procedure wird ausgeführt ohne Ausnahmefehler!");  
 RunStoreProcedure(false);  
 Console.WriteLine("\r\nStore Procedure wird ausgeführt mit Ausnahmefehler!");  
 RunStoreProcedure(true);  
 Console.WriteLine("\r\nPress enter to close application");  
 Console.ReadLine();  
 static void RunStoreProcedure(bool throwError)  
 {  
   var connection = new SqlConnection(  
     @"server=127.0.0.1,1433;User Id=CustomUser;Password=passwort;Database=example-data;");  
   connection.Open();  
   var query = "DECLARE @StatusOutput AS NVARCHAR(20), @ErrorOutput AS NVARCHAR(100);" +  
         $"EXEC [dbo].[myStoreProcedure] {(throwError ? 1 : 0)}, " +  
         "@StatusOutput OUTPUT, " +  
         "@ErrorOutput OUTPUT; " +  
         "SELECT @StatusOutput AS Status, @ErrorOutput AS Error";  
   var command = new SqlCommand(  
     query,   
     connection);  
   var reader = command.ExecuteReader();  
   while (reader.Read())  
   {  
     Console.Write("Ergebnis: ");  
     for (var iColumn = 0; iColumn < reader.GetColumnSchema().Count; iColumn++)  
     {  
       Console.Write($"{reader.GetValue(iColumn)}, ");  
     }  
     Console.WriteLine("");  
   }  
   connection.Close();  
 } 

 

That's it

Der Umfang ist übersichtlich und kann in den meisten Fällen für eine Anwendung in der Form eine Store Procedure ausführen. Was nicht so einfach ist, wenn eine Tabelle zurück gegeben wird und dort die Möglichkeit statt der Ergebnis Tabelle, wiederum einen Fehlertext auszugeben.

 

GitHub - ExampleStoreProcedureErrorOutput

Sonntag, 12. September 2021

Sensor Daten über Smart Port versenden mit dem Arduino


Der Empfänger, den ich für meinen FPV RC Crawler verwende, hat einen Smartport an dem z.B. Sensoren angeschlossen werden können. Die Anzahl der verfügbaren Sensoren von Frsky ist übersichtlich, aber speziell für meinen Bedarf war keiner dabei. Wie gut, dass hier bereits eine Lösung mit dem Arduino vorhanden ist und ich dazu auf den Arduino Webseite den Eintrag "S.Port sensor library for FrSky" gefunden habe.

Verwendet

  • Arduino Mini
  • Temperatur Sensor
  • Diode
  • FrSky Empfänger mit Smartport
  • Fernsteuerung mit OpenTX

 

Ziel

Die erfasste Temperatur des Sensors soll auf der Fernsteuerung umgerechnet und auf dem Display angezeigt werden.

 

Funktioniert das wirklich?

Wie bei jeder neuen Sache, prüfe ich mit wenig Aufwand, ob das Zielvorhaben erreichbar ist. Praktisch ein PoC. Im Grunde formuliere ich meine Blogeinträge anfangs als "Proof of Concept", bevor daraus ein Beispiel wird und das gilt auch wieder für diesen Eintrag. Nur diesmal beschreibe ich das Testen mit.

In den Sourcen zur Bibliothek für den SmartPort, sind, wie auch bei den anderen Beispiele Codes vorhanden. Für mich ist der ein feststehender Wert zu wenig und deshalb ändere ich den zu sendenden Wert in der Loop Methode.

 #include <SPort.h>  
 SPortHub hub(0x12, 3);  
 CustomSPortSensor sensor(getSensorData);   
 int mSendingValue = 0;  
 int mCurrentMillis;  
 void setup() {  
  hub.registerSensor(sensor);  
  hub.begin();                
 }  
 void loop() {  
  hub.handle();   
  int current = millis();  
  if(current - mCurrentMillis < 100) {  
    return;  
  }  
  mCurrentMillis = current;  
  mSendingValue++;    
 }  
 sportData getSensorData(CustomSPortSensor* sensor) {  
  sportData data;   
  data.applicationId = 0x5900;        
  data.value = mSendingValue;  
  return data;  
 }  

Ist der Code auf dem Arduino geschrieben, muss eine Verkabelung zum Smartport hergestellt werden. Hierfür soll die Diode verwendet werden, aber vielleicht sollte ich die Beschreibung nochmal durchgehen, wofür die Diode gut ist. (Später habe ich die Diode doch nicht verwendet)

 

 

Sensor einbinden

Die Fernsteuerung mit dem OpenTX Betriebssystem kann nun eingeschaltet werden. Im Menü TELEMETRY (Abschnitt 11 auf der Xlite pro) für Sensoren, kann nun die Suche gestartet werden. Wenn der Arduino mit dem Code als Sensor funktioniert, sollte schon nach wenigen Sekunden der Sensor in OpenTX  gefunden werden.

 


 

Display Wiedergabe

Für den Bildschirm können mehrere Seiten eingerichtet werden, auf denen die Sensor Ergebnisse ausgegeben werden. Dazu muss über das Menü DISPLAY (Abschnitt 12 auf der Xlite pro) der Screen auf "Nums" eingestellt werden und dann muss darunter ein Feld mit "---" auf den neuen Sensor eingestellt werden.

 


Ist die Fernsteuerung auf den Hauptbildschirm geschaltet, muss man in meinem Fall den Stick für eine Sekunde nach unten ziehen, damit das eingerichtete DISPLAY gezeigt wird.

 

 

Echten Sensor anschließen

Das war schon alles, um sich an den SmartPort ran zuhängen. Natürlich macht der Anschluss nur Sinn mit einem echten Sensor.

Für dieses Beispiel verwende ich einen Temperatur Sensor, der über die I²C Schnittstelle angesprochen wird. An der Stelle hätte ich auch einen interessanteren Sensor nehmen können, dennoch soll das Beispiel schlicht bleiben. Und der Code für den Temperatur Sensor lässt sich in wenigen Zeilen eingeben.

 #include <SPort.h>  
 #include <Wire.h>  
 SPortHub hub(0x12, 3);  
 CustomSPortSensor sensor(getSensorData);  
 #define TMP102_ADD 0x48  
 void setup() {  
  Wire.begin();  
  hub.registerSensor(sensor);  
  hub.begin();                
 }  
 void loop() {  
  hub.handle();  
 }  
 sportData getSensorData(CustomSPortSensor* sensor) {  
  sportData data;   
  data.applicationId = 0x5900;  
  int raw = getTemperatureValue();  
  float result = raw * 0.0625;  
  data.value = raw;  
  return data;  
 }  
 int getTemperatureValue() {  
  Wire.beginTransmission(TMP102_ADD);  
  Wire.write(0x00);  
  delay(100);  
  Wire.endTransmission();  
  Wire.requestFrom(TMP102_ADD, 2);  
  while(Wire.available() < 2) { }  
  return ((Wire.read() << 8) | Wire.read()) >> 4;  
 } 


Wert-Ausgabe nur Ganzzahl

Nun haben wir einen Rohwert, der einem so nichts sagt. Eigentlich könnte der Wert am Arduino umgerechnet werden, aber ich hatte aus den Source Code gelesen, dass nur Ganzzahlen übermittelt werden.

 

LUA Script

Die Antwort für das Umrechnen der Ganzzahlen in einen Wert mit Nachkommastellen ist die Unterstützung von Lua Script auf OpenTX. Statt den Rohwert auf dem Display auszugeben, kann dieser durch einen Script umgerechnet werden und dann auf dem Display als lesbaren Wert ausgegeben werden.

Aber kommen wir zunächst zu dem Teil, was eigentlich ein LUA Script haben muss. Im Wesentlichen hilft hier die Dokumentation Telemetry Scripts.

 

Vorraussetzung

  • Das Lua Script muss auf der SD Karte in das Unterverzeichnis "SCRIPTS\TELEMETRY\".
  • Das Script muss die Namenserweiterung ".lua" haben.
  • Der Name des Lua Script darf nicht länger als sechs Zeichen lang sein, ansonsten wird das Script in der DISPLAY Einrichtung nicht angezeigt. Die Namenserweiterung ".lua" wird an der Stelle nicht mit gezählt.

Im Grunde sollte das Script mindestens die 'local function run' enthalten. Die "Init" Funktion ist optional und eigentlich sollte das auch ohne eine Background-Funktion funktionieren. Wichtig ist, dass die Methode am Ende einen Return-Wert ausgibt.

 local function run_func(event)  
      lcd.clear()  
      local receivedValue = getValue('TEMP')  
      local toDecValue = receivedValue * 0.0625;  
      lcd.drawText(10, 10, "Temperature", MIDSIZE)  
      lcd.drawText(10, 25, string.format("%.2f", toDecValue), MIDSIZE)  
      return 0  
 end  
 return { run=run_func }   


Einbinden des Scripts

Nun kann das Script auf die SD Karte und in die Fernsteuerung mit OpenTX gesteckt werden. Nach dem Einschalten kann über das Menü DISPLAY (auf der Xlite Pro befindet sich dieses in Abschnitt 12), auf Screen 1 von Nums gewechselt werden. Rechts von der Script Einstellung, kann man nun das Script myVal.lua auswählen.


 

Anschließen geht’s zurück auf den Hauptscreen. Mit dem 1 bis 2 Sek nach unten gezogenen Stick kann man vom Hauptdisplay auf den gescripteten Bildschirm (Display) wechseln. Fertig!

 

 

Schlusswort

Irgendwie habe ich im Internet keine Beschreibung gefunden, die in wenigen Schritten aufzeigt, was zu tun ist, um einen Wert auf dem Display anzuzeigen. Am Ende ist der Aufbau sehr übersichtlich, aber die kleinen Details, die man wissen muss, halten einen auf.

Natürlich werde ich an den Sensor mehr als nur ein Temperatur Sensor anschließen, schließlich kann man die Lage noch ermitteln und Abstände messen.

Was ich vermisse, ist ein Designer für die Bildschirm Ausgabe. Entweder habe ich den nicht gefunden oder für diesen Zweck gibt’s einfach keinen. Dabei wäre ein Designer nicht schwierig, aber es wäre zeitaufwendig diesen zu entwickeln (womit ich mir praktisch die Frage selbst beantworte).

 

Eintrag zu meinem Repository:

GitHub - ExampleFrskySensor

 

Sourcen

Sonntag, 5. September 2021

Nummernschildrahmen für den Crawler


Die nächsten Schritte sind oft Verbesserungen, aber ein Nummernschild war vor zwei Monate noch nicht fertig. Und wenn man sich auch das Heck vom Crawler ansieht, dann kommt einem schnell der Eindruck, dass zumindest das noch fehlt.


Verwendet:

  • 3D Programm wie 123D Design
  • Dienstleister oder eigenen 3d Drucker
  • Tamiya Schwarz Matt TS-6
  • Sehr dünne Kabel
  • Osram SMD LEDs, SMD 3430, PCLCC4, kalt weiß, 560mcd

 

Ziel

Für ein Bestehenden auf klebbaren Nummernschild, soll ein Rahmen entworfen werden, in dem SMD LEDs  verbaut werden können. Die Ansteuerung der LEDs erfolgt wiederum über den bereits bestehenden PWM Moduls. Die Größe des Rahmens orientiert sich an der Größe des Angefertigten Nummernschild.

 

Rahmen Modulieren

Im Grunde muss zunächst eine Fläche Gebildet werden, das größer ist als das Nummernschild selbst. Dann soll das Nummernschild in einer Vertiefung liegen, bzw. soll rund um ein Rand angelegt werden. Der Fragliche Teil ist die Beleuchtung, die von oben kommen soll. Dennoch sollte der Rahmen weiterhin sehr flach bleiben.

Normale LEDs sind ab 3mm bereits zu groß. Deshalb sah ich mich in der SMD Abteilung um. Gut das ich hierfür bereits welche auf Lager hatte, um diese in der Hand direkt zu vermessen und einzuschätzen wie die Beleuchtung an den Nummernschildrahmen angebracht werden kann.

Knifflig war der Kabelschach einzuzeichnen und zwar so, dass diese auch von einem 3D Drucker gedruckt werden kann (die ich am Ende doch nicht brauchte).


 

Hier habe ich mich zunächst mit dem 3D Builder aus Windows eine Vorprüfung starten können, welches mir dann entsprechende Meldungen zurück gab, wo die Stellen zu dünn sind. Diese Funktion war für mich Hilfreich, weil ich anfangs meine Einschätzung etwas zu dünn gewählt hatte.

Damit der Rahmen keine Klobigen Beleuchtungsansätze hat, änderte ich das Design an den Stellen und Rundete die Ecken etwas ab. Somit sah der Entwurf des Nummernschildrahmen wieder Natürlicher aus.



 

Jemand hat bestimmt einen 3D Drucker

Natürlich fragte ich ebenfalls  in der Copter Gruppe, ob mein Entwurf für einen 3D Druck geeignet ist und bekam hierzu auch die Bestätigung. Zudem bekam ich kurzerhand einen Ausdruck von meinem Nummernschild Entwurf.

 

Alternative einen Dienstleister

Wollte ich ausprobieren, kommt ein andermal.

 

Entscheidung der SMD LEDs

Die aktuell verwendeten Osram SMD LEDs hatte ich auf Lager. Daher gibt's zu der Entscheidung, außer der Baugröße keine Nennenswerte Eigenschaften, warum ich mich dafür entschieden habe.

Eine Besonderheit könnte jedoch sein, dass diese sehr hell sind. In meinem Fall muss ich jedoch die Helligkeit drosseln.

 

SMD LEDs

Ist sicherlich nicht für jeden etwas, in der Größenordnung zu Löten. Wichtig hierbei ist, eine Halterung zu haben, die auch dritte Hand genannt wird. Ohne wird das nichts.

Die zwei SMD LEDs werden Parallel geschaltet, womit ein größerer Strom auf einen Wiederstand berechnet wird. Im Datenblatt konnte ich entnehmen, dass die einzelne SMD LED  4,35V Spannung und 30mA Strom benötig. Allerdings müssen diese nicht bei voller Leistung leuchten.

Bei einer Spannungsversorgung von 5V, ist der berechnete Vorwiderstand 16 Ohm groß. Alternative verwende ich hier aus der E12 Reihe, einen Kohlebeschichteten Widerstand mit 100 Ohm. Der Widerstand selbst wird nicht im Nummernschildrahmen verbaut und wird daher aus Platzgründen im Verlegten Kabel untergebracht.

 

 

Die Steuerung der LEDs wird von dem PCA9685 Modul übernommen. Über den Arduino kann ich nachträglich die Helligkeit runter regeln.

 

Wie Verbinden?

Das lustige ist, wenn man die Falsch herum anschließt, dann leuchtet die SMD LED rot, statt weiß.

 

Verlöten

Die Kontakte müssen mit ein wenig Lötzinn angereichert werden, damit sich die Leitungen leichter anlöten lassen. Ich verwendete für die Verkabelung sehr dünne Kabel, damit der Rahmen nicht zu weit hervorgehoben werden muss von der Karosserie.

 

Lochbohren

Der Teil der mir immer etwas Sorgen bereitet sind Löcher in die Schöne Karosserie zu bohren. Zum Glück reicht hier nur eins.



 

Fertig

Das Nummernschild mit Rahmen empfinde ich als eines der Highlights zum Crawler. Das Nummernschild selbst als Aufkleber bestellte ich über Ebay, welches ich über den Händler RC-Decals gefunden habe. Neben den normalen Schildern, erhielt ich auf Anfrage auch Nummernschilder mit meinem Internetnamen „Codexzier“.


Download zu meine 3D Entwurf des Nummernschild:

Nummernschildrahmen in den Formaten *.sat, *.stl, *.wrl und *.x3d



Ameisen Simulation und andere Dinge

Wer lange sich schon mit C# beschäftig, hat sicherlich schon mal was von AntMe gelesen oder gehört. Diese Idee hatte ich aufgegriffen und mi...