Formeln

Wichtig: Bei Verwendung von ; in den Formeln muss die Formel mit „ “ eigefasst werden. Zudem muss das letzte Zeichen innerhalb der " ein ; sein.

Zugriff auf Items:

  • X.0
    Zugriff auf die Itemvariablen. 0= ID des Items

Zugriff auf System-Variablen:

  • $.SYS
    $.SYS.TIME Systemzeit in Sekunden
    $.SYS.TIME_MS Systemzeit in Millisekunden
  • $.PARAM.xxx
    Zugriff auf die Parameter des einzelnen Subdevices.
  • $.GPARAM.xxx
    Zugriff auf die Parameter des Hauptdevices.
    z.B. $.GPARAM.MANUFACTURER
  • URL: erzeugt einen URL Aufruf. Dieser kann dann dem $.GPARAM.URL übergeben werden und dann als Link in der App aufgerufen werden.
    $.GPARAM.URL:=XXX.URL;

Zugriff auf Temporäre Variablen:

  • Wird der Name der Funktion nicht gefunden wird dies als TEMP Variable verwendet. Variablen gelten nur innerhalb des Devices(Slave)

Zugriff auf Kommunikationsmethoden:

  • NNN.xxx
    • NNN= ALIAS der Methode.
    • xxx= Abhängig vom Protokoll
  • Generelle Variablen:

    • F=Forcen/Changed (GET/SET)
    • L=Datenlänge
    • Q=Qualität
    • EC=Errorcounter (GET/SET)
    • EN=Error-Nummer
    • T=Timesstamp (GET/SET)
    • P=Pausieren für x Sekunden (GET/SET)
  • Modbus:

    • xxx.FORMAT
      • xxx=Start-Register
      • FORMAT: Konvertierung WORD/UINT/DWORD/DUINT/LWORD/LUINT/INT/DINT/LINT/FLOAT/DOUBLE
  • Sercom(Ascii)

    • GET/LESEN
      • xxx.yyy.FORMAT
        xxx=Start-Byte, yyy=Länge,FORMAT=Format
        FORMAT: INT,FLOAT,BYTESUM(Summe aller Bytes)
      • xxx.zzz
        xxx=Byte
        zzz=String-Enumliste zb. NNN.8.NO,YES,MAYBEE
        Ist der String ab dem 8.Byte gleich mit „NO“ , dann ist Wert 0
        YES=1, MAYBEE=2, Anders =0
    • SET/SCHREIBEN
      • ARG.xxx
        xxx = ALIAS des Argumentes der Funktion
  • Rest(JSON)

    • GET/LESEN
      xxx
      • xxx = VALUE
        Wert des Objektes
        VAL.NNN.NNN.NNN
        NNN= Name des Objektes
      • xxx = ARRAY
        Zugriff auf eine Arrary mit den Folgefunktionen
        ARRAY.MEDIA.NNN.NNN.NNN = Mittelwert
        ARRAY.MAX.NNN.NNN.NNN = Maxwert
        ARRAY.MIN.NNN.NNN.NNN = Minwert
        ARRAY.LEN.NNN.NNN.NNN = Länge des Arrays
        NNN= Name des Objektes
      • xxx = FIND
        Vergleichen des Wertes mit dem folgenden String
        FIND.STRING.NNN.NNN.NNN
        Sucht den STRING im Objektwert
        NNN= Name des Objektes
      • Abfragevariable bei JSON Objekten:
        ARRAY-Wert: mit xxx.xxx[0].sdas[1].das; Mit [].
      • ASLIST: Damit können Werte aus Arrays in eine Liste mit ' getrennt umgewandlet werden.
        zb. XXX.ASLIST.Item[1].subitem[].variable;
        listet die Werte aus dem Array Item[1].subitem der Variable variable auf.
      • xxx.EXIST.yyy.yyy.yyyy
        xxx: DATA
        yyy.yyyy… =JSON Item
        liefert 1 wenn Json/XML Item gefunden wird.
      • xxx.URL
        liefert den URL String des aktuellen Aufrufs
      • xxx.HTTP_CODE
        liefert den http-CODE
      • xxx.HTTP_DATA
        liefert die http-RAW-Daten
         
    • SET/SCHREIBEN
      ARG.xxx
      • xxx = ALIAS des Argumentes der Funktion

Aufbau der Formel:

Die Formeln müssen in „ eingeschlossen sein, da sie ; als Befehlszeichen verwenden. Auch newLine ist anwendbar. (tab in Formel “ " erlaubt)

Aufbau:

  • Beinhaltet alle Möglichkeiten der aktuellen Formelberechungen. Für die richtige Ausführung ist die konsequente Anwendung von Klammern () wichtig.

  • Operationen:

  • *

    MUL

    /

    DIV

    +

    ADD

    -

    SUB

    ^

    POT

    >

    GR

    >=

    GGL

    <

    KL

    <=

    KGL

    !=

    UGL

    ==

    GL

    >>

    SHR

    <<

    SHL

    &&

    AND

    ||

    OR

    &

    BAND

    |

    BOR

    :=

    RESULT


  • Strukturfunktionen:
    IF THEN ELSE ENDIF;

  • IF THEN Anweisungen dürfen nicht verschachtelt werden. Jedoch können mehrere IF THEN ELSE IF THEN ELSE IF THEN ELSE ENDIF; angelegt werden.

  • Beispiel:

  • "IF X.0 > 100 THEN 
        X.1 := X.1 + 1; 
    ELSE IF X.0 > 10 THEN 
        X.1:=X.1+10; 
        TESTVAR:=(X.1+X.2)*(10-9); 
        DEBUG(TESTVAR,X.2,X.0); 
    ELSE 
        X.1:=X.1+1000;  
    ENDIF; 
    IF X.1 > 1000 THEN 
        X.2:=10; 
    ELSE IF X.1 >200 THEN X.2:=100;  ELSE  X.2:=1000; ENDIF;  
    X.2:=X.2+10;" 
    

Variablenzugriff:

  • Siehe oben.

Funktionsaufrufe in Formeln:

In Formeln ist es möglich Funktionen zu verwenden. Die Funktionen können mehre Parameter haben.

Die gesamte Funktion darf keine Operationszeichen wie +-/…. enthalten

Zb. DEBUG( TEST, TEST); geht nicht, DEBUG(TEST,TEST); ist OK

Aufbau: NNN(XXX,XXX,XXX,XXXX)

  • NNN= Name der Funktion
  • XXX= Parameter der Funktion. Diese müssen Variablennamen sein und nicht direkt numerische Werte. In dem Fall müssen die Werte zuerst in eine Variable geschrieben werden und dann dieses al Parameter übergeben.
  • Wichtig: Die Funktion darf kein Leerzeichen enthalten und auch keine Operationszeichen wie +-/….
  • Beispiel:
    X.1:=DATE_DAY($.SYS.TIME);
    Schreibt in X.1 den Monatstag der aktuellen Uhrzeit rein.
    UHRZEIT:=$:SYS.TIME-86000; X.1:=DATE_DAY(UHRZEIT);
    Schreibt in X.1 den Monatstag des Vortages.

Funktionen:

  • Bei den Funktionen müssen die Paramter als Variablen übergeben werden. Direkt Werte gehen nicht. (Grund: bei einer Zahl mit punkt kommt das Aufsplitten durcheinander.)
  • Beispiel: PARAM_TIME:=10000; X.1:= DATE_MONTH(PARAM_TIME);

  • Datumsfunktionen:
    PARAM_TIME= VARIABLE mit TIME WERT (Zeit in Sekunden)
    • DATE_MONTH(PARAM_TIME)
    • DATE_YEAR(PARAM_TIME)
    • DATEWDAY(PARAM_TIME)
    • DATE_YDAY(PARAM_TIME)
    • DATE_HOUR(PARAM_TIME)
    • DATE_MIN(PARAM_TIME)
    • DATE_SEC(PARAM_TIME)
  • Zeitfunktionen:
    • TIME_FROM_YDAY(PARAM_YEAR, PARAM_YEARDAY)
    • TIME_FROM_DATE (YEAR,MON, DAY)
    • TIME_FROM_DATE (YEAR,MON, DAY,HOUR,MIN,SEC);
    • TIMEFROMISO8601(isostring)
  • Math-Funktionen :
    • LOG(VALUE,BASE)
    • DEC(val) ... GANZZAHL der Zahl
    • DEC(val, div) .... GANZZAHL der Division in Int und real
    • MOD(val, div) ... REST der Division in Int und real.
    • ROUND(val, div) ... GERUNDETER WERT der Division in Int und real
    • ROUND(val) ... GERUNDETER WERT der real zahl
       
    • val und div sind die real-werte

    • SINEFROMTIME(frequency, amplitude, phase=0) frequency in Hz, amplitude, phase in radiant all item oder number
  • Help-Funktionen:
    • DEBUG(VAR1,VAR2,VAR2,..);
      Die Funktion DEBUG gibt im Log des Device die Namen der Variablen mit dem aktuellen Wert aus.
      Zb. IF .. THEN DEBUG(VAR1,VAR2,X.10); …
      Erscheint im Log: 10:12:30:VAR1=6,VAR2=3,X.10=10.2);
  • String-Funktionen:
    • X.1:=‘HALLO‘;
    • LEN(X.1);
    • ISEQUAL(X.1,X.2);

      Andere Operationen wie +-/.. sind nicht möglich. Parameter dürfen hier auch direkte Strings sein zB ISEQUAL(TEST,‘HALLO‘);
       
    • ISEQUAL(string1, string2, [len]) len= Anzahl der zu vergleichenden Zeichen
    • SUBSTRING(string, start, [len]) len= Anzahl der Zeichen
    • CONCAT(string1, string2,...) string item oder string
    • SYSTEMINFO(xxx);
      xxx=NAME Liefert den Hostnamen
      xxx=ID Liefert die Gekko ID
    • RANDOMSTRING(xxx);
      xxx= Länge des Strings als Zahl: zb RANDOMSTRING(16);
      Liefert einen Zufallsstring mit 16 Zeichen.
    • STRING_TO_NUMBER (string, start, len, type) type=INT8, INT16, INT32, INT64, FLOAT, DOUBLE
    • HEXSTRING_TO_NUMBER(STRING,START,LEN,TYPE)
      STRING: VARIABLE oder String’
      START ab 0 des Substrings zum umwandeln
      LEN des Substrings TYPE: INT8(1Byte),INT16(2Byte),INT32(4Byte),INT64(8Byte),FLOAT(4 Byte(,DOUBLE(8 Byte)

      Beispiel:
    • TEST:='fl_09818121';
      IF ISEQUAL(TEST,'fl_',3) THEN
        VAL:=HEXSTRING_TO_NUMBER(TEST,3,8,FLOAT);
      ELSE IF ISEQUAL(TEST,'u6_',3) THEN
        VAL:=HEXSTRING_TO_NUMBER(TEST,3,8,INT64);
      ELSE ....
      ENDIF;
    • STRING_TO_NUMBER(STRING,START,LEN,TYPE)
      Idem HEXSTRING_TO..
    • SUBSTRING(STRING,START)
    • SUBSTRING(STRING,START,LEN)
    • REPLACEWITHASCII(Text,Suchtext,ASCIIZeichen);
      TEXT:='HALLO $ANFTEST$ANF';
      TEXT2:=REPLACEWITHASCII(TEXT,'$ANF',34);
  • Speichern:
    • SAVE_JSON(x,y,c,v,v);
      Speichert Werte in einer Sicherungsdatei, die beim Neustart wieder geladen werden
      Nicht dauernd aufrufen. Achtung.
       
  • DECIMAL_TO_STRING(number)
  • FLOAT_TO_STRING(number)
  • SETVALUE(prefix, suffix, index, value1, value2,...) prefix as string or variable, suffix part of Variable, index as number or variable, value1..N as number or variable Variable=prefix.index.suffix -> SETVALUE('GET','INT', 10, 30.0); Variable=GET.10.INT;
  • ISO8601(time,type)
    time in sec
    type=0, ISO mit localtime
    1=ISO mit UTC(hinten Z).
  • TIMESEC:=TIME(0);
    ISO:=ISO8601(TIMESEC,0);
    DEBUG(ISO);
    ISOZ:=ISO8601(TIMESEC,1);
    DEBUG(ISOZ);
    
  • JSONGETVALUEFROMARRAY(json,arrayname, returnvaluename,LOGIC,TYPE,name,compare,comparevalue[,LOGIC,TYPE,name,compare,comparevalue]);
  • PID(INSTANCE,SOLL,IST,P,I,D,N)