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

Results 1 to 10 of 10

Thread: AWL Problem in Step 7

  1. #1
    Join Date
    31.01.2009
    Posts
    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
    Reply With Quote Reply With Quote AWL Problem in Step 7  

  2. #2
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,806
    Danke
    746
    Erhielt 3,127 Danke für 2,231 Beiträge

    Default

    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
    Last edited by Ralle; 08.02.2009 at 10:36.
    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
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default

    @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]
    Last edited by vierlagig; 08.02.2009 at 10:49.
    [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
    Join Date
    31.01.2009
    Posts
    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
    Reply With Quote Reply With Quote Vielen Dank!  

  7. #5
    Join Date
    03.12.2008
    Posts
    928
    Danke
    213
    Erhielt 241 Danke für 150 Beiträge

    Default

    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
    Last edited by Paul; 08.02.2009 at 20:36.

  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
    Join Date
    11.05.2005
    Location
    Baden-Württemberg
    Posts
    723
    Danke
    114
    Erhielt 158 Danke für 128 Beiträge

    Default

    Quote Originally Posted by Paul View Post
    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
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default

    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
    Join Date
    03.12.2008
    Posts
    928
    Danke
    213
    Erhielt 241 Danke für 150 Beiträge

    Default

    Hallo 4L
    Quote Originally Posted by vierlagig View Post
    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
    Join Date
    03.04.2008
    Posts
    6,464
    Danke
    238
    Erhielt 825 Danke für 698 Beiträge

    Default

    Quote Originally Posted by vierlagig View Post
    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

    Quote Originally Posted by vierlagig View Post
    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
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by Paul View Post
    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]

Similar Threads

  1. Konvertieren AWL von Step 7 zu AWL von CoDeSys
    By Nas97 in forum CODESYS und IEC61131
    Replies: 6
    Last Post: 19.04.2018, 12:16
  2. AWL: CoDeSys VS Step 7
    By MartinF. in forum CODESYS und IEC61131
    Replies: 3
    Last Post: 08.04.2016, 16:59
  3. Step 5 Befehlsreferenz AWL
    By urlicht in forum Simatic
    Replies: 3
    Last Post: 23.11.2012, 10:04
  4. Berechnung in Step 7 AWL
    By Fabix in forum Simatic
    Replies: 2
    Last Post: 19.11.2010, 00:28
  5. Replies: 10
    Last Post: 29.10.2010, 17:06

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •