TIA Statusabfrage absoluter Adressen

Christoph12345

Level-2
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo erstmal,

Bin erst neu hier und hätte eine Frage.

Ist es möglich, in einem SCL Code mittels absoluter Adressen den Status einer Variable auszulesen?
Hierbei verwende ich Tia Version 16, HMI Runtime advanced und die CPU 1515-2PN

Bin über jede Hilfe dankbar,
Christoph
 
Siehe die TIA Hilfethemen "Grundlagen zur indirekten Adressierung (S7-1200, S7-1500)" und "Variablen in globalen Datenbausteinen adressieren", und falls Du auch noch variabel indirekt adressieren willst die Anweisungen PEEK/PEEK_BOOL/POKE/POKE_BOOL.
Code:
%DB9.DBX1.0 := %DB17.DBX16.0 ;

Harald
 
Zuletzt bearbeitet:
Danke Harald,

bin jetzt schon sehr weit gekommen. Derzeit lese ich mit der PEEK Funktion die gewünschten Adressen des DB's aus und möchte die Werte danach anschließend in einem E/A- Feld anzeigen lassen.
Die PEEK Funktion funktioniert schon. Hierbei bekomme ich Werte wie 16#454B zum Beispiel. Würde diese aber gerne in einer Dezimaldarstellung anzeigen lassen, was aber irgendwie nicht möglich ist bzw. die Dezimalzahl im E/A- Feld nicht mit dem Wert der ausgelesenen Variable übereinstimmt. Falls jemand diesbezüglich noch eine Idee oder einen Tipp hätte, wäre ich sehr froh.

Christoph
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die PEEK Funktion funktioniert schon. Hierbei bekomme ich Werte wie 16#454B zum Beispiel. Würde diese aber gerne in einer Dezimaldarstellung anzeigen lassen, was aber irgendwie nicht möglich ist bzw. die Dezimalzahl im E/A- Feld nicht mit dem Wert der ausgelesenen Variable übereinstimmt.
"Irgendwie" ist es immer möglich den Wert einer Variable dezimal anzeigen zu lassen...
16#454B = 17739

Beobachtest Du auch die selbe Variable wie das Ergebnis der PEEK-Funktion bzw. wird das Ergebnis dann auch in die HMI-Variable kopiert, die im EA-Feld verwendet wird? Hast Du mal Bilder von Deinen irgendwie falschen Beobachtungen und den Einstellungen der HMI-Variable (Adresse, Datentyp, ...) und dem EA-Feld?

Harald
 
Mir ist gerade aufgefallen, dass die Umrechnung zu der Dezimalschreibweise klappt. 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. Ich vermute, dass es etwas mit den Datentypen INT und REAL zu tun hat.

Gruß
Christoph

PEEK Programmbaustein1628665401736.png
Variable in der Datenbank (dieser Variablenwert wird ausgelesen)
1628665454478.png
Tag_Result/ Variable des Peek Ausgangs
1628665732222.png
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
Zurück
Oben