Step 7 SPN Sprung

Wie Sie dass in SCL macht weis ich nicht.
Aber ich denke dass da nicht SPN (= sprung bei <>0) must sind, normal must das SPBN (= Sprung bei VKE0) sind.
Wieter muste die Anz ein IN_OUT variabele sind ein IN konte sie nicht schreiben.
Zeiger_akt_1 ist ein Temp und die habe fur is in die baustein geschrieben wurde keine feste wert ( Hier in Screenschot had er an anfang wert 9 aber dass ist nich bestimt jede mal so dass kan die volgende anruf 0 sind oder 10000. normal muste dass in ein FC auch ein IN-OUT sind. Oder Sie must die FC ersetzen durch ein FB und Diese variabele in die STAT var declarieren, diese wurde in die Instanz DB gespeichert.

Grus Joop
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke jetzt habe ich verstanden, IN Variable bleibt immer IN :) also verändert sich nicht.
Aber SPN verstehe ich nicht ganz,wie verhält SPN bei ==I und bei >I?
 
Zuletzt bearbeitet:
Wenn inhalt von Akku 1 <>0 immer ein sprung. Selektier die anweisung SPN und druck dan die F1 taste. Damit wurde die hilfe von SPN getont.

Verstuurd vanaf mijn GT-I9301I met Tapatalk
 
Bei ==I und >1 uzw. gibt dass ein auskumts von TRUE oder FALSE und must man ein sprung machen mit SPB wenn man bei TRUE die sprung machen wil oder mit SPBN wenn mann dass bei FALSE machen wilst. Wenn mann zb in KOP oder FUP ein vergleiger mit dathinter ein Move in ein netzwerk programmiert und man wechselt danach nach AWL wurde da auch ein sprung mit SPBNB gemacht (Hier wurde dass BIE bit mit genommen ins sprung) .

Gruss Joop.
 
SPN reagiert auf VKE 0. Das heisst. Weil springe Negativ, springt er solange die Vorbedingung nicht erfüllt ist.

Die Vorbedingung hier ist >I
ANZ ist in Ak2 und Zeiger_akt in AK1. Solange also AK2 kleiner oder gleich AK1 ist, ist die Bedingung nicht erfüllt und der Sprung wird ausgeführt.
Sobald Ak2 grösser als Ak1 ist, wird nicht mehr gesprungen.

Die Hilfe von SPN bezieht sich auf VKEs
die Hilfe von >I >=I ==I etc bezieht sich auf die Akkus für die Abfrage und VKE fürs resultat.

mfG René
 
SPN reagiert auf VKE 0. Das heisst. Weil springe Negativ, springt er solange die Vorbedingung nicht erfüllt ist
Wird hier "SPBN" mit "SPN" verwechselt?

SPN: SPN Springe, wenn Ergebnis <> 0
SPBN: SPBN Springe, wenn VKE = 0

SPN reagiert nicht auf das VKE sondern prüft ob das Ergebnis einer Berechnung ungleich 0 ist.
Dazu werden die beiden Statusbits A0/A1 verwendet. Auf ein >=I und Konsorten reagiert SPN nicht da diese A0/A1 nicht beeinflussen.

SPN springt wenn das Ergebnis einer vorangehenden Operation +I, /D, XOW, ..., ungleich 0 war.

Kann es sein das der Code des TE nicht wie gewünscht funktioniert, weil er statt dem SPN ein SPBN brauchen würde?
SPN müsste in dem Beispiel nämlich springen wenn wenn das Ergebnis des -I ein paar Zeilen davor ein Ergebnis ungleich 0 liefert.
Vom >I -Vergleich fühlt sich SPN nicht betroffen.

aber im Buch steht:Springe wenn Ergebnis !=0 (A0=0 und A1=1) oder (A0=1 und A1=0) also wenn Akku 2< Akku 1 oder Akku 2 >Akku 1 dann springen.
Nein, mit Akku 1 und 2 hat das im Endeffekt nicht direkt was zu tun.
A0 und A1 sind Statusbits die das Ergebnis von arithmetischen Operationen wiederspiegeln (+I,/D,-R,UW, etc.).
Diese Operationen beeinflussen direkt diese beiden Statusbits. Wenn du ein +I durchführst und das Ergebnis ist bei...
  • 0 -> A0 = 0; A1 = 0
  • <0 -> A0 = 1; A1 = 0;
  • >0 -> A0 = 0; A1 = 1;
SPN wertet genau das aus. Für einen direkten Vergleich zwischen den Akkus ist SPN nicht zu gebrauchen.

Achtung. Die markierten Teile sind falsch -> Siehe: HIER
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Stimmt du hast recht. SPN hab ich bisher auch noch nie benutzt.

SPN/SPBN wäre in SCL eine einfache IF abfrage.

z.B.
Code:
IF (#ANZ - 1) <> 0 THEN
 #ANZ := ANZ - 1;
END_IF;

mfG René
 
...einsparen. Aber dann tut sich wieder irgendein Kollege an dem "ungewohnten" Befehl schwer... :D

Stimmt, hab vielen Dank.Jetzt hab ich fast verstanden.
aber noch eine Frage habe ich noch :)
L #A;
L #B;
==I ;
SPN C003;
und davor gibts keine arithmetische Operation.
Was macht da SPN?

Aber wenn man Bausteine von S5 Zeiten mitschleppt, wird Mann öfter solche "ungewohnten" :) Befehl begegnen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
L #A;
L #B;
==I ;
SPN C003;
und davor gibts keine arithmetische Operation.
Was macht da SPN?
Es würde einfach nach dem Letztstand der Statusbits A0 und A1 agieren. Wie auch immer die gerade sind.

Obwohl ich mich korrigieren muss da ich jetzt noch ein wenig genauer nachgeschaut habe.
SPN ist laut Hilfe für Sprünge wenn das Ergebnis nach Operationen ungleich 0 ist gedacht...
F1-Hilfe SP schrieb:
SPN Springe, wenn Ergebnis <> 0

Beschreibung
Ist das Ergebnis, das von den Statusbits A1 und A0 angezeigt wird, größer oder kleiner als Null (A1 = 0/A0 = 1 oder A1 = 1/A0 = 0), unterbricht SPN <Sprungmarke> (Springe, wenn das Ergebnis <> 0) den linearen Programmablauf...

Beispiel

AWL Erläuterung
L EW8
L MW12
XOW
SPN NOZE //Springe, wenn der Inhalt von AKKU1-L ungleich Null ist.
UN M 4.0 //Der Programmablauf wird hier fortgesetzt, wenn der Sprung nicht ausgeführt wird.
Da die Auswertung über A0 und A1 passiert wäre SPN theorethisch aber nicht nur auf diese beschränkt.

Hab mal kurz nachgesehen, es gibt viel mehr Operatioen die A0 und A1 beeinflussen.
  • Arithmetische Operationen
  • Schiebe- und Rotier-Operationen
  • Vergleichsoperationen
  • Wortverknüpfungsoperationen

Die Vergleichsoperationen spielen also auch mit in das A0,A1 rein. Somit habe ich mich vorhin geirrt.
SPN in Kombination mit Vergleichsoperatoren ist möglich.
F1-Hife - A1 und A0: Ergebnisse aus Vergleichsoperationen schrieb:
A1 A0 Bedeutung
0 0 AKKU 2 = AKKU 1
0 1 AKKU 2 < AKKU 1
1 0 AKKU 2 > AKKU 1
1 1 Ungültig (nur bei Vergleichsoperationen mit Gleitpunktzahlen)
Wobei A0, A1 immer gleich gesetzt werden, egal ob mit >I, <I, ==I, verglichen wird.

Mit deinem Beispiel von oben würde das also bedeuten dass der Code immer springen würde sobald Akku1 ungleich Akku2 ist. Ob man ==I oder >=I schreibt wäre egal.

Die Konstellation erscheint aber verwirrend. Ich erkenne keinen Vorteil von...
Code:
L    #A
L    #B
==I
SPN

//gegenüber

L    #A
L    #B
==I
SPBN

//oder

L    #A
L    #B
<>I
SPB
... erkennen. Vielleicht korrigiert mich noch wer.

Grundsäzlich geht die Verwendung von SPN mit Vergleichoperatoren aber.
Scheint bei deinem Eingangs-Code, den man sich jetzt nochmal ansehen müssten, tatsächlich im einen "schlauen" Trick aus der S5-Zeit handeln.... Ob man das heute noch will..?
 
SPN heißt "Springe, wenn Ergebnis <> 0", was allerdings nicht heißt, daß mit "Ergebnis" das Rechenergebnis einer arithmetischen Operation gemeint ist. Genauer wird in der Hilfe zu SPN erläutert "ist das Ergebnis, das von den Statusbits A1 und A0 angezeigt wird" - das kann das Ergebnis ganz anderer Operationen sein, z.B. Vergleichsoperationen oder Schiebeoperationen oder Wordverknüpfungen oder ... Tatsächlich wertet SPN nur den Zustand der Statusbits A1 und A0 aus (nicht den Inhalt des AKKU1!) und springt, wenn die Statusbits A1 und A0 unterschiedlich sind.
  • Wordverknüpfungen sind noch am ehesten mit arithmetischen Operationen vergleichbar, wobei aber nur die Ergebnisse A1=0/A0=0 und A1=1/A0=0 möglich sind, was als ==0 (SPZ), <>0 (SPN) oder >0 (SPP) abgefragt werden kann
    (Abfragen <0 (SPM), <=0 (SPMZ) und >=0 (SPPZ) sind nicht sinnvoll, weil sie nie oder immer zutreffen)
  • Vergleichsoperationen sind im Grunde eine "testweise" Subtraktion mit Ergebnisanzeige in A1/A0 und anschließendem setzen des VKE entsprechend der Vergleichsoperation, wobei das Rechenergebnis danach verworfen wird (also nicht in AKKU1 geladen wird)
    Code:
    L #A
    L #B
    ==I       //setzt die Statusbits wie -I, mit anschließendem Vergleich auf ==0 ins VKE
    SPN Mxxx  //springt, wenn #A <> #B
  • Bei Schiebeoperationen ist die Statusanzeige vom letzten geschobenen Bit abhängig: wenn man eine 1 um 1 Bitstelle rechts schiebt, dann ist danach das Resultat in AKKU1 = 0, da aber eine 1 ins A1 geschoben wurde wird als Ergebnis <>0 angezeigt! Es sind die selben Ergebnisse wie bei Wordverknüpfungen möglich, das Ergebnis bezieht sich aber nicht auf das Resultat (Inhalt Akku1) sondern auf das zuletzt geschobene Bit (in A1).
    Code:
    L 1
    SRW 1     //--> AKKU1 = 0, A0=0 und A1=1
    SPN Mxxx  //springt weil A1=1 und A0=0, obwohl AKKU1 = 0 !

Problematisch und wohl deshalb selten benutzt: die von A1/A0 abhängigen Sprungbefehle SPN, SPZ, ... verändern nicht das VKE und das Erstabfragebit /ER, wodurch keine VKE-Abgrenzung stattfindet und am Sprungziel eventuell keine neue Verknüpfung begonnen wird - das bestehende VKE wird mitgenommen und am Sprungziel fortgesetzt ("verschleppt"). Das kann man ausnutzen, um bei bestimmten Zwischenergebnissen (z.B. 0) aus einer Verknüpfung herauszuspringen oder die Verknüpfung fortzusetzen. Da muß man aber sehr konzentriert arbeiten (besonders beim Sprungziel), um da keine fehlerhaften Logik-Verknüpfungen zu programmieren.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe nicht, warum #Anz immer 9 bleibt.Wieso zählt nicht bis 0?
Das ist aus dem von Dir gezeigten Code nicht ersichtlich, da wird #Anz lediglich einmal dekrementiert. Ist da eine Schleife? Was ist die Endebedingung? Fehlt da eine/mehrere Programmzeile(n)?

Ich meine, daß die Verwendung des Sprunges "SPN" aber ziemlich sicher falsch ist, weil der Code mit SPN keinen Sinn ergibt, weil er nämlich den Wert von #Anz in #Zeiger_akt1 schreiben würde, nur wenn die beiden Werte ohnehin schon gleich sind. Doch auch mit SPBN sehe ich nicht den beabsichtigten Sinn des Codes. Was soll der Code im Klartext bewirken?

Dein Programmschnipsel mal als Pseudocode:
Code:
#Zeiger_akt1 += 1;  //INC(#Zeiger_akt1)
#Anz -= 1;          //DEC(#Anz)

//Funktion bei SPN:
IF #Anz = #Zeiger_akt1 THEN #Zeiger_akt1 := #Anz;

//Funktion mit SPBN:
IF #Anz > #Zeiger_akt1 THEN #Zeiger_akt1 := #Anz;

Harald
 
Hallo Harald,

#Anz ist Imput Variable, Zeiger_aktl auf Anz-1 begrenzt, soweit ich das verstanden habe und ich habe so umgesetzt:

Code:
IF (Zeiger_aktl = Anz) THEN
     Zeiger_aktl:=Anz;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Code ist völlig überflüssig - das meinte ich mit "keinen Sinn ergibt".
Kannst Du mal "bildlich" erklären, was der Code bzw. das Programm tun soll? Du erklärst den Code mit sich selbst.
Ich wollte z.B. sowas hören: ich empfange eine Zeichenkette und suche nach einem Trennzeichen, ab hinter dem Trennzeichen muß ich nun den Rest der Zeichenkette kopieren...

Harald
 
Hallo Harald,
bildlich schwer zu erklären, dafür muss ich ganze Code veröffentlichen und dass darf ich nicht. Was mir Problem gemacht hat, SPN gewesen.
Ob der Code Überflüssig ist naja Ansichtssache, weil wenn man 350 zeile Code s5(awl) auf s7 scl umsetzen soll macht es schon Sinn wenn man SPN umsetzt.

Trotztem Vielen Dank an alle, SPN befehl war mir neu und unklar.Jetzt habe ich es verstanden.
 
Ob der Code Überflüssig ist naja Ansichtssache, weil wenn man 350 zeile Code s5(awl) auf s7 scl umsetzen soll macht es schon Sinn wenn man SPN umsetzt.
SPN hin oder her - einer Variablen genau den Wert zuzuweisen, den sie eh' schon hat, ist immer überflüssig.

In Deinem Code oben steht z.B.:
Wenn die Variable Zeiger_aktl den Wert 10 hat, dann soll sie den neuen Wert 10 bekommen. Überflüssig, denn den hat sie schon!
 
Zuletzt bearbeitet:
Zurück
Oben