-> 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
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
Zuletzt bearbeitet: