SQLite-Anbindung in Logi.CAD

More
5 years 2 months ago - 5 years 2 months ago #42 by Tobias Hajszan
Hallo liebe Community!

Ich habe diesen Sommer (2014) mein Praktikum bei Logicals verbracht und als kleines Projekt auf dem Raspberry Pi, Schnittstellen für SQLite in Logi.CAD eingebaut.
Dieses Projekt möchte ich kurz vorstellen.

Aufgabenstellung
  • Schreiben von Werten in eine Tabelle
  • Abfrage von Werten aus der DB
  • Absetzen von SQL-Statements
  • Werte von Analogsensor (z.B. Analogmodul Hr. Horter) werden von SPS-Programm zyklisch gelesen.
  • Mittels der DB-Vendor-Bauseine werden die Werte vom Sensor zyklisch in eine SQLite-Datenbank geschrieben.
  • Die Werte können aus der DB wieder ausgelesen werden.

Bausteine
Um dieses Ziel erfüllen zu können musste ich C-Vendorbausteine schreiben.
Folgende C-Vendor Bausteine sind verfügbar und funktionsfähig:
  • SQLite_Connect
  • SQLite_Disconnect
  • SQLite_ExecuteStatement
  • SQLite_GetTimestamp
  • SQLite_Sprintf
  • SQLite_SelectIntegers
  • SQLite_SelectString

Erläuterung der Bausteine

SQLite_Connect
Diese Methode ist für die Verbindung der Datenbank zuständig. Als Parameter empfängt der Baustein lediglich den Dateipfad zur SQLite Datenbankdatei.
Ist die Verbindung erfolgreich wird ein Handle, welcher ungleich 0 ist, zurückgesendet. Dieser Handle ist ein lint.

SQLite_Disconnect
Dieser Baustein ist für die Trennung der Datenbank zuständig. Als Parameter empfängt der Baustein den Handle des SQLite_Connect Bausteins.
Es gibt einen int zurück, wenn erfolgreich 0, wenn ein Fehler auftritt 1-101. Die Werte können hier nachgeschlagen werden.

SQLite_ExecuteStatement
Mit diesem Baustein ist es möglich SQL Statements auszuführen. Dazu zählen insert, update, create, drop und alter Befehle. Dazu braucht er einerseits den Handle,
sowie das SQL Statement, welches in einem String[500] übergeben werden muss. Ist das SQL-Statement erfolgreich ausgeführt worden gibt die Methode
über sqlresponse (int) eine 0 zurück. Liegt ein Fehler vor, wird eine Kennzahl mit sqlresponse übermittelt welche man hier nachschlagen kann.

SQLite_GetTimestamp
Dieser Baustein gibt den aktuellen Timestamp in Unixepoch-Format als String[10] über die Variable timestamp zurück.

SQLite_SelectIntegers
Dieser Baustein gibt eine Reihe Integer Werte von der Datenbank zurück. Er braucht dazu den Handle der Datenbank, sowie ein gültiges select Statement. Mit dem Anfügen von "limit x, x+1", kann eine bestimmte Reihe herausgefiltert werden. Es können bis zu 10 spalten auf einmal ausgelesen werden. Die Daten werden dann in einem Int array gespeichert

SQLite_SelectString
Dieser Baustein liefert einen String von maximal 50 Zeichen zurück. Zum Ausführen werden der Handle der Datenbank und ein SQL Statement benötigt. Zurück bekommt man über den retstr von String[50] den Wert, den das SQL-Statement liefert.

SQLite_Sprintf
Mit dem SQLite_Sprintf lässt sich ein Text mit Variablen vom Typ String und Int befüllen. Dazu gibt man ihm mit string1 den Haupttext an, indem die Variablen eingesetzt werden sollen. In der str variable steht dann der String-Wert welcher eingesetzt werden soll. Mit dem ints Array kann man bis zu zehn Ints übergeben, welche ebenfalls im Haupttext ersetzt werden können. zurück bekommt man dann den retstr (return string) von dem Typ String[500].
Beispiel:
ints[0] := 10;
SQLite_GetTimestamp(timestamp => timestamp);
 
/*
 *Mit dem Symbol "}" und dem danach folgendem Zeichen definiert man, was ersetzt werden soll.
 *"s" steht für String. Deswegen wird }s mit str ersetzt.
 *Die Zahlen 0-9 stehen für die Zahlen im ints Array. 0 --> ints[0] 1 --> ints[1]....
*/
 
sqlstring1 :='insert into temp values(}s,}0)';
SQLite_StatementReplacer(string1 := sqlstring1, str := timestamp, ints := ints, retstr => statement);
 
Ausgabe: 'insert into temp values(1406205914,10)'


Git Repository
Den Code findet ihr auf Github unter:
URL: github.com/Tobbeeee69/lc3-vendor-sqlite
URL: github.com/Tobbeeee69/langzeitueberwachung (Beispiel zur Verwendung der SQLite-Bausteine mit i2c)
In der Readme Datei wird auch das Datenbankschema zum jeweiligen Projekt angeführt.

Abschließend möchte ich mich bei Logicals bedanken, welche mir ein sehr schönes und anspruchsvolles Praktikum ermöglicht haben. Ich habe sehr viel Neues gelernt und konnte eine Menge Erfahrung sammeln. Danke!
Last edit: 5 years 2 months ago by Tobias Hajszan.
The following user(s) said Thank You: Rainer Poisel

Please Log in or Create an account to join the conversation.

More
5 years 2 months ago #43 by Edwin Bruckner
Nice Job!

Anmerkungen:
Der Sample-Code zu SQLite_Sprintf verwendet noch den alten Namen "SQLite_StatementReplacer".
Zu erwähnen wäre noch, dass die Programme auf dem Raspberry Pi laufen, und SQLite3 installiert sein muss.
Das Datenbank-Schema ist in README.md in den GIT Repositories zu finden.

Please Log in or Create an account to join the conversation.

LOGI.CALS AUSTRIA

Address

Europaplatz 7/1,
3100 St. Pölten

LOGI.CALS GERMANY

Address

Postfach 1306,
40738 Langenfeld
© 1987 - 2019 logi.cals GmbH