TIA TIA Speicherzugriff

sensei

Level-2
Beiträge
43
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein Problem, dass ich rasch lösen muss. Deshalb fahre ich zweigleisig, frage hier und versuche selbst weiter.

Ich möchte eine Funktion schreiben der ein LReal z.B. %ID18 übergeben wird. In der Funktion möchte ich dann auf die Bytes der LReal zugreifen. Ich habe mir das so vorgestellt,
dass ich ein Byte Array erstelle und das Array den gleichen Speicherbereích abdeckt wie die LReal. Also das erste Arrayelement liegt auf dem 'Speicheranfang' der LReal. Aber wie realisiere ich das ?
In C++ wüsste ich wie das geht aber bei der SPS Programmierung habe ich das noch nicht gebraucht. Ich hoffe ihr könnt mir helfen.
TIA Protal V14, SCL, S7 1515 -2.

Vielen Dank für die Unterstützung.

Gruß
Dirk
 
Hallo, was bedeutet ID18 ? Was hast du eigentlich vor? Du könntest eine AT-Sicht oder Deserialize verwenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit der Funktion "Serialize" ist das möglich, zu finden unter "Einfache Anweisungen" -> Verschieben.
Ein LReal besitzt übrigens 8 Bytes, %ID18 adressiert aber nur 4 Bytes, das würde dann für ein Real-Datentyp sprechen.
Serialize kann aber mit beiden Typen umgehen.
 
Ich habe mir das so vorgestellt,
dass ich ein Byte Array erstelle und das Array den gleichen Speicherbereích abdeckt wie die LReal. Also das erste Arrayelement liegt auf dem 'Speicheranfang' der LReal. Aber wie realisiere ich das ?
In C würdest Du das mit einer Union lösen - in SCL entspricht das AT-Konstrukt der Union. Das geht allerdings nicht mit "optimiertem" Speicher.

Einfacher: Slice-Zugriffe (siehe TIA-Hilfe) Die sollten auch für LREAL/LWORD gehen.
Code:
Byte_0 := LREAL_TO_LWORD(IN_REAL).%B0 ;
Byte_1 := LREAL_TO_LWORD(IN_REAL).%B1 ;
..
Byte_7 := LREAL_TO_LWORD(IN_REAL).%B7 ;

PS: hat man in TIA V15.1 die in TIA V13 eingeführte Schreibweise mit "%" ("Engine".Speed.%B0) wieder abgeschafft, oder wieso schreibt die TIA-V15.1-Hilfe als Beispiel "Engine".Speed.B0 (ohne %)? :confused:

Harald
 
Zuletzt bearbeitet:
Harald war schneller...... :-)

eine temporäre LWord variable anlegen und mit LREAL_TO_LWord explizit konvertieren/Casten
Anschließend kann man mit slicen auf die einzelnen Bytes zugreifen --> .%B0 - .%B7
der direkte Zugriff hinter dem Cast funktioniert meines wissen nach nicht :-(

Wenn es im Gleichen Speicher sein soll geht es nur mit der AT Sicht und einem Nicht optimierten Baustein meins Wissens nach

Die Variant mit dem Byte Array geht auch, dafür gibt es den Serialize Befehl,
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
... in SCL entspricht das AT-Konstrukt der Union. Das geht allerdings nicht mit "optimiertem" Speicher.
Ach, Harald, Du provozierst das doch mit Absicht...
:-P



Wenn es im Gleichen Speicher sein soll geht es nur mit der AT Sicht und einem Nicht optimierten Baustein meins Wissens nach
Geht auch optimiert im FB mit der Remanenzeinstellung "Im IDB setzen". :D
Auch wenn es dann intern vermutlich nicht mehr wirklich optimiert ist.
 
In C würdest Du das mit einer Union lösen - in SCL entspricht das AT-Konstrukt der Union. Das geht allerdings nicht mit "optimiertem" Speicher.
In C ist das Verwenden einer union dafür schlechter Stil, weil es je nach C-Standard compilerabhängig ist ob das funktioniert. Soweit ich weiß ist das Verhalten nur nach Standard C99 eindeutig definiert, davor nicht und danach mit C11 nicht.
 
Ach hucki,

angenommen der Fragesteller erstellt sich einen "optimierten" FC für die Byte-Zerlegung (und möchte das LREAL aus "optimiertem" Speicher übergeben): Kann man für den FC-IN-Parameter "Im IDB setzen" einstellen? (damit man da ein AT mit einem Array machen kann) :p

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In C ist das Verwenden einer union dafür schlechter Stil, weil ...
Die Union habe ich erwähnt, weil der Fragesteller die vermutlich kennt. Ich wollte ihm lediglich das SCL-Pendant "AT" nennen und nicht mit irgendwelchen Spitzfindigkeiten verwirren ...

Als Du dem Fragesteller das vermutlich uneffiziente "Serialize" empfohlen hast, da hast Du auch nicht erwähnt, daß das nur bei bestimmten TIA-Versionen und bestimmten CPU-Firmware-Versionen geht und in einigen bestimmten Versionen Bug-behaftet ist ... daher könnte man das "Serialize" auch als "schlechter Stil" bezeichnen ;)

Harald
 
Hallo,

vielen Dank für Eure Hilfe. Wenn ich morgen Früh wieder an dem System sitze werde ich zuerst versuchen Eure Ratschläge (Slicen, serialize) verstehen (mit der TIA Hilfe) und dann die
beiden Methoden ausprobieren. Vielen Dank für Eure Hilfe.

Gruß
Dirk
 
eine temporäre LWord variable anlegen und mit LREAL_TO_LWord explizit konvertieren/Casten
Anschließend kann man mit slicen auf die einzelnen Bytes zugreifen --> .%B0 - .%B7
der direkte Zugriff hinter dem Cast funktioniert meines wissen nach nicht :-(
RedCali hat recht, direkt LREAL_TO_LWORD(IN_REAL).%B0 geht in TIA (zumindest in V13) nicht, man muß den LREAL erst auf ein LWORD umspeichern und kann danach "slicen":
Code:
#temp_LWord := LREAL_TO_LWORD(#IN_REAL) ;

#Byte_0 := #temp_LWord.%B0 ;
#Byte_1 := #temp_LWord.%B1 ;
..
#Byte_7 := #temp_LWord.%B7 ;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

so habe mich mit dem Problem und Euren Lösungsvorschlägen noch weiter beschäftigt. Es gibt mehrere Varianten (unterschiedliche Datentypen) des Speichers auf den ich zugreifen muss.
Sollte aber eigentlich ähnlich zu lösen sein (habe ich gedacht).
Erster Ansatz (anscheinend zu naiv):

Function mit input DWORD source und output DWORD target
target.%B0 := source.%B4; //% hat TIA ergänzt

funktioniert nicht. Compiler meldet .%B4 unzulässige Operation für source

Das verstehe ich nach Studium der Hilfe nicht :confused: Tipp?

Gruß Dirk
 
Zuletzt bearbeitet:
Oh man. Das ist jetzt peinlich (wo ist der rote Smiley) ??

Das kommt davon wenn man (ich) mehrere Sachen auf einmal macht.
 
Funktioniert jetzt so wie ich es mir gewünscht habe. Ich slice ...:).
Danke. Habe auch gleich eine neue Frage aber da mache ich ein neues Thema auf.
 
Darf ich erfahren warum man überhaupt ein LReal slicen will? Ich meine, es ist halt eine Fließkommazahl, was will man denn mit den einzelnen Bytes anfangen?
 
Zurück
Oben