Skripte
Für lokale Berechnungen oder einfache Automatisierungsaufgaben können Skripte hinterlegt werden. Diese Skripte werden in der Programmiersprache Lua programmiert und können auf alle Datenpunkte zugreifen.
Lua Schnelleinstieg
Lua ist eine leichtgewichtige, einfach zu erlernende Skriptsprache.
Variablen werden ohne Typangabe deklariert (a = 10
), Kommentare beginnen mit --
.
Blöcke wie Bedingungen und Schleifen werden mit then
und end
abgeschlossen (if a > 5 then ... end
).
Funktionen werden mit function
definiert (function name(arg) ... end
).
Tabellen (table
) sind das zentrale Datenstrukturkonzept und werden mit geschweiften Klammern erstellt (t = {}
).
Lua ist dynamisch typisiert und verwendet nil
für nicht gesetzte Werte.
Die Sprache ist minimalistisch, aber sehr flexibel und eignet sich ideal für Automatisierungsaufgaben.
-- Eine einfache Funktion, die zwei Zahlen addiert
function addiere(a, b)
return a + b
end
ergebnis = addiere(5, 7)
print("Das Ergebnis ist: " .. ergebnis)
Zugriff auf Variablen
Mit tags
kann auf alle Datenpunkte aller Verbindungen lesend und schreibend zugegriffen werden.
Der Zugriff erfolgt unter Angabe des Verbindungsnamens gefolgt vom symbolischen Namen (z.B. tags["ModbusConnection"]["Temperature"]
).
Bei einigen Geräten kann auf lokale IOs zugegriffen werden. Diese stehen unter Device
zur Verfügung.
-- Temperatur über Modbus auslesen
temp = tags["ModbusConnection"]["Temperature"]
-- Ventilator einschalten, wenn Temperatur 25°C überschreitet
tags["Device"]["ioman.gpio.dio0"] = temp > 25
Eingangsvariablen
Wenn für die Skript-Logik Werte aus anderen Cloud Adaptern oder aus AnyViz benötigt werden, können diese über requirenumber()
, requireboolean()
und requirestring()
-Funktionen angefordert werden.
In AnyViz steht dann ein beschreibbares Symbol zur Verfügung. So kann beispielsweise ein Sollwert aus AnyViz vorgegeben werden.
Alternativ kann über die Datenpunkt-Quelle der Wert eines anderes Datenpunktes als Eingangsvariable des Skriptes dienen.
level = requirenumber("Water level tank") -- Pegelstand über die Cloud beziehen
pumpIsOn = tags["Modbus"]["Pump"] -- Aktuellen Pumpenstatus ermitteln
if pumpIsOn then
-- Pumpe ausschalten, wenn 400cm erreicht sind
tags["Modbus"]["Pump"] = level < 400
else
-- Pumpte einschalten, wenn 300cm unterschritten wurden
tags["Modbus"]["Pump"] = level < 300
end
Rückgabewerte
Ein Skript kann einen Wert oder alternativ eine Tabelle zurückgeben. Alle Rückgabewerte stehen als Symbol in AnyViz zur Verfügung. So können beispielsweise lokale Berechnungen von ein oder mehren Datenpunkten vorgenommen werden.
-- Eingabewerte
volumenstrom = tags["OPC-UA"]["volume flow"] -- m³/h
temp_vl = tags["OPC-UA"]["temp 1"] -- Vorlauf in °C
temp_rl = tags["OPC-UA"]["temp 2"] -- Rücklauf in °C
-- Berechnung
delta_T = temp_vl - temp_rl
waerme_kW = volumenstrom * 1.16 * delta_T
-- Rückgabe beider Werte als Table
return { Temperaturdifferenz = delta_T, Leistung = waerme_kW }
nil Überprüfung
Es gibt mehrere Gründe, warum der Wert eines Datenpunktes nicht zur Verfügung steht:
- Verbindung wurde noch nicht hergestellt (z.B. nach Neustart)
- Temporäre Verbindungsunterbrechung
- Datenpunk wurde gelöscht
nil
zurück geliefert. Die Skript-Abarbeitung wird fortgesetzt.
Es wird empfohlen, Werte von Datenpunkten immer auf nil
zu überprüfen, bevor sie weiterverarbeitet werden.
So können Fehler durch fehlende oder noch nicht verfügbare Werte vermieden werden.
temp = tags["ModbusConnection"]["Temperature"]
if temp == nil then
print("Wert steht noch nicht zur Verfügung --> keine weitere Abarbeitung")
return
end
Nutzung von Lua Funktionen
Lua bietet einige nützliche Funktionen, die über die IntelliSense-Funktion (STRG+Leerzeichen) des Editors einsehbar sind.
Für komplexere Berechnungen stehen mathematische Funktionen über die math
Tabelle zur Verfügung.
Die os
Tabelle bietet Funktionen zum Auslesen von Datum und Uhrzeit.
-- Aktuelle Stunde über die Funktion os.date()
hour = tonumber(os.date("%H")) -- Stunde (00-23)
-- Licht nach 19:00 Uhr bis 06:00 Uhr einschalten
tags["Siemens TCP"]["Light"] = hour >= 19 or hour < 6
Aus Sicherheitsgründen sind nicht alle Lua-Funktionen verfügbar.
Beispielsweise sind keine Dateioperationen erlaubt und Methoden, wie os.execute()
oder os.exit()
wurden entfernt.