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

Ergebnis 1 bis 10 von 10

Thema: REAL im DB

  1. #1
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,

    es gibt beim Speichern von REAL Werten irgendwie Darstellungsprobleme.
    Beschreibng:
    es werden REAL Werte in einen DB gespeichert, dabei wird das weiterzählen der Doppelworte mit einem Pointer realisiert. Das funktioniert soweit auch.

    Das Problem:
    die Werte werden nicht im REAL Format gespeichert / angezeigt. Da irrwitzige dabei ist, das es mal funktioniert hat. Am FC der das Speichern übernimmt wurde "eigentlich" nix verändert...?!
    Auf dem angefügten Bild soll im DBD 2 bzw. DBD6 die 498.765 (PLCSIM MD60) gespeichert werden. Gespeichert wird aber nur "Schrott". Als es noch funktioniert hat, wurde auch die 498.765 im DBD2 angezeigt.
    Was kann ich tun?

    Vielen Dank

    Gruß
    DerMatze

    generierte AWL-Quelle des FCs
    Code:
    FUNCTION "FC_Energiewert_Speichern" : VOID
    TITLE =Zaehlerstände Speichern
    AUTHOR : 
    VERSION : 0.1
    
    
    VAR_INPUT
      Initialisieren : BOOL ;    //Initialisierung
      Startmonat_setzen : BOOL ;    //Startmonat setzen
      aktuellMonat : BYTE ;    //laufender Monat, wenn Initialisierung erfolgte
      Speichern : BOOL ;    //Speichern
      DB_Nr : INT ;    //Datenbaustein 
      Wert : REAL ;    //aktueller Wert
    END_VAR
    VAR_OUTPUT
      Speicher_Voll : BOOL ;    
    END_VAR
    VAR_TEMP
      DBNr : INT ;    //DB Nummer für Pointer
      Zeiger : DWORD ;    //Datenformat Pointer
      Schleife : INT ;    //Schleifenzähler
      DB_VOLL : BOOL ;    //maximale Anzahl an Speicherungen ist erreicht
    END_VAR
    BEGIN
    NETWORK
    TITLE =DB aufschlagen und #Zeiger initialisieren
    
          L     #DB_Nr; // Nummer des DBs
          T     #DBNr; // in Temp Variable transferieren
    
          AUF   DB [#DBNr]; // geforderten DB aufschlagen
          L     P#0.0; // Pointerformat für 
          T     #Zeiger; // Variable festlegen
    
          L     DBLG; // Datenbausteinlänge lesen
          L     2; // die ersten zwei Bytes
          -I    ; // abziehen
          L     4; // weil es nur 12 Speicherablagen sind, aber 48Bytes
          /I    ; // die Bausteinlänge vierteln
          T     DBB    0; // Ergebnis merken
    NETWORK
    TITLE =Multiplikator für Speicheroffset manuell zuweisen
    //Wenn eine Initialisierung durchgelaufen ist, kann hier der Multiplikator (DBB1) 
    //gesetzt werden, damit die Daten in das korrekte Doppelword transferiert werden 
    //können
    //Dabei muss berücksichtigt werden, dass im Netzwerk 4 der Multiplikator um 1 
    //erhöht wird! --> Alos hier erstmal einen Abziehen...
          U     #Startmonat_setzen; // soll der Multiplikator
          SPBN  NIX; // gesetzt werden?
    
          L     #aktuellMonat; // Eingabe laden
          L     1; // hier erstmal -1
          -I    ; // gerechnet werden
          T     DBB    1; // transferieren
    
    NIX:  NOP   0; 
    NETWORK
    TITLE =IST / MAX Vergleich
    
          L     DBB    1; // IST Datensatz Anzahl
          L     DBB    0; // MAX Datensatz Anzahl
          >=I   ; 
          =     #DB_VOLL; 
          S     #Speicher_Voll; 
    NETWORK
    TITLE =Werte speichern
    
          U     #Speichern; // ?
          UN    #Speicher_Voll; 
          SPBN  END; // nein, dann Sprung nach END
    
          U     #DB_VOLL; // Variable = 1?
          SPB   M001; // ja, Sprung nach M001
    
          L     DBB    1; // IST
          L     1; // um 1 erhöhen
          +I    ; 
          T     DBB    1; // IST = Multiplikator für Speicherbereich
          SPA   M002; 
    
    M001: L     1; // wenn Variable "Voll" = 1
          T     DBB    1; // dann IST mit "1" initialisieren
          SPA   M002; 
    
    M002: L     P#4.0; // Offset mit
          L     DBB    1; // IST = Multiplikator für Speicherbereich
          *D    ; // multiplizieren
          T     #Zeiger; // Startadresse
    
          L     #Wert; // Wariable laden und
          T     DBW [#Zeiger]; // auf die entsprechende Adresse abspeichern
    
    END:  NOP   0; 
    
    NETWORK
    TITLE =Schleife
    
          U     #Initialisieren; // ?
          SPBN  END2; // nein, Sprung nach END2
    
          R     #Speicher_Voll; 
    
          L     0; 
          T     DBB    1; // IST löschen
    
          L     P#4.0; // Pointer
          T     #Zeiger; // Startadresse
    
          L     DBB    0; // Maximale Anzahl der zu speichernden Gewichte
    LAUF: T     #Schleife; // Schleifendurchläufe
    
          L     0; // Zeiger
          T     DBW [#Zeiger]; // initialisieren
    
          L     #Zeiger; // zum Zeiger
          L     P#4.0; // Offest
          +D    ; // addieren
          T     #Zeiger; // nächster Speicherort
          L     #Schleife; // dec Schleifendurchläufe
          LOOP  LAUF; // Schleife durchlaufen bis Variable "Schleife" = 0
    
    END2: NOP   0; 
    
    
    END_FUNCTION
    Angehängte Grafiken Angehängte Grafiken
    Geändert von DerMatze (03.12.2013 um 13:26 Uhr)
    -----------------------------------------------------------------------------------------
    Programmierumgebung: Step 7 V5.5 + SP3
    WinCC flexible 2008 Advanced + SP3
    -----------------------------------------------------------------------------------------
    Zitieren Zitieren REAL im DB  

  2. #2
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard

    Code:
          L     #Wert; // Wariable laden und
          T     DBW [#Zeiger]; // auf die entsprechende Adresse abspeichern
    Hast Du schon versucht den REAL Wert in ein DBD zu speichern?
    Das Grauen lauert in der Zwischenablage !!

  3. #3
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Danke für den Tipp. Soweit so gut, der Fehler liegt wohl doch irgendwo im FC, da der REAL Wert auch nicht so wie ich es brauche abgespeichert wird...?!

    Anbei ein Bild auf dem ist der DB zu sehen, als es noch funktionierte
    Angehängte Grafiken Angehängte Grafiken
    -----------------------------------------------------------------------------------------
    Programmierumgebung: Step 7 V5.5 + SP3
    WinCC flexible 2008 Advanced + SP3
    -----------------------------------------------------------------------------------------

  4. #4
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard

    Code:
    NETWORK
    TITLE =Werte speichern
    
          U     #Speichern; // ?
          UN    #Speicher_Voll; 
          SPBN  END; // nein, dann Sprung nach END
    
          U     #DB_VOLL; // Variable = 1?
          SPB   M001; // ja, Sprung nach M001
    
          L     DBB    1; // IST
          L     1; // um 1 erhöhen
          +I    ; 
          T     DBB    1; // IST = Multiplikator für Speicherbereich
          SPA   M002; 
    
    M001: L     1; // wenn Variable "Voll" = 1
          T     DBB    1; // dann IST mit "1" initialisieren
          SPA   M002; 
    
    M002: L     P#4.0; // Offset mit
          L     DBB    1; // IST = Multiplikator für Speicherbereich
          *D    ; // multiplizieren
          T     #Zeiger; // Startadresse
    
          L     #Wert; // Wariable laden und
          T     DBW [#Zeiger]; // auf die entsprechende Adresse abspeichern
    
    END:  NOP   0;
    Habs mal ROT markiert wo ich meine das der Fehler liegt...
    Das Grauen lauert in der Zwischenablage !!

  5. Folgender Benutzer sagt Danke zu dtsclipper für den nützlichen Beitrag:

    DerMatze (03.12.2013)

  6. #5
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Standard

    AHA! Da hat sich der Fehlerteufel versteckt. Danke für die Hilfe, hab ich total übersehen.

    Eine Frage noch, im Folgenetzwerk
    Code:
    NETWORK
    TITLE =Schleife
    
          U     #Initialisieren; // ?
          SPBN  END2; // nein, Sprung nach END2
    
          R     #Speicher_Voll; 
    
          L     0; 
          T     DBB    1; // IST löschen
    
          L     P#4.0; // Pointer
          T     #Zeiger; // Startadresse
    
          L     DBB    0; // Maximale Anzahl der zu speichernden Gewichte
    LAUF: T     #Schleife; // Schleifendurchläufe
    
          L     0; // Zeiger
          T     DBW [#Zeiger]; // initialisieren
    
          L     #Zeiger; // zum Zeiger
          L     P#4.0; // Offest
          +D    ; // addieren
          T     #Zeiger; // nächster Speicherort
          L     #Schleife; // dec Schleifendurchläufe
          LOOP  LAUF; // Schleife durchlaufen bis Variable "Schleife" = 0
    
    END2: NOP   0;
    wird wieder mit DBW gearbeitet, ist das so richtig???
    -----------------------------------------------------------------------------------------
    Programmierumgebung: Step 7 V5.5 + SP3
    WinCC flexible 2008 Advanced + SP3
    -----------------------------------------------------------------------------------------

  7. #6
    Registriert seit
    11.09.2007
    Ort
    Suedwestpfalz
    Beiträge
    917
    Danke
    81
    Erhielt 209 Danke für 192 Beiträge

    Standard

    Ich denke mal Du redest von o.A. DB.

    Schau Dir den mal genau an.

    Der erste Speicherwert fängt bei 2 an und ist ein REAL.

    Also denke ich mal der erste Zeigerbesatz sollte P#2.0 lauten und dann L 0.0 T DBD[Zeiger].
    Das Grauen lauert in der Zwischenablage !!

  8. #7
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Zitat Zitat von dtsclipper Beitrag anzeigen
    o.A. DB.


    Ja irgendwie scheint da noch ein Versatz drin zu sein.
    Bin grad aum Archive durchsuchen, mal sehen ob ich den Baustein finde wo es noch funktioniert hat...
    -----------------------------------------------------------------------------------------
    Programmierumgebung: Step 7 V5.5 + SP3
    WinCC flexible 2008 Advanced + SP3
    -----------------------------------------------------------------------------------------

  9. #8
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Idee

    So!
    Ich habe versucht die Startadresse auf P#2.0 zu setzen und dann um P#4.0 das Offset drauf --> speichern n.i.O
    Dann den Baustein gemäß Beitrag #1 wieder hergestellt, allerdings unter Verwendung von DBD anstatt DBW. Den DB mit zwei weiteren Bytes als Dummy erweitert, somit ist der erste Speicherort auf DBD4.
    Und siehe da, es geht?!
    Es muss doch mit der Startardesse P#2.0 und ohne die beiden "Dummybytes" auch funktionieren?
    Hab ich noch etwas übersehen?

    Gruß
    DerMatze
    Angehängte Grafiken Angehängte Grafiken
    -----------------------------------------------------------------------------------------
    Programmierumgebung: Step 7 V5.5 + SP3
    WinCC flexible 2008 Advanced + SP3
    -----------------------------------------------------------------------------------------

  10. #9
    Registriert seit
    14.10.2010
    Ort
    Telgte
    Beiträge
    655
    Danke
    97
    Erhielt 129 Danke für 99 Beiträge

    Standard

    Code:
    M002: L     P#4.0; // Offset mit
          L     DBB    1; // IST = Multiplikator für Speicherbereich
          *D    ; // multiplizieren
          T     #Zeiger; // Startadresse
    Hi Matze,
    in diesen Zeilen überschreibst du die zuvor eingestellte Startadresse grundsätzlich auf das 4te Byte.
    Deshalb wird es egal sein welche Startadresse du derzeit definierst.

    Gruß, Toki
    Programmierumgebung: Step7 V5.5, WinCCflex2008-SP3, TIA-PortalV13, MicroWinV4.0

  11. Folgender Benutzer sagt Danke zu Toki0604 für den nützlichen Beitrag:

    DerMatze (05.12.2013)

  12. #10
    DerMatze ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.01.2012
    Beiträge
    511
    Danke
    92
    Erhielt 21 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Toki0604,

    ich habe es bis auf weiteres bei den beiden Dummybytes belassen - funktioniert ja nun so

    Gruß
    DerMatze
    -----------------------------------------------------------------------------------------
    Programmierumgebung: Step 7 V5.5 + SP3
    WinCC flexible 2008 Advanced + SP3
    -----------------------------------------------------------------------------------------

Ähnliche Themen

  1. DT-> real
    Von siqo im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 20.06.2011, 23:10
  2. Real --> Int
    Von cyrix im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 21.10.2010, 10:22
  3. Addieren Real
    Von Emilio im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 21.12.2007, 13:37
  4. Integer to Real
    Von sweber im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 13.12.2006, 16:49
  5. Real zu Int
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 26.01.2006, 13:43

Lesezeichen

Berechtigungen

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