Beckhoff-Twincat: ADR()-Funktion

klausbre

Level-1
Beiträge
54
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Gelöst: Beckhoff-Twincat: ADR()-Funktion

Guten Abend,

ich bin im Moment dabei einen recht umfangreichen Codesys-Baustein zur Ansteuerung meiner CANopen-Servos auf TwinCat/EtherCat zu portieren. Das klappt überraschend gut ... aber an einer Stelle hänge ich.

Ich würde gerne einem Funktionsblock eine Adresse einer Variablen übergeben. Diese Variable kann ein Byte, ein Wort oder ein DInt sein. Der Funktionsblock dient dabei ein beliebiges SDO zu schreiben.

Unter Codesys konnte man z. Bsp.
Code:
dw_ErgebnisVar_pt:=ADR(by_HomingMethod)
schreiben. Dabei landete in dem DWord dw_ErgebnisVar_pt die entsprechende Adresse unabhängig davon welchen Datentyp man innerhalb der Funktion ADR() verwendet hatte.

Laut der Beckhoff Hilfe sollte das hier genau so gehen:
ADR liefert die Adresse seines Arguments in einem DWORD. Diese Adresse kann an Herstellerfunktionen geschickt und dort wie ein Pointer behandelt werden oder innerhalb des Projektes an einen Pointer zugewiesen werden. [...]
Beispiel in ST:

dwVar:=ADR(bVAR);

Nur tut es das leider nicht. Wenn man die obige Zeile übersetzt bekommt man immer den Fehler. Typ 'POINTER TO BYTE' kann nicht in 'DWORD' konvertiert werden.

Kennt hier jemand einen gangbaren Weg? Ich würde ungern eine Inputvariable für jeden Datentyp im Funktionsblock anlegen ... aber was anderes fällt mir im Moment nicht ein.

Vielen Dank
K. Kilper
 
Zuletzt bearbeitet:
Also in TwinCAT 2 bekomme ich da keine Fehler.
Ich kann mit ADR die Adresse der Variablen in ein DWORD schreiben.

Verwendest du TwinCAT 3? Da kann ich das zu Hause leider nicht ausprobieren.
Ansonsten einfach mal den entsprechenden Ausschnitt aus deinem Code (am besten mit den Deklarationen) hier posten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei TwinCAT 3 müsste ein UXINT verwendet werden. Durch den 64-Bit Support wird das UXINT je nach Zielsystem als 32-Bit Pointer oder 64-Bit Pointer kompiliert.
 
Danke Ihnen beiden. Der Tipp von Neals scheint zu funktionieren. Jetzt lässt sich das Projekt fehlerfrei übersetzen. Kommende Woche werde ich das mal an der Maschine probieren. Vielen Dank nochmals.

P.S. Ich arbeite mit TwinCAT 3. Mein Projekt stammte aber von Codesys 2.x. Offensichtlich funktioniert die ADR() unter TwinCAT 2 wie unter Codesys 2.x.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
In TC3 löse ich solche Probleme lieber mit UNIONs, um von der Typunsicherheit des ADR-Operators wegzukommen.
Code:
TYPE uniBitSequences
UNION
   B:BYTE;
   W:WORD;
   D:DWORD;
   L:LWORD;   // Falls benötigt
END_UNION
END_TYPE
 
Heute konnte ich es endlich an der Maschine testen. Der Tipp von Neals hat prima funktinoiert. Vielen Dank nochmals.
 
Zurück
Oben