Ziel:

  • Persistenzlösung mit dem CODESYS Application Composer auf einem RevPi einrichten.

  • Persistenz in einer Beispielanwendung verwenden, die Konfigurationsdaten und Hardware-Zähler nach einem Neustart automatisch wiederherstellt.

RevPi Geräte besitzen kein dediziertes Hardware-EEPROM für CODESYS-Retain-Variablen bzw. für persistente Variablen. Die Schlüsselwörter RETAIN und PERSISTENT RETAIN werden auf diesen Geräten nicht standardmäßig unterstützt. Die Lösung ist der CODESYS Application Composer PersistenceManager, der Variablendaten als ASCII-Dateien auf dem integrierten eMMC-Flash-Speicher ablegt.

Dieses Tutorial ist anwendbar mit allen RevPi Basismodulen.

Ein bereits programmiertes Beispielprojekt steht dir im GitLab Repository zur Verfügung. Dieses Beispiel wurde auf dem RevPi Connect 5 entwickelt und getestet. Um es an einen anderen RevPi anzupassen, muss das Gerät im CODESYS-Gerätebaum geändert werden. Die Persistenzkonfiguration selbst bleibt identisch.

Das Projekt verwendet drei Persistenzkanäle, jeweils mit einer eigenen Speicherstrategie:

  • Channel_Config: Speichert Sollwerte und Parameter sofort, wenn sich ein Wert ändert, und beim SPS-Stopp.

  • Channel_Counters: Speichert Laufzeitzähler und Summen regelmäßig jede Minute und beim SPS-Stopp.

  • Channel_Critical: Speichert Sicherheitszustände und Alarme sofort, wenn sich ein Wert ändert, und beim SPS-Stopp.

Caution
Vorzeitiger eMMC-Verschleiß durch ungeeignete Kanalzuordnung

▷ Verwende den Kanal Channel_Counters für häufig oder zyklisch geänderte Werte.

▷ Verwende die Kanäle Channel_Config und Channel_Critical nur für selten geänderte Werte.

Voraussetzungen #

Geräte

RevPi DIO

Hardware-Installation

✓ Erweiterungsmodul RevPi DIO ist über die PiBridge Steckbrücke mit dem RevPi Connect 5 an der rechten Seite verbunden.

✓ RevPi Basismodul ist mit dem Netzwerk verbunden.

✓ RevPi Basismodul ist an die Spannungsversorgung angeschlossen.

✓ RevPi DIO ist an die Spannungsversorgung angeschlossen.

Software-Installation

✓ CODESYS Development System (CODESYS) V3.5 SP21 oder höher ist auf deinem PC installiert.

✓ CODESYS Runtime ist im CODESYS Development System installiert.

✓ RevPi I/O-Treiber ist im CODESYS Development System installiert.

✓ CODESYS ist mit dem RevPi verbunden.

✓ CODESYS Runtime ist auf dem RevPi installiert.

✓ Ein neues Standardprojekt mit einem RevPi Connect 5 ist angelegt (mit CODESYS Control for Linux ARM64 SL in Structured Text).

Siehe auch: System einrichten.

1. Application Composer Add-on installieren #

Der Application Composer ist nicht in der Basisinstallation der CODESYS-IDE enthalten. Er muss separat als kostenloses Add-on über den CODESYS Installer installiert werden. Das in diesem Tutorial verwendete PersistenceManager-Modul benötigt keine kostenpflichtige Lizenz.

▷ Öffne CODESYS.

▷ Wähle Tool  CODESYS Installer.

❯ Der CODESYS Installer öffnet sich.

▷ Schließe CODESYS.

▷ Installiere über den CODESYS Installer die aktuellste Version des Add-on CODESYS Application Composer.

▷ Starte CODESYS.

❯❯ In der Menüleiste ist nun der Punkt Composer angelegt.

Note

Wenn das Composer-Menü nach der Installation nicht sichtbar ist, drücke Alt+2 bei geöffneter CODESYS-IDE.

Erstelle alternativ eine CODESYS-Desktopverknüpfung und ergänze in den Eigenschaften das Ziel mit dem Parameter --profile="CODESYS Composer Dedicated", sodass CODESYS direkt mit dem Application-Composer-Profil startet.

2. Persistenz-Bibliothek hinzufügen #

Die Bibliothek AC_Persistence ist eine Application-Composer-Bibliothek zur Verwaltung persistenter Daten. Sie stellt sowohl die PLC-Bibliothek für den Zugriff auf die Persistenzfunktionen als auch die zugehörigen Composer-Module zur Verfügung.

AC_Persistence muss sowohl über den Library Manager als auch über das Composer-Menü hinzugefügt werden. Beide Schritte sind erforderlich, damit sie für den Code verfügbar ist und die Module im Composer registriert werden.

Über den Library Manager hinzufügen

▷ Öffne im Gerätebaum den Library Manager.

▷ Wähle Add Library.

▷ Suche nach AC_Persistence und wähle AC_Persistence (CODESYS). Wähle die neueste verfügbare Version aus.

▷ Wähle OK.

AC_Persistence ist der Liste der Bibliotheken hinzugefügt.

Über den Composer hinzufügen

▷ Wähle das Menü Composer  Add Module Library to Project.

▷ Aktiviere im Dialog AC_Persistence (CODESYS).

Note

Es sind zwei Ausgaben verfügbar: eine von 3S - Smart Software Solutions GmbH und eine von CODESYS. Wähle unbedingt die Ausgabe von CODESYS.

▷ Wähle OK.

3. Persistence Manager konfigurieren #

Persistence Manager hinzufügen

Der Persistence Manager ist ein Projektobjekt in CODESYS zur Verwaltung persistenter Variablen.

▷ Wähle das Menü View  Modules oder drücke Alt+2.

❯ Der Reiter Modules wird angezeigt.

▷ Öffne das Kontextmenü des Projekts und wähle Add Top-Level Module Instance.

▷ Gib im Feld Name PersistenceManager ein.

▷ Wähle in der Modulliste PersistenceManager mit Type AC_PERSIST.PersistenceManager.

▷ Setze Application auf Device.Application.

▷ Wähle Add Module.

❯ Der PersistenceManager ist im Modulbaum hinzugefügt.

Persistenzkanäle anlegen

▷ Öffne im Modulbaum das Kontextmenü von Channels.

▷ Wähle Add Submodule Instance.

▷ Wähle bei Module den PersistenceChannel.

▷ Gib den Instanznamen Channel_Config ein und wähle Add Module.

Wiederhole diese Schritte für Channel_Counters und Channel_Critical.

Instanzname Typ Zweck

Channel_Config

PersistenceChannel

Sollwerte und Parameter

Channel_Counters

PersistenceChannel

Laufzeitzähler und Summen

Channel_Critical

PersistenceChannel

Sicherheitszustände und Alarme

CODESYS erstellt automatisch eine Persistenzgruppe mit demselben Namen wie die Kanalinstanz. Es ist keine manuelle Gruppenkonfiguration erforderlich. Die Gruppennamen Channel_Config, Channel_Counters und Channel_Critical stehen sofort für die Verwendung im Attribut ac_persist zur Verfügung.

Speichertyp hinzufügen

▷ Füge jedem Persistenzkanal im Modulbaum über den Knoten Data Storage jeweils den Speichertyp ASCIIFileStorage hinzu.

Nach Abschluss dieses Schritts sollte der Modulbaum die folgende Struktur haben:

Modulbaum mit PersistenceManager

Kanalparameter konfigurieren

▷ Öffne im Modulbaum die Kanäle, um den jeweiligen Kanal-Editor zu öffnen.

▷ Wähle die Registerkarte Parameters und setze die folgenden Werte:

Parameter Channel_Config Channel_Counters Channel_Critical

tPeriodicSaving

T#1h

T#1m

T#1h

xSaveOnChange

TRUE

FALSE

TRUE

eAutomaticActionPlcStop

Save

Save

Save

eAutomaticActionOnlineChange

Save

Save

Save

xIntegrityCheckBeforeReading

FALSE

FALSE

FALSE

Note

Für dieses Tutorial wird der Parameter xIntegrityCheckBeforeReading auf FALSE gesetzt, damit beim ersten Start ohne vorhandene Persistenzdatei keine Wiederherstellungsfehler auftreten.

Warum die Kanalwahl wichtig ist:

Die Persistenzkanäle schreiben ihre Daten entsprechend ihrer Speicherstrategie auf die integrierte eMMC. Die Wahl des Kanals beeinflusst daher direkt die Schreiblast und damit die Lebensdauer des Flash-Speichers.

  • Channel_Config und Channel_Critical verwenden xSaveOnChange = TRUE.

Bei jeder Änderung einer zugewiesenen Variable wird die Persistenzdatei neu geschrieben. Diese Kanäle eignen sich ausschließlich für Werte, die sich selten ändern wie Sollwerte, Parameter, Alarmzustände oder Not-Aus-Flags.

Der Name Channel_Critical beschreibt die Bedeutung der Daten, nicht deren Änderungshäufigkeit. Er sollte daher nur für selten wechselnde, aber wichtige Zustände verwendet werden.

  • Channel_Counters verwendet periodisches Speichern über tPeriodicSaving.

Änderungen werden gesammelt und erst beim nächsten Speicherintervall geschrieben. Dadurch eignet sich dieser Kanal für Werte, die sich häufig ändern, beispielsweise Zähler, Summen oder Betriebsstunden.

Regel: Weise Persistenzkanäle nach Änderungshäufigkeit zu, nicht nach Wichtigkeit.

Wenn häufig wechselnde Daten einen Neustart oder Stromausfall überstehen müssen, verwende einen periodischen Kanal und reduziere bei Bedarf das Speicherintervall, anstatt auf xSaveOnChange umzuschalten.

Caution
Vorzeitiger eMMC-Verschleiß durch ungeeignete Kanalzuordnung

▷ Verwende den Kanal Channel_Counters für häufig oder zyklisch geänderte Werte.

▷ Verwende die Kanäle Channel_Config und Channel_Critical nur für selten geänderte Werte.

4. Hardware-Zähler konfigurieren #

Der Eingang CH1 auf einem RevPi DIO wird als Zähler für steigende Flanken konfiguriert. Der Zählerwert wird in Channel_Counters gespeichert, sodass er einen Runtime-Neustart übersteht.

▷ Füge im CODESYS-Gerätebaum dem Objekt piBridgeRight einen RevPi DIO hinzu.

▷ Öffne im Gerätebaum den Modul-Editor des RevPi_DIO.

▷ Wähle Revolution PI DIO Module Parameters.

▷ Setze Input Mode Ch 1 auf Counter, rising edge. Alle anderen Kanäle bleiben auf Direct.

▷ Wähle Revolution PI DIO Module I/O Mapping.

▷ Gehe im Abschnitt Digital Inputs (Channel 1-14) zu DI_CH1 an Adresse %IX8.0 (Typ BOOL) und trage xInputCH1 in die Spalte Variable ein.

▷ Gehe im selben Abschnitt zu Counter_Ch1 an Adresse %ID3 (Typ DINT) und trage diCounterCH1 in die Spalte Variable ein.

❯ Die Zählervariablen sind zugeordnet.

5. Persistente Variablen erstellen #

Global Variable List anlegen

▷ Öffne im Gerätebaum das Kontextmenü von Application.

▷ Wähle Add Object  Global Variable List…​.

▷ Gib den Namen GVL_Persistent ein.

▷ Wähle Add.

GVL_Persistent öffnet sich.

Variablen den Kanälen zuweisen

▷ Deklariere die persistenten Variablen mit dem Attribut ac_persist, um jede Variable ihrem Kanal zuzuweisen:

{attribute 'qualified_only'}
VAR_GLOBAL

    // CONFIG-Kanal - speichert bei Änderung (Sollwerte, Parameter)
    {attribute 'ac_persist' := 'Channel_Config'}
    rSetpointTemp           : REAL    := 20.0;

    {attribute 'ac_persist' := 'Channel_Config'}
    rSetpointPressure       : REAL    := 1.0;

    {attribute 'ac_persist' := 'Channel_Config'}
    eOperationMode          : INT     := 0;

    // COUNTERS-Kanal - speichert periodisch (Standard T#1m)
    {attribute 'ac_persist' := 'Channel_Counters'}
    uiRunCycles             : UINT    := 0;

    {attribute 'ac_persist' := 'Channel_Counters'}
    udiTotalRunHours        : UDINT   := 0;

    {attribute 'ac_persist' := 'Channel_Counters'}
    udiTotalProductCount    : UDINT   := 0;

    {attribute 'ac_persist' := 'Channel_Counters'}
    // Zähler für steigende Flanke von DIO-Eingang CH1, per I/O Mapping zugeordnet
    diCounterCH1            : DINT    := 0;

    // CRITICAL-Kanal - speichert bei Änderung, SPS-Stopp und Online Change
    {attribute 'ac_persist' := 'Channel_Critical'}
    xEmergencyStopActive    : BOOL    := FALSE;

    {attribute 'ac_persist' := 'Channel_Critical'}
    sLastAlarmMessage       : STRING  := '';

    {attribute 'ac_persist' := 'Channel_Critical'}
    dtLastShutdownTime      : DT      := DT#2024-1-1-0:0:0;

END_VAR
Note

Der Wert des Attributs ac_persist muss exakt dem Gruppennamen entsprechen, der in der Registerkarte Persistence des Kanals sichtbar ist, sonst wird die Variable ignoriert. Es erscheint keine Fehlermeldung.

Funktionsweise und Speicherstrategie des Hardware-Zählers:

Funktionsweise der Variablen

Die I/O-Mapping-Variablen werden von CODESYS automatisch in IoConfig_Globals_Mapping erzeugt. Sie können nicht direkt als Persistenzziele verwendet werden. xInputCH1 wird in jedem Scan-Zyklus in eine lokale Variable in PLC_PRG gelesen, und das Delta von diCounterCH1 wird in GVL_Persistent.diCounterCH1 aufsummiert.

Speicherstrategie für numerische Zählervariablen

xSaveOnChange ist in AC_Persistence nur für BOOL-Variablen wirksam. Für numerische Typen wie DINT wird keine Änderungserkennung unterstützt. Der Kanal löst daher keinen Speichervorgang aus, wenn der Wert erhöht wird. Periodisches Speichern über tPeriodicSaving ist deshalb der einzige automatische Speichertrigger für diCounterCH1. Damit ist Channel_Counters der richtige Kanal für diese Variable.

Das bedeutet, dass bei einem unsauberen Runtime-Neustart Zählwerte bis zur Länge eines Speicherintervalls verloren gehen können. Der Standardwert tPeriodicSaving = T#1m ergibt ein maximales Verlustfenster von 60 Sekunden. Wenn eine Anwendung ein kürzeres Fenster erfordert, sollte tPeriodicSaving für Channel_Counters wie z. B. auf T#10s reduziert werden.

Note

Kürzere Intervalle erhöhen die Schreibfrequenz auf die integrierte eMMC und damit deren Verschleiß.

▷ Wähle daher einen Wert, der zur erwarteten Lebensdauer deiner Anwendung passt.

Kanalbenennung

Der Kanal in diesem Projekt heißt Channel_Counters, da er Software-Zähler und Summen enthält:

  • uiRunCycles,

  • udiTotalRunHours und

  • udiTotalProductCount.

Der Hardware-Eingangszähler diCounterCH1 passt zur gleichen periodischen Speicherstrategie und wird deshalb demselben Kanal hinzugefügt. Der Name Channel_Counters bezieht sich auf die Gruppe mit gleicher Speicherstrategie, nicht ausschließlich auf Hardware-Zähler.

Wenn die Unterscheidung in deinem Projekt wichtig ist, benenne den Kanal um, z. B. in Channel_Periodic, und aktualisiere alle ac_persist-Attribute entsprechend.

6. PLC_PRG erstellen #

Das Hauptprogramm erhöht jede Sekunde einen Laufzeitzähler und addiert den Hardware-Zähler von CH1 des RevPi DIO in jedem Scan-Zyklus zum persistenten Gesamtwert.

Der Persistence Manager muss nicht manuell aufgerufen werden. Der Application Composer übernimmt die gesamte Speicher- und Wiederherstellungslogik über die generierten AC_-Wrapper-Programme.

PROGRAM PLC_PRG
VAR
    tonCycleTimer        : TON;
    xDIO_CH1_State       : BOOL;     // Zustand von Digitaleingang CH1 (Zählermodus, steigende Flanke)
    diCounterCH1_Prev    : DINT;     // Hardware-Zählerwert aus dem vorherigen IEC-Zyklus
END_VAR

// I/O-Mapping-Variablen in jedem IEC-Zyklus lesen
xDIO_CH1_State := xInputCH1;

// diCounterCH1 beginnt nach Gerätestart oder codesyscontrol-Neustart immer bei 0.
// Delta vom Hardware-Zähler in jedem Scan zum persistenten Gesamtwert addieren.
GVL_Persistent.diCounterCH1 := GVL_Persistent.diCounterCH1 + (diCounterCH1 - diCounterCH1_Prev);
diCounterCH1_Prev := diCounterCH1;

tonCycleTimer(IN := NOT tonCycleTimer.Q, PT := T#1S);
IF tonCycleTimer.Q THEN
    GVL_Persistent.uiRunCycles := GVL_Persistent.uiRunCycles + 1;
END_IF

diCounterCH1 ist ein schreibgeschütztes Eingangs-Mapping, das nach einem Gerätestart oder einem codesyscontrol-Neustart immer bei 0 beginnt. In jedem Scan wird das Delta zwischen dem aktuellen und dem vorherigen Hardware-Zählerwert zu GVL_Persistent.diCounterCH1 addiert. Diese Variable enthält den wiederhergestellten persistenten Gesamtwert. Da sowohl diCounterCH1 als auch diCounterCH1_Prev mit 0 initialisiert werden, ist das Delta im ersten Scan 0 und der persistente Wert bleibt korrekt erhalten:

Note

Wenn der Zählerwert vor dem Speichern verarbeitet werden muss, z. B. um ihn zu skalieren oder in eine separate Summe zu übernehmen, deklariere stattdessen ein normales DINT für das I/O-Mapping und kopiere den verarbeiteten Wert innerhalb von PLC_PRG in eine persistente Variable.

7. Composer-Code generieren und Tasks konfigurieren #

Generate ausführen

Note

Führe Composer  Generate erst aus, nachdem alle Persistenzkanäle und deren ASCIIFileStorage-Instanzen angelegt wurden. Andernfalls schlägt die Generierung fehl.

▷ Wähle Composer  Generate.

▷ Prüfe das Fenster Messages und stelle sicher, dass keine Fehler gemeldet werden.

❯ Wenn die Generierung erfolgreich ist, erstellt der Application Composer automatisch Folgendes im Projektbaum:

  • Ordner AC_FBs mit den generierten Funktionsbausteinen.

  • Ordner AC_Std mit den folgenden Programmobjekten:

    • AC_CALL_HIGH_START

    • AC_CALL_HIGH_END

    • AC_CALL_LOW_START

    • AC_CALL_LOW_END.

  • Ordner AC_RMP mit Programmobjekt AC_PRG_RMP.

  • Drei IEC-Tasks in der Task Configuration: HIGH (Priority 1), LOW (Priority 10) und AC_RMP_Task (Priority 30).

  • Die Programme AC_ werden vom Composer automatisch den Tasks HIGH, LOW und AC_RMP_Task zugewiesen.

  • Einen Konfigurationsknoten PersistenceConfig unter Application.

  • MainTask mit PLC_PRG.

Die AC_-Wrapper-Aufrufe müssen im folgenden Schritt manuell konfiguriert werden.

Gerätebaum nach Generate mit AC_FBs

MainTask konfigurieren

PLC_PRG läuft in MainTask und muss von den AC_-Persistenzaufrufen umschlossen werden. Dadurch kann der PersistenceManager Variablenwerte sicher erfassen, bevor und nachdem die Benutzeranwendung in jedem Zyklus ausgeführt wird.

▷ Öffne im Projektbaum das Kontextmenü von MainTask.

▷ Wähle Add Call.

▷ Wähle AC_CALL_HIGH_START aus.

▷ Wähle OK.

▷ Wiederhole die letzten drei Aktionen mit * AC_CALL_LOW_START, * AC_CALL_HIGH_END und * AC_CALL_LOW_END.

▷ Verwende Move Up und Move Down, um die endgültige Reihenfolge wie folgt herzustellen:

MainTask (20 ms, Priority 1)
    1.  AC_CALL_HIGH_START
    2.  AC_CALL_LOW_START
    3.  PLC_PRG
    4.  AC_CALL_HIGH_END
    5.  AC_CALL_LOW_END
Note

PLC_PRG muss zwischen den Start- und den Endaufrufen bleiben. Prüfe jeden Eintrag beim Hinzufügen sorgfältig, um Fehler bei der Programmauswahl zu vermeiden.

▷ Verwende Change Call, um Fehler zu korrigieren, ohne den Eintrag entfernen und neu hinzufügen zu müssen.

8. Build und Deployment #

▷ Wähle Build  Build.
Stelle sicher, dass die Ausgabe keine Fehler anzeigt.

▷ Wähle Online  Login.

▷ Wähle Debug  Start.

9. Persistenzfunktion testen #

Variablen online beobachten

▷ Öffne im Projektbaum GVL_Persistent.

▷ Öffne die Online View.

❯ Alle zehn persistenten Variablen werden mit ihren Live-Werten angezeigt und in jedem Scan-Zyklus aktualisiert.

▷ Um zu testen, dass Channel_Config bei Änderungen speichert, gib in der Online View neben rSetpointTemp einen neuen Wert in die Spalte Prepared value ein.

▷ Öffne anschließend das Kontextmenü an einer beliebige Stelle in der Variablenliste und wähle Write All Values of 'Device.Application', um den Wert zu übernehmen.

❯ Der neue Wert wird aus der Spalte Prepared value in die Spalte Value übernommen und sollte innerhalb weniger Sekunden in die Persistenzdatei geschrieben werden.

Persistenzdateien prüfen

▷ Nachdem die Anwendung mindestens eine Minute gelaufen ist, logge dich über ein Terminal am RevPi ein..

▷ Prüfe, ob die Persistenzdateien erstellt wurden:

sudo ls -la /var/opt/codesys/PlcLogic/ac_persistence/
sudo cat /var/opt/codesys/PlcLogic/ac_persistence/Channel_Config
sudo cat /var/opt/codesys/PlcLogic/ac_persistence/Channel_Counters
sudo cat /var/opt/codesys/PlcLogic/ac_persistence/Channel_Critical

Ein korrekt funktionierendes Setup erzeugt für Channel_Config eine Ausgabe ähnlich der folgenden:

DT#2026-03-24-10:38:21
___xCompressTags        BOOL:TRUE
GVL_Persistent.eOperationMode   INT:0
<rSetpointPressure      REAL: 1.0
<rSetpointTemp          REAL: 20.0
___Integrity    BOOL:TRUE
Note

Channel_Counters erscheint erst nach dem ersten periodischen Speichern. Dieses erfolgt eine Minute nach dem SPS-Start. Channel_Config und Channel_Critical erscheinen direkt nach dem ersten SPS-Start, da xSaveOnChange für beide auf TRUE gesetzt ist.

Wiederherstellung nach Neustart testen

▷ Notiere die aktuellen Werte von uiRunCycles, rSetpointTemp und diCounterCH1 in der Online View.

▷ Starte die CODESYS-Runtime auf dem RevPi per SSH neu:

sudo /etc/init.d/codesyscontrol restart

▷ Wähle Online  Login  Debug  Start um dich aus CODESYS wieder einzuloggen.

▷ Öffne GVL_Persistent in der Online View und prüfe, ob:

  • uiRunCycles mit dem zuletzt gespeicherten Wert weiterläuft, statt auf 0 zurückgesetzt zu werden.

  • rSetpointTemp den zuvor gespeicherten Wert behält, statt auf den Deklarationsstandard 20.0 zurückzufallen.

  • GVL_Persistent.diCounterCH1 mit dem zuletzt gespeicherten Gesamtwert weiterläuft, statt auf 0 zurückgesetzt zu werden.

❯ Ein erfolgreiches Ergebnis bestätigt, dass alle drei Kanäle korrekt speichern und wiederherstellen.

Da Channel_Counters jede Minute speichert, können bei einem unsauberen Neustart bis zu 60 Sekunden an Zählwerten verloren gehen. Das ist der erwartete Kompromiss beim periodischen Speichern eines häufig veränderten Zählers.

Fehlerbehebung #

Problem Ursache Lösung

C0569: No VAR_PERSISTENT list

VAR_GLOBAL PERSISTENT wird statt des Attributs ac_persist verwendet.

Verwende das Attribut ac_persist für jede Variable.

No default persistence group is set

Gruppenname im Attribut stimmt nicht mit dem Gruppennamen des Kanals überein.

Öffne die Registerkarte Persistence des Kanals und kopiere den exakten Gruppennamen.

itfDataStorage requires at least 1 connection

ASCIIFileStorage wurde nicht zum Kanal hinzugefügt.

Füge ASCIIFileStorage unter dem Knoten Data Storage für jeden Kanal hinzu.

The slot 'pChannels' requires at least 1 connection(s)

Generate wurde ausgeführt, bevor Kanäle hinzugefügt wurden.

Füge alle drei Kanäle und ASCIIFileStorage hinzu, bevor du Generate ausführst.

Add Module button greyed out

AC_Persistence wurde nicht über den Library Manager hinzugefügt.

Öffne den Library Manager, füge AC_Persistence hinzu (Ausgabe CODESYS) und füge die Bibliothek über den Composer hinzu.

0 values ok beim Start

Erster Lauf ohne vorhandene Persistenzdatei.

Normales Verhalten. Die Datei wird nach dem ersten Speicherzyklus erstellt.

integrity check failed

xIntegrityCheckBeforeReading ist TRUE und die Datei existiert noch nicht.

Setze xIntegrityCheckBeforeReading auf FALSE.

Variablen werden nicht gespeichert

xSaveOnChange ist FALSE und es wurde noch kein periodischer Speichervorgang ausgelöst.

Setze xSaveOnChange für Kanäle, die bei Änderung speichern müssen, auf TRUE.

PersistenceManager nicht im Modulbaum sichtbar

AC_Persistence wurde nicht über das Composer-Menü hinzugefügt.

Führe beide Schritte beim Hinzufügen der Bibliothek in der richtigen Reihenfolge aus.

Weitere Ressourcen #