Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 35

Thema: SPN Sprung

  1. #11
    exclis066 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.06.2013
    Beiträge
    14
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von RONIN Beitrag anzeigen
    ...einsparen. Aber dann tut sich wieder irgendein Kollege an dem "ungewohnten" Befehl schwer...
    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.
    Geändert von exclis066 (22.05.2016 um 11:41 Uhr)

  2. #12
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.358
    Danke
    456
    Erhielt 695 Danke für 520 Beiträge

    Standard

    Zitat Zitat von exclis066 Beitrag anzeigen
    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...
    Zitat Zitat von F1-Hilfe SP
    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.
    Zitat Zitat von F1-Hife - A1 und A0: Ergebnisse aus Vergleichsoperationen
    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..?
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  3. #13
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.204
    Danke
    926
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    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
    Geändert von PN/DP (22.05.2016 um 16:23 Uhr)
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. Folgende 2 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    RONIN (22.05.2016),vollmi (22.05.2016)

  5. #14
    exclis066 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.06.2013
    Beiträge
    14
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    OK hab es verstanden und
    Zitat Zitat von PN/DP Beitrag anzeigen
    die von A1/A0 abhängigen Sprungbefehle SPN, SPZ, ... verändern nicht das VKE und das Erstabfragebit /ER, wodurch keine VKE-Abgrenzung

    Harald
    lieber Finger weg .

    Vielen Dank an alle!

  6. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.204
    Danke
    926
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Zitat Zitat von exclis066 Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #16
    exclis066 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.06.2013
    Beiträge
    14
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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;

  8. #17
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard

    Zitat Zitat von exclis066 Beitrag anzeigen
    H
    Code:
    IF (Zeiger_aktl = Anz) THEN
         Zeiger_aktl:=Anz;
    END_IF;
    Herzlichen Glückwunsch!

    Das ist so ziemlich der offensichtlichste überflüssige Code, den ich je gesehen habe.
    Geändert von hucki (22.05.2016 um 18:21 Uhr) Grund: Grammatik korrigiert

  9. #18
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.204
    Danke
    926
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #19
    exclis066 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.06.2013
    Beiträge
    14
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  11. #20
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von exclis066 Beitrag anzeigen
    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!
    Geändert von hucki (22.05.2016 um 19:08 Uhr) Grund: Link eingefügt

Ähnliche Themen

  1. AS Sprung in PRG
    Von Tyler-Durden im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 01.07.2011, 10:08
  2. Sprung programmieren
    Von Stonie im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 22.12.2008, 22:49
  3. Sprung programmieren
    Von Syntaxfehler im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 17.12.2007, 11:19
  4. vergleich mit sprung?
    Von Ibaxx im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 28.09.2007, 09:50
  5. ob1 sprung in fc1
    Von Anonymous im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 14.11.2005, 17:32

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •