Mit IF Anweisung Schritt überspringen

Gizzl0r

Level-1
Beiträge
142
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,
ich habe 3 Messpunkte mit festen Positionen die nacheinander abgefahren werden (P1, P2, P3), jeder dieser Messpunkte soll deaktivierbar sein.
Das heißt: Ist P1 inaktiv soll er direkt zu P2 fahren. Dies ist erstmal kein Problem. Dies habe ich gelöst indem ich den Array Index der Positionen per If Anweisung um 1 erhöht habe.

Wenn ich jetzt P2 deaktiviere, soll er erst P1 anfahren und über P2 hinweg auf P3 zu fahren, hier ist auch mein Problem weil ich nicht weiß, wie ich da verfahren soll.

Gibt es hier einen Weg bzw. Denkanstoß eurerseits?
Freue mich über jede Antwort.

Mit freundlichem Gruß
Daniel
 
wie wäre es mit einer Case Anweisung in der du nur den aktuellen schritt betrachtest


Code:
1: If aktiv then
..mach was
gehe zu schritt 2
else
gehe zu schritt 2
end_if
2:If aktiv then
..mach was
gehe zu schritt 3
else
gehe zu schritt 3
end_if
...

wäre als Sonderbediengung nur zubetrachten wenn kein Messpunkt aktiviert ist
Holger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Daniel

Wie ist denn der Ablauf? Fährt dein "Gerät" non-stop 1-2-3-1-2-3-1-2-3 ab?

So ganz blicke ich hinter deine Anlage noch nicht durch, aber ich denke, dass Du evtl. einen "Fertig gemessen" Befehl hast, der den Fahrbefehl zum nächsten Messpunkt aktiviert. Ist es vielleicht hier möglich, das "Fertig gemessen" bit auf TRUE zu setzen, wenn der Messpunkt deaktiviert ist?


Oder als andere Alternative:
Die Position, wo er hinfahren soll: steht die in einer Variablen? Diese dann dementsprechend belegen mit der Position, die als nächstes angefahren werden soll?



Wäre gut, wenn Du Deine Anlage ein bisschen genauer beschreibst...
Danke schon mal.
 
Hi,
danke schon mal für die Antworten.
Nach der 3. Position ist erstmal Schluß weil es keine weiteren Anweisungen gibt. Über eine Hometaste fahre ich diese dann in die Home Position zurück und kann dann neu starten.
Die Positionen sind in Variablen hinterlegt (pos1_x[0]:=200,pos2_x[1] :=400,pos3_x[2]:=600).

Ich habe im Anhang den Aufbau des Programms fix für 3 Punkte erstellt. Ich hoffe es hilft weiter. Mit dem GL_VAR.pos_y_d_i zähle ich auch die Pos1_x[INDEX] hoch

Ablauf.jpg
 

Anhänge

  • Ablauf.jpg
    Ablauf.jpg
    37,6 KB · Aufrufe: 10
Hinter dieses Netzwerk würde ich jetzt noch ne IF Anweisung rein schrieben.

GL_Var.pos_y_d_i bekommt ja den Wert zwischen 1 und 3

IF ((GL_Var.pos_y_d_i == 1) AND GL_Var.Pos1_aktiv) THEN
GL_Var.pos_y_d_i := GL_Var.pos_y_d_i +1;
END_IF;

Das müsste man 3 mal machen. Für jede Position vorher gucken ob aktiv oder nicht. Recht unsexy, aber mir fällt auf Anhieb nichts besseres ein, wenn die Aktiv Bits nicht in einem Array sind.
Sonst könnte man evtl. mit ner FOR Schleife die 3 Punkte mit dem zugehörigen Aktiv Ja/Nein Bit abklappern.


Aufpassen bei der dritten Position wenn GL_Var.pos_y_d_i die Nummer 4 bekommen würde. Das musst Du in einen von Dir definierten Zustand bringen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
ich habe es jetzt so gelöst. Die Werte die er haben muss um sozusagen die Positionen anzufahren, passen auch (Online Übersicht s.Anhang) Jedoch gibt er mir trotzdem am Ausgang FALSE an Obwohl alle Bedingungen TRUE sind. Woran liegt das? Liegt die If Schleife evtl. an einem Falschem Ort?



IF GL_VAR.pos1_aktiv=FALSE AND GL_VAR.pos_y_d_i = 0
THEN
GL_VAR.pos_z_d_i := GL_VAR.pos_z_d_i +1;
GL_VAR.pos_y_d_i := GL_VAR.pos_y_d_i +1;
END_IF


IF GL_VAR.pos2_aktiv=FALSE AND GL_VAR.pos_y_d_i = 1
THEN
GL_VAR.pos_z_d_i := GL_VAR.pos_z_d_i +1;
GL_VAR.pos_y_d_i := GL_VAR.pos_y_d_i +1;
END_IF


Anweisung.pngBedingung TRUE.pngBedingung.jpg
 
Hallo Gizzl0r,

du fragst gemäß deines Screenshots GL_VAR.pos_y_d_i = 0 ab, GL_VAR.pos_y_d_i ist aber online auf 1. Damit geht dann schonmal garnix.

Desweiteren ist es in Codesys möglich und - wie ich finde - auch schöner Variablenvergleiche direkt durchzuführen.
Also statt
Code:
IF GL_VAR.pos1_aktiv=FALSE .... Then
lieber
Code:
IF not GL_VAR.pos1_aktiv .....Then
verwenden.
 
Zuletzt bearbeitet:
Liegt die If Schleife evtl. an einem Falschem Ort?
Du solltest sicherstellen, daß das grafische Netzwerk nach dem ST-"Netzwerk" ausgeführt wird (ich kenne jetzt den Aufbau von deinem Programm nicht, kann dir also keine Tipps geben, wo du das nachschaust/korrigierst)

Mach doch bitte dieselben Screenshots nochmal, aber mit eingeschalteter Ablaufkontrolle (Flow Control) - Knopf ist oben in der Leiste bei den Debugsymbolen (Step Into, Step over, etc.)

Mal ein paar Kleinigkeiten, die nix mit deinem Problem zu tun haben:

Code:
IF GL_VAR.pos1_aktiv=FALSE (*Vergleiche "mit var=TRUE" oder "var=FALSE" macht man normalerweise nicht, benutze einfach "var" bzw. "NOT var" *) AND GL_VAR.pos_y_d_i = 0
    THEN
    GL_VAR.pos_z_d_i := GL_VAR.pos_z_d_i+1;
    GL_VAR.pos_y_d_i := GL_VAR.pos_y_d_i(*ist hier immer 0, kannst du weglassen*) +1;
END_IF

Hat das nen spezifischen Grund, warum du ST-Code und ein grafisches Netzwerk mischst? Also dagegen spricht ja erstmal nix, aber dein grafisches Netzwerk sieht mir sehr überladen und unübersichtlich aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Anregungen.
Ja, das ist ja mein Hauptproblem das es Sehr unübersichtlich ist. Versuche halt, statt noch 1000 Bausteine zu verwenden um Situationen auszuschließen, die Anweisungen im ST-Code zu setzen.
Das Programm an sich soll bis zu 9 Punkten Abfahren jeweils 3x3 in X/Y Richtung, je nach aktivem bzw. Inaktivem Messpunkt fährt eine Z-Achse Herunter oder halt nicht.
Im Anhang ein Link zu dem Programm. Evtl. hilft das weiter.


https://www.file-upload.net/download-12720095/Target.rar.html
 
Zurück
Oben