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

Ergebnis 1 bis 8 von 8

Thema: Pointer ohne Verwendung eines Adressregisters

  1. #1
    Registriert seit
    15.10.2014
    Beiträge
    6
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!

    Ich arbeite erst seit ca einem Monat als Steuerungstechniker und bin daher noch blutiger Anfänger in Sachen SPS.

    Für ein Schulungsbeispiel sollte ich ein Programm in AWL schreiben, das für eine Zahl (1-10), die am HMI (KTP 600 PN) eingegeben wird, den entsprechenden (in einem DB gespeicherten) Wert am HMI ausgibt. Zusätzlich soll am HMI für eine Zahl ein neuer Wert eingegeben werden und per Tastendruck übernommen werden können.

    Mit Hilfe der S7 Hilfe und einiger Foreneinträge habe ich ein funktionierendes Programm geschrieben, das Pointer verwendete, die über das Adressregister 1 angesprochen werden.

    Das Code sieht folgendermaßen aus:

    Code:
     
    //-Pointer 4.0 in Akku 1 laden----------
     
          L     4                           // lade 4 
          SLD   3                           // schiebe um 3 nach links
          LAR1                              // in Adressregister 1 laden (Pointer P#4.0)
     
          L     10                          // lade die Anzahl der Schleifenzyklen in Akku 1
     
    //- Zahlenvergleich---------------------
     
    NEXT: T     MW   100                    // Sprungmarke --> Beginn der Schleife/ Inhalt von Akku 1 in Merkerwort 100 speichern
     
          L     MW   100                    // lade Merkerwort 100
          L     "DB1".Zahl                  // lade Zahl aus DB1 (Zahl, die am HMI eingegeben wurde)
          ==I                               // vergleiche
          SPBN  NW1                         // springe bedingt nicht zur Sprungmarke NW1
     
          AUF   "DB1"                       // DB1 öffnen
          L     DBW [AR1,P#0.0]             // Pointer laden
          T     "DB1".Wert                  // lade in "DB1".Wert  (wird am HMI angezeigt)
     
    //- neuen Wert Übernehmen--------------- 
     
          U     "m_uebernehmen"             // Merker Übernehmen betätigt
          SPBN  NW1                         // springe bedingt nicht zur Sprungmarke NW1
     
          L     "DB1".NeuerWert             // lade neuen Wert
          T     DBW [AR1,P#0.0]             // lade in Pointer --> Pointer wird um 2 erhöht
     
    //-Pointer um 2 erhöhen-----------------
     
    NW1:  L     2                           // lade 2
          SLD   3                           // schiebe um 3 nach links
          +AR1                              // zum Inhalt von Adressregister addieren
     
    //- Schleifenfunktion-------------------
     
          L     MW   100                    // lade Merkerwort 100 (enthält den Inhalt von Akku 1 zu Beginn der Schleife
          LOOP  NEXT                        // Schleife/ springe zu NEXT wenn inhalt von Akku 1 <> 0
    Das Programm funktioniert einfwandfrei, allerdings soll ich es nun (als Übung und zum besseren Verständnis) so umschreiben,
    dass kein Adressregister mehr benötigt wird.

    Brauche ich zu diesem Zweck eine Temp Variable?

    Bzw. ist mir überhaupt nicht klar, wie ich einen Pointer erstelle bzw. lade ohne das Adressregister zu verwenden.

    Ich bin um jeden Beitrag dankbar und bitte bedenkt, dass mir nach so kurzer Zeit erst ein sehr begrenztes Grundwissen zum Thema S7 Programmierung zur Verfügung steht.

    Danke im Voraus
    Schnabeltiermann
    Geändert von Schnabeltiermann (15.10.2014 um 12:07 Uhr)
    Zitieren Zitieren Pointer ohne Verwendung eines Adressregisters  

  2. #2
    Registriert seit
    28.07.2005
    Beiträge
    10
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Schnabeltiermann..
    Du kannst es auch über einen Any Pointer machen..

    Im Temp Bereich den Any Pointer angeben ( Name-Suchen) Datentyp Any

    L W#16#1002 // Typ Byte ( INT )
    T LW 0
    L #I_Anzahl_Byte // Anahl Bytes ( INT )
    T LW 2
    L #I_DB // Quell DB ( INT )
    T LW 4
    L #Suchzeiger // Anfang der Quelle ( DINT )
    SLD 3
    OD DW#16#84000000
    T LD 6

    Das machst du 2 x ( für die Empfangsdaten und für die Sendedaten )
    Dann kannst du das ganze mit dem SFC20 übertragen.

    CALL "BLKMOV"
    SRCBLK :=#Suchen
    RET_VAL:=#retval
    DSTBLK :=#Ablegen


    Viel Spaß beim umsetzen..

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

    Schnabeltiermann (16.10.2014)

  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

    das war sicher nicht der Wunsch des Aufgabenstellers - ganz sicher nicht!

    Statt die Adresse ins Adressregister zu laden, kann man diese auch in einem Doppelwort, z.B. MD10 ablegen, dann kann man mit L DBW[MD10] zugreifen
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

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

    Schnabeltiermann (16.10.2014)

  6. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.200
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Indirekte Adressierung mit Adressregister heißt: "registerindirekte Adressierung"
    Indirekte Adressierung ohne Adressregister heißt: "speicherindirekte Adressierung"

    siehe Hilfe zu AWL > Index > Indirekte Adressierung > Speicherindirekte Adressierung

    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:

    Schnabeltiermann (16.10.2014)

  8. #5
    Registriert seit
    15.10.2014
    Beiträge
    6
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das war genau, wonach ich gesucht habe!

    Habe die Adresse zwar schon in ein Doppelwort gespeichert, aber habe L MW[MD10] statt L DBW [MD10] geschrieben.

    Das war mein einziger Fehler.

  9. #6
    Registriert seit
    15.10.2014
    Beiträge
    6
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen Dank für die schnelle Hilfe, konnte die Aufgabe nun lösen.

    Aber es folgen sicher noch einige weitere, bei denen ich ein wenig Hilfe benötige.

    Mein größtes Problem ist verwunderlicherweise nicht, die Funktionsweise zu verstehen, sondern die Umsetzung in den Code, da ich zu diesem Thema weder in der Step 7 Hilfe noch im Internet Beschreibungen finde, die alles für einen absoluten Anfänger verständlich erklärt.
    Aber dieses Forum ist der Hammer´!

    vielen Dank
    Schnabeltiermann

  10. #7
    Registriert seit
    15.10.2014
    Beiträge
    6
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Beziehungsweise bringt mir die extrem umfangreiche Step 7 Hilfe nicht sehr viel, wenn ich absolut kein Plan habe, wonach ich suchen soll....

  11. #8
    Registriert seit
    15.10.2014
    Beiträge
    6
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Propheteus Beitrag anzeigen
    Hallo Schnabeltiermann..
    Du kannst es auch über einen Any Pointer machen..

    Im Temp Bereich den Any Pointer angeben ( Name-Suchen) Datentyp Any

    L W#16#1002 // Typ Byte ( INT )
    T LW 0
    L #I_Anzahl_Byte // Anahl Bytes ( INT )
    T LW 2
    L #I_DB // Quell DB ( INT )
    T LW 4
    L #Suchzeiger // Anfang der Quelle ( DINT )
    SLD 3
    OD DW#16#84000000
    T LD 6

    Das machst du 2 x ( für die Empfangsdaten und für die Sendedaten )
    Dann kannst du das ganze mit dem SFC20 übertragen.

    CALL "BLKMOV"
    SRCBLK :=#Suchen
    RET_VAL:=#retval
    DSTBLK :=#Ablegen


    Viel Spaß beim umsetzen..
    Danke, das werde ich sicher zu einem anderen Zeitpunkt noch brauchen können
    Geändert von Schnabeltiermann (16.10.2014 um 14:48 Uhr)

Ähnliche Themen

  1. Array ohne Pointer übergeben? (SCL)
    Von tahren im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 15.06.2010, 12:08
  2. Antworten: 2
    Letzter Beitrag: 24.12.2009, 22:06
  3. Any-Pointer ohne SFC20 verwenden
    Von RONIN im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 21.10.2009, 23:50
  4. Verwendung eines Any-Pointers im FB
    Von merlin im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 17.04.2007, 21:33
  5. AG_SEND ohne Pointer?
    Von lariamat im Forum Feldbusse
    Antworten: 3
    Letzter Beitrag: 06.09.2006, 20:35

Stichworte

Lesezeichen

Berechtigungen

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