Step 7 Auslesen Array aus DB über zwei Funktionen (ANY-Zeiger und Blkmov)

Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

ich habe ein Problem bzw. der folgende Code verursacht ein Problem:
Code:
//Quelle
      L     P##Datenholen               //relative Adresse #Datenholen in dieser Instanz (DI)
      TAR2                              //Lade Adressregister2 mit Offset dieser Multiinstanz (DB) in Akku1
      UD    DW#16#FFFFFF                //Bereichskennung (DB) ausblenden
      +D                                //Addiere
      LAR1                              //Lade AR1 mit Inhalt von Akku1: absolute Adresse #Datenholen im IDB (DI)

      LAR2  P##Quelle                   //Lade AR2 mit Adresse des TEMP-ANY #Quelle
      L     DID [AR1,P#0.0]             //S7-ID 16#10 + Datentyp + Wiederholfaktor aus #Datenholen
      T     LD [AR2,P#0.0]              //schreibe in den ANY #Quelle
      L     DIW [AR1,P#4.0]             //Lade DB-Nummer aus #Datenholen
      T     LW [AR2,P#4.0]              //schreibe in den ANY #Quelle
      L     DID [AR1,P#6.0]             //Lade Bereichsadresse aus #Datenholen
      T     LD [AR2,P#6.0]              //schreibe in den ANY #Quelle


Ich nutze Blockmove um mit Any-Zeigern die Eingangswerte (Von den Eingänge in meim DB) in meine Funktion zu kopieren. Das funktioniert gut soweit.
Hierbei gebe ich als IN-Parameter an meinem FB die Variable "Start_EA" als INT Wert an. Diese Startadresse, ist zb 200.
Die selbe Startadressen wird auch beim Ausgangsdaten schreiben (von DB auf Ausgänge) genutzt.

Nach dem der gepostet Code aber abläuft steht in meiner Variable "Start_EA" ist 0. Quasi verliert durch den Code die Variable ihren Wert.
Weiß da jemand einen Rat?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast also zuerst den geposteten Code und danach willst Du den IN-Parameter "Start_EA" laden und da ist der 0?
Leider zeigt Dein Codeausschnitt gerade nicht die problematische Stelle - doch kann es sein, daß Du das AR2 nicht wiederhergestellt hast?
Lese Dir nochmal die Codebeispiele in den Beiträgen #17 bis #20 durch, da steht sehr oft "LAR2 #SaveAR2 //AR2 wiederherstellen für Zugriff auf Instanz-Variable", z.B.:
Es soll auf eine Instanzvariable zugegriffen werden, dazu muß in AR2 der originale Instanzoffset stehen.
Siehe meinen Kommentar: "LAR2 #SaveAR2 //AR2 wiederherstellen für Zugriff auf Instanz-Variable"

Nochmal ausführlich: in FB enthält AR2 den Multiinstanz-Offset zum Anfang des Instanz-DB, damit der FB seine Instanzvariablen adressieren kann. Der Step7-Compiler verläßt sich darauf, daß AR2 auf den Anfang der Instanz zeigt! Siemens schreibt irgendwo, daß man in FB das AR2 nicht verändern darf. Nun - man kann AR2 verändern, wenn man weiß was man tut und dafür sorgt, daß AR2 an bestimmten Stellen wieder seinen originalen Inhalt hat - nämlich bei jedem direkten Zugriff auf Instanzvariablen (IN/OUT/IN_OUT/STAT). Da benutzt der Compiler unsichtbar das AR2 für den Zugriff auf die Instanzvariablen, da macht er ungefähr die gleiche Berechnung wie die ersten 5 Zeilen in Deinem Code.

Tip: wenn man mit indirekter Adressierung rummacht, dann ist es besonders wichtig, daß man weiß wie man zur Kontrolle und zum Debugging das Programm in der CPU oder in PLCSIM beobachtet. Da muß man sich auch mal den Inhalt der Adressregister und der DB-Register ansehen und checken, ob das auch die richtigen Werte sind. Dazu beim Beobachten einen Rechtsklick auf die Statusspalten (VKE, STA, AKKU1) klicken > Einblenden > das gewünschte anklicken

Durch unkontrollierte indirekte Adressierung kann man sich ALLE möglichen Variablen überschreiben, was die tollsten Fehlereffekte hervorruft und wo die Ursache sehr schwer zu finden ist. Indirekte Adressierung lieber einmal mehr kontrollieren als zuwenig.

Harald
 
Danke für die Antwort, Harald.
Nein, das Wiederherstellen war drin ABER auskommentiert. Glaube hier hat noch ein anderer an meiner Funktion rumgespielt. Gestern beim Fehlersuchen habe ich das nicht gleich gesehen und hätte auch nicht gedacht, dass es daran lag da es noch bis Freitag funktionierte.
Beim Simulieren sieht man es genauso wie bei der CPU,nur ohne das man die Anlage abschiest :D Danke dir :)

Ergo, könnte ich mir auch merken nach jeder Pointer Nutzung Wiederherstellen von AR1 und AR2 ausführen?!
 
Zuletzt bearbeitet:
Zurück
Oben