Skip to main content

Der Rezepturverwalter CODESYS Recipes

Das Add-on CODESYS Recipes ist ein System zum Speichern und Laden von Variablensätzen (Rezepturen) auf einer Steuerung oder über das Programmiersystem. Der Rezepturverwalter ermöglicht es, unterschiedliche Konfigurationen oder Parameterzustände einer Applikation zentral zu verwalten, auf der Steuerung zu speichern und bei Bedarf wiederherzustellen. Damit lässt sich das Verhalten der Anwendung flexibel an unterschiedliche Betriebszustände oder Produktvarianten anpassen.

Rezepturverwalter in einem CODESYS-Projekt verwenden

Um den Rezepturverwalter verwenden zu können, muss in der Applikation im Gerätebaum ein Rezepturverwalter‑Objekt angelegt werden. Unterhalb des Rezepturverwalters muss mindestens eine Rezepturdefinition hinzugefügt werden, damit Rezepturen erstellt, verwaltet und verarbeitet werden können.

Für weitere Informationen siehe: Rezepturdefinition

Grundprinzip der Rezepturverwaltung

Eine Rezeptur besteht aus einem definierten Satz von Variablen, der sogenannten Rezepturdefinition. Durch das Laden und Schreiben einer Rezeptur werden alle darin enthaltenen Variablen gleichzeitig auf der Steuerung aktualisiert. Auf diese Weise können Parametergruppen konsistent und reproduzierbar gesetzt oder ausgelesen werden.

Die Einstellungen wie Speicherort und Speicherformat werden im Objekt Rezepturverwalter vorgenommen. Unterhalb dieses Objekts können beliebig viele Rezepturdefinitionen angelegt werden.

Rezepturen können:

  • in Dateien gespeichert werden

  • aus Dateien in die Steuerung geladen werden

  • ausschließlich innerhalb der Steuerung verwaltet werden

Verwendung von Rezepturen auf entfernten (remote) Geräten

Wenn es sich um Datenquellenvariablen handelt und ein Datenquellenaustausch konfiguriert ist, werden Variablenwerte aus Rezepturen automatisch zu/von einer anderen Steuerung übertragen. Das Lesen/Schreiben erfolgt synchron. Das heißt, dass alle in einer Rezepturdefinition konfigurierten Variablen zum selben Zeitpunkt aktualisiert werden.

Durch einen Aufruf von g_RecipeManager.LastError nach dem Lesen/Schreiben können Sie überprüfen, ob die Übertragung funktioniert hat (g_RecipeManager.LastError = 0).

Bedienkonzepte

Die Rezepturverwaltung lässt sich über verschiedene Ebenen ansteuern:

  1. CODESYS-Programmieroberfläche

    Sie können die Rezepturen direkt in der Programmieroberfläche manuell laden, bearbeiten und speichern.

  2. Visualisierung

    In der Visualisierung wird der Aufruf der Rezepturbefehle mit der Eingabekonfiguration (Befehl ausführen) für ein Visualisierungselement implementiert. So kann ein Visualisierungsbenutzer das Ausführen von Rezepturbefehlen steuern.

  3. Applikationsprogramm

    Zur Laufzeit können die Rezepturdefinition und die Rezepturbefehle im Applikationsprogramm aufgerufen werden. Implementieren Sie dazu in Ihrem Code den Ablauf zum Schreiben, Lesen oder Überwachen der Rezepturdefinitionen mit den Methoden des Funktionsbausteins RecipeManCommands aus der Bibliothek RecipeManagement.

    Für weitere Informationen siehe: RecipeManCommands (FB)

Lademodi

Der Rezepturverwalter unterstützt zwei Lademodi, um Rezepturdateien zu laden:

  • Exakte Übereinstimmung

    Daten aus einer Rezepturdatei werden nur dann geladen, wenn deren Struktur vollständig und exakt mit der Variablenliste der zugehörigen Rezepturdefinition übereinstimmt.

  • Selektive Übereinstimmung

    Es werden alle Variablen aus einer Rezepturdatei geladen, die in der Variablenliste der Rezepturdefinition vorkommen – unabhängig von deren Position in der Liste. Variablen, für die keine Daten in der Rezepturdatei vorhanden sind, werden nicht aktualisiert.

Der gewählte Lademodus im Rezepturverwalter ist besonders relevant in folgenden Situationen:

  • Eine Rezepturdatei wurde mit einem externen Editor erstellt oder geändert und stimmt nicht mehr exakt mit den intern konfigurierten Variablen oder deren Reihenfolge überein.

  • Eine Rezepturdatei wurde für eine neue Anwendung erweitert, kann jedoch nicht mehr in älteren Projekten verwendet werden, die diese zusätzlichen Variablen nicht erwarten. (Eine einfachere Lösung wäre hier das Erstellen einer V2‑Datei; der Lademodus kann jedoch ebenfalls zur Kompatibilität beitragen.)

Wenn die Rezepturdatei nicht geladen werden kann

Wenn eine Rezepturdatei nicht geladen werden kann, stellen Sie den Lademodus auf selektive Übereinstimmung. Beachten Sie, dass diese Einstellung für alle Rezepturen gilt, die in der Anwendung geladen werden, in der der Rezepturverwalter integriert ist.

Weitere Informationen finden Sie unter: Rezepturverwalter

Dateizugriff

Der Zugriff auf externe Dateien, die sich außerhalb des SPS‑Dateisystems befinden, ist aus Sicherheitsgründen eingeschränkt. Versuche, Dateien in externen Verzeichnissen zu öffnen oder zu schreiben, schlagen daher fehl.

Bei CODESYS Control Win SL verweist der Standardpfad beispielsweise auf das Verzeichnis der Laufzeitdateien PlcLogic, das das interne SPS‑Dateisystem darstellt. Verwenden Sie dieses Verzeichnis oder ein anderes systeminternes Verzeichnis Ihrer spezifischen Steuerung als Root‑Pfad, um Zugriffsverletzungen zu vermeiden.

Wenn das SPS‑Dateisystem nicht über den Dateiexplorer des Host‑Systems erreichbar ist – oder nicht erreichbar sein soll –, nutzen Sie die Registerkarte: Dateien innerhalb von CODESYS, um Dateien zu verwalten, beispielsweise solche, die im Rahmen von Rezepturen verwendet werden.

Fehlerbehebung

Zur Auswertung von Fehlerzuständen stehen die folgenden Vorgehensweisen zur Verfügung:

  • Abfangen des von einer Operation zurückgegebenen Fehlercodes

    Vergleichen Sie den Rückgabewert mit den definierten Fehlerzuständen aus der Liste der ReturnValues (GVL).

  • Abrufen des zuletzt aufgetretenen Fehlers

    Um den zuletzt aufgetretenen Fehlercode zu erhalten, verwenden Sie die Methode RecipeManCommands.GetLastError().

Für eine detailliertere Analyse, ob ein Ladevorgang vollständig oder nur teilweise erfolgreich war (beispielsweise wenn nicht alle Variablen einer Rezeptur geladen wurden), verwenden Sie RecipeManCommands.GetLastInfo().

Diese Methode liefert einen Info‑Code, der mithilfe der Enumeration InfoValues (ENUM) ausgewertet werden kann.

Tipp

Gespeicherte Fehlercodes müssen gegebenenfalls manuell zurückgesetzt werden, beispielsweise mit RecipeManCommands.ResetLastInfo().

Erkennen von Änderungen

Um einfache Änderungen erkennung zu können, verwenden Sie die InfoValues (ENUM), wie im Abschnitt Fehlerbehebung beschrieben.

Wenn detailliertere Informationen über Zustandsänderungen erforderlich sind, können Sie redundante Datenstrukturen implementieren. Dadurch lassen sich der vorherige und der aktuelle Zustand einer Rezeptur sowie die aktuellen Variablenwerte auf der Steuerung miteinander vergleichen.

Sliding-Window-Mechanismus

Zum Auslesen von Rezepturwerten und deren Variablennamen wird häufig der Sliding-Window-Mechanismus verwendet

Er dient dazu, innerhalb eines deutlich größeren Puffers einen definierten Bereich von Einträgen zu betrachten, indem eine Fenstergröße sowie ein Offset (Positionierung des Fensters auf der Datenliste) verwendet werden.

Für weitere Informationen siehe RecipeManCommands.GetRecipeValues (), RecipeManCommands.GetRecipeVariableNames () und RecipeManCommands.GetRecipeNames()

SlidingWindowExample.png

Namensschema für Rezepturdateien

Rezepturdateien folgen einem definierten Namensschema, damit sie beispielsweise im Dateisystem eindeutig identifizierbar sind.

Beachten Sie das folgende Namensschema: <Rezeptur>.<Rezepturdefinition>.<Erweiterung>

  • Recipe: Der Name der konkreten Rezeptur.

  • Rezepturdefinition: Der Name der zugehörigen Rezepturdefinition.

  • Erweiterung: Die Dateiendung (beispielsweise .txt, .csv), die in der Registerkarte des Rezepturverwalters im Gerätebaum festgelegt wird.

Besondere Funktionsweise bei Gleitkommazahlen

Bei Variablen des Typs REAL oder LREAL wird unterschieden, ob der Wert exakt konvertierbar ist oder nicht.

  • Wenn es möglich ist, den Wert exakt zu konvertieren, wird in der Rezepturdatei nur der numerische Wert gespeichert.

  • Wenn keine exakte Konvertierung möglich ist, wird in der Rezepturdatei neben dem numerischen Wert ein hexadezimal codierter String geschrieben. Dies soll bewirken, dass auch eine nicht konvertierbare Gleitkommazahl den gleichen Wert zurück liefert.

Dieses Feature kann mit dem Compiler-Define RECIPE_GENERATE_SIMPLE_STRINGREAL deaktiviert werden.

Tipp

In den Objekteigenschaften der übergeordneten Applikation unter Build können Sie in der Option Compiler-Defines dieses Compiler-Define RECIPE_GENERATE_SIMPLE_STRINGREAL eintragen. Daraufhin wird kein hexadezimal codierter String gespeichert.

Für weitere Informationen siehe: Dialog: Eigenschaften: Build

Rezepturverwaltung auf der Steuerung, Speicherverbrauch

Wenn Sie die Option Rezepturverwaltung in der SPS deaktiviert haben, verbraucht der Rezepturverwalter und die Rezepturdefinitionen keinen Speicher auf der Steuerung.

Wenn Sie die Option aktiviert haben, wird für den Rezepturverwalter und alle Rezepturdefinitionen Code erzeugt, der auf der Steuerung Speicher belegt. Die Größe des Speicherverbrauchs hängt hauptsächlich von der Anzahl der Rezepturen und deren Variablen sowie vom Datentyp der Variablen ab. Dabei ist ebenfalls von Bedeutung, ob die Felder der Rezepturdefinition mit Werten besetzt sind oder nicht. Der Speicherverbrauch von Rezepturen kann nicht berechnet werden - dieser muss bei Bedarf empirisch ermittelt werden. Die nachfolgende Tabelle soll hier nur ein Anhaltspunkt sein.

Tabelle 1. Speicherverbrauch für CODESYS V3 SP6 mit Steuerung CODESYS Control Win SL V3

Codegröße (Byte)

Datengröße (Byte)

Gesamt (Byte)

Eine Rezepturdefinition mit 100 INT-Variablen

194406

79400

267352

Eine Rezepturdefinition mit 200 INT-Variablen

238318

121284

459344

Eine Rezepturdefinition mit 300 INT-Variablen

282230

163084

543856

Eine Rezepturdefinition mit 100 BOOL-Variablen

192742

69884

343168

Eine Rezepturdefinition mit 200 BOOL-Variablen

235446

101568

436872

Eine Rezepturdefinition mit 300 BOOL-Variablen

278146

133284

510072

Eine Rezepturdefinition mit 100 STRING-Variablen

203278

870084

1154000

Eine Rezepturdefinition mit 200 STRING-Variablen

255570

1709784

2973296

Eine Rezepturdefinition mit 300 STRING-Variablen

307886

2549484

2964112