# Rezeptverwaltung in Codesys



## Bensen83 (15 Dezember 2012)

Hi Leute bin ein Umsteiger von Siemens. Dort habe ich ja alle Daten, welche in einem dB stehen nach einem power On wieder zur Verfügung. Da ich nun in codesys nicht alles retain deklarieren möchte, habe ich folgende frage: gibt es bei codesys eine tezepturverwaltung, wo man Variablen hinterlegen kann, wel je nach einem power in noch ihren alten Wert haben?


----------



## IBFS (15 Dezember 2012)

Ich denke, die Antwort steckt schon in deiner Frage .... 

Die Variablen, die nach Power On noch erhalten bleiben sollen müssen RETAIN gelabelt sein. 

Eine Rezepturverwaltung mit STEP7 ist typischerweise mittels der HMI gelöst, d.h. die Werte werden auf der HMI ausfallsicher gehalten.
Da der SIEMENS-typische Rezepturverwaltungsmechanismus magels sinnvoll adaptierbarer HMI mit CoDeSys nicht verfügbar ist, bleibt nur der manuelle Weg.

Grüße

Frank


----------



## Bensen83 (16 Dezember 2012)

*Also Baustein schreiben*

Also in der s7 hatte ich mir auch mal nen Baustein dafür geschrieben, weil es nicht in der Visu realisiert werden sollte. (Powertags sparen) ;-) 
Dort hatte ich für jedes Rezept einen dB und habe je nach Anwahl den entsprechenden dB und den dB "aktuelles Rezept" kopiert. 
Also hier im fall codesys einfach ne Struktur machen und dann für x Rezepze ein Array dieser Struktur?
Kann man irgendwie erkennen wie lange eine Struktur ist? So könnte ich einen allgemein gültigen Baustein schreiben? Muss dann mit Pointern gearbeitet werden?


----------



## Matze001 (16 Dezember 2012)

Also wenn du eine "Instanz" einer Struktur in eine andere kopieren willst geht es wie bei Siemens in SCL mit

STRUCT_A := STRUCT_B;

Grüße

Marcel


----------



## Bensen83 (16 Dezember 2012)

*Länge des Arrays*

Danke das ist mir ja klar, meinte es auch nicht so.,
Sondern wie kann ich an einem Baustein einen Eingang erstellen, wo ich nicht genau weis was es für ein Datentypen ist. 
Also bspw. Ob es Ein Array mit 10 Elementen vom Typ xy ist, oder ob es 20 Elemente sind. 
Bzw. Wenn ich den Namen des Datentypist nicht weis. Kann ich irgendwie einen flexiblen Eingang anlegen und rausfinden welcher datentyp es ist?


----------



## IBFS (16 Dezember 2012)

Bensen83 schrieb:


> Danke das ist mir ja klar, meinte es auch nicht so.,
> Sondern wie kann ich an einem Baustein einen Eingang erstellen, wo ich nicht genau weis was es für ein Datentypen ist.
> Also bspw. Ob es Ein Array mit 10 Elementen vom Typ xy ist, oder ob es 20 Elemente sind.
> Bzw. Wenn ich den Namen des Datentypist nicht weis. Kann ich irgendwie einen flexiblen Eingang anlegen und rausfinden welcher datentyp es ist?



Wozu brauchst du denn das alles?  

Selbst bei einer Rezepturverwaltung in einer HMI müssen Datentypen und die Variablenstruktur am Anfang festgelegt werden.
Wenn sich diese ändert, muss das HMI Projekneu erstellt und überspielt werden.

Genausso in der SPS, da muss man sich am Anfang eine sinnvolle passende Struktur erstellen.  
Da kann man nicht alles Variabel gestalten.

Weder macht das Sinn noch passen da die Zugriffe im (Rest)-Projekt und der Visu.
Ich denke du bist da mit deinen Gedanken noch nicht ganz sortiert.

Frank


----------



## Bensen83 (16 Dezember 2012)

*Für mehrfachberwwndung*

Für instanzierung und mehrfachberwwndung.
Also wenn ich Bsp einen Baustein schreiben möchte, welche 2 mal aufgerufen werden soll. Das erste mal für tezepturverwaltung vom datentyp a und ein 2. mal für eine vom Typ b.
Bei step7 habe ich da einfach geprüft wie lange der dB ist (sprich die Struktur) und dann immer die entsprechende Anzahl an Bytes kopiert. So war der Baustein rezeptlängen unabhängig. Bzw. Datentypen unabhängig. Das macht meiner Meinung nach schon Sinn, wenn man mehrere verschiedene Rezepturen zu verwalten hat. Zumindest hat es sich als hilfreich erwiesen.


----------



## Bensen83 (16 Dezember 2012)

*Jemand ne idee?*

Weis jemand wie ich es machen könnte? Oder bekomme ich das als Baustein nicht allgemein gelöst?


----------



## IBFS (16 Dezember 2012)

Bensen83 schrieb:


> Weis jemand wie ich es machen könnte? Oder bekomme ich das als Baustein nicht allgemein gelöst?



Allgemein gelöst ist es dann, wenn du die betreffenden Strukturtypen an die Bausteine anbindest. 
Ändert sich die globale Strukturdefinition muss man nur alles neu übersetzen in in die SPS spielen. 
Noch universellere Methoden sind nicht zu machen.

Frank


----------



## Bensen83 (17 Dezember 2012)

*Rezept in Datei Speichern*

Habe jetzt nen tip bekommen, die Rezepte in ne Datei zu speichern. Was haltet ihr davon?


----------



## IBFS (17 Dezember 2012)

Bensen83 schrieb:


> Habe jetzt nen tip bekommen, die Rezepte in ne Datei zu speichern. Was haltet ihr davon?



Ich halte besonders von dem Umstand nicht viel, das man bei deinem Projekt die Hardware nicht kennt.
Für Codesys gibt es mind. 150 Hersteller d.h. am Ende vlt. 500 SPS-Typen. Wie sollen wir da zur deinem 
Statement "die Rezepte in ne Datei zu speichern" eine sinnvolle Antwort schreiben.

Ich wiederhole mein Gefühl, das du zur Zeit etwas zu kompliziert denkst.

Es muss doch möglich sein für eine   

- konkrete Aufgabenstellung-

eine

-sinnvolle Struktur-

und damit einen 

-passenden Baustein-

zu schreiben, der die Aufgabe 

-Daten umschaufeln-

realisiert.

Mehr ist eine Rezeptur-"verwaltung" eigentlich nicht.

Frank


----------



## Bensen83 (17 Dezember 2012)

*Schon klar*

Das ist mir schon klar das es nicht mehr ist. Es geht auch pberhauptnicht um eine Aufgabenstellung, sondern darum eine tezepturverwaltung als Baustein zu erstellen und dies so flexibel, dass dieser Datentypen unabhängig ist. Das wird ja wohl gehen, werde es mal über Adresse und datenkänge versuchen. Es geht einfach darum bspw. Mehrere rezepturverwaltungen mit verschiedenen Datentypen mit einem Baustein bedienen zu können, das halte ich jetzt persönlich nicht für kompliziert gedacht, sondern für zukünftige Fehlerquellen Verkleinerung.


----------



## IBFS (17 Dezember 2012)

Dann verstehe ich aber dein Post zur Ablage in einer Datei erst recht nicht.
Mit jeder Hardware sind die Methoden verschieden oder ggf. auch garnicht
vorhanden.

Unabhängig vom Dateithema ist es dann, wenn die Datenstruktur klar ist,
ein leichtes sich aus einem Array of Struct mittels Zeigerwert (Datensatz) die 
passenden Werte zu lesen oder zu schreiben. 
Das ganze dauert, wenn es dann soweit ist 1 bis 2 Stunden.

Jedenfalls kann man erst dann, wenn die benötigten Daten klar sind die 
passenden Strukturen im CoDeSys erstellen. 

GGf. erstellt man ein Initialstruktur mit der man übt.

Wenn es dann soweit ist (das schrieb ich bereits) wird dann die Struktur
zu gewünschten Struktur verändert und alles neu kompiliert.

Mehr gibt es dazu nicht zu sagen.

Frank


----------



## Bensen83 (17 Dezember 2012)

*Ok*

Also ich glaube wir reden aneinander vorbei. Ich will ja was ohne datentyp haben. Aber egal. Habe gesehen es gibt ja bei codesys 3 auch einen recipemanager. Ist der nicht gut, oder benutzt den jemand?


----------



## IBFS (17 Dezember 2012)

Bensen83 schrieb:


> Also ich glaube wir reden aneinander vorbei. Ich will ja was ohne datentyp haben. Aber egal.



Mein Tip mit der FAKE-TEMP-Struktur gefällt wohl nicht  ;-)         
Ansonsten kenne ich keine Bausteine, die man mit <DatenTypEgal> parametrieren könnte.

Frank


----------



## Bensen83 (17 Dezember 2012)

*Adresse*

Ich meinte es irgendwie mit 2 eingabeparametern wie Adresse Länge bspw. ;-)


----------



## IBFS (17 Dezember 2012)

Bensen83 schrieb:


> Ich meinte es irgendwie mit 2 eingabeparametern wie Adresse Länge bspw. ;-)



Ich denke da muss du umdenken, d.h. dich von der Direktardessierbaren BLOCKMOVE-SIEMENS-WELT zur PUR-CODESYS-SYMBOLIK-WELT umgewöhnen. Dort macht die Adresse/Länge Denkweise keinen rechten Sinn mehr.

frank


----------



## Chräshe (17 Dezember 2012)

Mensch Bensen,

vergiss die umständliche Handhabung wie beim Blockmove!
Du kannst hier ganz einfach Strukturen hin und her kopieren ohne Schnick- Schnack.

Wenn dir der Vorschlag von Frank nicht gefällt, erstelle halt eine Stuktur „Rezeptur_Bensen_Egal“.
Diese legst du einmal direkt in deinem Programm-Baustein an und einmal als Array im persistenten Bereich.




Rezept laden
FB_Rezeptur_Bensen_Egal  := Pers_Rezeptur_Bensen_Egal[123];

Rezept zurückschreiben
Pers_Rezeptur_Bensen_Egal[123]  := FB_Rezeptur_Bensen_Egal;

 Gruß
Chräshe


----------



## Bensen83 (17 Dezember 2012)

Ich versuche es nochmal. 1. kann ich doch auch in codesys über ADR auf die Adresse schauen.
2. kann man bei Siemens auch Strukturen im strukturierten Text direkt kopieren.
3. geht es nicht drauf dass die Struktur "Egal" heißen soll, sondern egal sein soll. Das heist es soll mir ermöglichen einmal eine Struktur xy zu verwalten und einmal eine Struktur ab. Und dies eben mit ein und dem selben Baustein, eben nur einer anderen Instanz. ;-) aber ich Gleise ihr versteht mich nicht. :-(


----------



## IBFS (17 Dezember 2012)

Bensen83 schrieb:


> Ich versuche es nochmal. 1. kann ich doch auch in codesys über ADR auf die Adresse schauen.



ja und genau diese Grundidee ist der Quark, von dem du dich nicht lösen willst.

Du willst genau denn hartkodierten Programmierstil in die CoDeSys-Welt mitnehmen. Löse dich endlich davon ... vom dem ADRESSE - LÄNGE - KÄSE und mache es richtig, nämlich symbolisch.



Bensen83 schrieb:


> 3. geht es nicht drauf dass die Struktur "Egal" heißen soll, sondern  egal sein soll. Das heist es soll mir ermöglichen einmal eine Struktur  xy zu verwalten und einmal eine Struktur ab. Und dies eben mit ein und  dem selben Baustein, eben nur einer anderen Instanz.



Spätestens beim Übersetzen muss eine Struktur "irgendwas" sein und nicht "egal". Es macht mich echt fertig, dass du diese Tatsache nicht einsehen willst.

Frank


----------



## Bensen83 (17 Dezember 2012)

*Nochmal *

Sorry, aber ich habe nie gesagt, dass die Struktur beim übersetzen nicht bekannt ist. Ich möchte doch nur einen abstrakten Baustein erstellen der allgemein zu verwenden ist. Und Sorry, aber das ist durchaus nicht altmodisch. Ich arbeite gerne symbolisch, entwickle ab und zu auch einige Sachen in Visual Studio in c#. Also nur um mal klarzustellen, dass ich kein Siemens adressptohrammierer bin, das war nur ein Beispiel. War eben nur ne Idee, weil es eben symbolisch nicht abstrakt und Datentypen unabhängig funktioniert.


----------



## IngoLov (19 Dezember 2012)

Hallo,

bin auch gerade auf der Suche nach so etwas und kann den Themenstarter gut verstehen. In der Siemens Welt hat man halt einen DB angelegt, der zB 500Byte (incl Reserve) groß war und konnte in diesen Daten Schreiben. 
Programm abspeichern:Kopiere DB50(WorkDB) nach DB150(Programm1 Speicher)
Programm laden:Kopiere DB150(Programm1 Speicher) nach DB50(WorkDB)

Nun in Codesys habe auch ich das Probleme,  Programme(Werte) abzuspeichern:

habe einen Variablen-Container(Retain-Persistant) erstellt. Dort Deklariere ich alle Variablen, die Modell/Rezept abhängig sind (Zeiten, Zählern, Sollwerte, Temperaturen, Einstellungen usw)
Nun müsste es eine Möglichkeit geben, diesen Variablen Container mit Werten abzuspeichern und einen anderen zu Laden.

Da fehlt mir auch noch die Idee!

(Hoffe, den Themenstarter so verstanden zu haben)


----------



## IBFS (19 Dezember 2012)

IngoLov schrieb:


> bin auch gerade auf der Suche nach so etwas und kann den Themenstarter gut verstehen.



Ich langsam nicht mehr



IngoLov schrieb:


> Da fehlt mir auch noch die Idee!



Man kann doch in CoDeSys hierarchische Strukturen erstellen, was viel besser als mit STEP7 geht.

Diese dann mittels     Struktur_A:= StrukturArray[Index];   umzukopieren ist das einfachste von der Welt.

Das das so ein Problem darstellen soll ist mir schleierhaft.

Vielleicht sollte man sich mal mit dem Sprachkonstrukt  _struct_    und   _array of struct_      beschäftigen.

Frank


----------



## Bensen83 (19 Dezember 2012)

*Ok anscheinend versteht mich keiner*

Also es scheint wohl nicht klar zu sein, dass es mit nicht darum geht ein arrayelement zuzuweisen. Das ist mit auch klar wie das geht. Ich möchte einen Baustein erstellen, der strukturunabhängig Rezepte kopieren kann und das mit verschiedenen Funktionen. Warum versteht das keiner und macht dann meine Idee so schlecht. Das finde ich nicht gut, wenn man es nicht versteht es so runter zu machen.


----------



## DaHauer (20 Dezember 2012)

Hallo,

Ich versuch es mal zu verstehen ;-)
Du möchtest einen Baustein, der unabhängig vom eigentlichen Datentyp Daten in einen Array schreibt oder aus einem Array liest.

So etwas geht, man muss aber mit Pointern arbeiten und das ist bekanntermaßen Teufelszeug, aber es ist machbar. Auf jeden Fall solltest Du deine Indizes der Arrays gut kontrollieren und im Griff haben und immer nur an einer Stelle anfangen und diese fertig testen. Klingt vielleicht etwas altklug, aber ich hab mir da eine Funktion geschrieben, die in etwa das tut was du willst und ich bin am Anfang ziemlich auf die Schnauze geflogen damit, aber jetzt hab ich etwas Übung bekommen und die Vorteile liegen auf der Hand, ich bin nicht mehr an die eigentliche Rezeptstruktur gebunden und muss meine Verwaltung nie wieder anfassen.

Ich bin im Sondermaschinenbau unterwegs und da sind die Rezepte niemals gleich und ich hab mir einen Standardbaustein schreiben können, dem es egal ist was er da rum kopiert, weil es am Ende doch nur Bytes sind.

Schau dir mal den Anhang an, das ist das Kernstück meiner Verwaltung und evtl. hilft es dir ja weiter.


cheers 


Anhang anzeigen FC_MEMCPYONE.EXP.txt


----------



## Bensen83 (22 Dezember 2012)

*Ok danke.*

Danke dir genau sowas meinte ich. Genau aus dem Hintergrund, aus dem du das auch gemacht hast.


----------

