EleLa - Elektronik Lagerverwaltung Hilfe

MQTT - EleLa Fernsteuerung

Mit MQTT lässt sich EleLa fersteuern. Darüber können:

  • Datensätze erstellt oder beschrieben
  • Datensätze gelesen
  • Funktionen ausgeführt

werden. Die Aktionen werden im Log protokolliert.

Konfiguriert wird die MQTT Funktion in der INI Datei. Somit kann man ein EleLa Programm starten, das MQTT Client aufgaben erledigen kann, die man ansonsten nur umständlich lösen kann.

Um diese Funktion nutzen zu können ist dennoch ein grundlegendes Wissen über die EleLa Datenbank und deren Zusammenhänge der Tabellen und Daten erforderlich.

EleLa unterstütz das MQTT Protokoll V3.1.1. MQTT wurde in EleLa integriert, da EleLa bereits das komplette Handling der Daten beinhaltet, incl. Protokollierung.

Beispiel:

Produktion von Geräte, automatisches Generieren eines Test-Protokolls und Eintrag in die Projekt-Historie. Die Daten können von einer SPS Steuerung oder einem Prüfrechner erstellt werden und das Ergebnis wird mit MQTT übermittelt und EleLa trägt die Daten in der EleLa Datenbank ein.

Lager Menge manipulieren, um andere Lagersystem an EleLa anbinden zu können.

Handbuch öffnen: Bei der Nutzung von externen Programmen, die nicht direkt das Handbuch von EleLa öffnen können, kann dies EleLa übernehmen.

Wie funktioniert es:

EleLa verbindet sich mit einem MQTT Broker, dem Server bei dem sich alle Clients des MQTT Netzwerks anmelden müssen. Dieser "Mosquitto" Server muss zu erst installiert werden, wenn er nicht bereits vorhanden ist. Mosquitto ist ein Dienst, der im Hintergrund läuft. Clients verbinden sich mit diesem Server und können Variablen gegenseitig austauschen.

EleLa empfängt über die MQTT Variable, die man bei der INI Datei in "ControlEleLaRx" deklariert hat, einen Befehl und führt diesen aus. Anschließend, nachdem der Befehl ausgeführt wurde, wird die Antwort auf die MQTT Variable "ControlEleLaTx" gesendet.

Die Daten sind mehrzeilige Texte in einer Übertragung, wobei die das Zeilenwechselzeichen ein CR oder CRLF sein kann.

Wenn Datensätze über MQTT geschrieben werden, so geschieht dies im Hintergrund. Daher werden die Ansichten in EleLa nicht automatisch aktualisiert. Mit Rechtsklick in die jeweilige Tabelle können die Daten aktualisiert werden. Dies ist absichtlich so gemacht um effizienter die Daten mit MQTT austauschen zu können.

Warnung Sicherheitsrisiko!

Mit MQTT können Daten in der Datenbank manipuliert werden Sobald MQTT aktiviert ist kann jeder, der Zugriff auf den MQTT Server hat, die Daten von EleLa lesen und schreiben! Es ist unbedingt darauf zu achten dass MQTT nur in einer geschützten IT Umgebung genutzt wird und keinesfalls offen über das Internet. Wenn man MQTT bei EleLa nicht aktiviert hat, so besteht dieses Sicherheitsrisiko natürlich nicht. Siehe ReadOnly Parameter in der INI Datei.

Tipp:

Um die MQTT Funktion zu testen kann man die bestehende Datenbank exportieren und EleLa mit dem Backup als SQLite verbinden. Damit kann man die MQTT Befehle testen bevor man diese mit der echten Datenbank verwendet.

Befehlsübersicht:

Befehl
Beschreibung
WR
Beschreibt oder erstellt einen Datensatz in der Datenbank.
RD
Liest einen Datensatz
Lager
Menge dem Lager hinzufügen oder abziehen.
LagerPlatz
Abfrage der verfügbaren Lagerplätze von einem Bauteil
OpenHandbuch
Öffnet ein PDF Dokument oder Weblink (Handbuch)

Antwort:

Befehl
Beschreibung
IO
Befehl wurde ausgeführt.
Optional: in den weiteren Zeilen ist die Antwort.
Error
Befehl wurde nicht ausgeführt
In der nachfolgenden Zeile steht der erkannte Fehlergrund.

Datentyp Deklaration:

Datentyp
Beschreibung
S
String
F
Float/Double
Wird auch bei Datum/Uhrzeit verwendet im Format ab 1.1.1970.
I
Integer
B
Base64, mehrzeilige Memo-Felder bei z.B. Bemerkung.

Befehl WR - Aufbau MQTT Datentelegram zum schreiben oder erstellen von einem Datensatz:

Mit diesem Befehl kann man einen Datensatz erstellen oder überschreiben. Es können nicht mehrere Datensätze gleichzeitig bearbeitet werden.

Zeile 1: der Befehl "WR"
Zeile 2: der Tabellen Name von EleLa
Zeile 3: Optional, Feld ID vom Datensatz der beschrieben werden soll. Wenn "ID" nicht verwendet wird, so wird ein neuer Datensatz erzeugt.
Ab Zeile 4: Die Felder, die beschrieben werden sollen.

In EleLa gibt es Felder, die zwingend beschrieben werden müssen. Beispiel: Um ein Historien Datensatz an zu legen muss zwingend die "Projekt_ID" und die "Bezeichnung" gesetzt werden.
Andere Felder, die in der Datenbank als "NOT NULL" deklariert sind, müssen ebenfalls mit einem gültigen Wert beschrieben werden (z.B. Status).
Bei Fragen dazu können wir Sie gerne unterstützen.

Beispiel:

WR
Tabelle=<Tabellen Name>
ID=<ID vom Datensatz oder leer um neuen Datensatz zu erstellen>
<Feldname>=<Datentyp>;<Daten>

Wenn der Befehl ordentlich ausgeführt wurde, so wird die Antwort "IO" mit der ID des betroffenen Datensatzes gesendet.
Bei einem Fehler wird "Error" gesendet und in der folgenden Zeile die Fehlermeldung, warum der Datensatz nicht beschrieben werden konnte. EleLa prüft vor dem Schreiben ob die Tabelle und die Felder in der Tabelle existieren und meldet dies als Fehler.

Beispiel der Antwort:

IO
ID=1234

Wenn es bei einzelnen Feldern einen Fehler gab, so wird der Datensatz dennoch erzeugt und mit der "IO" Rückmeldung diese Info dazu gezeigt.

Hinweis: Die Tabellen Foto, Param und Recht können nicht beschrieben werden.

Befehl RD - Aufbau MQTT Datentelegram zum lesen von einem Datensatz:

Mit diesem Befehl kann man einen Datensatz von der EleLa Datenbank lesen. Es kann nur 1 Datensatz abgefragt werden.

Zeile 1: der Befehl "RD"
Zeile 2: der Tabellen Name von EleLa
Zeile 3: <Feldname>=<Wert>
Zeile 4: Die Felder, die gelesen werden sollen, Komma getrennt (optional)

In Zeile 3 kann beispielsweise der eindeutige Datensatz mit ID=<Zahl> die eindeutige Datenzeile ausgewählt werden. Man kann auch mit anderen eindeutigen Bezeichnern einen Datensatz wählen, Beispiel: Tabelle "bauteilvariante", Feld "ArtikelNr" mit dem Wert.

In Zeile 4 werden alle Felder mit Komma getrennt übergeben. Wenn Zeile 4 nicht existiert so werden alle Felder zurück gegeben.

Beispiel:

RD
Tabelle=<Tabellen Name>
ID=<ID vom Datensatz der abgefragt werden soll>
<Feldname>,<Feldname>,
<Feldname>,...

Wenn der Befehl ordentlich ausgeführt wurde, so wird die Antwort "IO" gesendet, in den weiteren Zeilen die Daten.
Bei einem Fehler wird "Error" gesendet und in der folgenden Zeile die Fehlermeldung, warum der Datensatz nicht beschrieben werden konnte. EleLa prüft ob die Tabelle und die Felder in der Tabelle existieren und meldet dies als Fehler.

Beispiel der Antwort:

IO
ID=I;123
Bezeichnung=S;1N4148
ArtikelNr=S;LL4148N

ID=<Datentyp>;<Wert>

Befehl Lager - Aufbau MQTT Datentelegram zum ändern der Lagermenge:

Mit diesem Befehl kann man die Lagermenge von einem Lagerplatz ändern. Bei der Änderungsmenge von 0 wird die aktuelle Lagermenge abgefragt.

Zeile 1: der Befehl "Lager"
Zeile 2: ID der Tabelle bauteillager
Zeile 3: Menge, die manipuliert werden soll oder mit MengeSet, die Menge die man setzt.

In Zeile 3, "Menge" kann bei einer negativen Zahl = Lagermenge abziehen, bei einer positiv Zahl = Lagermenge hinzugefügt werden. Bei Menge = 0 wird keine Lagermenge manipuliert.
Wenn bei Abzug vom Lager die Lagermenge 0 unterschreitet, so wird die Lagermenge in EleLa auf 0 begrenzt.
In Zeile 3, "MengeSet" setzt die Lagermenge, z.B. 10 setzt die neue Lagermenge auf 10. Negative Werte sind nicht möglich.

Beispiel:

Lager
ID=<ID vom Datensatz der Tabelle bauteillager>
Menge=<zu manipulierende Menge>

Wenn der Befehl ordentlich ausgeführt wurde, so wird die Antwort "IO" gesendet, in der zweiten Zeile der aktuelle Lagerbestand.
Bei einem Fehler wird "Error" gesendet und in der folgenden Zeile die Fehlermeldung, warum der Datensatz nicht beschrieben werden konnte.

Beispiel der Antwort:

IO
Menge=123

Befehl LagerPlatz - Aufbau MQTT Datentelegram zum Abfragen von Lagerplätze:

Mit diesem Befehl kann man die Lagerplätze von einem Bauteil abfragen. EleLa unterstützt mehrere Lagerplätze je Bauteil, mit diesem Befehl kann man diese erfahren.

Zeile 1: der Befehl "LagerPlatz"
Zeile 2: ID der Tabelle bauteilvariante oder ArtikelNr, ArtikelNr2 oder Barcode von bauteilvariante
Zeile 3: Optional, das Trennzeichen, wenn keines angegenen wurde, so wird ein | Zeichen verwendet.

In Zeile 2 kann man mit unterschiedlichen Methoden den Datensatz finden. Wenn man nach "ArtikelNr" sucht, so muss das Ergebnis genau einen Datensatz liefern, ansonsten wird EleLa mit einem Fehler antworten, da die Lagerpositionen nicht mehr einem eindeutigen Gehäuse/Variante Datensatz zuordenbar ist.

Beispiel:

LagerPlatz
ID=<ID vom Datensatz der Tabelle bauteilvariante>
|


LagerPlatz
Barcode=<Text>
|

Wenn der Befehl ordentlich ausgeführt wurde, so wird die Antwort "IO" gesendet, ab der zweiten Zeile die Daten aus der Tabelle Gehäuse/Variante und ab der dritten Zeile die Lagerplätze. Die einzelnen Felder sind mit einem "|" getrennt, alternativ kann in der Abfrage das Trennzeichen (1 Zeichen) gewählt werden. Wenn in dem Text das Trennzeichen vorhanden ist, so wird automatisch der Text in " eingeschlossen.
Bei einem Fehler wird "Error" gesendet und in der folgenden Zeile die Fehlermeldung, z.B. wenn kein eindeutiger Datensatz bei von Gehäuse/Variante gefunden werden konnte.

Beispiel der Antwort:

IO
<ID>|<Bezeichnung>|<Gehäuse>|<ArtikelNr>|<ArtikelNr2>|<Barcode>|<Gewicht>
<ID>|<Menge>|<Kiste_ID>|<LagerNrFach>|<X>|<Y>|<Z>|<Gewicht>
<ID>|<Menge>|<Kiste_ID>|<LagerNrFach>|<X>|<Y>|<Z>|<Gewicht>

Gewicht Felder:

Zeile 2, BauteilVariante: Das Gewicht eines einzelnen Bauteils.
Zeile 3..., BauteilKiste: Das Leer-Gewicht des Lagerfaches, bzw. der Box, Dose, Behälter der Bauteile.

Befehl OpenHandbuch - Öffnen von einem PDF Dokument oder eines Weblink:

Mit diesem Befehl kann auf dem PC, auf dem EleLa läuft, ein PDF Dokument oder ein Weblink geöffnet werden.

Zeile 1: der Befehl "OpenHandbuch"
Zeile 2: der Tabellen Name von EleLa
Zeile 3: ID vom Datensatz der Tabelle

Beispiel:

OpenHandbuch
Tabelle=<Tabellen Name>
ID=<ID vom Datensatz der Tabelle>

Wenn der Befehl ordentlich ausgeführt wurde, so wird die Antwort "IO" gesendet.
Bei einem Fehler wird "Error" gesendet, z.B. wenn der Tabellenname nicht existiert oder wenn der Datensatz kein Handbuch verlinkt hat.

Beispiel der Antwort:

IO

Quellcode Beispiel einer Base64 Codierung Wandlung in ein Byte Array in SCL (SPS Steuerung):

Empfang von Daten im Format "Base64", Wandlung der Daten in ein Array of Byte. Dieser Quellcode ist in der Sprache SCL geschrieben, die meisten modernen SPS Steuerungen unterstützen diese Programmiersprache.

FUNCTION_BLOCK "Base64"
VAR_INPUT
  StrBase64: String; // Base64 String
END_VAR
VAR
  i: Int; // String Index, darf nie länger als 252 werden
  k: Int; // Array Index, darf nie länger als 189 werden
  Temp_String : String[254]; // Buffer-String für Wandlung in ByteArray
  String_Sicht AT Temp_String: Struct
    Str_Max_Len: Byte;
    Str_Akt_Len: Byte;
    Data: Array[1..254] of Byte;
  END_STRUCT;
  DataByte : Array[1..155] of Byte; // Buffer-Daten der empfangenen Bytes
END_VAR
BEGIN
  #Temp_String := #StrBase64; // Umrechnen Base64 Daten in Byte Array:
  #i := 2;
  #k := 1;
  WHILE #i < BYTE_TO_INT(#String_Sicht.Str_Akt_Len) DO
    #DataByte[#k] := SHL_BYTE(IN := #String_Sicht.Data[#i] AND 16#3F, N := 2) OR SHR_BYTE(IN := #String_Sicht.Data[#i + 1], N := 4);
    #i += 1;
    #k += 1;
    IF #i < BYTE_TO_INT(#String_Sicht.Str_Akt_Len) THEN
      #DataByte[#k] := SHL_BYTE(IN := #String_Sicht.Data[#i] AND 16#F, N := 4) OR SHR_BYTE(IN := #String_Sicht.Data[#i + 1], N := 2);
      #i += 1;
      #k += 1;
      IF #i < BYTE_TO_INT(#String_Sicht.Str_Akt_Len) THEN
        #DataByte[#k] := SHL_BYTE(IN := #String_Sicht.Data[#i] AND 16#3, N := 6) OR #String_Sicht.Data[#i + 1];
        #i += 2;
        #k += 1;
      END_IF;
    END_IF;
  END_WHILE;
END_FUNCTION_BLOCK

Diagnose von MQTT

Mit Client Tools können die MQTT Datentelegramme vom MQTT Broker abgefragt werden. Damit lässt sich der Datenverkehr zwischen 2 Programmen mit hören. Auf der EleLa Homepage, unter neueste Builds, kann man sich unter Tools > MQTT ein einfacher Client für Windows oder Linux laden.


© 2010-2025 by Markus Müller