Detailinformation zu den Rezepten
Für die Rezepte stehen zwei interne Datenpunkttypen zur Verfügung. Neue Rezepttypen werden als Datenpunkt vom Typ _Rct angelegt. Neue Rezepte werden als Datenpunkt des Datenpunkttyps _Rcp angelegt. Die Bedeutung der Datenpunktelemente entnehmen Sie den zwei folgenden Tabellen:
Datenpunkttyp _Rct
| Element | Datentyp | Bedeutung | 
|---|---|---|
| recipeType | string | Name des Rezepttyps | 
| description | langString | Beschreibung des Rezepttyps | 
| lastActivated | time | Zeitpunkt der letzten Aktivierung | 
| lastActivatedOfThisType | string | Letztes Rezept dieses Typs, das aktiviert wurde | 
| lastModified | time | Zeitpunkt der letzten Bearbeitung | 
| valid | bool | Status des Rezepttyps | 
| elements | dyn_string | Die zugehörigen Datenpunktelemente | 
| elementTypes | dyn_string | Datentypen der DPEs | 
| elementUnits | dyn_int | Einheit der Datenpunktelemente | 
| elementIndex | dyn_int | Index der Elemente für Sortierung nach Reihenfolge der Zuordnung | 
| recipes | dyn_string | Alle Rezepte, die zu einen Typ gehören | 
| lastActivatedUser | string | Benutzer der das Rezept aktiviert hast | 
Datenpunkttyp _Rcp
| Element | Datentyp | Bedeutung | 
|---|---|---|
| recipeType | string | Name des zugehörigen Rezepttyps | 
| author | string | Benutzername des Rezepterstellers | 
| description | langString | Beschreibung des Rezeptes | 
| lastUsage | time | Zeitpunkt der letzten Aktivierung | 
| lastModified | time | Zeitpunkt der letzten Bearbeitung | 
| valid | bool | Status des Rezeptes | 
| elementValues | dyn_string | Werte, die auf Datenpunktelemente übertragen werden sollen. | 
| user | string | aktueller Benutzer | 
CTRL-Funktionen
Die Verwendung der Rezept-Funktionalitäten muss nicht zwingend mit den mitgelieferten Panels erfolgen. Alle wesentlichen Operationen stehen als CTRL-Funktionen zur Verfügung und können auch in selbst gestalteten Panels verwendet werden. Alle CTRL-Funktionen sind in einer Library mit dem Namen rcp.ctc zusammengefasst.
Folgende Tabelle zeigt diese CTRL-Funktionen in der Reihenfolge, wie sie sinnvollerweise eingesetzt werden:
| Funktion + Syntax | Beschreibung | 
|---|---|
| bool rcpCheckLicence() | Prüft die Existenz der Lizenz | 
| void rcp_createRecipeType(string typname, int &err) | 
                                 Damit wird ein Rezepttyp angelegt Parameter: string typname = Name des Datenpunkttyps int &err = Möglicher Fehler, der zurückgegeben wird. Mögliche Fehlercodes: 0 OK -1 Common error -2 DP exists -3 illegal characters -4 Permission NOK  | 
                        
| void rcp_changeRecipeType(string typename, dyn_int element_index, dyn_string elements_new, dyn_string comment, string &err) | 
                                 Speichert alle Rezepttypdaten Parameter: string typename = Name des Datenpunkttyps dyn_int element_index = Index der Datenpunktelemente dyn_string elements_new = neue Datenpunktelemente dyn_string comment = Kommentar für den Rezepttyp string &err = Möglicher Fehler, der zurückgegeben wird. Mögliche Fehlercodes: "error_dpe_doesnotexist" "error_invalid_type" "error_address_conflict" "error_mp_"  | 
                        
| void rcp_checkRecipeType(string typename, dyn_dyn_string &err) | 
                                 Prüft den Rezepttyp string typename = Name des Rezepttyps dyn_dyn_string &err = Möglicher Fehler, der zurückgegeben wird. Mögliche Fehlercodes: ""error_dpe_doesnotexist" "error_invalid_type" "error_address_conflict" "error_mp_"  | 
                        
| void rcp_checkDPE(string dpe, string &errorMsg) | 
                                 Prüft das Datenpunktelement string dpe = Das Datenpunktelement string &errorMsg = Möglicher Fehler, der zurückgegeben wird. Mögliche Fehlercodes: ""error_dpe_doesnotexist" "error_invalid_type" "error_address_conflict" "error_mp_"  | 
                        
| void rcp_createRecipe(string recipename, string typename, int &err) | 
                                 Legt ein Rezept an string recipename = Der Name des zu erstellenden Rezeptes string typename = Der Typname des Rezeptes int &err = Möglicher Fehler, der zurückgegeben wird. Mögliche Fehlercodes: 0 OK -1 Could not be created -2 Type does not exist -4 Permission NOK  | 
                        
| void rcp_checkRecipe(string rcp, string &err) | 
                                 Prüft das Rezept auf seine Gültigkeit string rcp = Name des zu prüfenden Rezeptes string &err = Möglicher Fehler, der zurückgegeben wird. Mögliche Fehlercodes: 0 OK -1 rct invalid -2 Value invalid -3 Value empty  | 
                        
| void rcp_changeRecipe(string rcp, dyn_string comment, dyn_anytype ds_elementValues, string &err) | 
                                 Speichert alle Rezeptdaten string rcp = Name des Rezeptes, das geändert werden soll dyn_string comment = Das neue Kommentar dyn_anytype ds_elementValues = Neue DPE-Werte string &err = Möglicher Fehler, der zurückgegeben wird. Mögliche Fehlercodes: 0 OK -1 rct invalid -2 Value invalid -3 rcp check NOK -4 Permission NOK  | 
                        
| void rcp_activateRecipe(string recipeName, string rtc, string &err) | 
                                 Überträgt die Sollwerte des Rezeptes auf die DPEs string recipeName = Name des Rezeptes string rtc = Rezepttyp string &err = Möglicher Fehler, der zurückgegeben wird. Mögliche Fehlercodes: 1 rct invalid -2 rcp invalid -3 no of rcp != no of values -4 Permission NOK  | 
                        
| void rcp_readRecipeTypeFromFile(string filenameString, bool overwrite, string &err) | 
                                 Liest Rezepttypen aus einer ASCII Datei. Mögliche Fehlercodes: 0 OK -1 common file error  | 
                        
| void rcp_readRecipesFromFile(string filenameString, string &err, bool overwrite) | 
                                 Zum Einlesen von Rezepten aus einer ASCII Datei in WinCC OA . Mögliche Fehlercodes: 0 OK -1 File Error -2 DP already exists  | 
                        
| void rcp_writeRecipeTypeToFile(string recipeType, bool overwrite, bool all, string fileNameString, string &err) | 
                                 Schreibt Rezepttypen in ASCII Datei. Mögliche Fehlercodes: 0 OK -1 File error -2 File exists  | 
                        
| void rcp_writeRecipeToFile(dyn_string recipe, bool overwrite , bool all, string fileNameString, string &err) | 
                                 Speichert Rezepte eines ausgewählten Rezepttyps in eine ASCII Datei. Possible error codes: 0 OK -1 File Error  | 
                        
| int rcp_deleteRecipe(string recipename) | 
                                 Löscht das angegebene Rezept string recipename = Rezeptname Mögliche Fehlercodes: -1 dpNotExists  | 
                        
| void rcp_deleteRecipeType(string recipeType) | 
                                 Löscht den angegebenen Rezepttyp string recipeType = Rezepttyp.  | 
                        
| void rcp_getAllRecipes(string recipeType, dyn_string &recipeNames) | 
                                 Liefert alle zu einem Typ gehörenden Rezepte in einem dynString zurück. Falls der Typ nicht existiert, wird auch nichts zurückgegeben. string recipeType = der Rezepttyp &recipeNames = zurückgelieferte Rezeptnamen.  | 
                        
| void rcp_getAllRecipeTypes(dyn_string &recipeTypes) | 
                                 Liefert alle bestehenden Rezepttypen in einem dynString zurück. dyn_string &recipeType = zurückgelieferte Rezepttypen.  | 
                        
BEISPIEL
Im Folgenden finden Sie ein Beispiel für die Rezepte-Funktionen. Beachten Sie, dass für das Beispiel der verwendete Datenpunkttyp und Datenpunkt existieren müssen.
main()
{ 
  /* entsprechende DPs wie 'alu' müssen bereits existieren bzw. an richtiger Stelle angelegt werden um für die Rezepte verwendet werden zu können */
  int err; 
  string errMsg; 
  dyn_dyn_string dserrMsg; 
  dyn_int element_index; 
  dyn_string elements_new;
  dyn_string comment;
  dyn_anytype ds_elementValues;
  DebugN("Lizenzprüfung: ",rcpCheckLicence());
  if(!dpExists("Metallverarbeitung_Alu")) 
  {
    rcp_createRecipeType("Metallverarbeitung_Alu",err); 
    DebugN("neuer Rezepttyp 'Metallverarbeitung_Alu' erstellt: ",err); 
  }
  element_index[1] = 1; element_index[2] = 2; 
  element_index[3] = 3;
  elements_new[1] = "alu.soll.state:_original.._value";
  elements_new[2] = "alu.soll.val:_original.._value";
  elements_new[3] = "alu.soll.cmd:_original.._value";
  comment[1] = "Aluverarbeitung";
  rcp_changeRecipeType("Metallverarbeitung_Alu",element_index,elements_new,comment,errMsg); 
  DebugN("Rezepttypdaten 'Metallverarbeitung_Alu' gespeichert: ",errMsg);
  rcp_checkRecipeType("Metallverarbeitung_Alu",dserrMsg);
  DebugN("Rezepttyp 'Metallverarbeitung Alu' geprüft: ",dserrMsg);
  rcp_createRecipe("Alu","Metallverarbeitung_Alu",err); 
  DebugN("Rezept 'Alu' erstellt: ",err);
  ds_elementValues[1] = 222;
  ds_elementValues[2] = 22.222; 
  ds_elementValues[3] = 1;
  rcp_changeRecipe("Alu",makeDynString("Alu"),ds_elementValues,errMsg);
  DebugN("Rezeptdaten gespeichert: ",errMsg);
  rcp_activateRecipe("Alu","Metallverarbeitung_Alu",errMsg);
  DebugN("Rezept aktiviert: ",errMsg); 
  }
        