# Betriebsart wechseln



## woody (25 Juli 2016)

Servus allerseits. ...
Ich habe in winsps Programm für eine regenwassernützungsanlage erstellt. 
Es ist kein reales Projekt .

Die Anlage besteht aus 3 Schwimmer Schalter im regen wassertank eine pumpe und ein Trinkwasser Ventil für den Fall das wenn im Tank zuwenig Wasser vorhanden ist immer brauchwssser zur Verfügung steht. 

Ich hab jetzt einen FC für die pumpe und einen FC für das Ventil erstellt sowie den OB 1 für den Aufruf. ....

Mein Problem ist jetzt das ich umschalten muss zwischen regenwasser und Trinkwasser. 

Wie lege ich jetzt diese Betriebsart fest? 
Lege ich jetzt nochmal einen FC an oder macht man so etwas im OB1 ?

Grüße


----------



## winnman (26 Juli 2016)

Warum willst du eine Betriebsart wechseln? (unter Betriebsart versteht man normalerweise: Automatik, Hand, Einrichten, Test, . . .)

Bei dir soll ja im Automatikbetrieb beim unterschreiten des unteren Schwimmerschalters bis zum Mittleren aufgefüllt werden (oder hab ich das falsch verstanden?)

Kannst im OB1 beide FC aufrufen
Wenn der Pegel über dem unteren Schwimmerschalter ist passiert ja beim Trinkwasserventil nichts, da arbeitet ja die Pumpe.
Wenn die Pumpe kein Wasser fördert (wie erkennst du das eigentlich? nicht dass die zu lange trocken läuft) fällt der Pegel unter den unteren Schalter öffnet dein TW Ventil und wenn der mittlere Schwimmerschalter überschritten wird schließt du es wieder.

Sind eigentlich 2 getrennte Funktionen, die jeweils so ausprogrammiert sein sollten, dass nichts passiert.

Alternative wäre natürlich:
Du hast einen separaten FC der im OB1 immer aufgerufen wird der entscheidet: Pumpbetrieb oder Trinkwasserbetrieb.
Dann kannst du im OB1 abhängig von dieser Grundlage den entsprechenden FC aufrufen (und dann wären wir auch bei deinen "Betriebsarten"  Würde das aber der Verwechslungsgefahr wegen dann eher "Zustand" oder ähnlich nennen.


----------



## woody (26 Juli 2016)

Hallo danke nochmal für das feedback...
Hab jetzt nochmals ein bild angehängt.
wenn der regen wasserbehälter leer ist soll er umschalten auf Trinkwasser . Hab auch schon überlegt mit sprüngen zu arbeiten und hab alles in einem FC gepackt.
	

		
			
		

		
	



..
	

		
			
		

		
	

Anhang anzeigen 33486
Anhang anzeigen 33487
Anhang anzeigen 33488


----------



## Hohlkörper (27 Juli 2016)

Wenn der M0.0 gesetzt ist wird durch den Sprungsbefehl das "Ventil_Wasserzulauf" nicht mehr abschaltet, ist das so gewollt?
Wobei: auch wenn es gewollt sein sollte, schön ist das nicht.


----------



## vollmi (27 Juli 2016)

ist dir klar das "Ventil Wasserzulauf" stehen bleibt wenn M0.0 True wird und Das Ventil grad offen ist? IMHO kannst du hier gut auf Sprünge verzichten, das macht die Sache einfacher nachvollziehbar. Ausserdem besteht weniger die Gefahr Verknüpfungsergebnisse zu verschleppen (Je nach Sprungbefehl).

edit: Jetzt war Hohlkörper schneller 

mfG René


----------



## borromeus (27 Juli 2016)

Hohlkörper schrieb:


> Wenn der M0.0 gesetzt ist wird durch den Sprungsbefehl das "Ventil_Wasserzulauf" nicht mehr abgeschaltet, ist das so gewollt?
> Wobei: auch wenn es gewollt sein sollte, schön ist das nicht.



Auch, denn das Netzwerk 2 ist sowieso bedenklich, der A0.0 ist nur vom E0.1 abhängig- was der E0.2 macht ist egal.
Das sieht man auch am grünen Text daneben.... der macht nicht viel Sinn.


----------



## Hohlkörper (27 Juli 2016)

Stimmt, mir ist nur vorhin der Sprung sofort aufgefallen.


----------



## woody (27 Juli 2016)

Hi Danke für das Feedback. ...
Werde das nachher noch mal überarbeiten!

Das M0.0 das Trinkwasser überspringt soll ja richtig sein. 

Also ich Schilder nochmal den Ablauf. ...
Wenn der regenwasser Behälter voll ist wird durch den Taster das Trinkwasser übersprungen und die pumpe arbeitet in Abhängigkeit des füllstands um den druckspeicher zu füllen je nachdem wieviel brauchwssser  entnommen wird.
Wenn dann der trockenlaufschutz aktiv wird signalisiere ich ja dass der Behälter leer ist. Da wird dann automatisch auf Trinkwasser umgestellt um den Behälter wieder zu füllen. 
Wenn es wieder regnet kann man wieder manuell auf regenwasser umstellen. 

Ich setze mich aber nochmal ran ......


----------



## borromeus (27 Juli 2016)

woody schrieb:


> Das M0.0 das Trinkwasser überspringt soll ja richtig sein.



Ja, aber wenn zu dem Zeitpunkt der A0.0 logisch 1 ist, geht der Ausgang nicht mehr weg, ist Dir das klar?
Der Ausgang wurde auf 1 gesetzt und wird danach nicht mehr bearbeitet!


----------



## woody (27 Juli 2016)

Hallo also habe mir jetzt nochmals gedanken gemacht und hoffe es jetzt besser gemacht zu haben....


Netzwerk 1    

       U    "Regenwasser"                //Wenn der Taster gedrückt wird 
       S    M         0.0                //wird der Merker gesetzt 
       UN   "S4 Trockenlaufschutz EIN"   //wenn umgeschaltet wird 
       R    M         0.0                //wird der Merker zurückgesetzt 
Netzwerk 2

       UN   M         0.0                //hat der Merker 1 Signal für Regenwasser 
       UN   "S3 Twasser EIN/Trocken A"   //wenn der Füllstand sinkt 
       S    "Ventil Wasserzulauf"        //öffnet das Ventil um den Behälter zu füllen 
       ON   "S2 Trinkwasserzulauf AUS"   //wenn der Behälter wieder voll ist 
       O    M         0.0 
       R    "Ventil Wasserzulauf"        // Trinkwasser abschalten 
Netzwerk 3

       U    "S1 Füllstand MAX"           //Wenn der Druckspeicher Leer meldet 
       U    "S3 Twasser EIN/Trocken A"   //und der Trockenlaufschutz AUS ist 
       O
       U    "S1 Füllstand MAX"           //oder wenn der Druckspeicher Leer meldet
       U    M         0.0                //und Regenwasser angewählt ist
       S    "Wasserpumpe"                //wird die Pumpe Eingeschaltet
       ON   "S1 Füllstand MAX"           //Wenn der druckspeicher voll ist
       ON   "S4 Trockenlaufschutz EIN"   //oder der Trockenlaufschutz Aktiv wird
       R    "Wasserpumpe"                // wird die Pumpe abgeschaltet


grüsse


----------



## woody (27 Juli 2016)

[CODENetzwerk 1    

       U    "Regenwasser"            
       S    M         0.0               
       UN   "S4 Trockenlaufschutz EIN"   
       R    M         0.0              
Netzwerk 2

       UN   M         0.0               
       UN   "S3 Twasser EIN/Trocken A" 
       S    "Ventil Wasserzulauf"          
       ON   "S2 Trinkwasserzulauf AUS  
       O    M         0.0  
       R    "Ventil Wasserzulauf"        
Netzwerk 3

       U    "S1 Füllstand MAX"           
       U    "S3 Twasser EIN/Trocken A"   
       O
       U    "S1 Füllstand MAX"           
       U    M         0.0                
       S    "Wasserpumpe"                
       ON   "S1 Füllstand MAX"          
       ON   "S4 Trockenlaufschutz EIN"   
       R    "Wasserpumpe"                

][/CODE]

ohne kommentare kann man es vielleicht besser lesen....


----------



## vollmi (28 Juli 2016)

Nene mit Kommentaren in Code TAGs lässt es sich viel beser lesen. Wieso machst du um M0.0 kein Symbol?

Ich hab den Code nicht auf fehler geprüft. Aber besser ist es.
Aber als Tip. Sobald der Code grösser wird, macht es manchmal Sinn Perperie zuerst auf eine Datenstruktur zu mappen. Dann kann man Rückmeldungen z.B. direkt so invertieren dass S1 Füllstand MAX z.B. dann erreicht ist wenn das Signal TRUE ist. Jetzt musst du dich immer im Programmcode drum kümmern ob etwas NC oder NO angeschlossen ist. Sowas kann man einmal im Programm beim Mapping abhandeln und kümmert sich danach nicht mehr drum. Man braucht sein Hirn ja noch für genügend anderes.

mfG René


----------



## woody (28 Juli 2016)

Also ich hab den S1 und S2 extra NC gewählt wegen der drahtbruchsicherheit für den Fall das er mir die pumpe und das Trinkwasser Ventil noch abschalten kann. 

Zu deinem Tipp ich weiß was du meinst. ...das macht es bestimmt einfacher. ....ich hab da großes Interesse dran das umzusetzen. ...da ich bis jetzt immer so kompliziert vorgegangen bin weiß ich jetzt nicht wie. ....
Wäre cool wenn man mir das zeigen kann


----------



## winnman (28 Juli 2016)

Mach ganz am Anfang einen FC in dem du die Eingänge behandelst.
Darin gehst du Eingang für eingang nach zB.:
U E0.0 (wenn du einen Öffner hast dann halt UN E0.0)
= MX.Y (oder schöner das ganze in einen DB schreiben)

E0.0 . . . sollte natürlich Symbolisch benannt werden.
Ebenso im DB die Bits benennen

Falls ein Eingang entprellt werden soll kann das auch hier erledigt werden.

Im rest des Programms greifst du dann auf die M oder DB bits zu.

Wenn du nun deine Schwimmerschalter hast, dann kannst du nun, unabhängig ob Öffner oder Schließer, davon ausgehen, dass dein Signal wenn das Wasser unter dem Schalter ist 0 ist und wenn der Schalter betätigt ist 1.


----------



## woody (28 Juli 2016)

Hab es mal versucht aber leider klappt da gar nix. ..[emoji30] 

Werde es weiterhin versuchen


----------



## vollmi (29 Juli 2016)

woody schrieb:


> Hab es mal versucht aber leider klappt da gar nix. ..[emoji30]



Das hilft nicht weiter. Was klappt nicht?

Der Vorschlag mit Peripheriebereich ummappen geht etwa so.
In SCL

```
"HW_IO"."S3 Twasser EIN/Trocken A" :=  "S3 Twasser EIN/Trocken A"; // Zuweisung für Eingänge"HW_IO"."S1 Füllstand MAX" := NOT "S1 Füllstand MAX"; // Invertiert  DB Variable TRUE wenn wirklich Maximal erreicht
"HW_IO"."S2 Trinkwasserzulauf AUS" := NOT "S2 Trinkwasserzulauf AUS"; 
"HW_IO"."S4 Trockenlaufschutz EIN" := NOT "S4 Trockenlaufschutz EIN"; // DB Variable TRUE wenn wirklich Trocken


"Ventil Wasserzulauf" := "HW_IO"."Ventil Wasserzulauf"; // Zuweisung für Ausgänge
```

In AWL

```
U     "S3 Twasser EIN/Trocken A"
      =     "HW_IO"."S3 Twasser EIN/Trocken A"


      UN    "S1 Füllstand MAX"
      =     "HW_IO"."S1 Füllstand MAX"
      UN    "S2 Trinkwasserzulauf AUS"
      =     "HW_IO"."S2 Trinkwasserzulauf AUS"
      UN    "S4 Trockenlaufschutz EIN"
      =     "HW_IO"."S4 Trockenlaufschutz EIN"


// Zuweisung für Ausgänge
      UN    "HW_IO"."Ventil Wasserzulauf"
      =     "Ventil Wasserzulauf"
```

Arbeiten im Programm tust du dann nur noch mit  z.B. "HW_IO"."Ventil Wasserzulauf" nicht mehr mit der direkten Peripherie

Dein Code Könnte dann etwa so aussehen.

```
UN    "HW_IO"."S1 Füllstand MAX"// Wenn Max nicht erreicht
      U(
      O     "HW_IO"."S3 Twasser EIN/Trocken A"// und Arschtrocken
      O     "Clock_10Hz"         // wozu?
      )
      S     "HW_IO".Wasserpumpe


      O     "HW_IO"."S1 Füllstand MAX"// Maximal Sensor ausgelöst
      O     "HW_IO"."S4 Trockenlaufschutz EIN"// oder Trockenlauf ausgelöst
      R     "HW_IO".Wasserpumpe  // Wasserpumpe zurücksetzen
```


----------



## woody (29 Juli 2016)

servus....
also heute habe ich mich nochmals mit dem mapping ausernander gesetzt.

Gestern hatte nichts funktioniert weil das eine neu umstellung war für mich war. Konnte mir das invertieren noch nicht so richtig einprägen .....wo dann in meinem FC 2 dann nur müll raus kam.


das ist jetz mein neuer versuch....

```
FC 1
//Allgemeine Eingangsabfrage
2 UN "S1 Sensor Öffner"
2 = "Füllstand Max"
2 UN "S2 Sensor Öffner"
2 = "Trinkwasserzulauf AUS"
2 U "S3 Sensor Schliesser"
2 = "Trinkwasserzulauf EIN"
2 UN "S3 Sensor Schliesser"
2 = "Trockenlaufschutz AUS"
2 U "S4 Sensor Öffner"
2 = "Trockenlaufschutz EIN"

FC 2
//Betrieb nur mit Regenwasser!
Netzwerk 1
2 U "Taster Regenwasser" //Wenn der Taster gedrückt wird 
2 S "Umschalten" //läuft nur Regenwasser in den Druckspeicher 
2 U "Trockenlaufschutz EIN" //Wenn Schutz Aktiv
2 R "Umschalten" //wird das Umschalten zurückgesetzt 


Netzwerk 2
//Trinkwasser wird nur Eingeschaltet wenn kein Regenwasser mehr vorhanden ist .....
NOT Umschaltung
2 UN "Umschalten" //Wenn Umschalten nicht Aktiv ist 
2 UN "Trinkwasserzulauf EIN" //und der Füllstand im Behälter sinkt
2 S "Ventil Wasserzulauf" //öffnet das Ventil um den Behälter zu füllen 
2 O "Trinkwasserzulauf AUS" //wenn der Behälter wieder voll ist 
2 O "Umschalten" //oder wenn umgeschaltet wird
2 R "Ventil Wasserzulauf" //wird das Trinkwasser zurückgesetzt 


@a@0 <Ueberschrift von Netzwerk>
//Pumpe Arbeitet mit Regenwasser
bei NOT Umschaltung mit Trinkwasser!
2 UN "Füllstand Max" //und der Druckspeicher Leer meldet 
2 U(
2 ON "Trockenlaufschutz AUS" //und der Trockenlaufschutz AUS ist 
2 O "Umschalten" //Wenn das Umschalten Aktiv ist
2 )
2 S "Wasserpumpe" //wird die Pumpe Eingeschaltet 
2 O "Füllstand Max" //Wenn der druckspeicher voll ist 
2 O "Trockenlaufschutz EIN" //oder der Trockenlaufschutz Aktiv wird 
2 R "Wasserpumpe" // wird die Pumpe zurückgesetzt
```


----------



## woody (29 Juli 2016)

```
also irgendwie funktionieren meine codetags nicht
```


----------



## woody (4 August 2016)

Kurze Frage zum genannten Thema noch. ..
Wenn ich im FC 1 meine Eingänge gemappt habe.... muss ich dann im FC 2 meine merker als IN deklarieren?


----------



## vollmi (4 August 2016)

Nein. Wenn du auf Globale Speicher gemappt hast. Also Merker oder vorzugsweise DBs.
Das Mapping mach ich aber in einem FB. Da hast du dann noch Möglichkeiten Timer und dergleichen reinzuinstanzieren (Um z.B. Prellen zu unterdrücken).


----------



## EisenWolf (21 September 2016)

Servus,
Ich bevorzuge auch ein "ist" Kopf alle zuständ einlesen in Merker Packen weiter gehts...

Aber für sone Aufgabe macht sich nee  " If - then - Else " Schleife am besten,
je nachdem wo man was reinpackt wird nur F.Wasser genommen egal wie der Schalter steht.
Erst wen der Schalter Umgelegt wird auf Regen springt er in das andere Ende.


----------

