Der Wert der Variable welche gelesen wird ist hier im Beispiel 50. Somit müsste die Variable ausg_var_abfr (Ausgangsvariable des Peek Bausteins) doch auch 50 sein wenn ich mich nicht irre.
Dein PEEK Code liest keine Variable sondern den Inhalt eines Speicherbereichs. Wenn Du alles richtig machst, sollte das der Speicher sein, auf dem die von Dir anvisierte Variable liegt. Dein Code liest aber nicht den kompletten Speicherbereich den die REAL-Variable belegt und deshalb erhältst Du auch nicht das erwartete Ergebnis.
Um Missverständnisse zu vermeiden, als Programmierer bitte angewöhnen: Wenn Du von Gleitkommazahlen sprichst, dann schreibe sie auch im Gleitkommazahl-Format mit einem Dezimalpunkt: 50.0
Ich vermute, dass es etwas mit den Datentypen INT und REAL zu tun hat.
Rrrichtig!
Wenn man im Speicher absolut adressiert rumspielen will, dann sollte man sich auch unbedingt mit Datentypen auskennen, weil dann kann das TIA nicht geradebiegen was der ahnungslose Programmierer verbockt.
INT und WORD = 16 Bit groß, REAL = 32 Bit groß - merkst Du was?
Wenn Du eine Gleitkomma/REAL-Variable mit PEEK lesen willst, dann musst Du ein DWord lesen und das Muster des DWord in eine REAL-Variable kopieren, damit das HMI damit klarkommt:
Code:
#dwordVar := PEEK(area := 16#84, dbNumber := "db_diagnose".db_nr, byteOffset := "db_diagnose".byte_offset);
#realVar := DWORD_TO_REAL(#dwordVar);
(für bessere Lesbarkeit und um sicherzugehen, daß der Compiler versteht was man meint, kann man für das
PEEK
auch schreiben
PEEK_DWORD
)
Hinweis: Auch wenn die S7-1500 AWL interpretieren kann, so sollte man neue Programme nicht im veralteten AWL schreiben. Wenn es unbedingt eine Textsprache sein muß, dann besser SCL, da kann TIA zum großen Teil überwachen was der Programmierer treibt.
Harald