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

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 24 von 24

Thema: Auslesen Array aus DB über zwei Funktionen (ANY-Zeiger und Blkmov)

  1. #21
    UsernameS7 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.11.2014
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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?

  2. #22
    UsernameS7 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.11.2014
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    EDIT: Doppelpost

  3. #23
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    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.:
    Zitat Zitat von PN/DP Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #24
    UsernameS7 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.11.2014
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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 Danke dir

    Ergo, könnte ich mir auch merken nach jeder Pointer Nutzung Wiederherstellen von AR1 und AR2 ausführen?!
    Geändert von UsernameS7 (09.12.2014 um 07:38 Uhr)

Ähnliche Themen

  1. Index aus Array auslesen
    Von heri1980 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.09.2010, 14:54
  2. Datenbereich über ANY Zeiger aus DB holen
    Von Temotec im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 21.06.2009, 21:42
  3. Float aus Byte-Array auslesen
    Von Joe im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 07.07.2008, 12:09
  4. Block_DB über zwei funktionen weiterreichen
    Von plant1 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 13.08.2006, 15:17
  5. Wert mit Zeiger aus DB auslesen
    Von mst im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 03.03.2006, 20:20

Lesezeichen

Berechtigungen

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