Step 7 Verständnis indirekte Adressierung

stepper7

Level-2
Beiträge
245
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich muss eine Programmänderung machen und versuche gerade ein Programm zu verstehen was schon etwas älter ist.
In diesem Programm wurde viel mit indirekter Adressierung programmiert und ich tue mich ehrlich gesagt noch etwas schwer damit.
Solche Programme finde ich sehr schwer zu verstehen, weil ich selber nicht so programmiere.
Kann mir da jemand einen Tip zu diesen Programmauszug geben ?
Und zwar was ich nicht verstehe ist, wie hier die Adressierung DIX und DIB funktioniert.
Was macht DIX und DIB in diesem Programmbeispiel ? Wird da direkt auf ein Adressregister zugegriffen oder auf ein DB der geöffnet ist.

Hier wird der FC "S_FC Logistic" aufgerufen, soweit OK !

Code:
LOG1: CALL  "S_FC LOGISTIC"       
MOBY_DBNR:=#MobyDBNO

      U     DIX   51.0                  // Weg gerade
      U     DIX   60.4                  // Page1 gerade
      O(    
      U     DIX   51.1                  // Weg Umkehr
      U     DIX   60.5                  // Page1 Umkehr
      )     
      O(    
      U     DIX   51.2                  // Weg rechts
      U     DIX   60.6                  // Page1 rechts
      )     
      O(    
      U     DIX   51.3                  // Weg links
      U     DIX   60.7                  // Page1 links
      )     
      R     DIX   51.5                  // Prozessbit
      R     DIX   51.0                  // Weg gerade
      R     DIX   51.1                  // Weg Umkehr
      R     DIX   51.2                  // Weg rechts
      R     DIX   51.3                  // Weg links
      S     DIX   31.2                  // Schritt 2
      SPB   ST3E
      SET   
      S     DIX   31.4                  // Schritt 4

In dem FC "S_FC Logistic" ist folgender Code enthalten:
Hier verstehe ich nicht woher der Wert kommt der z.b in DIB 65 steht.

Code:
     L     #MOBY_DBNR      
     T     #MOBY_DBNO
     AUF   DB [#MOBY_DBNO]


      L     DBB  201                    // gelesenes Ziel
      T     #READ_TARGET


// Gerade gleich


      ON    DIX   60.0                  // Projektiert
//    ON    DIX   61.0                  // Anwahl
      SPB   NEX1


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   65                    // gleich gerade 1
      ==I   
      SPB   STRA


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   66                    // gleich gerade 2                 
      ==I   
      SPB   STRA


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   67                    // gleich gerade 3
      ==I   
      SPB   STRA


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   68                    // gleich gerade 4
      ==I   
      SPB   STRA


// Umkehr gleich


NEX1: ON    DIX   60.1                  // Projektiert
//    ON    DIX   62.0                  // Anwahl
      SPB   NEX2


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   71                    // gleich Umkehr 1
      ==I   
      SPB   TURN


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   72                    // gleich Umkehr 2
      ==I   
      SPB   TURN


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   73                    // gleich Umkehr 3
      ==I   
      SPB   TURN


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   74                    // gleich Umkehr 4
      ==I   
      SPB   TURN


// Rechts gleich


NEX2: ON    DIX   60.2                  // Projektiert
//    ON    DIX   63.0                  // Anwahl
      SPB   NEX3


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   77                    // gleich rechts 1 
      ==I   
      SPB   RIGH


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   78                    // gleich rechts 2
      ==I   
      SPB   RIGH


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   79                    // gleich rechts 3
      ==I   
      SPB   RIGH


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   80                    // gleich rechts 4
      ==I   
      SPB   RIGH


// Links gleich


NEX3: ON    DIX   60.3                  // Projektiert
//    ON    DIX   64.0                  // Anwahl
      SPB   NEX4


      L     #READ_TARGET                // gelesenes Ziel
      L     DIB   83                    // gleich links 1 
      ==I   
      SPB   LEFT

Danke
LG
 
Zuletzt bearbeitet:
Hallo Stepper,

das Hier wird auf einen DB der als Instanz DB aufgerufen aufgeschlagen ist zugegriffen.
Nachdem du Schreibst das hier es lauter Fc s sind wird das Di Register nicht vom Aufruf Selbständig geschrieben. Wird der Fc öfter aufgerufen? Wenn nicht dann wäre es wohl das einfachste in der online Ansicht das Instansdb Register per Rechtsklick auf die aktualwerte in der Awl Ansicht einzublenden.

Du könntest auch mal schauen gibt es irgendwo den Befehl „auf di“

Die Begriffe DIB DIX DID DIW stehen als Bondow zu DBW DBD DBX nur das hier auf das Datenbaustein Register zugegriffen wir mit Auf DB aufgerufen.

Gruß Tia
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah verstehe es wird also auf den aufgerufen Instanz DB damit zugegriffen.
Ist praktisch das selbe wie DBW DBD DBX nur das hier auf einen Instanz DB zugegriffen wird der vorher AUF gemacht wurde.
Ist das richtig ? Dann hab ich diese Schreibweise verstanden.
 
Hallo Stepper

ja ja genau im Normalfall wird er per Auf DI aufgerufen es könnte aber auch der IDB des zuletzt ausgerufenen FB sein. Wie gesagt du kannst dir in der Online Ansicht das Register einblenden und die Zahl anschauen auf welchen DB zugegriffen wird.
Wie gesagt es muss nicht zwingend ein IDB aufgerufen werden es kann auch ein Normaler DB sein es wir wie gesagt nur mit den anderen befehlen mit I im Nahmen zugegriffen wird.


MIt freundlichen grüßen Tia
 
... Wie gesagt es muss nicht zwingend ein IDB aufgerufen werden es kann auch ein Normaler DB sein es wir wie gesagt nur mit den anderen befehlen mit I im Nahmen zugegriffen wird. ...
Es ist zwar schon ein paar Jahre her, dass ich mit S7 gearbeitet habe, aber ich kann mir absolut nicht vorstellen, dass die damals klare Unterscheidung zwischen DB und DI von heutigen Steuerungen tatsächlich sooo lasch gehandhabt werden soll!? Das wäre der Hammer, wenn S7 in dieser Beziehung nicht-aufwärtskompatibel erweitert worden wäre.
Gruss, Heinileini
PS: Ich könnte mir allenfalls vorstellen, dass mittlerweile der Begriff "InstanzDB" leichtsinnigerweise an Bedeutung(sVielfalt) zugenommen hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
viele kümmern sich tatsächlich nicht darum, ob das nun IDB oder DB ist. Wenn man beispielsweise etwas via indirekter Adressierung von einem DB in einen anderen schreiben will, dann braucht man beide Adressregister. Und manche Programmierer haben dann einfach den einen DB via AUF DB und den zweiten via AUF DI geöffnet und dann solche Sachen wie:
U DBX 0.0
= DIX 0.0
umgeladen.
Das hab ich schon recht häufig gesehen.
 
In einem FC ist es egal, ob man auf einen DB über das DB-Register oder das DI-Register zugreift. Wenn man effizient indirekt abwechselnd auf 2 DB zugreifen will, dann ist das zugreifen via erstens DB-Register und zweitens DI-Register ganz legitim und auch so vorgesehen.
ABER: an einen FC einen geöffneten DB via DI-Register übergeben ist meiner Meinung nach schon ziemlich unsaubere Programmierung. Und wenn wirklich unbedingt nötig, dann sollte das deutlich kommentiert sein.

Harald
 
In einem FC ist es egal, ob man auf einen DB über das DB-Register oder das DI-Register zugreift. Wenn man effizient indirekt abwechselnd auf 2 DB zugreifen will, dann ist das zugreifen via erstens DB-Register und zweitens DI-Register ganz legitim und auch so vorgesehen.
ABER: an einen FC einen geöffneten DB via DI-Register übergeben ist meiner Meinung nach schon ziemlich unsaubere Programmierung. Und wenn wirklich unbedingt nötig, dann sollte das deutlich kommentiert sein.

Harald
Ich wollte das auch nicht verteufeln :)
Bin da vollkommen bei dir. Wenn man weis was man da tut und die Nachwelt darüber unterrichtet finde ich das auch absolut legitim.
 
Zurück
Oben