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

Ergebnis 1 bis 10 von 10

Thema: AWL Problem in Step 7

  1. #1
    Registriert seit
    31.01.2009
    Beiträge
    45
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Böse


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute
    Ich bin ein Neuling was SPS Programmierung angeht, und verstehe nur sehr wenig AWL. Ich habe da eine Bitte. Könntet ihr euch mal folgende AWL anschauen und mir kurz beschreiben worum es geht. Der Teil stammt aus einer Störmelde-Erfassung und ich bin mir nicht im klaren was genau hier gemacht wird.

    L P#0.0
    T #sm_pointer1
    Auf "DB2_Störungen"
    L 14
    schl: T #schleife1
    L DBB [#sm_pointer1]
    L 0
    <> I
    SPB sto1
    L #sm_pointer1
    L P#1.0
    +D
    T #sm_pointer1

    L #schleife1
    Loop schl
    U "m_eins"
    R "m_sammelstoer"
    SPA end1
    stol: SET
    S "m_sammelstoer"

    end1: NOP o

    Ich kann zwar erkennen das es irgendwie um den Pointer und den DB2 geht aber der vollständige Sinn wird mir nicht klar.
    Würde mich freuen wenn mir jemand auf die Sprünge helfen könnte.

    Vielen Dank vorab!
    Heiko
    Zitieren Zitieren AWL Problem in Step 7  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.262
    Danke
    537
    Erhielt 2.707 Danke für 1.956 Beiträge

    Standard

    Code:
    L P#0.0				//Pointerformat
    T #sm_pointer1			//in Schmier-Variable kopieren
    Auf "DB2_Störungen"		//DB2 mit den Bit-Störmeldungen öffnen
    L 14					//Zahl 14 laden
    schl: T #schleife1		//in den Schleifenzähler kopieren
    L DBB [#sm_pointer1]	//Byte aus Störmelde-DB, auf welches der pointer zeigt laden
    L 0					//0 laden
    <> I					//Vergleich, ob das geladene Byte aus dem Störmelde-DB 0 ist
    SPB sto1				//Wenn ja liegt eine Störung vor, Sprung zur Marke sto1
    L #sm_pointer1			//Wenn nein, geht es hier weiter, Pointer laden
    L P#1.0				//der Pointer soll um 1 erhöht werden, dazu diesen Pointer laden
    +D					//addieren der beiden Pointer
    T #sm_pointer1			//Pointer zurückschreiben, damit wurde der Pointer um 1 erhöht
    
    L #schleife1			//Schleifenzähler laden
    Loop schl				//wenn der noch nicht null ist, Sprung zur Marke schl und verrringern des schleifenzählers #schleife um 1 (macht alles der Befehl Loop!)
    U "m_eins"			//dieser Merker ist wohl in deinem Programm immer auf 1 gesetzt
    R "m_sammelstoer"		//Sammelstörung auf False, denn wenn das Programm bis zu dieser Stelle kommt, wurde die Loop-Schleife komplett durchlaufen, 14 Mal das jeweilige Byte auf Null vergleichen und kein Sprung nach stol ausgeführt, da alle Byte 0 waren!
    SPA end1				//Sprung zum Ende
    stol: SET				//hier wird hergesprungen, wenn der Vergleich feststellt, daß ein Byte <> 0 ist nd somit ein Fehler vorliegt
    S "m_sammelstoer"		//setzen der Sammelstörmeldung
    
    end1: NOP o
    Kurz: Es werden die ersten 14 Byte des DB2 auf 0 vergleichen. Sind alle 0, wird die Sammelstörung auf False gesetzt, ist eines <> 0, wird die Sammelstörung auf True gesetzt.

    PS: Diese Codedarstellung mit Kommentaren ist in unserem Forum leider der letzte Scheiß, ich die Kommentare einfach nicht an die gleiche Position
    Hätte da mal irgendwer einen Tip? In der Textverarbeitung, in der ich die Kommentare eingefügt habe paßt es jedenfalls.

    Hier nochmal eine Code-Version mit ungleicher Formatierung: , aber richtiger Anzeige:

    Code:
     
    L P#0.0			//Pointerformat
    T #sm_pointer1		//in Schmier-Variable kopieren
    Auf "DB2_Störungen"	//DB2 mit den Bit-Störmeldungen öffnen
    L 14			//Zahl 14 laden
    schl: T #schleife1	//in den Schleifenzähler kopieren
    L DBB [#sm_pointer1]	//Byte aus Störmelde-DB, auf welches der pointer zeigt laden
    L 0			//0 laden
    <> I			//Vergleich, ob das geladene Byte aus dem Störmelde-DB 0 ist
    SPB sto1		//Wenn ja liegt eine Störung vor, Sprung zur Marke sto1
    L #sm_pointer1		//Wenn nein, geht es hier weiter, Pointer laden
    L P#1.0			//der Pointer soll um 1 erhöht werden, dazu diesen Pointer laden
    +D			//addieren der beiden Pointer
    T #sm_pointer1		//Pointer zurückschreiben, damit wurde der Pointer um 1 erhöht
    
    L #schleife1		//Schleifenzähler laden
    Loop schl		//wenn der noch nicht null ist, Sprung zur Marke schl und verrringern des schleifenzählers #schleife um 1 (macht alles der Befehl Loop!)
    U "m_eins"		//dieser Merker ist wohl in deinem Programm immer auf 1 gesetzt
    R "m_sammelstoer"	//Sammelstörung auf False, denn wenn das Programm bis zu dieser Stelle kommt, wurde die Loop-Schleife komplett durchlaufen, 14 Mal das jeweilige Byte auf Null vergleichen und kein Sprung nach stol ausgeführt, da alle Byte 0 waren!
    SPA end1		//Sprung zum Ende
    stol: SET		//hier wird hergesprungen, wenn der Vergleich feststellt, daß ein Byte <> 0 ist nd somit ein Fehler vorliegt
    S "m_sammelstoer"	//setzen der Sammelstörmeldung
    
    end1: NOP o
    Geändert von Ralle (08.02.2009 um 10:36 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    bullimen (08.02.2009)

  4. #3
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    @ralle: benutze in deinem editor die schriftart courier new oder eine andere nichtproportionale schriftart (alle zeichen gleich breit). dann passt es auch im forum.

    ich mach es meistens direkt mit step7, dann stimmt auch der abstand von befehl und operand

    [edit] und nicht den tabulator benutzen, das verstehts forum nicht [/edit]
    Geändert von vierlagig (08.02.2009 um 10:49 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    Ralle (08.02.2009)

  6. #4
    Registriert seit
    31.01.2009
    Beiträge
    45
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Daumen hoch

    Vielen Dank an Ralle passt! So ergibt auch der Rest des Bausteins einen Sinn!

    mfg bullimen
    Zitieren Zitieren Vielen Dank!  

  7. #5
    Registriert seit
    03.12.2008
    Beiträge
    654
    Danke
    160
    Erhielt 185 Danke für 113 Beiträge

    Standard

    Hallo zusammen
    Ich kann mir nicht verkneifen hier meinen Senf dazuzugeben, auch wenn mich die Freunde der indirekten Addressierung wahrscheinlich dafür steinigen werden.
    Bis vor ein paar Monaten habe ich diese Funktion so programmiert:
    L DB2.DBD 0 // Störmeldungen 1...32
    L 0
    <>D
    S "Sammelstörung"

    L DB2.DBD 4 //Störmeldungen 33...64
    L 0
    <>D
    S "Sammelstörung"

    L DB2.DBD 8 //Störmeldungen 65...96
    L 0
    <>D
    S "Sammelstörung"

    L DB2.DBD 12 //Störmeldungen 97...128
    L 0
    <>D
    S "Sammelstörung"



    U "Quitt_Signal" //bei Quittierung Sammelstörung rücksetzen
    R "Sammelstörung"

    U "Quitt_Signal" //Störungen quittieren
    SPBN M001
    L 0
    T DB2.DBD 0 // Störmeldungen 1...32
    T DB2.DBD 4 // Störmeldungen 33...64
    T DB2.DBD 8 // Störmeldungen 65...96
    T DB2.DBD 12 // Störmeldungen 97...128
    M001: NOP 0
    Weniger Programmcode, einfacher zu programmieren und JEDER BLICKT DURCH!!!

    Ich habe in der Zwischenzeit meine Arbeitsstelle gewechselt, und bin seitdem ständig mit indirekter Addressierung konfrontiert, bis auf wenige Ausnahmen sehe ich darin keinen Vorteil, mal ganz zu schweigen davon daß die Referenzdaten dir nicht mehr helfen können, wenn etwas "in unerklärlicher Weise" überschrieben wird.

    Wie gesagt, die Freunde der indirekten Addressierung werden mich wahrscheinlich dafür in der Luft zerreissen (altmodischer S5-Kram etc.) aber vielleicht kann mir ja jemand mal anschaulich die Vorteile aufzeigen.

    Mfg
    Paul
    Geändert von Paul (08.02.2009 um 20:36 Uhr)

  8. Folgende 4 Benutzer sagen Danke zu Paul für den nützlichen Beitrag:

    Da_Basco (08.02.2009),eYe (08.02.2009),Kieler (08.02.2009),zotos (09.02.2009)

  9. #6
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    673
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    Zitat Zitat von Paul Beitrag anzeigen
    Hallo zusammen
    Ich kann mir nicht verkneifen hier meinen Senf dazuzugeben, auch wenn mich die Freunde der indirekten Addressierung wahrscheinlich dafür steinigen werden.
    Bis vor ein paar Monaten habe ich diese Funktion so programmiert:

    Weniger Programmcode, einfacher zu programmieren und JEDER BLICKT DURCH!!!

    Ich habe in der Zwischenzeit meine Arbeitsstelle gewechselt, und bin seitdem ständig mit indirekter Addressierung konfrontiert, bis auf wenige Ausnahmen sehe ich darin keinen Vorteil, mal ganz zu schweigen davon daß die Referenzdaten dir nicht mehr helfen können, wenn etwas "in unerklärlicher Weise" überschrieben wird.

    Wie gesagt, die Freunde der indirekten Addressierung werden mich wahrscheinlich dafür in der Luft zerreissen (altmodischer S5-Kram etc.) aber vielleicht kann mir ja jemand mal anschaulich die Vorteile aufzeigen.

    Mfg
    Paul

    moin,

    bei der indirekten Version sparst du Zeit, da bei der ersten gefundenen Störmeldung die Sammelstörung erkannt wird, und der Rest nicht mehr bearbeitet wird.

    Ausserdem ist es flexibler, was die Länge des Störmeldebereiches angeht.
    wenn z.B. im obigen Beispiel der Störmeldebereich nicht 14Byte lang ist, sondern 300Byte müsste mann nur
    Code:
    L 14
    durch
    Code:
    L 300
    ersetzen (oder man könnte es gleich parametrierbar machen, bzw Bausteinlänge vom Programm ermitteln lassen).
    Damit hast du mit deiner Variante schon mehr Arbeit..

    Micha
    "arbeite klug, nicht hart" - deutsches Sprichwort

  10. Folgender Benutzer sagt Danke zu SPSKILLER für den nützlichen Beitrag:

    Paul (08.02.2009)

  11. #7
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    ich frag mich wirklich, wie man sich noch so konsequent gegen die indirekte adressierung wehren kann ... die vorteile hat dir SPSKILLER aufgezeigt ... bei anlagen mit mehr als 100 störmeldungen gehst du mit deinem weg einfach mal einen sehr unbequemen weg!

    die nachvollziehbarkeit hängt auch immer stark mit der dokumentation des codes zusammen!
    natürlich kann man hier und da indirekt adressieren, auch ein- undausgänge, und das mal unkommentiert so stehen lassen ... manchmal hat man halt nen schlechten tag, aber eigentlich geht es darum komfortablen code zu schreiben und die anwendung soweit zu optimieren, dass sie im grundkonstrukt wiederverwendbar ist (s.d.a. aus 14 einfach mal 300 byte machen), dieser gehört kommentiert und gut ist.

    dazu kommt, dass hier nicht geschrieben, sondern nur gelesen wird und da ist die schleife über die entsprechenden bytes wirklich einfach nur praktikabel!

    indirekte adressierung tut nicht weh! - sie erleichtert uns nur den täglichen wahnsinn...
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  12. #8
    Registriert seit
    03.12.2008
    Beiträge
    654
    Danke
    160
    Erhielt 185 Danke für 113 Beiträge

    Standard

    Hallo 4L
    Zitat Zitat von vierlagig Beitrag anzeigen
    ich frag mich wirklich, wie man sich noch so konsequent gegen die indirekte adressierung wehren kann
    Ich wehre mich nicht grundsätzlich gegen indirekte Adressierung, ich denke nur manchmal "weniger ist mehr".

    PS: Ich arbeite seit den Zeiten der S3 (nein nicht S5)nach dem Prizip "Learning by doing", manchmal ist das ganz schön hart.

    MfG
    Paul

  13. #9
    Registriert seit
    03.04.2008
    Beiträge
    6.205
    Danke
    237
    Erhielt 817 Danke für 691 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    ich frag mich wirklich, wie man sich noch so konsequent gegen die indirekte adressierung wehren kann
    Wehren ist der falsche Ausdruck. Indirekt dort wo es Sinn macht aber nicht alles und jedes indirekt zu adressieren versuchen

    Zitat Zitat von vierlagig Beitrag anzeigen
    indirekte adressierung tut nicht weh! - sie erleichtert uns nur den täglichen wahnsinn...
    Ja, dem Entwickler, doch werden denkt an die Instandhalter? In einem fremden Programm einen Fehler zu finden ist nicht immer einfach und wenn dann noch indrekt jeder Mist adressiert wird, dann haben die Jungs keine Chance.

    Ich bin der Meinung ich programmiere für den Kunden, dass der mit der Anlage produzieren kann und bei Störung schnell die Ursache erkennen kann und weiter Geld verdient, dann kann er neue Anlagen auch kaufen

    bike

  14. #10
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Paul Beitrag anzeigen
    PS: Ich arbeite seit den Zeiten der S3 (nein nicht S5)nach dem Prizip "Learning by doing", manchmal ist das ganz schön hart.
    ich habe in den 90ern mit S5 und S7-200 angefangen und bis heut nicht einen S- oder anderen progkurs besuchen dürfen

    @bike: ...und ich war auch mal instandhalter
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 29.10.2010, 17:06
  2. Step 7 Pro 065.4 SR 4 UND Windows Vista Problem
    Von SilverNavigator im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 23.04.2009, 17:18
  3. Problem mit Step 5 / ALM 3.0
    Von emphy im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 09.07.2008, 09:02
  4. Step 7 Problem ( Taster mit setzbit )
    Von lurchitopone im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 02.02.2008, 22:16
  5. Step 7 - Problem mit Zeiten
    Von Nix_Wissen im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 23.01.2007, 20:47

Lesezeichen

Berechtigungen

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