Step 7 Schleifen in SCL

Techniker1997

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich arbeite mit einer S7 300 und Programmiere mit den Simatic Manager v5.6.

Mein Problem ist Folgendes:

Ich haben einen DB ein Array vom Typ Real angelegt. Nun sollte der Bediener mittels eines HMI´s jeden einzelnen Speicherplatz im Array mit einen gewissen Wert belegen können.
Das ganze würde ich in SCL realisieren (falls es bessere Varianten wie SCL gibt bin ich auch gerne offen dafür).
Aktuell probiere ich es mit einer Fußgesteuerten Schleife, also
REPEAT
DB105.MD_Eingabe := DB105.Seite1[Index];
Index := Index + 1;

UNTIL
DB105.M_Array_Beenden = true
END_REPEAT;

Jetzt folgendes Problem. Spiel ich den Baustein in die SPS geht diese in Sammelstörung, weil die Schleife ja quasi endlos ist. Wie kann ich es machen das er erst nach Eingabe eines Werts die Schleife wieder wiederholt. Also um einen Vergleich zu schaffen in C# zum Beispiel wartet er ja bei Console.Readline () erst auf einen Eingabe vom Bediener und arbeitet dann den Quellcode weiter ab.
Geht das überhaupt mit einer Schleife oder denk ich da ganz Falsch?

Danke im Vorraus.
 
Ein zyklisches PLC-Programm ist nichts anderes als ein Programm, das "endlos" in einer Schleife vom BetriebsSystem aufgerufen wird.
Deine SchleifenStruktur (REPEAT ... UNTIL) ist überflüssig.
Aus Deinem CodeSchnippsel ist leider nicht ersichtlich, ...
- worin Deine Eingabe besteht und woran Du erkennst, ob etwas eingegeben wurde
- wie Du das EndeKriterium DB105.M_Array_Beenden "befruchtest".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du denkst komplett falsch.
Sowohl was die Arbeitsweise der SPS als auch was die Funktion des HMI angeht.

Die SPS arbeitet das Programm zyklisch ab.
Endlosschleifen führen zu einer Zykluszeitüberschreitung und somit zu Stopp.

Welches HMI benutzt du?
Wie wählt der Benutzer den Index an?

Gruß
Blockmove
 
Erstmal danke für die Schnelle Antwort.

Um es zu konkretisieren.
In meinem HMI habe ich ein Eingabefeld mit der Variable DB105.MD_Eingabe hinterlegt. Über diese Variable möchte ich jetzt quasi mein Array mit Werten füllen. Also in meinen fall hab ich das über "DB105.MD_Eingabe := DB105.Seite1[Index];" probiert. Mit dem Hintergedanken, dass er in der Zeile quasi wartet und erst den Code weiter abarbeitet, nachdem der Bediener etwas in die Variable DB105.MD_Eingabe eingegeben hat (So kenn ich das halt aus anderen Programmiersprachen, also das der code erst weiter abgearbeitet wird, wenn etwas eingegeben wurde (z.B. Console.Readline() bei C#). Aber scheinbar geht das ja so nicht...

Das Endkriterium ist eigentlich nur eine Boolsche Variable mit der ich aus der Schleife springen möchte wird diese Variable aktiviert.
 
HMI: OP170B Mono.
Also aktuell hab ich noch keine Wahl für den Index vom Bediener.
Angedacht war es so, dass der Bediener einen Wert eingebt diesen Wert dann mit "Enter" bestätigt und dieser Wert dann in Index 1 gespeichert wird. Dann kann er wieder einen Wert eingeben, dieser wird dann automatisch in Index 2 geschrieben usw. Ich hoffe das ist so irgendwie möglich. Kenn mich aber leider nicht wirklich gut mit SCL Programmierung aus...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welches HMI?

Bei einem Comfort Panel brauchst du z.B. für die Aufgabe nicht mal ein Programm in der SPS.

Die Arbeitsweise ist nicht mit Readline sondern mit einem Textfeld in einer Windowsform vergleichbar.
 
1. In meinem HMI habe ich ein Eingabefeld mit der Variable DB105.MD_Eingabe hinterlegt. Über diese Variable möchte ich jetzt quasi mein Array mit Werten füllen. Also in meinen fall hab ich das über "DB105.MD_Eingabe := DB105.Seite1[Index];" probiert.

2. Das Endkriterium ist eigentlich nur eine Boolsche Variable mit der ich aus der Schleife springen möchte wird diese Variable aktiviert.
Zu 1.:
Wenn Du den Inhalt der Eingabe in das ArrayElement kopieren möchtest:
Array[Index] := Eingabe ;
Links vom ':=' das Ziel, wohin gespeichert werden soll.

Zu 2.:
Wir wissen wohl, was ein EndeKriterium ist, aber nicht, was für Dich das Kriterium ist, die Schleife zu beenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
HMI: OP170B Mono.
Also aktuell hab ich noch keine Wahl für den Index vom Bediener.
Angedacht war es so, dass der Bediener einen Wert eingebt diesen Wert dann mit "Enter" bestätigt und dieser Wert dann in Index 1 gespeichert wird. Dann kann er wieder einen Wert eingeben, dieser wird dann automatisch in Index 2 geschrieben usw. Ich hoffe das ist so irgendwie möglich. Kenn mich aber leider nicht wirklich gut mit SCL Programmierung aus...

Auch beim OP170B kannst du Variablen indirekt adressieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dafür benötigt man keine Schleife in einer SPS. Ich würde das folgendermaßen lösen:

Ein/Ausgabefeld für Wert, Ein/Ausgabefeld für Index (vlt. mit Textliste falls der Index eine Bedeutung hat), Schaltgläche für Eingabe fertig.

Für die Schaltfläche brauchst du eine Flankenerkennung.

IF #Index < 0 OR #Index > z.B 100 THEN
#Index := 0;
END_IF;

IF #FlankeEingabeFertig THEN
#Wert[#Index] := #WertEingabe;
#Index := #Index + 1;
END_IF;
 
Zurück
Oben