Step 7 Pointer ohne Verwendung eines Adressregisters

Beiträge
6
Reaktionspunkte
0
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
 
Zuletzt bearbeitet:
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..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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 :)
 
Zuletzt bearbeitet:
Zurück
Oben