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

Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 37 von 37

Thema: Indirekte Adressierung mit AWL

  1. #31
    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 joe_bvb Beitrag anzeigen
    Hallo Harald,
    Alles ist in Ordnung, dieser rekursive Impuls muss nicht sein. Danke
    Er steht aber in der Aufgabenstellung!
    und er könnte sein, also angenommen, wir wollen diese Option umsetzen, was ist dann mit "rekursiver Impuls" gemeint?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  2. #32
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.184
    Danke
    923
    Erhielt 3.290 Danke für 2.659 Beiträge

    Standard

    Zitat Zitat von joe_bvb Beitrag anzeigen
    Diese Schritte habe nicht verstanden:
    T MW 30
    L 2000
    <I
    TAK //MW30 zurück in AKKU1
    SPB hier

    Was macht TAK und was wolltest du damit sagen?
    Wie Gebs schon in #24 schrieb:
    Wenn der Sprung zu "hier" ausgeführt wird, dann muß der Wert von MW30 im AKKU1 stehen, weil der Wert da in den DB geschrieben wird. Wegen dem "L 2000" für den Vergleich steht aber die 2000 in AKKU1 und der Wert von MW30 wurde in AKKU2 geschoben. Wie bekommt man nun am einfachsten den Wert zurück in AKKU1? --> entweder mit TAK (tauscht die Inhalte von AKKU1 und AKKU2) oder mit POP (holt den Inhalt von AKKU2 in AKKU1) oder durch erneutes Laden aus dem MW30. Erneutes Laden wäre schön übersichtlich, TAK und POP sind aber kürzer und schneller als das Laden, POP ist für viele AWL-Leser nicht so geläufig, also habe ich mich für TAK entschieden. Man kann das Programm aber auch anders schreiben, z.B. das "L MW30" direkt in der Zeile hinter "hier:" machen, oder den Vergleich mit 2000 andersrum formulieren, so daß die 2000 in AKKU2 steht und der neue Wert des MW30 in AKKU1 steht, oder ...

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    joe_bvb (05.06.2014)

  4. #33
    Registriert seit
    02.06.2014
    Beiträge
    46
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Wie Gebs schon in #24 schrieb:
    Wenn der Sprung zu "hier" ausgeführt wird, dann muß der Wert von MW30 im AKKU1 stehen, weil der Wert da in den DB geschrieben wird. Wegen dem "L 2000" für den Vergleich steht aber die 2000 in AKKU1 und der Wert von MW30 wurde in AKKU2 geschoben. Wie bekommt man nun am einfachsten den Wert zurück in AKKU1? --> entweder mit TAK (tauscht die Inhalte von AKKU1 und AKKU2) oder mit POP (holt den Inhalt von AKKU2 in AKKU1) oder durch erneutes Laden aus dem MW30. Erneutes Laden wäre schön übersichtlich, TAK und POP sind aber kürzer und schneller als das Laden, POP ist für viele AWL-Leser nicht so geläufig, also habe ich mich für TAK entschieden. Man kann das Programm aber auch anders schreiben, z.B. das "L MW30" direkt in der Zeile hinter "hier:" machen, oder den Vergleich mit 2000 andersrum formulieren, so daß die 2000 in AKKU2 steht und der neue Wert des MW30 in AKKU1 steht, oder ...

    Harald
    Hi,
    ich habe es verstanden, aber wie die Schleife verlassen wird (beendet) habe nicht kappiert, weil wenn die Schleife nicht verlassen wird, stürzt er ab(weil er einen unendlichen Zyklus hat).
    Gruß

  5. #34
    Registriert seit
    02.06.2014
    Beiträge
    46
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    Er steht aber in der Aufgabenstellung!
    und er könnte sein, also angenommen, wir wollen diese Option umsetzen, was ist dann mit "rekursiver Impuls" gemeint?
    Ich weiß selber nicht, was damit gemeint ist.
    Gruß

  6. #35
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.184
    Danke
    923
    Erhielt 3.290 Danke für 2.659 Beiträge

    Standard

    Zitat Zitat von joe_bvb Beitrag anzeigen
    wie die Schleife verlassen wird (beendet) habe nicht kappiert, weil wenn die Schleife nicht verlassen wird, stürzt er ab(weil er einen unendlichen Zyklus hat).
    Da stürzt nichts ab. LOOP oder SPB springen bedingt nur dann zurück zum Schleifenanfang, solange die Schleife noch nicht 1000-mal ausgeführt wurde. Nach vollständiger Abarbeitung der Schleife ist die Rücksprungbedingung nicht mehr erfüllt und der Sprung deshalb nicht mehr ausgeführt und das Programm wird einfach mit der nächsten Anweisung nach der Schleife fortgesetzt.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    joe_bvb (05.06.2014)

  8. #36
    Registriert seit
    02.06.2014
    Beiträge
    46
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Da stürzt nichts ab. LOOP oder SPB springen bedingt nur dann zurück zum Schleifenanfang, solange die Schleife noch nicht 1000-mal ausgeführt wurde. Nach vollständiger Abarbeitung der Schleife ist die Rücksprungbedingung nicht mehr erfüllt und der Sprung deshalb nicht mehr ausgeführt und das Programm wird einfach mit der nächsten Anweisung nach der Schleife fortgesetzt.

    Harald
    Hezlichen Dank. Jetzt habe ich nachvollzogen. Mein Fehler am Anfang war, dass ich den Sprung anders bedingt habe (Wenn MW30>2000 dann spring zum anfang wieder mit SPA Anf) und so verlässt er nie die Schleife. Aber mit deiner Methode führt er die Befehle aus bis Mw30 die 2000 erreicht danach springt er automatisch raus (wenn ich das richtig verstanden habe).
    Geändert von joe_bvb (05.06.2014 um 10:45 Uhr)

  9. #37
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.184
    Danke
    923
    Erhielt 3.290 Danke für 2.659 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja, hast Du richtig verstanden.

    Man kann das Programm noch in ...zig weiteren Varianten schreiben, z.B. eine wo erst der Schleifenzähler geprüft wird und dann die Schleife ausgeführt wird.

    Variante "Speicherindirekt" mit dem Pointer in einem DWORD in TEMP
    Code:
    // Schleife initialisieren
          L     0
          T     MW    10                    //Schleifenzähler (Index)
    
          AUF   DB    100                   //Global Datenbaustein DB100 mit 1000 INT
    
    // Schleife schon komplett abgearbeitet?
    next:  L     1000
          L     MW    10
          <=I   
          SPB   ende                        //ja, fertig
    
    // nein: 0, 2, 4 ... 1998 in DB100.DBW[0, 2, 4 ... 1998] schreiben
    // DB100.DBW[Index*2] := Index*2 ;
          SLD   4                           //Index * 16 --> DBW_Adresse P#xxxx.0
          T     #tmp_DW_Adr
          SRD   3                           //Index * 2  --> Wert, der in DBW geschrieben wird
          T     DBW [#tmp_DW_Adr]
    
    // Schleifenzähler weiterschalten
          L     MW    10
          +     1
          T     MW    10
          SPA   next                        //nächstes DBW
    
    // Fertig
    ende:  NOP   0
    Variante "Registerindirekt" mit dem Pointer in AR1
    Code:
    // Schleife initialisieren
          L     0
          T     MW    10                    //Schleifenzähler (Index)
    
          AUF   DB    100                   //Global Datenbaustein DB100 mit 1000 INT
    
    // Schleife schon komplett abgearbeitet?
    next: L     1000
          L     MW    10
          <=I   
          SPB   ende                        //ja, fertig
    
    // nein: 0, 2, 4 ... 1998 in DB100.DBW[0, 2, 4 ... 1998] schreiben
    // DB100.DBW[Index*2] := Index*2 ;
          SLD   4                           //Index * 16 --> DBW_Adresse P#xxxx.0
          LAR1  
          SRD   3                           //Index * 2  --> Wert, der in DBW geschrieben wird
          T     DBW [AR1,P#0.0]
    
    // Schleifenzähler weiterschalten
          L     MW    10
          +     1
          T     MW    10
          SPA   next                        //nächstes DBW
    
    // Fertig
    ende: NOP   0
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Indirekte Adressierung in AWL
    Von Bensen83 im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 31.01.2015, 15:58
  2. Step 7 Anfängerfrage indirekte Adressierung Array (AWL)
    Von Vorname Nachname im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 29.01.2014, 21:32
  3. indirekte Adressierung AWL
    Von Tigerente1974 im Forum Programmierstrategien
    Antworten: 2
    Letzter Beitrag: 14.08.2011, 01:40
  4. Indirekte Adressierung FB mit Pointern
    Von kliebisch.m im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 28.10.2010, 12:06
  5. Indirekte Adressierung mit S5!!
    Von Anonymous im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 20.10.2004, 15:15

Lesezeichen

Berechtigungen

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