TIA Zeiger

manuelck99

Level-1
Beiträge
22
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin noch ein ziemlicher Anfänger was das SPS-Programmieren angeht und wollte einfach fragen, ob mir jemand die Zeiger-Datentypen VARIANT, ANY bzw. POINTER und ihre Unterschiede erklären könnte. Ich habe schon im Internet und auf der TIA-eigenen Hilfe-Seite nachgeschaut und zwar Erklärungen gefunden, allerdings verstehe ich diese nicht wirklich und würde deswegen auch gern fragen, ob jemand mir auch die Idee hinter Zeigern bzw. ihre Vorteile mit einem Beispiel erklären kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich spiele hier mal wieder den Post-Nekromancer und häng meine Frage an diesen Post an:
Ich hab mir einen Datentyp "Anypointer" gebastelt, welchen ich relativ bequem auf einen Any-Zeiger oder einen Remote-Zeiger legen kann. Nun habe ich aber ein kleines Problem mit meinem Aufbau:

Code:
TYPE Anypointer :
STRUCT
	Kennung			:	BYTE;
	Datentyp:			:	BYTE;
	Wiederholungsfaktor	:	WORD;
	DBNummer		:	WORD;
	Bereichszeiger		:	DWORD;
END_STRUCT
END_TYPE

Funktioniert auch alles recht gut, nur muss ich am Ende immer den Wert "16#84000000" auf den Bereichszeiger addieren damit ich den Speicherbereich auch noch habe.
Das finde ich irgendwie etwas unschön. Habt ihr eine Variante gefunden wie ich das umgehen kann und den Speicherbereich als eigenen Teil des Structs definieren kann? Ich hab auch schon gesehen dass jemand das Byte 7 einfach als Reserve deklariert hat, was dann aber bedeuten würde, dass ich max. auf das Byte 8191 zeigen kann, was eine ziemliche Reduktion des adressierbaren Bereichs wäre.
Ein "Array[0..2] of Byte" funktioniert auch schlecht, weil ich da über eine Funktion den Bereichszeiger zusammensetzen müsste.
Habt ihr da was?
 
(Du musst nicht immer 16#84000000 addieren, sondern nur wenn der ANY auf einen DB-Bereich zeigen soll. Wenn er auf einen anderen Speicherbereich zeigen soll, dann mußt Du eine andere Bereichskennung verwenden.)

TIA/Step7 kennt keinen 3-Byte-(Ganzzahl-)Datentyp, daher muß die Bereichskennung mit der 4-Byte-Bereichsadresse zusammengebastelt werden (DWORD-OR oder notfalls addieren):
Code:
L   #Byteadresse
SLD 3
OD  DW#16#84000000  //P#DBX0.0 für Bereichskennung "DB" zufügen
T   #MyAny.Bereichszeiger

oder

L   #Byteadresse
SLD 3
L   P#DBX0.0        //DW#16#84000000 für Bereichskennung "DB"
OD                  //Bereichskennung zufügen
T   #MyAny.Bereichszeiger

oder

L   #Byteadresse
SLD 3
L   P#DBX0.0        //DW#16#84000000 für Bereichskennung "DB"
+D                  //Bereichskennung zufügen
T   #MyAny.Bereichszeiger
Tut das wirklich Not, daß Du mit TIA noch mit ANY rumbasteln willst? Bekommst Du das nicht besser vollsymbolisch programmiert (dann funktioniert es auch mit "optimiertem" Speicherzugriff)? Oder verwendest Du den ANY nur für die Partner-Adresse von PUT/GET?

Harald
 
(Ja, das weiss ich. Deshalb hätt ichs gern im Datentyp)

Okay, das habe ich was befürchtet. Ja, dann bleibe ich beim aktuellen Code.

Wie vermutet handelt es sich hier um eine Put-Get Anwendung. Den lokalen Teil hab ich vollsymbolisch adressiert (nachdem Howard mir gesagt hat dass das geht).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest auch versuchen PUT/GET durch eine andere Kommunikation zu ersetzen, z.B. I-Device oder T_SEND_C/T_RCV_C. Mischen optimierter und nicht optimierter Daten sollte aus Performancegründen nach Möglichkeit vermieden werden.
 
Zurück
Oben