Step 7 REAL im DB

DerMatze

Level-1
Beiträge
525
Reaktionspunkte
21
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
 

Anhänge

  • indirekt speichern.jpg
    indirekt speichern.jpg
    168,6 KB · Aufrufe: 49
Zuletzt bearbeitet:
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:confused:
 

Anhänge

  • indirekt speichern ok.jpg
    indirekt speichern ok.jpg
    170 KB · Aufrufe: 36
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

    [COLOR=#ff0000]  L     #Wert; // Wariable laden und
      T     DBW [#Zeiger]; // auf die entsprechende Adresse abspeichern
[/COLOR]
END:  NOP   0;

Habs mal ROT markiert wo ich meine das der Fehler liegt...
 
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    [COLOR=#ff0000] DBW[/COLOR] [#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???
:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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].
 
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
 

Anhänge

  • funktioniert.jpg
    funktioniert.jpg
    284,7 KB · Aufrufe: 19
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zurück
Oben