Hochsprachenprogrammierung - Logik Script

Aus HMI-Master Online Docu
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Allgemein

Hinweis: Dieses Modul ist nur aus kompatibilitätsgründen noch vorhanden!

Aktiv weiternetwickelt wird nur mehr das Scriptmodul in der grafischen Logikprogrammierung, siehe Logik GUI...


Mit diesem Logikodul können einfache Scripte erstellt werden. Als Syntax wird Lua (www.lua.org) verwendet. Diese Programmiersprache ähnelt in der Syntax Basic und wurde mit einigen zusätzlichen Befehlen erweitert. Es stehen ein einfacher Editor und Debugger zur Verfügung. Sie können aber auch jeden anderen Editor verwenden, beispielsweise Scite oder Nodepad++.

Logik script.png


Das Hauptfenster ist aufgeteilt in einem Editor plus Watch- und Tracefenster. Im Tracefenster (6) werden ausgeben mit dem Befehl "hmi_print" oder Fehlermeldungen des Interpreters ausgegeben. Im Watchfenster werden Meldungen mit dem Befehl "hmi_watch" ausgegeben, über diesen Befehl kann der Wert von Variablen online beobachtet werden.

Editor

Im Editor wird das Programm als normaler Text bearbeitet, Sie können auch jederzeit einen anderen Editor verwenden, in diesem Fall muss die Datei „hmi_master_script.lua“ im „config_“ Verzeichnis bearbeitet werden. Ausgeführt wird das Script vom Dienst SCRIPT, ob der Dienst läuft kann unter System geprüft werden. Das Programm erkennt automatisch ob sich das Script geändert hat und startet es dann automatisch neu. In dieser Beschreibung kann nicht auf den gesamten Sprachumfang eingegangen werden, deshalb werden hier nur einige grundlegende Dinge und die Spracherweiterungen beschrieben. Eine sehr gute Beschreibung für Anfänger gibt es unter „http://lua.gts-stolberg.de“.

Der Editor bietet ein einfaches Syntax highlighting, folgende Farben sind vordefiniert:


Grün Kommentar -- Das ist ein Kommentar
Blau Grundbefehlssatz function, if, then, else, end
Rot HMI-Master Spracherweiterungen hmi_watch, hmi_print


Tipp: Im Script werden Variablennamen verwendet, diese können vom Variablenfenster im Konfigmode direkt per Drag&Drop in den Editor gezogen werden.

Funktionen


Im Script gibt es keine Main Schleife die kontinuierlich durchlaufen wird, vom Interpreter werden nur Funktionen aufgerufen. Es gibt einige Funktionen welche immer im Script vorhanden sein müssen:


function OnNetvar (name,value,adr_scr,adr_dst,cmd,from)

end

________________________________________________________

Diese Funktion wird aufgerufen sobald ein Bustelegramm empfangen wurde. Als Parameter wird der Name des EIB Gerätes und der Wert übergeben. Es werden nur Telegramme weitergeleitet in welchem als Zieladresse ein Gerät in der KNX Konfiguration angelegt wurde, unbekannte Adressen werden nicht weitergegeben

  • name: Name der Variable
  • value: Wert
  • adr_src: Quelladressen in der Form 1.1.1
  • adr_dst: Zieladresse in der Form 1/1/2
  • cmd: Befehl. CMD_WRITE, CMD_RESPONSE oder CMD_READ
  • from: Namen des Dienstes von dem die Adresse gesendet wurde, beispielsweise FROM_EIBD bedeutet vom KNX Bus, FROM_CAND bedeutet vom CAN Bus.

function OnTimer (value_ms)


      -- 100 Millisekunden

      if value_ms == 100 then



      end


      -- 1 Sekunde

      if value_ms == 1000 then



      end


      -- 10 Sekunden

      if value_ms == 10000 then



      end

      -- 1 Minute

      if value_ms == 60000 then



      end

end

Diese Funktion wird zyklisch in vordefinierten Zeitabständen aufgerufen. In der Variable „value_ms“ wird der Abstand in Millisekunden angegeben. Beispielsweise 100 für den 100 Millisekunden Intervall. Zurzeit wird die Funktion in folgenden Abständen aufgerufen:

100 ms Kleinste Zeiteinheit
1000 ms 1 Sekunde
10000 ms 10 Sekunden
60000 ms 1 Minute

Größere Abständen können beispielsweise durch hoch zählen einer Variable gebildet werden. Kleinere Abstände als 100 ms sind zurzeit nicht vorgesehen.



Eigene Funktionen definieren


Um das Programm übersichtlich zu gestalten ist es sinnvoll eigene Funktionen zu definieren. Die selbst definierten Funktionen können dann entweder zyklisch über die Funktion OnTimer abgearbeitet,
oder als Reaktion auf ein Bustelegramm aus der Funktion OnNetvar aufgerufen werden.

function OnTimer (value_ms)
      -- 1 Sekunde
      if value_ms == 1000 then
            Logic_1 ();
      end
end
function Logic_1()
      if hmi_get_var("Aktor1") > 0 then
            hmi_write_var("Aktor1",0,0);
      else
            hmi_write_var("Aktor1",1,0);
      end
end

In diesem Beispiel wurde die Funktion „Logic_1()“ definiert, diese Funktion wird auf der Funktion „OnTimer“ aufgerufen. Damit wird die Funktion Logic_1 jede Sekunde aufgerufen. Die Funktionen
„hmi_get_var“ und „hmi_write_var“ dienen zur Abfrage und zum Beschreiben von EIB Variablen, siehe Befehlsübersicht. Ist die Variable „Aktor1“ größer 0 wird diese auf 0 gesetzt, anderenfalls auf 1. Als Ergebnis wird der Aktor jede Sekunde Aus- Eingeschaltet, mit dieser Funktion wurde also ein einfaches Blinken eines Ausganges realisiert.


Befehlssatzerweiterungen


hmi_write_var

hmi_write_var(„Name“, Wert, Force)

Mit diesem Befehl wird ein Bustelegramm gesendet.

Name: String in Anführungszeichen, Name der EIB Variable aus der EIB KNX Konfiguration. Der Name muss exakt so wie in der Konfiguration angegeben
werden, zwischen Groß Kleinschreibung wird ebenfalls unterscheiden.

Wert: Wert der Variable. Es können beliebige Werte angegeben werden, beispielsweise können auch Solltemperaturen oder Dimmwerte gesendet werden.

Force: Wird hier eine 1 angegeben, wird die Variable immer auf den Bus gesendet, auch wenn sich der Zustand nicht geändert hat. Bei 0 wird das Telegramm nur gesendet wenn sich der Zustand geändert hat.

Hinweis: In Programmen die Zyklisch bearbeitet werden sollte dieser Parameter mit 0 angegeben werden, ansonsten wird bei jedem Aufruf ein
Telegramm gesendet.

if hmi_get_var(„Schalter1“) == 0 then
      hmi_write_var(„Aktor“,1,0)
end
hmi_write_var_ex
Mit diesem Befehl können beliebige Bustelegramme gesendet werden, die Adressen müssen nicht wie beim Befehl „hmi_write_var“ in der Adressdatenbank vorhanden sein.

hmi_write_var(1,1,1,1,1)
hmi_write_var(1,1,1,1,0)

Parameter 1-3: Zieladresse Hauptgruppe/Mittelgruppe/Untergruppe
Parameter 4: EIS Typ (1-14, 15 wird nicht unterstützt)
Parameter 5: Wert

Im Beispiel wird zuerst eine 1 an die Adresse 1/1/1 gesendet, danach eine 0.
hmi_get_var
hmi_get_var(„Name“)

Mit diesem Befehl wird der Zustand einer EIB Variable abgefragt. Es wird hierbei kein Read Befehl auf den Bus gesendet, der Wert kommt aus dem Cache des EIB Daemons.

if hmi_get_var(„Schalter1“) ~= 0 then
      hmi_write_var(„Aktor“,1,0)
end
hmi_print
hmi_print("Nachricht an den Debugger...");
hmi_print("Clock0.0: ", g_clock_0);

Mit diesem Befehl können Debug Meldungen an den Debugger gesendet werden, es können auch im Programm verwendete Variablen angegeben werden.

hmi_print("Diese Variable ist: ", g_clock_0,“ km/h“ );

Obiger Befehl gibt folgendes in das Ausgabefenster des Debuggers aus:

"Diese Variable ist: 123 km/h“
hmi_get_wdir
Liefert das Arbeitsverzeichnis als String zurück, dies ist für die Funktion „dofile“ hilfreich, mit dem Befehl dofile können Funktionen in weitere Dateien ausgelagert werden, dabei muss immer der komplette Pfad mit angegeben werden. Die Funktion „hmi_get_wdir“ liefert immer das aktuelle Konfigurationsverzeichnis zurück, damit können Scripte in mehreren verschiedenen Konfigurationen gleich verwendet werden.

Beispiel:

"hmi_master_lua_f1.lua"

function f_extern_1()
      hmi_print(g_schalter_1);
end

function f_extern_2()
      hmi_print(g_schalter_2);
end

Aufruf im Hauptscript:

f = loadfile( hmi_get_wdir() .. "hmi_master_lua_f1.lua");
f();

Im Script können dann die Funktionen aus der externen Datei aufgerufen
werden

f_extern_1();
f_extern_2();

Mit dieser Änderung können externe Scripte unter Linux und Windows gleich aufgerufen werden, bisher musste immer der komplette Pfad mit angegeben werden.
hmi_watch
hmi_watch(„Text“, Variable)

Mit diesem Befehl können interne Programmvariablen überwacht werden, der Wert der Variable wird dann im Debugger ausgegeben. Anders als mit dem
Print Befehl wird die Ausgabe nicht überschreiben sondern kontinuierlich in der selben Zeile angezeigt.
hmi_ser_open

com_handle = hmi_ser_open("com2","CBR_115200","DATABIT8","ONESTOPBIT","NOPARITY");

Mit den Befehlen "hmi_ser" kann eine serielle Schnittstelle vom Script aus verwendet werden. Um die Schnittstelle nutzen zu können, muss diese erst geöffnet werden. Tritt ein Fehler auf , beispiesweise weil die Schnittstelle nicht vorhanden oder von einem anderen Prozess verwendet wird, wird nil zurückgegeben.

hmi_ser_close

hmi_ser_close(com_handle)

Schließen der Schnittstelle mit dem Handle aus "hmi_ser_open"


hmi_ser_read

len,str_data = hmi_ser_read(max_len,timeout_ms,"_STRING");

Lesen von Daten der seriellen Schnittstelle, als Parameter wird die maximale Länge, Timeout und Datentyp angegeben. Als Datentyp kann entweder "_STRING" oder "_HEX" angegeben werden. Wird "_HEX" angegeben, werden die Daten als Hexstring zurückgegeben (FF0E00 usw.). Daten und String werden als zwei Variablen im Rückgabewert zurückgegeben.

hmi_ser_write

hmi_ser_write(len,str_data,"_STRING");

Schreiben von Daten auf die serielle Schnittstelle