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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Werte mit Pointer aus DB lesen und schreiben, nicht ganz klar

  1. #1
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    wie schon in der Überschrift erwähnt möchte ich in einem FC via Zeiger Werte schreiben und lesen.
    Anbei meine Versuche.
    Versuch 1 funktioniert bis ich an das Ende des DB komme, letzter Zeigerwert stimmt dann nicht mehr?
    Angenommen Startadresse ist 34, Zeiger past bis zum letzten Wert, bei diesem zeigt "er" dann auf 32???
    Versuch 2 sollte doch auch funktionieren, oder?

    Besten Dank schon im Voraus für die Hilfe.

    Code:
    //--- Datenbaustein öffnen
          L     #IN_DBNr
          T     #DB_open
          AUF   DB [#DB_open]
    
    //--- Pointer auf die Anfangsadresse des Datenbausteinbereichs 
          L     #IN_Start_Nr                //Anfangsadresse sprich erster Wert
          SLD   3
          LAR1  
          T     #Zeiger_auf_Wert
    
    // Messwert nach DB schreiben
          L     #Messwert_REAL              // hole umgewandelten Wert
          T     DBD [#Zeiger_auf_Wert]      // schreibe in DB
    
    // Werte aus DB holen Versuch 1
          L     #Zeiger_auf_Wert            // hole Zeiger Wert
          INC   32                               // erhöhe um 4x8 Bit
          T     #Zeiger_auf_Wert            // schreibe Zeiger zurueck
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #GW_Min_Ein                 // schreibe in Temp Variable
    
    // dies wiederholt sich 5x, dann letzter Wert lesen, funktioniert nicht
    
    //10Byte entfernt vom Startwert, zeigt dann auf nicht plausiblen Wert?
          L     #Zeiger_auf_Wert
          INC   80
          T     #Zeiger_auf_Wert
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #Offset_Fuehler
    
    
    
    // Werte aus DB holen Versuch 2
          +AR1  P#4.0                       // erhoehe Zeiger um  4x8 Bit (naechste REAL Zahl)
          T     #Zeiger_auf_Wert            // schreibe auf Zeiger
    
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #GW_Min_Ein                 // schreibe in Temp Variable
    Zitieren Zitieren Werte mit Pointer aus DB lesen und schreiben, nicht ganz klar  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Hallo,
    ab wo genau funktioniert das Ganze nicht mehr ?
    Ist der DB groß genug ?

    Unabhängig davon würde ich allerdings den Code auch etwas anders aufbauen (wegen der Pointer-Geschichte) :
    Code:
    // Werte aus DB holen Versuch 1
          L     #Zeiger_auf_Wert            // hole Zeiger Wert
          L p#4.0
          +D                                // erhöhe um 4x8 Bit
          T     #Zeiger_auf_Wert            // schreibe Zeiger zurueck
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #GW_Min_Ein                 // schreibe in Temp Variable
    
    // dies wiederholt sich 5x, dann letzter Wert lesen, funktioniert nicht
    
    //10Byte entfernt vom Startwert, zeigt dann auf nicht plausiblen Wert?
          L     #Zeiger_auf_Wert
          L p#10.0
          + D
          T     #Zeiger_auf_Wert
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #Offset_Fuehler
    Ist "Zeiger_auf_Wert" ein Doppelwort ?

    Gruß
    Larry

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

    mzva (04.12.2014)

  4. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Ach ja ... diese Sequenz gefällt mir ganz und gar nicht ...
    Code:
    // Werte aus DB holen Versuch 2
           +AR1  P#4.0                       // erhoehe Zeiger um  4x8 Bit (naechste REAL Zahl)
           T     #Zeiger_auf_Wert            // schreibe auf Zeiger
    Mit welchem Grundwert vom AR1 arbeitest du denn da ?

    Gruß
    Larry

  5. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Adressen sind 32-Bit-Werte, INC addiert nur auf die unteren 8 Bit.
    Statt "INC 32" muß P#4.0 +D-addiert werden, statt "INC 80" muß P#10.0 +D-addiert werden.
    Siehe Beitrag #2 von Larry

    PS: Bei speicherindirekter Adressierung braucht man AR1 nicht, das LAR1 ist in dem gezeigten Code überflüssig.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    mzva (04.12.2014)

  7. #5
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Danke für die prompte Hilfe.

    -->ab INC 80 funktioniert es nicht mehr.

    "Zeiger_auf_Wert" ist als DINT deklariert.

    Grundwert sollte, so dachte ich jedenfalls, mein Startwert als Input sein
    Code:
    //--- Pointer auf die Anfangsadresse des Datenbausteinbereichs 
          L     #IN_Start_Nr                //Anfangsadresse sprich erster Wert
          SLD   3
          LAR1  
          T     #Zeiger_auf_Wert

  8. #6
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Verstehe wohl das mit den AR nicht. Ich brauche dann das LAR1 nicht, den Zeiger mache ich ausschliesslich mit SLD3.

    Code:
    //--- Pointer auf die Anfangsadresse des Datenbausteinbereichs 
          L     #IN_Start_Nr                //Anfangsadresse sprich erster Wert
          SLD   3
          LAR1  
          T     #Zeiger_auf_Wert

  9. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Nein ... das AR1 brauchst du an dieser Stelle (WEIL du ja nur mit der Variablen arbeitest) nicht.
    Der Befehl ist also hier überflüssig.

    Gruß
    Larry

    Nachsatz :
    Funktioniert denn dein Code jetzt (nach den von mir vorgeschlagenen Änderungen) ?

  10. #8
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    bin heute auf einer anderen Baustelle (Saia), Feedback werde ich morgen geben. Danke nochmal

  11. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Zitat Zitat von mzva Beitrag anzeigen
    Verstehe wohl das mit den AR nicht. Ich brauche dann das LAR1 nicht, den Zeiger mache ich ausschliesslich mit SLD3.
    In Step7 AWL gibt es "registerindirekte Adressierung" und "speicherindirekte Adressierung".
    (siehe Hilfe zu AWL > Index > Indirekte Adressierung)

    Bei der registerindirekten Adressierung werden die Adressregister AR1 und AR2 als Pointer benutzt. Diese Variante ist nicht so übersichtlich, kann aber ohne den Pointer zu ändern zusätzliche Offsets zum Pointer berechnen.

    Bei der speicherindirekten Adressierung werden Speichervariablen (z.B. LD... oder MD...) als Pointer benutzt. Die Adressregister werden nicht verwendet. Diese Variante halte ich für sehr viel übersichtlicher (die Variablen können symbolische Namen haben) und es kann mit mehr als 2 Pointern ohne Umladen gearbeitet werden.

    Das "SLD 3" wird bei beiden Varianten benötigt um aus einer Bytenummer eine Adresse im Pointerformat P#Byte.Bit zu machen.

    Die beiden Varianten kann man gemischt verwenden, sie funktionieren unabhängig voneinander und beeinflussen sich nicht.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  12. #10
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen zusammen,

    die indirekte Adressierung funktioniert, aber nur wenn ich den FC einmal aufrufe.
    Ich möchte den FC mehrmals aufrufen und mit verschiedenen Startwerten belegen.
    Wo ist der "Haken"?

    Gruss

Ähnliche Themen

  1. Variablen schreiben und lesen aus TwinCat3-Projekt
    Von patzer103040 im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 08.04.2013, 12:11
  2. Daten aus S7 lesen und schreiben
    Von pat125 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 01.11.2011, 19:35
  3. Libnodave C# - WORD und STRING aus S7 lesen/schreiben
    Von dolo280 im Forum Hochsprachen - OPC
    Antworten: 10
    Letzter Beitrag: 13.01.2011, 12:04
  4. Merkerwörter mit C# und Libnodave aus SPS lesen und schreiben
    Von Red-Sh4nks im Forum Hochsprachen - OPC
    Antworten: 14
    Letzter Beitrag: 04.06.2010, 15:10
  5. Antworten: 4
    Letzter Beitrag: 01.09.2008, 12:45

Lesezeichen

Berechtigungen

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