Step 7 Problem bei einen Programm

kwnundawn

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich bin absoluter Anfänger in der Programmierung mit S7, habe eine Weiterbildung darin erhalten und nun bin ich dabei nach dem Kurs die erhaltenen Zusatzaufgaben zu lösen.
Für die meisten dürfte das alles kein Problem darstellen, aber evtl kann mir mal jemand bei meiner Aufgabe einen Tipp geben.
Hier meine Aufgabe:
Drei Behälter sollen über eine Steuerung überwacht werden.

Jeder Behälter hat einen Sensor für die Voll- sowie Leermeldung. Jeweils ein Magnetventil ist für die Automatische Befüllung der Behälter vorgesehen. Die Behälter können über Handventile einzeln entleert werden. Wenn ein Behälter Leer ist soll dieser wieder befüllt werden. Da auch mehr als ein Behälter Leer sein kann, die Zuleitung aber nur je einen befüllen kann, soll die Befüllung in derselben Reihenfolge wie ihre Leermeldung erfolgen. Das heißt ist erst Behälter 2 dann 3 und anschließend 1 Leer, soll zuerst Behälter 2 dann 3 und dann erst Behälter 1 gefüllt werden.

Sensor Eingang Aktor Ausgang
Behälter 1 VOLL S1 NC E0.0 / %IX0.0 Magnetventil
Behälter 1 M1
A0.0 /%QX0.0
Behälter 1 LEER S2 NO E0.1 / %IX0.1 Magnetventil
Behälter 2 M2
A0.1 /%QX0.1
Behälter 2 VOLL S3 NC E0.2 / %IX0.2 Magnetventil
Behälter 3 M3
A0.2 /%QX0.2
Behälter 2 LEER S4 NO E0.3 / %IX0.3 A0.3 /%QX0.3
Behälter 3 VOLL S5 NC E0.4 / %IX0.4
Behälter 3 LEER S6 NO E0.5 / %IX0.5

Habe auch meine Lösung mit dazu gehangen.
Mein Problem ist es einfach das ich nicht die richtige Reihenfolge zum Befüllen der Beh. hinbekomme.
Es kann ja auch mal Beh 2 dann 1 und dann 3 leer sein. Es können auch aber auch 2 Beh zeitgleich leer werden.
Wäre toll etwas auf diesem Weg auch für die Zukunft zu lernen.
Danke schon mal
 

Anhänge

  • Fuellanlage.pdf
    121,3 KB · Aufrufe: 33
Zuletzt bearbeitet:
Das Problem ist die Sache mit der Reihenfolge.

Ich würde mir einen DB nehmen, der 3 Int Werte enthält.
Sind alle Behälter voll, sind alle drei Werte 0. Wird Behälter 3 als erstes leer, wird in den ersten DB Wert eine 3 geschrieben. Wird dann noch ein Behälter leer, z.B. der zweite, wird in die zweite Int Variable eine 2 geschrieben. Nebenher läuft ein Zähler der sobald ein Behälter auf Leer springt um eins hochgezählt und wenn ein Behälter auf Voll springt wieder um eins heruntergezählt wird. Der Wert zeigt also immer die Anzahl an leeren Behältern an und zeigt dir immer am in welchen Int Wert im DB du die nächste Zahl schreiben musst. Ist der Wert z.B. 2 ist der nächste freie Plaatz der dritte Wert im DB.

Somit steht im DB die Reihenfolge drin in welchen die behälter leer wurden.

Dann geht es wieder um das Befüllen. Da füllst du den Behälter der in der ersten Variable drinsteht. Ist dieser voll, wird das befüllen beendet und der Wert um eins nach unten gezählt. Gleichzeitig kopierst du den Wert der im DB an zweiter stelle steht an die erste und den der an dritter stelle steht an die zweite stelle, bevor du die dritte Stelle auf 0 setzt.
Nun kann das Befüllen mit dem zweiten Behälter beginnen der als zweites leer wurde. Ist auch dieser voll, wird der Wert erneut runtergezählt und du kopierst wieder den zweiten Wert in den ersten und den dritten Wert in den zweiten.

Wenn zwei Behälter genau gleichzeitig leer gehen, musst du einen Vorrang einprogrammieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank Zombie für Deine ausführliche Erklärung.
Da hoff ich mal das ich das mit meinem wenigen Wissen irgendwie umgesetzt bekomme.
Es fehlt mir einfach komplett die Erfahrung.
 
Hallo Zombie,
Das hört sich sehr stark nach all an. Mir USt gerade noch nicht bewusst wie ich deinen Vorschlag in fup realisiere. Ist i für wahrscheinlich extrem kompliziert aber awl und scl habe ich jeweils 1 Woche kennengelerntl Bin froh das ich etwas in fup schön hinkriege.
Gruss kwnundawn
 
Naja, das ist eine Lösung. Du kannst versuchen sie umzusetzen und dabei noch was zu lernen. Es ist noch kein Meister vom Himmel gefallen.

Du hast aber recht, wenn du mit deinem Text aussagen wolltest, dass diese Lösung mit FUP schwer umzusetzen ist. Das ist insofern korrekt, da zwar jeder Vorgang möglich ist, aber aufgrund der Struktur von FUP oder auch KOP sehr viele Netzwerke erfordern würde. Das wäre auch der Grund, weswegen ich auch SCL nutzen würde um die Funktion umzusetzen.

Code:
//Laufvariable vorbelegen
if siAnz < 1 then
siAnz := 1;
End_IF;
dbSpeicher.Leerbehälter[4] := 0;
//Behälterreihenfolge festlegen
If "Behälter1leer" and not MerkerBehälter1leer then
dbSpeicher.Leerbehälter[siAnz] := 1;
siAnz := siAnz + 1;
Elsif "Behälter2leer" and not MerkerBehälter2leer then
dbSpeicher.Leerbehälter[siAnz] := 2;
siAnz := siAnz + 1;
elsif "Behälter3leer" and not MerkerBehälter3leer then
dbSpeicher.Leerbehälter[siAnz] := 3;
siAnz := siAnz + 1;
End_IF;
//Behälter füllen
"AusgangPumpe" := dbSpeicher.Leerbehälter[1] <> 0;
//Ventilansteuerung für jeweiligen Behälter
"AusgangVentil1" := dbSpeicher.Leerbehälter[1] = 1;
"AusgangVentil2" := dbSpeicher.Leerbehälter[1] = 2;
"AusgangVentil3" := dbSpeicher.Leerbehälter[1] = 3;
//Behälter voll festlegen
If Not "Behälter1voll" and MerkerBehälter1voll 
Or Not "Behälter2voll" and MerkerBehälter2voll
Or Not "Behälter3voll" and MerkerBehälter3voll then
dbSpeicher.Leerbehälter[1] := dbSPeicher.Leerbehälter[2];
dbSpeicher.Leerbehälter[2] := dbSPeicher.Leerbehälter[3];
dbSpeicher.Leerbehälter[3] := dbSPeicher.Leerbehälter[4];
siAnz := siAnz - 1;
End_IF;
//Flankenbedingung erfüllen
MerkerBehälter1leer := "Behälter1leer";
MerkerBehälter2leer := "Behälter2leer";
MerkerBehälter3leer := "Behälter3leer";
MerkerBehälter1voll := "Behälter1voll";
MerkerBehälter2voll := "Behälter2voll";
MerkerBehälter3voll := "Behälter3voll";
siAnz ist ein Integer.
dbSpeicher ein DB, der ein Array[1..4] of Int enthält, welches den Namen Leerbehälter hat.
Die Variablen in " " sind Ein- und Ausgänge.
Merker sind als Merker benannt.

Hab die Lösung nicht getestet, deshalb übernehme ich keine Gewähr auf korrekte Funktion.
 
Zurück
Oben