Step 7 SPN Sprung

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo hucki,

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 du siehst, ende FB.Was würdest du mir sinnvolles vorschlagen damit ich diesen Schritt sinnvoll ersetze.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo hucki,

wie du siehst, ende FB.Was würdest du mir sinnvolles vorschlagen damit ich diesen Schritt sinnvoll ersetze.
Bin leider kein AWL-Profi, schon gar nicht für S5.

Für mich steht da:
Code:
IF #Weiter THEN
   #Prog_End    := #SProg_End AND #Anz - 1 > Zeiger_aktl + 1;
   #Zeiger_aktl := #Anz - 1;
ELSE
   #Prog_End    := #SProg_End;
END_IF;
Das SPN dient nur dazu, den im #Zeiger_aktl bereits vorhandenen Wert nicht mit dem gleichen Wert noch mal zu überschreiben und trotzdem durch den Sprung das VKE nicht zu verändern. M.M.n. würde das Überschreiben mit dem gleichen Wert aber auch nicht schaden und würde nicht so verwirren, wie der Sprung.

Anders sieht es aus, wenn nach dem Sprung SPN vlt. doch noch andere Anweisungen folgen, die das VKE beeinflussen.


Aber wie an anderen Stellen schon oft gesagt, nur "Hobby"-Meinung.
 
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
In #1 war es noch ein FC3000, nun ist es ein FUNCTION_BLOCK?
Und die Zuweisung "T #Anz" fehlt nun?

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:
Code:
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;

Nachtrag: VKE-Verschleppung nicht beachtet! Korrektur siehe Beitrag #28

Harald
 
Zuletzt bearbeitet:
Hallo Harald,

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?



PS: In exclis066s Text-Programmauszug im Post#21 fehlt das T #Anz. Deswegen bin ich davon ausgegangen, dass #Anz seinen ursprünglichen Wert behalten soll. Im Bild-Ausschnitt aus Post#1 ist es jedoch drinne.
Da sieht man mal wieder, was solche Kleinigkeiten ausmachen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und der Sprung wird doch gemacht, wenn #Anz und #Zeiger_aktl gleich sind (Differenz = 0), oder? Ansonsten erfolgt der Transfer.
Müsste es daher nicht heißen:
Code:
IF #Zeiger_aktl <> #Anz THEN
   #Zeiger_aktl := #Anz;
END_IF;
bzw. einfach nur:
Code:
#Zeiger_aktl := #Anz;
 
Hallo zusammen,

ich habe FC erstellt damit SPN verhalten simulieren und verstehen wollte, da nicht den ganzen FB simulieren wollte. Aber AKKU1 =Zeiger_aktl und AKKU2=Anz-1 SPN spring nicht wenn AKKU1=AKKU2 daher mit dem TAK AKKU1= Anz-1 dann Zeiger_aktl :=Anz-1 oder?

ich habe jetzt so realisiert:

EDIT:Fehler korrigiert!
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;
 
Zuletzt bearbeitet:
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?
Hallo hucki,

Du hast recht, die VKE-Verschleppung habe ich nicht beachtet, mist... :oops:

Zur Übersicht nochmal der S7-AWL-Code:
Code:
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;
(1) SPN springt bei "#Anz <> #Zeiger_aktl" ---> die überflüssige Zuweisung "#Zeiger_aktl := #Anz" wird ausgeführt bei "#Zeiger_aktl = #Anz"
(2) Das VKE wird gebildet von "#Anz > #Zeiger_aktl" und geht wegen der fehlenden VKE-Abgrenzung in die Verknüpfung zu #Prog_End mit ein

Meine SCL-Umsetzung sieht nun so aus:
Code:
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;

Doch wer weiß, vielleicht ist das SPN ein Übertragungsfehler vom S5-AWL und wir zerbrechen uns den Kopf über nichts?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
SPN spring nicht wenn AKKU1=AKKU2 daher mit dem TAK AKKU1= Anz-1 dann Zeiger_aktl :=Anz-1 oder?
Zur Verdeutlichung wie überflüssig (und daher vermutlich falsch) die Zuweisung an Zeiger_aktl ist, nochmal ausführlich:
Nach dem Inkrementieren von #Zeiger_aktl und Dekrementieren von #Anz und Laden vom neuen #Zeiger_aktl (vor dem >I) ist folgende Situation:

AKKU2 = neuer Wert #Anz
AKKU1 = neuer Wert #Zeiger_aktl

SPN springt nicht bei AKKU1=AKKU2
--> Situation hinter dem SPN: AKKU1=AKKU2=#Zeiger_aktl=#Anz
- TAK: nun wird der ohnehin gleiche Inhalt von AKKU1 mit AKKU2 getauscht (!)
- T #Zeiger_aktl: der gleiche Wert wie #Zeiger_aktl wird wieder #Zeiger_aktl zugewiesen (!)

(!) zwei wirkungslose und daher überflüssige Operationen ---> Code vermutlich falsch

Harald
 
Hallo Harald,

hast du recht, TAK und SPN ist überflüssig.Ich habe nachgefragt und festgestellt SPN falscher weise eingesetzt wurde.
Kollege wollte nur Zeiger_aktl auf Anz-1 begrenzen.

Vielen Dank an alle
 
Zuletzt bearbeitet:
Ich habe nachgefragt und festgestellt SPN falscher weise eingesetzt wurde.
Kollege wollte nur Zeiger_aktl auf Anz-1 begrenzen.
Versteh' ich das jetzt richtig, dass der Original-Code-Ersteller noch einfach greifbar ist (weil = Kollege)?
Hätte man den dann nicht gleich fragen können, was er da im Sinn hatte?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es hat sich herausgestellt, daß das "T #Anz" doch nicht zum vorhandenen Code gehört (#Anz also nicht dekrementiert wird), und daß der inkrementierte #Zeiger_aktl auf max #Anz-1 begrenzt werden soll ---> so gesehen macht SPBN Sinn (SPN ist wohl ein Tippfehler) und in SCL würde es dann heißen:
Code:
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;
oder mit (temporärer) Hilfsvariable #Zeiger_max für nur einmal rechnen #Anz-1:
Code:
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;

Harald
 
So ein kleines vermaledeites untergegangenes B.
Das ändert so vieles - VKE-Kette, Sprung oder nicht, Sinn oder nicht.

:ROFLMAO:
 
Zurück
Oben