Trends

Trends – Live-Daten mit CODESYS verbinden (Generate Code Dokumentation)

Diese Anleitung zeigt, wie du mithilfe des Buttons „Generate Code“ Live-Daten aus einer SPS – z. B. einem CODESYS-Projekt – mit dem PLCVisu-Trendmodul verbindest. Ziel ist es, Messwerte (z. B. Temperaturen, Drücke, Füllstände) zyklisch in eine Datenbank zu schreiben, die anschließend im Trend Viewer visualisiert wird.

Ziel

  • Live-Daten aus CODESYS automatisch in eine Trend-Datenbank schreiben
  • Visualisierung dieser Daten in Echtzeit auf einem HMI, z. B. WAGO WP400
  • Minimaler Konfigurationsaufwand dank Code-Generator in PLCVisu

Schritt-für-Schritt-Anleitung

1. Code generieren

Klicke im Trend-UI auf „Generate Code“ – der generierte Code wird automatisch kopiert und kann direkt in dein CODESYS-Projekt eingefügt werden.

(* DECLARATION SECTION *)
trendsFBlinetrend1Instance: PLCVisu.trendsFB; (* FB instance for current trend *)
slinetrend1Columns:STRING(4096):= 'dataset1';
slinetrend1Values:STRING(4096);
(* CODE SECTION *)
(* Initiate the instace parameters: path_to_file,  max_records (cyclic buffer) *)
trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', {{max_records}});
(* write one record into the DB *)
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING({{dataset1_value}}));
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"');
trendsFBlinetrend1Instance.write('',slinetrend1Columns, slinetrend1Values);
(* write delimiter line - optional - i.e. end of the batch -> this will cut the line in front-end view *)
(* trendsFBlinetrend1Instance.writeFinish(''); *)

Optional:
Mit writeFinish('') kannst du visuelle Trennlinien im Trend erzeugen, z. B. zur Kennzeichnung von Chargenwechseln.

2. Sensorwert einfügen

Ersetze GVL.MySensor durch deine reale SPS-Variable, z. B.:

REAL_TO_STRING(GVL.TemperaturSensor1)

Hinweise:

  • Die Variable muss als REAL deklariert sein.
  • Für andere Datentypen verwende den passenden Konverter:
    • INT_TO_STRING(...) für Integer
    • BOOL_TO_STRING(...) für Booleans usw.

3. Verbindung zwischen CODESYS & PLCVisu herstellen

Damit PLCVisu die SPS-Daten visualisieren kann, sind folgende Schritte nötig:

In CODESYS:

  1. Symbolkonfiguration öffnen
  2. Die genutzten GVL-Variablen markieren
  3. „Für externen Zugriff verfügbar“ aktivieren
  4. Gegebenenfalls Symboldatei exportieren

In PLCVisu:

  • Die Verbindung zum SPS-System im Projekt konfigurieren:
    • PLCVisu://localhost für lokale Tests
    • opc.tcp://<IP>:4840 für OPC UA
  • Anschließend über den Tag-Browser die Werte zuweisen

4. Datenbank initialisieren

trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', 10000);
  • Erstellt (oder öffnet) die Datenbank-Datei im Trend-Verzeichnis
  • 10000 legt die maximale Anzahl an gespeicherten Werten fest
  • Wird einmalig beim Start benötigt (z. B. im Init-Zyklus)

5. Werte zyklisch schreiben

Der folgende Code schreibt bei jeder Ausführung den aktuellen Sensorwert:

slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING(GVL.TemperaturSensor1));
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"');
trendsFBlinetrend1Instance.write('', 'dataset1', slinetrend1Values);

Typische Anwendung:

  • In einem zyklischen Task (z. B. alle 1 s)
  • Oder über einen Timer-FB

Übersicht: CODESYS ↔ PLCVisu Trend

Schritt Zweck
Generate Code Basisstruktur erzeugen
Sensorwert einfügen GVL-Variable mit *_TO_STRING(...) konvertieren
Verbindung aktivieren Symbolkonfiguration & PLCVisu-Datenquelle einrichten
.init() Datenbank anlegen und Puffergröße festlegen
.write() Messwerte im Zyklus eintragen
Optional: .writeFinish Visuelle Trennlinien erzeugen (z. B. Batch-Ende)

Fehlerbehebung

Problem Mögliche Ursache
Keine Daten im Trend sichtbar .init() fehlt oder Sensorwert = leer
Fehler bei .write() Falsches Format (z. B. fehlende " in der CSV-Zeile)
Datenbank nicht erstellt Pfadangabe fehlerhaft oder keine Schreibrechte
Keine Verbindung zur SPS Symbolkonfiguration nicht aktiviert oder IP falsch

Empfehlung

  • Nutze den generierten Code als Basis – passe dataset1, Variablennamen & Pfade individuell an
  • Mehrere Signale? → Mehrere .write()-Zeilen oder mehrere datasetX definieren
  • Trends testen: Mit einem einfachen REAL-Wert starten und UI prüfen
datasetX
.write()
dataset1
"
.write()
.init()
*_TO_STRING(...)
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING(GVL.TemperaturSensor1)); slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"'); trendsFBlinetrend1Instance.write('', 'dataset1', slinetrend1Values);
10000
trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', 10000);
opc.tcp://<IP>:4840
PLCVisu://localhost
BOOL_TO_STRING(...)
INT_TO_STRING(...)
REAL
REAL_TO_STRING(GVL.TemperaturSensor1)
GVL.MySensor
writeFinish('')
(* DECLARATION SECTION *) trendsFBlinetrend1Instance: PLCVisu.trendsFB; (* FB instance for current trend *) slinetrend1Columns:STRING(4096):= 'dataset1'; slinetrend1Values:STRING(4096); (* CODE SECTION *) (* Initiate the instace parameters: path_to_file, max_records (cyclic buffer) *) trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', {{max_records}}); (* write one record into the DB *) slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING({{dataset1_value}})); slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"'); trendsFBlinetrend1Instance.write('',slinetrend1Columns, slinetrend1Values); (* write delimiter line - optional - i.e. end of the batch -> this will cut the line in front-end view *) (* trendsFBlinetrend1Instance.writeFinish(''); *)