TIA Encoder überspringt die IF-Anweisung

Hondo

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten morgen,

ich möchte Schritt für Schritt eine Inspektion von identischen Bauteilen auf einem Drehteller durchführen. Zuerst sollen zum Beispiel 10 Bauteile detektiert und anschließend werden die Bauteile in einem Register mit 10 Speicherplätzen geschrieben. Der Encoder zählt von 0 bis 6000. Wenn der Encoder den Wert 6000 erreicht hat, dann zählt er wieder ab 0 bis 6000. usw

Wenn der erste Bauteil detektiert wird, wird der aktuelle Encoder-Wert mit einem festen Offset-Wert addiert und dann im ersten Speicherplatz des Registers geschrieben. Gleichzeitig zählt der Encoder weiter, bis der zweite Bauteil detektiert wird. Wenn der zweite Bauteil detektiert wird, wird der aktuelle Encoder-Wert mit dem festen Offset-Wert addiert und dann im zweiten Speicherplatz des Registers geschrieben. Parallel zählt der Encoder weiter, bis der dritte Bauteil detektiert wird. Bis Hier komme ich klar.

Danach sollen die Bauteile Schritt für Schritt abgeblasen oder nicht abgeblasen werden, Wenn der Encoder nacheinander beim Zählen gleich mit den Werten der Position von Bauteilen, die vorher im Register geschrieben wurde, ist. Ich habe dem Code geschrieben, aber es funktioniert nicht gut. Manchmal wird die IF-Abfrage nicht abgearbeitet, wenn der Encoder gleich mit dem Wert der Position von einem Bauteil, der schon im Register geschrieben wurde, sein soll. Also , Die IF-Anweisungen mit dem Variable "HSC1_Encoder" werden manchmal nicht abgearbeitet und ich verstehe das nicht.

Hat jemand eine Idee, wie ich das Problem lösen kann?

Danke im Voraus für eure Hilfe.

Hier der Code für die Detektion der Bauteile

Code:
         IF (Detekt = 1)  THEN
               "DB".HSC1_Encoder := "HSC1_Encoder"; // Mitteilung der Detektion-Position               "DB".Liste_Ausschleusung["DB".m] := ("DB".HSC1_Encoder + "DB".Offset); // Ausschleusung-Position
                    IF (("DB".Liste_Ausschleusung["DB".m] > 6000)) THEN
                          "DB".Liste_Ausschleusung["DB".m] := ("DB".Liste_Ausschleusung["DB".m] - 6000);
                    END_IF;
               "DB".m := "DB".m + 1;
         END_IF;

Hier der Code, wenn der Encoder gleich nacheinander mit den Werten der Position von Bauteilen, die im Register geschrieben wurde, sind.

Code:
IF ("DB".m > 0 AND "Counter" < 10) THEN
    
     IF (("HSC1_Encoder" >= "DB".Liste_Ausschleusung["Counter"]) AND ("Counter" < 10) AND ("HSC1_Encoder" <= 4500)) THEN
         "Counter":= "Counter"+ 1;
     ELSIF (("HSC1_Encoder" = "DB".Liste_Ausschleusung["Counter"]) AND ("Counter" < 10) AND ("HSC1_Encoder" > 4500 AND "HSC1_Encoder" <= 6000)) THEN
         
          "Counter":= "Counter"+ 1;
     END_IF;
 END_IF;
 
Moin!
Ohne Kommentare ist das nicht so ganz einfach deinen Code zu verstehen.
Code:
IF ("DB".m > 0 AND "Counter" < 10) THEN
    
     IF (("HSC1_Encoder" >= "DB".Liste_Ausschleusung["Counter"]) AND ("Counter" < 10) AND ("HSC1_Encoder" <= 4500)) THEN
         "Counter":= "Counter"+ 1;
     ELSIF (([COLOR=#ff0000]"HSC1_Encoder" = "DB".Liste_Ausschleusung["Counter"][/COLOR]) AND ("Counter" < 10) AND ("HSC1_Encoder" > 4500 AND "HSC1_Encoder" <= 6000)) THEN
         
          "Counter":= "Counter"+ 1;
     END_IF;
 END_IF;
Ich hätte jetzt ohne das alles in gänze zu verstehen mal die Rot markierte Zeile in Frage gestellt. Vielleicht ist es nicht möglich auf das Inkrement genau zu positionieren und deshalb solltest du vielleicht ein kleines Toleranzband um deine gespeicherte Position aufbauen. Also deine gespeicherte Position +- 5 oder so.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Howard,

Danke für deinen Lösungsvorschlag

Code:
[COLOR=#ff0000]ELSIF (("HSC1_Encoder" = "DB".Liste_Ausschleusung["Counter"]) AND ("Counter" < 10) AND ("HSC1_Encoder" > 4500 AND "HSC1_Encoder" <= 6000)) THEN[/COLOR]

die Markierte Abfrage entspricht folgender Fall:
- "HSC1_Encoder" := 5000 und "DB".Liste_Ausschleusung[2] := 500

Dann zählt der Encoder von 5000 bis 6000. Danach zählt der Encoder wieder ab 0 und wird irgendwann 500 erreichen oder überspringen (meine Vermutung)

ich hoffe, ich habe deine Frage beantwortet.

Kurze Kommentare:
"DB".m entspricht die Anzahl von detektierten Bauteilen
"Counter" dient zur Bestimmung der Anzahl der Abarbeitung der IF-Anweisungen mit dem Encoder-Variable.
"HSC1_Encoder" Variable für den Encoder
"DB".Liste_Ausschleusung ist das Register, das enthält die Abblasen-Position oder Ausschleusungsposition von Bauteilen.
 
Du hast, glaube ich. nicht so richtig realisiert, was Howard dir vorgeschlagen hat.
Howard meinte im seinem Beitrag #2 diesen Passus :
"HSC1_Encoder" = "DB".Liste_Ausschleusung["Counter"]
An der Stelle kommst du nur weiter wenn die beiden Variablen identisch sind - ist die DB-Vorgabe = 5000 und der Counter ist 4999 oder 5001 dann wird es nicht mehr funktionieren.
Howard hatte dir zu Abhilfe hier vorgeschlagen, dass du einen Bereich überprüfen sollst - also z.B. 4950 bus 5050. Dann klappt das wahrscheinlich eher ...

Zu deinem restlichen Code :
Wenn du im umschließenden IF schon überprüfst das Counter < 10 ist dann brauchst du das bei den eingeschlossenen IF's nicht mehr zu tun - das macht den Code übersichtlicher.
Außerdem : wenn du im IF fragst, ob HSC_Counter1 < 4500 ist dann ist im ELSIF der Counter sowieso schon >= 4500 - du brauchst dann hier also nur noch zu checken ob der Counter unter 6000 bleibt.

Gruß
Larry
 
Larry hat mein Gestammel verstanden und perfekt zusammengefasst. :grin:
Aber, nochmal zum Verständnis. Dein Drehteller wird ja wahrscheinlich von einem Motor samt FU gesteuert. Wenn du diesem nun eine Sollposition vorgibst, dann wird dieser die Sollposition möglicherweise nicht ganz genau treffen, weil auch in der FU-Parametrierung meist ein Sollpositionsfenster hinterlegt ist. Erreicht dein FU dieses Positionsfenster, dann stoppt er - steht aber vielleicht auf dem Encoderwert 5001. Für deinen FU ist dann alles gut, weil er im Ziel angekommen ist. Dein Code wird aber in diesem Fall nicht funktionieren, weil du eben genau auf 5000 stehen willst und dies abprüfst. Deshalb mein Vorschlag eine Toleranz um die Sollposition zu spannen. Falls du wirklich wie von mir gemutmaßt über den FU positionierst, kannst du in dessen Parametrierung ja mal nachschauen, wie groß dessen Positionsfenster ist.
 
Hallo Nochmal Howard,

jetzt habe ich verstanden :eek: . Danke schön für die ausführliche Erläuterungen.

Gruß

Hondo
 
Zurück
Oben