# Programm in FUP



## Ratoncito (8 November 2020)

Hallo,

ich muss eine 25 Jahre alte SPS, die ich für die Steuerung von Licht und Rolläden nutze, durch eine neue ersetzen. Zur Programmierung nutze ich e!Cockpit. Da man das alte Programm nicht 1:1 übernehmen kann, möchte ich es lieber von Grund auf neu programmieren.
Da an mir sicherlich kein begnadeter Programmierer verloren gegangen ist, möchte ich Euch bitten, meine Versuche zu überprüfen und zu verbessern. 

Es sind eigentlich nur kurze Programmblöcke die sich mit anderen Eingangskombinationen wiederholen. Hier eine kurze Beschreibung:

In dem Beispiel werden drei verschiedene Lampen über ein Stromstoßrelais ein- und ausgeschaltet. Daher wird zum Ein- und Ausschalten nur ein kurzer Impuls TP benötigt.
An der Haustüre ist ein Sensor, der beim Abschließen alle eingeschalteten Lampen im Haus ausschaltet. Daher wird in einem SR-Speicher der Schaltzustand gespeichert.
Zum Schalten werden Taster benutzt und ausgewertet wie lange sie betätigt werden. 
TP_Kurz =1 entspricht Kurz
TP_Kurz =0 und TON_Dauer =0 entspricht Lang
TON_Dauer =1 entspricht Dauer
Da auch mehrere Taster gleichzeitig betätigt werden können wird die betätigte Kombination nach einer Verzögerung (NW1) TON_Verz im NW 4 gespeichert. Das Signal wird beim Loslassen der Taster über die negative Flanke von M_AlleE ausgelöst und NW4 zurückgesetzt.

Im Beispiel gibt es nur 1 Tasterkombination (NW4) mit Kurz (NW5), Lang (NW6) und Dauer in NW7.

Folgende Fragen habe ich:

1. Kann man das einfacher Programmieren?
2. Kann man NW 5, 6 und 7 übersichtlicher darstellen?
3. Kann man in Netzwerken einen Kommentar einfügen?
4. Bei einem Stromausfall sollen die die Zustände in NW 5, 6, und 7 nach dem erneuten Anlaufen wieder erhalten sein.

Vielen Dank für Eure Hilfe - Wolfgang


----------



## holgermaik (8 November 2020)

Hallo Wolfgang
- Warum Retain und nicht Persistent?
- Einen Ausgang als Retain zu setzen ist sinnfrei da er in jedem Zyklus überschrieben wird.
- Ein Instanzpfad wie bei den Ausgängen ist ungünstig für den Speicher
- die kompletten SR als Retain zu setzen ist ungünstig für den Speicher

Du hast mit deinen 5 Anweisungen bereits 72 Byte Retainspeicher verbraucht.

Holger


----------



## Ratoncito (8 November 2020)

Hallo Holger,

vielen Dank für die Antwort.



> Retain -> Nach Stromausfall bleibt Wert in der Variable.
> Persistent-> Variable kann Programmupdate überstehen/Programmänderung/Kein Spannungsausfall



Habe versucht die Info aus einem anderen Beitrag umzusetzen.

Nun habe ich die Merker Persistent gesetzt, leider mal wieder ohne Erfolg. Nach Stromausfall sind diese Merker grundsätzlich False, egal welchen Zustand sie vorher hatten.

Wo kann man die Größe des Speichers sehen?

Das geänderte Programm ist im Anhang.


Noch einen schönen Sonntag - Wolfgang


PS Wo und wie kann man die die hochgeladenen Dateien löschen?


----------



## holgermaik (8 November 2020)

> _Retain -> Nach Stromausfall bleibt Wert in der Variable._
> _Persistent-> Variable kann Programmupdate überstehen/Programmänderung/Kein Spannungsausfall_


Die Aussage ist falsch. Da du Firmware 17 benutzt ist die verwendetet Codesys Version 3.5.14 Persistent schließt Retain mit ein.


> [FONT=&quot]Ab CODESYS-Version 3.3.0.1 bewirkt eine Variablendeklaration mit [/FONT]PERSISTENT RETAIN[FONT=&quot] dasselbe wie mit [/FONT]RETAIN PERSISTENT[FONT=&quot] oder [/FONT]PERSISTENT[FONT=&quot].[/FONT]





> Wo kann man die Größe des Speichers sehen?


Kann man ausrechnen. Nach dem kompilieren wird der verwendete Speicher im Hinweisfenster angezeigt. Speicherbereich 3.


> PS Wo und wie kann man die die hochgeladenen Dateien löschen?


Meinst du im Forum? -> Benutzerkontrollzentrum -> Anhänge


----------



## Ratoncito (8 November 2020)

Hallo,

vielen Dank für die Antwort.




> Die Aussage ist falsch. Da du Firmware 17 benutzt ist die verwendetet Codesys Version 3.5.14 Persistent schließt Retain mit ein.



Im Prinzip würde dann Retain oder Persistent keinen Unterschied machen.

Leider erreiche ich mit allen meinen Versuchen nicht, dass die ausgewählten Merkerzustände nach einem Stromausfall erhalten sind. Sorry, aber bin wirklich absoluter Anfänger und stochere nur so im Nebel umher.

Unter dem Reiter Programm sind mir die angebotenen Funktionen wie Übersetzen, Code erzeugen, Bereinigen, Import und Export nicht wirklich klar. Mir schwant zwar ein weig, aber ob meine Annahme dann richtig ist... Ich bewege mich auf ganz dünnem Eis.

Leider sind die Handbücher für SPS-Programmierung und für e!Cockpit nicht für Anfänger gedacht. Im Moment bin ich froh, dass ich ein Programm erstellen, auf die SPS laden und Online kontollieren kann.

Daher wäre ich froh, wenn mir jemand diese Einstellung korrigieren würde.
Auch würde mich interessieren, ob man das Programm (es funktioniert) besser und effizienter gestalten kann.

Ich freue mich über jede Kritik und Verbesserung.

Liebe Grüße- Wolfgang


----------



## .:WAGO::018636:. (9 November 2020)

Hallo Ratoncito,

der Nutzer holgermaik hat hier bei vielen Punkten recht.
Deine Variablen am FB werden nach einem Neustart der Steuerung oder nach einem Download des Programms auch mit der Deklaration RETAIN PERSISTENT auf FALSE geschrieben, da der Ausgang des FBs nicht den vorigen Zustand kennt.
Außerdem verwendest du aktuell nicht die Variablen von der PersistentVars Liste, sondern die lokal deklarierten aus dem Programm Muster. Damit die aus der PersistentVars Liste verwenden kannst, musst du vor den Variablen den Namensraum PersistentVars schreiben. Dieses würde dann wie folgt aussehen PersistentVars.M_LiVitrine.
Wie vorher geschrieben ist dieses dann trotzdem nicht von Erfolg gekrönt.

Das Thema können wir auch gerne per Telefon klären.
Bitte melde dich unter der Nummer +4957188744555 und schildere dem Front Office kurz das Thema (Remanente Daten und e!COCKPIT)
Entweder werde ich dann das Thema mit dir klären oder meine Kollegen.


----------



## Ratoncito (10 November 2020)

Hallo,

so, mein Problem ist mit professioneller Hilfe gelöst.

Vielen Dank an den Wago-Support!!!
Leider ist es nicht mehr üblich, dass nach dem Kauf umfassende Hilfe angeboten wird. 

Für den Fall, dass jemand ähnliche Probleme hat, habe ich das funktionierende Programm als Beispiel angehangen.

Liebe Grüße - Wolfgang


----------



## holgermaik (10 November 2020)

> so, mein Problem ist mit professioneller Hilfe gelöst.


Alle Achtung. 120 Byte kostbarer Persistent Speicher für 5 Boolsche Variablen


----------



## Ratoncito (11 November 2020)

Hallo,



> Alle Achtung. 120 Byte kostbarer Persistent Speicher für 5 Boolsche Variablen



Dann wären es für 50 (mehr werde ich auf keinen Fall benötigen) 1,2KB. Wenn ich richtig informiert bin stehen 120KB zur Verfügung. Das würde für 5000 reichen.

Sorry, aber wie schon öfter geschrieben, ich bin absoluter Anfänger. Ich kann nicht beurteilen, ob es eine gute oder schlechte Lösung ist, und welche weiteren Auswirkungen es eventuell hat.

Wenn es bessere Lösungen gibt - ich bin für jedes Beispiel dankbar. Ein Beispiel in der von mir angehängten Datei wäre für mich die beste nachvollziehbare Lösung.

Liebe Grüße - Wolfgang


----------



## holgermaik (11 November 2020)

Hallo Wolfgang
128 kB ist richtig. Wenn du deinen Verbrauch an Speicher so klar bestimmen kannst ist es sicherlich ein möglicher Weg wenn auch nicht optimal.

Falls du dich weiter mit dem Thema beschäftigen möchtest.
Eine Variable die in jedem Zyklus geschrieben wird (z.B. der Ausgang eines Oder) kann man nicht persistent speichern. 
Persistenten hat immer was mit bedingter Programmausführung zu tun.

Hier wäre F_Trig, R_Trig und Move mit freigegebenem EN ein guter Einstig in das Thema.

stark vereinfachtes Ersatzbild eines SR. 
Da auf die Variable Zwischenmerker nur bedingt geschrieben wird könnte man diese als Persistent deklarieren und hätte 1 Byte verbrauch. 



Holger


----------



## PN/DP (11 November 2020)

Auch bei Variablen, die in jedem Zyklus eine Zuweisung erhalten, kann persistentes speichern Sinn machen, nämlich dann wenn die Variable erst gelesen/verarbeitet und dann geschrieben/zugewiesen wird. Wie z.B. die Hilfsvariablen (Flankenmerker) von Flankenerkennungen, R_TRIG, F_TRIG, ...

Harald


----------



## Ratoncito (11 November 2020)

Hallo Holger,



> Falls du dich weiter mit dem Thema beschäftigen möchtest.
> Hier wäre F_Trig, R_Trig und Move mit freigegebenem EN ein guter Einstig in das Thema.



ja, gerne.

Leider keinen Dunst was Move mit freigegebenem EN bedeutet. In meinem konkreten Fall geht es darum den Zustand eines SR zu speichern.

Grundsätzlich wäre es sicherlich besser erst die Grundlagen zu vertiefen als sich mit konkreten Projekten zu beschäftigen. Mein Problem ist, dass ich mit dem Rücken an der Wand stehe.

Auf meiner alten SPS laufen nur noch einige Programmteile, daher muss ich die SPS schnellstens ersetzen. Ich wurschtel mich gerade durch die Programmiererei und habe den ersten Baustein hier vorgestellt um Kommentare und Verbesserungen für eine effiziente Programmierung zu bekommen.

Liebe Grüße - Wolfgang

PS

@Holger
Das Bild kam als ich meinen Beitrag schrieb.
Geht das auch in FUP?
Kann man CFC in FUP umwandeln?
Wenn ja wie?


----------

