# Ablaufsteuerung: Anlage zur Wasseraufbereitung



## VolkerRacho (8 Mai 2017)

Hallo zusammen,

ich habe im Zuge einer nebenberuflichen  Weiterbildung o.g. Thema zu bearbeiten. Die Weiterbildung ist im Großen  und Ganzen wirtschaftlich ausgerichtet. Grundsätzliches Problem (neben  dem Ding mit der Wirtschaft):  Der Wissentransfer zum Thema SPS erfolgt  ausschließlich über Lernhefte, ohne Praxisteil. Ich habe große  Verständnisschwierigkeiten. Für die Aufgabenlösung habe ich bisher  Codesys benutzt, da kostenlos und meiner Meinung nach ziemlich gut. 

Aufgaben:
a.)  Wahl der Betriebsmöglichkeiten (automatisch, manuell) in ST schreiben.  Habe ich soweit gemacht. Hat unheimlich lange gedauert, könnte aber zu  70% passen.
b.) Den automatischen Modus der Anlage in AS abbilden. Habe ich irgendwie auch versucht, bin aber recht unsicher.

c.) Das Hauptprogramm in FUP / FBS schreiben. Hier fehlt mir jeglicher Ansatzpunkt. 

Ich  habe also Funktionsbausteine mit entsprechenden Eingängen und Ausgängen  in verschiedenen Darstellungsformen und soll nun ein Hauptprogramm mit  Übergabeparametern und Deklarationen der Variablen und Instanzen in FBS/  FUP anfertigen. .... keine Ahnung:/

Ich habe das Netz bisher  ohne Erfolg durchsucht. Man findet auf einschlägigen Seiten zwar  grundsätzliches zum FUP- Aufbau (Handbücher usw.), aber keinen Hinweis,  WIE man mit so einer Aufgabenstellung umgehen soll... oder ich verstehe  es schlichtweg nicht.


Ich bräuchte also einen Mentor, der hier bereit ist zu helfen.

Mein derzeitiger Stand ist dem Bild zu entnehmen.

Wie rufe ich die Bausteine grundsätzlich auf und wie ist zu deklarieren?
Hinweis: es wurden auschließlich lokale Variablen verwendet.


Leider kann ich die komplette Aufgabenstellung nicht hier rein posten (wäre auch sehr umfangreich mit allen Zuordnungslisten), weshalb mir private Nachrichten am liebsten wären.

Danke!
Volker
Anhang anzeigen 36883


----------



## holgermaik (8 Mai 2017)

Hallo Volker

Ja so ein Privatlehrer ist schon eine feine Sache.  Ich bin mir aber sicher, dass du hier im Forum auch gut aufgehoben bist. Die Aufgabenstellung könntest du z.B. als pdf hochladen und deine Fortschritte als zip.

Zu deiner Frage
Dein Hauptprogramm ist in Codesys PLC_PRG, bei Siemens wäre es OB1....
Die SPS würde also das PLC_PRG aufrufen und dann Netzwerk für Netzwerk der Reihe nach abarbeiten. Wenn alle Netzwerke abgearbeitet sind fängt alles von vorn wieder an. (mal ohne Betrachtung vom Betriebssystem und Taskaufrufen)
In deinem konkreten Fall startet also PLC_PRG -> geht in Netzwerk 1 und arbeitet den Baustein "Betriebsarten" ab. Danach würde es in Netzerk 2 weitergehen.
usw. usw.

Mit deinem Baustein"Betriebsarten" stimmt was nicht. Da es ein FB ist muss er instanziert werden. Erkennbar an den Fragezeichen über dem Baustein. Dort wird ein eindeutiger Name genau diesem Baustein zugewiesen. 

Holger


----------



## VolkerRacho (9 Mai 2017)

Hallo Holger,

danke für die schnelle Reaktion!

Im Anhang der ZIP Ordner. Passwort habe ich dir via PN geschickt.
	

		
			
		

		
	

Anhang anzeigen 36888


Gut gut.. entschuldige, wenn ich den falschen Fachterminus im Folgenden verwende:

Mal für ganz unbedarfte: Ich deklariere also "Betriebsarten" mit einem bestimmten Namen im Variablenblock (bspw. Strg_Betriebsarten oder so). Wie schaffe ich es davon ausgehend die anderen FBs aufzurufen? Wie verknüpfe ich also Ausgänge mit Eingängen?

Danke dir,
Volker


----------



## holgermaik (9 Mai 2017)

Hallo Volker


> Passwort habe ich dir via PN geschickt


Ich denke da hst du was falsch verstanden. Nach dem Motto des Forums "*Wissen ist das einzige Gut, das sich vermehrt, wenn man es teilt!*" sind sicherlich einige bereit bei deinem Problem zu helfen. Wenn du allerdings einen Privatdozenten suchst, wäre eine Anzeige unter "Suche/Biete" angebracht.
Ich denke das Thema wäre sicherlich für den einen oder anderen Ein- und Umsteiger ebenfalls interressant.
Holger


----------



## VolkerRacho (11 Mai 2017)

Hallo zusammen,

ok, stimmt. Entschuldigt.  Ich bin jetzt auch ein Stück weiter gekommen und versuche die Simulation. Was mir dabei auffällt: alle lokalen Variablen kann ich lustig in den jeweiligen FBs schalten. Die Logik funktioniert ganz gut. 
Will ich aber eine Inputvariable in einem FB ändern (bspw. auf TRUE setzen), blinkt diese nur kurz auf und bewirkt aber keine Änderung. 

Es wirkt, als würde meine Änderung sofort überschrieben. Hat es damit zu tun, dass das PLC_PRG (FUP) noch nicht vollständig ist? (enthält im Moment nur die instanzierten FBs, wie Holger es beschrieben hat)

Selbst die Werte zu forcen bringt hier nichts.. warum nur?
	

		
			
		

		
	

Anhang anzeigen 36951


Danke!
Volker


----------



## holgermaik (11 Mai 2017)

> Es wirkt, als würde meine Änderung sofort überschrieben


Da hast du völlig recht. Beim Aufruf des FB werden die Werte die "außen" sind auf die internen Variablen kopiert. Somit wird dein Force Wert bei jedem Zyklus überschrieben. Desweiteren liegt der Zeitpunkt zum beobachten und forcen der Variablen im Editor außerhalb des PLC_PRG Zyklus. Somit wird der Wert angezeigt, der als letztes geschrieben wurde was besonders bei mehrfachen beschreiben von Variablen zu Verwirrung führen kann.




Allgemeine Bemerkungen
Der Wunsch Variablennamen in kryptischen Abkürzungen zu erstellen stammt aus längst vergangenen Zeiten. Fast alle Programme unterstützen heute mehrZeichen.
Ein aussagekräftiger Name erspart viel an Kommentaren. 
Es ist auch einfacher den Typ zu erkennen, wenn man sich angewöhnt ein Kurzzeichen für den Datentyp vorranzustellen. (z.B. ein x für Bool)



Mehrfachzuweisungen sollten wenn möglich vermieden werden. (siehe oben)

Holger


----------



## VolkerRacho (11 Mai 2017)

Super Hinweise. Ich versuche diese umzusetzen. Die meisten Variablennamen sind leider per Aufgabenstellung vorgegeben. Verwirrt mich auch mächtig. Das mit dem "x" merke ich mir. In diesem Fall sind zwar alle Variablen BOOL, aber nach der Aufgabe ist vor der Aufgabe. Wenn ich glaube fertig zu sein würde ich das Programm mal hochladen. Würde mich freuen, wenn ihr mal einen Blick drauf werft.


Taster:
Wie ihr vllt. gesehen habt, habe ich versucht eine steigende Flanke auszuwerten, da eines der Schaltelemente ein Taster ist. 

Nun ist es aber so, dass beinahe alle Steuerelemente Taster sind. Muss ich so eine Flankenauswertung zwangsläufig auf alle Taster anwenden? Ich befürchte das übersteigt meinen Horizont. Mitstreiter haben Programme entworfen, die ohne Flankensteuerung gearbeitet haben.. wäre wohl auch korrekt gewesen.. vllt. ist auch einfach der Anspruch an uns Wirtschaftler nicht so hoch.

Grüße,
Volker


----------



## Fakrae (12 Mai 2017)

Üblicherweise gibt es dazu den Baustein "R_TRIG". Sobald eine steigende Flanke am Eingang anliegt, ist der Ausgang für genau einen Takt HIGH, danach wieder solange LOW, bis der Eingang wieder auf LOW und anschließend wieder auf HIGH (neue steigende Flanke) gegangen ist.


----------



## holgermaik (12 Mai 2017)

Flankenauswertungen kannst du theoretisch unendlich viele machen.



Was dabei zu beachten ist - in jedem Zyklus ausführen. (Nicht in irgenwelche If Bedingungen oder Case Anweisungen setzen)

Ob du nun eine Flanke brauchst hängt von Programm ab. Es ist auf jeden nicht nötig alle Taster per Flanke zu überwachen.
Ich würde (ohne jetzt dein Programm zu kennen) den Start Taster Flankenüberwachen. (Aus jahrelanger Berufserfahrung Bediener sind intelligente Menschen denen immer etwas einfällt um sich Freizeit zu schaffen. Das Manipulieren von Bedienelementen gehört da dazu.)

Holger

Nachtrag:


> Die meisten Variablennamen sind leider per Aufgabenstellung vorgegeben


Die Anmerkung ging auch weniger an dich. Es ist leider so, dass sehr viele Bildungsträger nach Standards lehren die seit langer Zeit keine Gültigkeit mehr haben.


----------



## VolkerRacho (15 Mai 2017)

Hallo zusammen,

danke für eure super Hinweise!

Ich denke ich habs soweit... Nur die Sache mit den Tastern und Flanken geht noch nicht so richtig in meinen Kopf.. ALSO ich habe eine Flankenanweisung (für das Anschalten der Anlage) aus dem Lehrbuch entnommen, verstehen tue ich sie nicht wirklich.

Laut Aufgabenstellung sind alle Bedienelemente außer dem Wahlschalter für _Automatik/ Manuell _Taster. Wo macht es Sinn eine Flankenauswertung zu nutzen? 

Wenn ich euch also richtig verstehe, muss ich R_Trig also nicht unbedingt im FB "Betriebsarten" in ST reinbringen, könnte, wie hier abgebildet auch einen Baustein hierfür im Hauptprogramm nutzen, richtig?
	

		
			
		

		
	

Anhang anzeigen 37014




Wenn ich nun alle Bedienelemente, bis auf das erwähnte, nun jeweils mit dem Baustein R_TRIG versehe, dann ist alles tutti?

Grüße,
Volker


----------



## VolkerRacho (15 Mai 2017)

Ich hab das jetzt mal so probiert und es scheint eigentlich nicht schlecht zu funktionieren.. die Eingänge werden durch die Funktion (scheinbar) sofort wieder zurückgesetzt, jedoch schalten in den FBs die Variablen, so wie ich es erwarten würde...

Ist das also die Lösung?

Danke!
Volker


----------



## VolkerRacho (15 Mai 2017)

...oder muss ich im ST - Text noch irgendetwas beachten? Ich würde jetzt ne einfache IF Anweisung nutzen: IF S_PON Then M_ON:=TRUE;END_IF;


----------



## holgermaik (16 Mai 2017)

Der Trig ist so falsch beschaltet. S_PON ist der Eingang. Als Ausgang musst du jetzt eine Hilfsvariable benutzen z.B. S_PON_Trigger mit der du dann auf deinen Eingang des Betriebsartenschalter gehst. Deine Anweisung in ST wäre dann ok.

Allg. Es ist ungünstig mehrere Variablen S_PON zu benennen. Der SPS ist es egal, da die Variablen durch die Instanz für die Steuerung unterschiedlich sind. (PLC_PRG.S_PON, Wahlschalter.S_PON...) für die Übersicht ist es eher nicht so schön.

Ob du einen Trigger nehmen musst häng von deinem Programm ab. Durch einen Trigger kann man z.B. den Bediener zwingen einen Taster wieder loszulassen und erneut zu drücken. Der Nachteil liegt in der Beobachtung des Programms. Da der Ausgangsimpuls nur einen SPS zyklus TRUE ist, ist es meistens unmöglich diesen zu beobachten.

Funktionsweise:
Programmanfang
Der Eingang ist FALSE und der Hilfsmerker ist False
.
weiterer Code

Programmanfang
Der Eingang ist TRUE und der Hilfsmerker ist FALSE
Jetzt erkennt die Steuerung eine Positive Flanke da beide Signale Ausgewertet werden
der Hilfsmerker wird auf TRUE gesetzt und der Ausgang wird auf TRUE gesetzt
.
weiterer Code

Programmanfang
Der Eingang ist immernoch TRUE und der Hilsmerker ist jetzt auch TRUE
-> Keine positive Flanke -> der Ausgang wird auf FALSE gesetzt
.
weiterer Code

Programmanfang
Der Eingang ist mittlerweile FALSE und der Hilfsmerker ist TRUE
-> keine positive Flanke -> der Ausgang bleibt FALSE und der Hilfsmerker wird auf FALSE gesetzt.
.
weiterer Code

Programmanfang
jetzt beginnt alles wieder von vorn

Den Hilfsmerker siehst du bei Codesys normalerweise nicht.


----------



## VolkerRacho (17 Mai 2017)

Hallo Holger,

danke für deine Geduld. Jetzt habe ich es Verstanden, denke ich.

Habe es nun doch in ST umgesetzt (war in der Aufgabe so verlangt.. hatte ich missinterpretiert)

Ich habe es so gemacht:

Taster um Anlage an und aus zu schalten: R_TRIG und XOR sowie internen Merker benutzt. Ergebnis: Auch Wenn der Eingang 0 ist (Taster losgelassen), bleibt die Anlage an. Bei erneutem True wird die Anlage ausgeschalten.
Alle weiteren Taster soll bei mehrmaligen Drücken den Ausgang nicht zurücksetzen. Daher auch R_TRIG genutzt.Der Ausgang bleibt TRUE auch wenn der Taster FALSE ist

Anhang anzeigen 37046



Ich denke so kann das passen. Anmerkungen?

Eine letzte Frage habe ich noch: 
Welche Variablen werden in FUP (Hauptprogramm in meinem Fall) als Outputvariablen deklariert?

Ich habe ja den Input von Schaltern und Sensoren, verarbeite diese weiter mit lokalen Variablen.. soweit so gut...und dann? Sind Signale die in FUP nicht weiter verarbeitet werden Output Signale? Oder sind da alle Outputsignale jedes Bausteins aufzuführen?!

Anhang anzeigen 37048


Danke,
Volker


----------



## holgermaik (17 Mai 2017)

Als Output Signal würde ich die Signale verstehen, die auf deine Hardwareausgänge gehen an denen die Aktoren (Ventile, Motoren...usw.) angeschlossen sind.

Der Sinn deines Bausteins "Befehlsausgabe" ist aus dem Blockbild leider nicht zu erkennen.


----------



## VolkerRacho (18 Mai 2017)

Da hast du Recht, ich erkenne auch keinen Sinn in diesem FB. 
Aufgabenstellung sagt nur, dass alle Aktoren über diesen Block anzusteuern sind.weitere Anforderungen gibt es nicht.
Er reicht also die Signale nur durch..so verstehe ich es zumindest.man könnte jetzt noch die Meldeleuchten als Aktoren sehen, aber das würde den Block nur wenig sinnvoll machen. Vllt verstehe ich die Aufgabe nicht richtig, aber mehr wird zu dem Block nicht gesagt:/


----------



## Morymmus (18 Mai 2017)

Ich denke in der Praxis würde in diesem Block die Zuweisung von Variablen-Nahmen auf Hardware-Adressen passieren, also z.B. 

```
*** Deklarationsteil ***
Var
Meldeleuchte AT %IX0.0: BOOL;        (*Meldeleuchte 1*)
END_VAR

*** Programmteil ***

Hier würden dann die verschiedenen Variablen mit UND bzw. ODER auf die oben definierten Ausgangsvariablen verbunden.
```

Das ist eine Möglichkeit, wie man sicherstellen kann, das Ausgänge nur an einer Stelle beschrieben werden.
Änderst du mal den Ausgang an der SPS - z.B. durch einen defekt - so ändert man nur oben die Hardware-Adresse und das Programm läuft wieder.


----------



## VolkerRacho (12 Juni 2017)

Hallo Zusammen,

dank eurer Hilfe habe ich das Ganze gut über die Bühne gebracht. Habt vielen Dank. Für mich ist das Thema gelöst.

Grüße,
Volker


----------

