Tables

Online-Tabelle

Die Online-Tabelle dient der Echtzeitüberwachung von Systemvariablen. Im Gegensatz zu den Tabellen „Basic“ oder „Editable“ ist sie nicht mit einer SQL-Datenbank verbunden, sondern bezieht ihre Werte direkt von einem laufenden CODESYS-Controller.

Damit ist sie ideal geeignet für Anwendungsfälle, in denen aktuelle Prozesswerte, Statusrückmeldungen oder Live-Sensordaten unmittelbar im Frontend visualisiert werden sollen.

Unterstützte Datentypen umfassen:

  • BOOL, INT, DINT, REAL, STRING (aus CODESYS-Variablen)
  • Arrays und strukturierte Felder (z. B. Sensortabellen)

Wichtig:
Die Online-Tabelle ist schreibgeschützt – Benutzer können hier keine Werte verändern. Sie dient ausschließlich der Anzeige.

Wie alle Tabellentypen folgt auch sie dem einheitlichen Berechtigungsmodell (Read, Insert, Update, Delete) – allerdings ist in diesem Fall nur Read funktional relevant.

⚠️ Die Onlinetable kann in gemischter Form verwendet werden. Das bedeutet mit Eingabe- und Ausgabefeldern, Umschaltern und Zeilenauswahl.

Erforderliche Schritte in CoDeSys

Einige Schritte zur Verwendung von PlcVisu sind obligatorisch und mit [*] gekennzeichnet. Diese Schritte sind in jedem Fall erforderlich.

[1] Websocketserver registrieren *

PROGRAM PLC_PRG VAR, wsInst : PLcVisu.wsInitFB; // WS-Instanz für die Kommunikationsinitialisierung, END_VAR

[2] Bibliothek in das Projekt kopieren *

Quelle: https://doc.plcvisu.cloud/de/downloads.html

[3] Neues Verzeichnis und Programm für bessere Übersicht erstellen.

Neuen Ordner hinzufügen. Beispiel: 07_OnlineTable
Neues Programm hinzufügen. Beispiel: onlineTablePrg
Programm aus einem neuen 500-ms-Task aufrufen (schneller ist nicht erforderlich).

[4] Erstellen Sie die folgenden 4 Strukturen

Die folgenden Strukturen basieren auf einer Tabelle mit den folgenden Parametern:
Anzahl der Zeilen = MAXROW
Anzahl der Spalten = 5

Spaltentyp
Nr. 1 – Text
Nr. 2 – Text
Nr. 3 – Eingabefeld
Nr. 4 – Ausgabefeld
Nr. 5 – Schalter

Struktur Nr. 1 = OnlineTable

TYPE OnlineTable : STRUCT structure : OnlineTableStructure; data : OnlineTableData; meta : PLCVisu.OnlineTableMeta; END_STRUCT END_TYPE

Struktur #2 = OnlineTableData

  • Anzahl der Zeilen definieren
TYPE OnlineTableData :
STRUCT
rows : ARRAY [0..onlineTablePrg.MAXROW] OF OnlineTableRow; // Anzahl der Zeilen. Bei Select-, Toggle- oder Input-Funktionen bitte mit Index = 0 beginnen.
END_STRUCT
END_TYPE

Struktur #3 = OnlineTableRow

  • Definiert die Anzahl und den Typ der Spalten in einer Zeile
    TYP OnlineTableRow :
    STRUKTUR
    Gerät : PlcVisu.OnlineTableText; // Spalte 1 ist vom Typ TEXT
    Status : PlcVisu.OnlineTableText; // Spalte 2 ist vom Typ TEXT
    Eingabefeld : PlcVisu.OnlineTableInput; // Spalte 3 ist ein Eingabefeld vom Typ REAL
    Ausgabefeld : PlcVisu.OnlineTableNumber; // Spalte 4 ist ein Ausgabefeld vom Typ REAL
    Umschalter : PlcVisu.OnlineTableToggle; // Spalte 5 ist ein Umschalter vom Typ BOOL
    Meta : PlcVisu.OnlineTableRowMeta; // Meta wird immer benötigt
    END_STRUCT
    END_TYPE

Struktur #4 = OnlineTableStructures

  • Definiert die Anzahl der Spalten in einer Zeile
    TYPE OnlineTableStructure :
    STRUCT
    Columns : ARRAY[1..5] OF PlcVisu.OnlineTableColumn;
    END_STRUCT
    END_TYPE

    [5] Beschriftung erstellen

  • Einige Schritte müssen nur einmal ausgeführt werden. Beispiel:
    WENN xInit = FALSE
    DANN
    onlineTable.structure.columns[1].UIType := 'text';
    onlineTable.structure.columns[1].name := 'device';
    onlineTable.structure.columns[1].title := '{{description'; // Platzhaltertext für Spalte 1
    onlineTable.structure.columns[2].UIType := 'text';
    onlineTable.structure.columns[2].name := 'status';
    onlineTable.structure.columns[2].title := '{{status'; // Platzhaltertext für Spalte 2
    onlineTable.structure.columns[3].UIType := 'input';
    onlineTable.structure.columns[3].name := 'input_field';
    onlineTable.structure.columns[3].title := '{{input_field'; // Platzhaltertext für Spalte 3
    onlineTable.structure.columns[4].UIType := 'number';
    onlineTable.structure.columns[4].name := 'output_field';
    onlineTable.structure.columns[4].title := '{{output_field'; // Platzhaltertext für Spalte 4
    onlineTable.structure.columns[5].UIType := 'toggle';
    onlineTable.structure.columns[5].name := 'toggleswitch';
    onlineTable.structure.columns[5].title := '{{toggleswitch'; // Platzhaltertext für Spalte 5
    // Spalte 1
    FOR Loop := 0 TO MAXROW BY 1
    DO
    tmpStr := '{{value_'; // Dieser Platzhalter verwendet PlcVisu für die mehrsprachige Textausgabe
    tmpStr := ConCat(tmpStr,INT_TO_STRING(Loop));
    tmpStr := ConCat(tmpStr,'_text}}');
    onlineTable.data.rows[Loop].device.value := tmpStr;
    onlineTable.data.rows[Loop].output_field.meta.numberFormat:= '0.00'; // Format der anzuzeigenden Werte
    END_FOR;
    // Spalte 4 - Array in Spalte 4 mit Standardwerten füllen, die in der Tabelle angezeigt werden sollen
    FOR Loop := 0 TO MAXROW BY 1
    DO
    rArray_Output[Loop]:= Loop + (Loop*0.1);
    END_FOR
    ButtonEnableAll := TRUE; // Alle Zeilen beim Start anzeigen
    xInit := TRUE; // Initialisierung abgeschlossen
    end_if

[6] Zyklischer Teil erstellen

  • Eingabefeld: Tabelle zu Variable

    // --------------------------------------------------------
    // Spalte 3 Eingabefeld
    // --------------------------------------------------------
    FOR Schleife := 1 TO MAXROW BY 1
    DO
    rArray_Input[Schleife]:= onlineTable.data.rows[Schleife].input_field.value;
    END_FOR
  • Ausgabefeld: Variable in Tabelle

    // --------------------------------------------------------
    // Spalte 4 Ausgabefeld
    // --------------------------------------------------------
    FOR Loop := 1 TO MAXROW BY 1 
         DO
           onlineTable.data.rows[Loop].output_field.value := rArray_Output[Loop]; 
        END_FOR
  • ToggleSwitch: normalerweise in beide Richtungen

       // -------------------------------------------------------- 
       // Spalte 5 ToggleSwitch
       // -------------------------------------------------------- 
       FOR Loop := 1 TO MAXROW BY 1 
       DO 
         xToggleArray[Loop]:= onlineTable.data.rows[Loop].toggleswitch.value;
      END_FOR
  • Die Zeilenauswahl erfolgt über die Variable onlineTable.meta.selectedIndex. Sie erhalten die Nummer der ausgewählten Zeile.
    Wenn zuvor keine Zeile ausgewählt war, erhalten Sie -1.

Markieren Sie den Text der gesamten ausgewählten Zeile in einer eigenen Farbe. Sie können die Ausgabefarbe der gesamten Zeile ändern, indem Sie den Wert dieser Variable anpassen: onlineTable.data.rows[onlineTable.meta.selectedIndex].meta.extraclass. Hierfür müssen Sie die CSS-Funktionalität von PLC-Visu verwenden.

Beispiel für die Zeilenauswahl

// --------------------------------------------------------   
// a new row was selected
// -------------------------------------------------------- 
IF ( onlineTable.meta.selectedIndex <> SelectedIndexOld ) AND // selectedIndex has changed
   ( onlineTable.meta.selectedIndex >= 0                )     // Cause the selectedIndex starts with -1
THEN
  FOR Loop := 0 TO MAXROW BY 1 
  DO
    onlineTable.data.rows[Loop].meta.extraclass   := '';
  END_FOR 
  onlineTable.data.rows[onlineTable.meta.selectedIndex].meta.extraclass   := 'mygreen'; // Set over CSS
  ButtonEnableAll := FALSE;  
END_IF
SelectedIndexOld := onlineTable.meta.selectedIndex; 
  • Einzelne Zeilen und Spalten farblich markieren.

    onlineTable.data.rows[selected_row].status.meta.color := 'red';   // The name of column #2 is ‘status’
  • Zeilen ein-/ausblenden:

Um Zeilen auszublenden, können Sie diese als sichtbar/unsichtbar markieren.

onlineTable.data.rows[selected_row].meta.visible := TRUE; // Row will be visible

oder

onlineTable.data.rows[selected_row].meta.visible := FALSE; // Row will be unvisible 

[7] Symbolkonfiguration erstellen

Die Symbolkonfiguration wird für die Kommunikation zwischen CoDeSys und PlcVisu benötigt.
Aktivieren Sie das Kontrollkästchen für die Struktur onlineTablePrg/onlineTable. Klicken Sie auf „Erstellen“.

Schritte in PlcVisu

Verbindung

[1] Verbindung erstellen

Burger-Menü → Dashboard → Verbindung → Neu

Verbindungsname = „PLC_connection“
IP-Adresse = „eth“ (Dies bedeutet, dass PlcVisu und CoDeSys auf demselben Gerät laufen)
Verbindungstyp = SPS
Port = 80 | 443
Protokoll = PLC_communication
Wiederverbinden = Ein
Aktualisierungsrate [ms] = 1000
CODESYS-Benutzername = Administrator
CODESYS-Passwort = Administrator

Bei erfolgreicher Einrichtung leuchtet die Status-LED grün.

Tabelle erstellen.

[1] Tabellen erstellen

Drücken Sie das Burgermenü und wählen Sie „Tabellen“. Wählen Sie „Tabellen“ und anschließend „Neu“.
Name : online_table
Title : {{my_online_table}}
Typ : Remote

[2] Seite mit dieser Tabelle erstellen

Drücken Sie das Burgermenü und wählen Sie „Seiten“. Wählen Sie „Neu“.

Titel: page_online_table
Breite: 1920
Höhe: 980

[3] Tabelle zur Seite hinzufügen.

Gehen Sie zur Seite „page_online_table“.
Hinzufügen > Tabellen > Tabelle
Zoomen Sie das Element auf die gewünschte Größe. Geben Sie nicht die Tabelle ein und wählen Sie die folgenden Parameter:
Steuerungseigenschaften

  • Tabelle

  • Verbindung

  • Verbindungszeichenfolge = 1::Application.onlineTablePrg.onlineTable
    (Drücken Sie dazu auf [+] und wählen Sie die Variable aus der Liste aus.)

  • Tabelleneigenschaften

  • Tabellen auswählen = {{my_online_table}}

CSS Editor

Um eine ganze Zeile grün anzuzeigen, benötigen Sie die Klasse extraclass und den folgenden Eintrag im CSS-Editor:

.mygreen {
           color: green;
         }

Hauptfunktionen

  • Direkte Verbindung zu CODESYS – keine Datenbank zwischengeschaltet
  • Echtzeit-Datenstrom – zeigt aktuelle Systemzustände ohne Verzögerung
  • Nur-Lese-Modus – ausschließlich zur Überwachung vorgesehen
  • Unterstützt Arrays und Strukturen – z. B. Kanallisten, Geräte- oder I/O-Zustände
  • Visuelle Formatierung – bedingte Farben, Icons, Ausrichtung
  • Zyklisches oder ereignisbasiertes Update – durch Polling oder Subscription (nicht dokumentiert)
  • Einheitliches BerechtigungsmodellRead-Zugriff kann benutzer- oder rollenbasiert definiert werden
Read
.mygreen { color: green; }
extraclass
onlineTable.data.rows[selected_row].meta.visible := FALSE; // Row will be unvisible
onlineTable.data.rows[selected_row].meta.visible := TRUE; // Row will be visible
onlineTable.data.rows[selected_row].status.meta.color := 'red'; // The name of column #2 is ‘status’
// -------------------------------------------------------- // a new row was selected // -------------------------------------------------------- IF ( onlineTable.meta.selectedIndex <> SelectedIndexOld ) AND // selectedIndex has changed ( onlineTable.meta.selectedIndex >= 0 ) // Cause the selectedIndex starts with -1 THEN FOR Loop := 0 TO MAXROW BY 1 DO onlineTable.data.rows[Loop].meta.extraclass := ''; END_FOR onlineTable.data.rows[onlineTable.meta.selectedIndex].meta.extraclass := 'mygreen'; // Set over CSS ButtonEnableAll := FALSE; END_IF SelectedIndexOld := onlineTable.meta.selectedIndex;
onlineTable.data.rows[onlineTable.meta.selectedIndex].meta.extraclass
onlineTable.meta.selectedIndex
// -------------------------------------------------------- // Spalte 5 ToggleSwitch // -------------------------------------------------------- FOR Loop := 1 TO MAXROW BY 1 DO xToggleArray[Loop]:= onlineTable.data.rows[Loop].toggleswitch.value; END_FOR
// -------------------------------------------------------- // Spalte 4 Ausgabefeld // -------------------------------------------------------- FOR Loop := 1 TO MAXROW BY 1 DO onlineTable.data.rows[Loop].output_field.value := rArray_Output[Loop]; END_FOR
// -------------------------------------------------------- // Spalte 3 Eingabefeld // -------------------------------------------------------- FOR Schleife := 1 TO MAXROW BY 1 DO rArray_Input[Schleife]:= onlineTable.data.rows[Schleife].input_field.value; END_FOR
WENN xInit = FALSE DANN onlineTable.structure.columns[1].UIType := 'text'; onlineTable.structure.columns[1].name := 'device'; onlineTable.structure.columns[1].title := '{{description'; // Platzhaltertext für Spalte 1 onlineTable.structure.columns[2].UIType := 'text'; onlineTable.structure.columns[2].name := 'status'; onlineTable.structure.columns[2].title := '{{status'; // Platzhaltertext für Spalte 2 onlineTable.structure.columns[3].UIType := 'input'; onlineTable.structure.columns[3].name := 'input_field'; onlineTable.structure.columns[3].title := '{{input_field'; // Platzhaltertext für Spalte 3 onlineTable.structure.columns[4].UIType := 'number'; onlineTable.structure.columns[4].name := 'output_field'; onlineTable.structure.columns[4].title := '{{output_field'; // Platzhaltertext für Spalte 4 onlineTable.structure.columns[5].UIType := 'toggle'; onlineTable.structure.columns[5].name := 'toggleswitch'; onlineTable.structure.columns[5].title := '{{toggleswitch'; // Platzhaltertext für Spalte 5 // Spalte 1 FOR Loop := 0 TO MAXROW BY 1 DO tmpStr := '{{value_'; // Dieser Platzhalter verwendet PlcVisu für die mehrsprachige Textausgabe tmpStr := ConCat(tmpStr,INT_TO_STRING(Loop)); tmpStr := ConCat(tmpStr,'_text}}'); onlineTable.data.rows[Loop].device.value := tmpStr; onlineTable.data.rows[Loop].output_field.meta.numberFormat:= '0.00'; // Format der anzuzeigenden Werte END_FOR; // Spalte 4 - Array in Spalte 4 mit Standardwerten füllen, die in der Tabelle angezeigt werden sollen FOR Loop := 0 TO MAXROW BY 1 DO rArray_Output[Loop]:= Loop + (Loop*0.1); END_FOR ButtonEnableAll := TRUE; // Alle Zeilen beim Start anzeigen xInit := TRUE; // Initialisierung abgeschlossen end_if
TYPE OnlineTableStructure : STRUCT Columns : ARRAY[1..5] OF PlcVisu.OnlineTableColumn; END_STRUCT END_TYPE
TYP OnlineTableRow : STRUKTUR Gerät : PlcVisu.OnlineTableText; // Spalte 1 ist vom Typ TEXT Status : PlcVisu.OnlineTableText; // Spalte 2 ist vom Typ TEXT Eingabefeld : PlcVisu.OnlineTableInput; // Spalte 3 ist ein Eingabefeld vom Typ REAL Ausgabefeld : PlcVisu.OnlineTableNumber; // Spalte 4 ist ein Ausgabefeld vom Typ REAL Umschalter : PlcVisu.OnlineTableToggle; // Spalte 5 ist ein Umschalter vom Typ BOOL Meta : PlcVisu.OnlineTableRowMeta; // Meta wird immer benötigt END_STRUCT END_TYPE
TYPE OnlineTableData : STRUCT rows : ARRAY [0..onlineTablePrg.MAXROW] OF OnlineTableRow; // Anzahl der Zeilen. Bei Select-, Toggle- oder Input-Funktionen bitte mit Index = 0 beginnen. END_STRUCT END_TYPE
TYPE OnlineTable : STRUCT structure : OnlineTableStructure; data : OnlineTableData; meta : PLCVisu.OnlineTableMeta; END_STRUCT END_TYPE
PROGRAM PLC_PRG VAR, wsInst : PLcVisu.wsInitFB; // WS-Instanz für die Kommunikationsinitialisierung, END_VAR
Read
Delete
Update
Insert
Read