wie du siehst, ende FB.Was würdest du mir sinnvolles vorschlagen damit ich diesen Schritt sinnvoll ersetze.UN #Weiter;
SPB D001;
L #Zeiger_aktl;
L 1;
+I ;
T #Zeiger_aktl;
L #Anz;
L 1;
-I ;
L #Zeiger_aktl;
>I ;
SPN D001;
TAK ;
T #Zeiger_aktl;
D001: NOP 0;
U #SProg_End;
= #Prog_End;
END_FUNCTION_BLOCK
Vielleicht kontrollierst Du nochmal den originalen S5-Code, ob der korrekt umgesetzt wurde.350 zeile Code s5(awl) auf s7 scl umsetzen
Bin leider kein AWL-Profi, schon gar nicht für S5.Hallo hucki,
wie du siehst, ende FB.Was würdest du mir sinnvolles vorschlagen damit ich diesen Schritt sinnvoll ersetze.
IF #Weiter THEN
#Prog_End := #SProg_End AND #Anz - 1 > Zeiger_aktl + 1;
#Zeiger_aktl := #Anz - 1;
ELSE
#Prog_End := #SProg_End;
END_IF;
In #1 war es noch ein FC3000, nun ist es ein FUNCTION_BLOCK?UN #Weiter;
SPB D001;
L #Zeiger_aktl;
L 1;
+I ;
T #Zeiger_aktl;
L #Anz;
L 1;
-I ;
L #Zeiger_aktl;
>I ;
SPN D001;
TAK ;
T #Zeiger_aktl;
D001: NOP 0;
U #SProg_End;
= #Prog_End;
END_FUNCTION_BLOCK
Wie der originale S5-Code aussieht wissen wir nicht, doch der in #1 und #21 gezeigte S7-AWL-Code kann so in SCL (V5.x) umgesetzt werden:
IF Weiter THEN
Zeiger_aktl := Zeiger_aktl + 1;
Anz := Anz - 1;
//nächste 3 Zeilen bewirken nichts und können deshalb entfallen:
// IF Zeiger_aktl = Anz THEN
// Zeiger_aktl := Anz;
// END_IF;
END_IF;
Prog_End := SProg_End;
IF #Zeiger_aktl <> #Anz THEN
#Zeiger_aktl := #Anz;
END_IF;
#Zeiger_aktl := #Anz;
IF Weiter THEN
Zeiger_aktl:=Zeiger_aktl+1;
IF (Zeiger_aktl > Anz-1) THEN
Zeiger_aktl:=Anz-1;
END_IF;
END_IF;
//Programm beendet
Prog_Ende:=SProg_Ende;
Hallo hucki,SPN unterbricht doch weder die VKE-Kette noch setzt es das VKE automatisch auf 1. Somit müsste das Ergebnis des vorhergehenden Vergleiches Eingang in die abschließende UND-Verknüpfung von #Prog_End finden, oder?
UN #Weiter;
SPB D001; //setzt auf jeden Fall VKE=1 und /ER=0
L #Zeiger_aktl;
L 1;
+I ;
T #Zeiger_aktl;
L #Anz;
L 1;
-I ;
T #Anz;
L #Zeiger_aktl;
>I ; //(2)
SPN D001; //(1)
TAK ;
T #Zeiger_aktl;
D001: NOP 0;
U #SProg_End;
= #Prog_End;
IF Weiter THEN
Zeiger_aktl := Zeiger_aktl + 1;
Anz := Anz - 1;
//nächste 3 Zeilen bewirken nichts und können deshalb entfallen:
// IF Zeiger_aktl = Anz THEN
// Zeiger_aktl := Anz;
// END_IF;
END_IF;
Prog_End := (NOT Weiter AND SProg_End) OR (Weiter AND (Anz > Zeiger_aktl) AND SProg_End); //Klammern nicht nötig aber übersichtlicher
// optimiert umgeformt:
// Prog_End := ((Anz > Zeiger_aktl) OR NOT Weiter) AND SProg_End;
Zur Verdeutlichung wie überflüssig (und daher vermutlich falsch) die Zuweisung an Zeiger_aktl ist, nochmal ausführlich:SPN spring nicht wenn AKKU1=AKKU2 daher mit dem TAK AKKU1= Anz-1 dann Zeiger_aktl :=Anz-1 oder?
Versteh' ich das jetzt richtig, dass der Original-Code-Ersteller noch einfach greifbar ist (weil = Kollege)?Ich habe nachgefragt und festgestellt SPN falscher weise eingesetzt wurde.
Kollege wollte nur Zeiger_aktl auf Anz-1 begrenzen.
IF Weiter THEN
Zeiger_aktl := Zeiger_aktl + 1;
IF Zeiger_aktl > Anz - 1 THEN
Zeiger_aktl := Anz - 1;
END_IF;
END_IF;
Prog_End := SProg_End;
IF Weiter THEN
Zeiger_aktl := Zeiger_aktl + 1;
Zeiger_max := Anz - 1;
IF Zeiger_aktl > Zeiger_max THEN
Zeiger_aktl := Zeiger_max;
END_IF;
END_IF;
Prog_End := SProg_End;
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?