ANY-Pointer auf UDT mit Bestimmter Länge

RONIN

Level-3
Beiträge
2.518
Reaktionspunkte
765
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

Ich schreibe gerade einen Multiinstanz-Fb zur Steuerung eines Danfoss Frequenzumformers via Profibus. Im statischen Bereich des FB´s habe ich einen UDT mit den erforderlichen Sende- (Byte 20-40) und Empfangsdaten Byte (0-20).

Jetzt geht es um die Bausteine DPRD_DAT und DPWR_DAT, genauer um den Reccord Eingang. Die Bausteine brauchen einen Any-Pointer auf den Datenbereich der zu senden bzw empfangen ist. Beim DPRD_DAT bzw. DPWR_DAT muss ich jeweils 20 Byte übertragen, ich kann also nicht einfach den UDT am Reccord Eingang angeben (Siehe Bild) sondern muss irgendwie einen ANY Pointer auf den UDT von 0 bis 20 angeben.Also etwas wie

Im Normalfall (DB) schreibt man einfach P#DB201.DBX20.0 BYTE 20 oder P#M 20.0 BYTE 20 usw.

Leider funktionert P#Fudaten BYTE 20 oder ähnliches nicht.

Kann man das doch irgenwie so schreiben oder muss ich mir den Erforderlichen Pointer erst händisch zusammenbauen.

mfg RONIN
 

Anhänge

  • screen_1.JPG
    screen_1.JPG
    193,1 KB · Aufrufe: 68
Fb

Hallo,

wieso machst du keine UDT_IN und eine UDT_OUT? Nutzt du diese UDT noch anderweitig? Ansonsten kannst du doch auch je ein STRUCT für IN und OUT im STAT-Bereich anlegen. Ich bin mir jetzt nicht ganz sicher ob der FB automatisch multiinstanzfähig ist wenn du die Variable symbolisch ranschreibst. Falls du das mit der einen UDT beibehalten willst musst du dir deinen Pointer selbst bauen. Denke dabei an den Offset für Multiinstanzaufruf!

André
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wieso machst du keine UDT_IN und eine UDT_OUT? Nutzt du diese UDT noch anderweitig? Ansonsten kannst du doch auch je ein STRUCT für IN und OUT im STAT-Bereich anlegen.
André

Das war der nächste Plan falls es so nicht geht. Wird wohl auf 2 structs rauslaufen. Baue mir nähmlich im FB schon 2 Zeiger für laden mit dem BLKMOV zusammen, wenn ich jetzt auch noch 2 fürs DP mache ist mir das zuviel Zeigergebastle für einen FB. :)

Hallo,
Ich bin mir jetzt nicht ganz sicher ob der FB automatisch multiinstanzfähig ist wenn du die Variable symbolisch ranschreibst.
André

Ist ne gute Frage, aber normalerweise schon da wie beim jedem anderen symbolischen Aufruf der Offset ja ebenso im AR2 stehen müsste. Oder irre ich mich da????

Hallo,
Falls du das mit der einen UDT beibehalten willst musst du dir deinen Pointer selbst bauen. Denke dabei an den Offset für Multiinstanzaufruf!
André

geht doch nix über "Tar2"


mfg RONIN
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
:confused: ich verstehe jetzt im Augenblick das Problem nicht.
Wenn du FUDaten symbolisch an den SFC14 (oder 15) übergibst, so wird das als ANY-Pointer übergeben. Wo hakt es denn nun ?
 
Any

:confused: ich verstehe jetzt im Augenblick das Problem nicht.
Wenn du FUDaten symbolisch an den SFC14 (oder 15) übergibst, so wird das als ANY-Pointer übergeben. Wo hakt es denn nun ?

daran dass er eine gesamte UDT für IN und OUT hat und so nur die Hälfte des Bereiches am SFC benötigt.

Ich würde wie schon erwähnt 2 STRUCT im STAT-Bereich anlegen. Von UDT (falls nicht an anderen Stellen noch verwendet) würde ich absehen, da sonst wieder eine unnötige Abhängigkeit besteht.

André
 
Hab ich auch schon längst so umgebaut (2 structs im Stat-Bereich). Meine Frage war ja auch lediglich ob es möglich ist bei einem symbolischen Anypointer einen Bereich zu vergeben. (Ohne dass mann ihn zusammenbasteln muss)

Aber anscheinend geht das nur bei statischen Pointern wie: P#M 20.0 BYTE 20


Was mich abschließend noch interresieren würde ist, meine vermutung im Beitrag #3 stimmt oder nicht

Darf man sich eigentlich selber zitieren... Ach was solls :rolleyes:
Ist ne gute Frage, aber normalerweise schon da wie beim jedem anderen symbolischen Aufruf der Offset ja ebenso im AR2 stehen müsste. Oder irre ich mich da????

mfg RONIN
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ronin,
bezüglich deiner Frage im Beitrag #3 bitte mal hier lesen. Ich denke, das ist im Grundsatz dein Problem ...

Deine andere Frage verstehe ich nicht so recht :
Meine Frage war ja auch lediglich ob es möglich ist bei einem symbolischen Anypointer einen Bereich zu vergeben. (Ohne dass mann ihn zusammenbasteln muss)
was verstehst du unter einem symbolischen Any-Pointer ?

Gruß
LL
 
@Beren:
Der UDT ist aber die Definition des Aufbaus eines Speicherbereichs - so wie z.B. auch ein STRING. Wenn du also in einem DB einen Speicherbereich vom Typ UDT11 (z.B.) festlegst, so kannst du diesen auch symbolisch einem Baustein übergeben, der einen Bereich haben möchte (vor Allem, wenn er den Bereich in identischer Struktur haben will). Das macht die Sache oftmals einfacher (übersichtlicher) als wenn du absolut den ANY-Pointer dran schreibst.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wieso macht man einen Pointer auf eine UDT? Das verstehe ich nicht so ganz. Ich verstehe eine UDT als ein Template - also Schablone für DBs. Der UDT ist doch gar kein Speicherbereich zugewiesen...

Kann mir das jemand erklären?

Du siehst das ein wenig zu eng. Da hast du naturlich Recht, aber sobald ich im Stat-Bereich eine Variable vom Typ Fudaten (UDT) erstelle hat für mich der FU-UDT einen Speicherbereich auf den ich auch einen Pointer legen kann.

hier lesen. Ich denke, das ist im Grundsatz dein Problem ...
LL

Ich erkenn leider nicht die Verbindung

Deine andere Frage verstehe ich nicht so recht :was verstehst du unter einem symbolischen Any-Pointer ?
LL

OK, das ist ein wenig schlecht formuliert, mit symbolich meine ich eher eine Any-Pointer der Art #Fudaten und mit nicht-symbolisch einen Pointer auf eine konstante Adresse, also P#M20.0 BYTE 20

So hatte ich das gemeint
 
... Ich erkenn leider nicht die Verbindung ...
In dem Link wird das Thema der Multi-Instanz und das Durchreichen von (ANY-)Pointern an andere Bausteine m.E. sehr schön behandelt und trifft m.E. auch ganz genau auf deine Frage mit dem AR2. Beachten solltest du vor Allem die Beiträge von Hovonlo und Sarek. Ich differenziere hier mal nicht zwischen einem ANY-Pointer und einem UDT.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mit symbolich meine ich eher eine Any-Pointer der Art #Fudaten und mit nicht-symbolisch einen Pointer auf eine konstante Adresse, also P#M20.0 BYTE 20

Wie ich schon geschrieben hatte :
der symbolische Zugriff erzeugt für einen Datenbereich automatisch den korrekten ANY-Pointer.
 
Zurück
Oben