TIA Zähler einer FOR schleife...

halloween20

Level-2
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.
Ich habe mal eine gewisse Grundsatzfrage.
In einem FB nutze ich eine Locale Temp Variable als Zähler für eine FOR Schleife.
Diese Variable nutze ich nun an mehreren Stellen innerhalb des FBs als Zählschleife.
Was in etwa so aussieht:
Code:
FOR #i := 0 to 11 DO
[hier passiert was...]
END_FOR

FOR #i = 0 to 42 DO
[hier passiert was anderes...]
END_FOR

kann dies schwierigkeiten verursachen wenn beide schleifen im selben zyklus abgearbeitet werden ?
ich also nicht explizit vor der zweiten Schleife "#i = 0" setze?
 
Hallo.
Ich habe mal eine gewisse Grundsatzfrage.
In einem FB nutze ich eine Locale Temp Variable als Zähler für eine FOR Schleife.
Diese Variable nutze ich nun an mehreren Stellen innerhalb des FBs als Zählschleife.
Was in etwa so aussieht:
Code:
FOR #i := 0 to 11 DO
[hier passiert was...]
END_FOR

FOR #i = 0 to 42 DO
[hier passiert was anderes...]
END_FOR

kann dies schwierigkeiten verursachen wenn beide schleifen im selben zyklus abgearbeitet werden ?
ich also nicht explizit vor der zweiten Schleife "#i = 0" setze?
Das ist kein Problem, das macht der FOR Befehl alles selber. Du musst nichts dazu programmieren.
 
Zuletzt bearbeitet:
Nein, wie Michaël schon schrieb.
Aber, bei ineinander geschachtelten FOR-Schleifen natürlich ein absolutes Tabu.
der teil ist mir klar. war wie gesagt eher eine frage zur bestätigung meiner Vermutung.
suche grad nach einem problem im Programm in der, warum auch immer, eine FOR-Schleife zwei identische werte in einen array schreibt obwohl sie vom code her nach dem ersten schreiben zum einen aus der FOR schleife springen soll (EXIT) und zum zweiten eine quittierung vollzieht die ein erneutes durchlaufen (nächster CPU Zyklus) verhindern soll...

hmmm :unsure:
 
Code:
IF #"Keyence Daten auslesen" = TRUE
THEN
    IF #"Keyence Platz Nummer" <= 7
    THEN
       FOR #count_job_R1 := 0 TO 19 BY 1
       DO
          IF "Aufgabenliste_DB"."Roboter 1"[#count_job_R1] = 0
          THEN
            "Aufgabenliste_DB"."Roboter 1"[#count_job_R1] := #"Keyence Platz Nummer" + #ZWL_Entnahme_JobNr;
            EXIT;
          END_IF;
       END_FOR;
    ELSE
       //gleicher Code nur für Roboter 2
    END_IF;
#"Keyence Daten auslesen" := FALSE;
END_IF;
(der Gesamte Code abschnitt ist inkl. kommentar zeilen rund 2000 Zeilen lang... darum hier nur der ausschnitt der relevant ist)

das passiert hier:
"Keyence daten auslesen" (IN) ist der trigger aus meiner Schrittkette (gesetzt bei "kommender schritt" flanke) der die auswertung startet.
Nachdem ich die daten aus der schnittstelle des Keyence Controllers geladen/umgeschrieben habe, durchlaufe ich den Teil wie oben abgebildet.
Die FOR schleife durchsucht den ARRAY im DB nach einer freien stelle. Wenn er eine findet, legt er dort einen Code an der den Job für den Roboter deklariert.
"Keyence Platz Nummer" = platz an dem der Roboter arbeiten muss basierend auf dem Ort an dem die Keyence gerade daten erzeugt hat (für Roboter 1 wäre das 1-7).
"ZWL_Entnahme_JobNr" = tätigkeit die er dort nachgehen soll, es ist eine Konstante hier mit dem Wert 100.
am ende setzt er die Variable die diesen Vorgang aufruft auf FALSE.
was hier nun hinzukommt wie man an "Roboter 1" ablesen mag, hier gibt es zwei Roboter die durch den selben code, unterschieden nach "keyence Platz nummer" einen job zugewiesen bekommen. Die Aufgabenlisten sind dafür extra getrennt (zwei Arrays im Aufgabenliste DB).
Der Fehler kommt nun gelegentlich wenn ein Job generiert wird. Beobachtung zufolge ist der Roboter zu der Zeit noch mit einem anderen Job beschäftigt.
Später erfüllt er den Job wie gewünscht. Anstelle danach jedoch was anderes zu machen, macht er den gerade erledigten job nochmal.
Obwohl hierfür kein job hätte erstellt werden dürfen. Die Keyence hat entweder keinen daten erzeugt (keyence daten auslesen wärenicht getrigger worden) oder es wurde am Platz des anderen Roboters daten erzeugt. Hier hätten die Daten aber in der Liste des zweiten roboters landen müssen, für den fall das zufällig dort der gleiche job zustande kommt.

Das ganze läuft auf einer 1512SP-F mit TIA V15.1
 
Warum da manchmal unerwartet Jobs erzeugt werden, kann ich an Deinem Code nicht sehen. Aber zwei sehr schlechte Sachen:
Code:
#"Keyence Daten auslesen" := FALSE;
"Keyence daten auslesen" (IN)
Haut Dir TIA das Schreiben auf den INPUT nicht um die Ohren?? Wie ist #"Keyence Daten auslesen" deklariert?

Hinweis: Gewöhne Dir das Variablennamen mit Leerzeichen mal schnell wieder ab, sowas ist nur bei Siemens TIA möglich. In "seriösen" Programmiersprachen sind Leerzeichen in Variablennamen nicht zulässig. Vielleicht führt das Siemens auch irgendwann mal wieder ein...


Tip: einen BOOL-Ausdruck muß man nicht extra mit TRUE oder FALSE vergleichen, weil er liefert selbst schon ein BOOL-Ergebnis, was man direkt verwenden kann:
Anstatt IF #"Keyence Daten auslesen" = TRUE THEN
reicht IF #"Keyence Daten auslesen" THEN


Wie und wann bekommt #"Keyence Platz Nummer" Werte zugewiesen? Wie ist die Variable deklariert?
Laufen bei Dir Programmteile in verschiedenen OB?
Oder ist Deine Kommunikation mit den Robotern nicht konsistent oder nicht multitasking-sicher?
Oder ist die Schrittkette oder der Trigger nicht gut programmiert oder hast Du Logikfehler?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich gehe davon aus, dass #"Keyence Daten auslesen" für ein und denselben Auftrag in mehr als 1 Zyklus gesetzt wird.
Ist denn gewährleistet, dass #"Keyence Daten auslesen" pro Auftrag nur einmalig gesetzt wird?

Zu Deiner ursprünglichen Frage:
In Deiner Anwendung hast Du gar nicht den Fall, dass die beiden ForSchleifen im selben Zyklus nacheinander ausgeführt werden. Es kann im selben Zyklus nur entweder die eine oder die andere aktiv werden.
 
Haut Dir TIA das Schreiben auf den INPUT nicht um die Ohren?? Wie ist #"Keyence Daten auslesen" deklariert?
hopla... meinte natürlich InOut ... :oops:
die Platznummer wird im Vorfeld erzeug da der Scanner selber auf diesen Platz fahren muss um dort seine arbeit zu verrichten.
platz für keyence wird ermittelt -> fährt hin macht arbeit -> sps ließt daten von keyence aus und speichert die intern in einem db zwischen damit die keyence wo anders weiter machen kann -> basierend auf die eingelesenen daten wird einer von 3 möglichen jobs für den Roboter erstellt, meist wie in meinem code dargestellt und auch der fall bei dem der fehler auftrit, das eine zwischenlage entnommen werden muss.
alles läuft über OB1.
die kommunikation mit dem roboter läuft über handshake so das der roboter erst einen neuen job annehemn kann, wenn der alte durchquittiert ist.

Ich gehe davon aus, dass #"Keyence Daten auslesen" für ein und denselben Auftrag in mehr als 1 Zyklus gesetzt wird.
Ist denn gewährleistet, dass #"Keyence Daten auslesen" pro Auftrag nur einmalig gesetzt wird?
das Signal dafür wird in der Ablaufsteuerung in einem Schritt gesetzt (kommender Schritt). Der Schritt bleibt dann solange aktiv bis die auswertung dieses Bit wieder auf FALSE gesetzt hat.
in dem Code Abschnitt ist viel "if then, case, for" drin. deshlab ist der Teil so lang geworden (2k zeilen ^^). im Grunde wird der Teil aber mit einem Zyklus abgeschlossen.
 
im Grunde wird der Teil aber mit einem Zyklus abgeschlossen.
Na gut, aber was passiert im nächsten Zyklus? Same procedure as last cycle?

Der Schritt bleibt dann solange aktiv bis die auswertung dieses Bit wieder auf FALSE gesetzt hat.
Der Schritt mag wohl solange aktiv bleiben, aber tunlichst ohne Wiederholung des Setzens von #"Keyence Daten auslesen".

Alternativ:
Ein Schritt für's Setzen.
Ein weiterer Schritt für's Warten auf FALSE.
 
Zuletzt bearbeitet:
Zurück
Oben