Indir. symbolische Adressierung

Beckx-net

Level-1
Beiträge
132
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS Gemeinde,

Ich habe das folgende Problem. Ich habe einen FB, dem ein ANY-Pointer übergeben wird. Der Pointer zeigt auf ein UDT, der sich in einem Datenbaustein befindet.

Nun möchte ich in meinem FB auf Variablen des UDT's symbolisch zugreifen. Also z.B: myUDT.Var1

In AWL kann ich immer nur absolut auf die UDT-Struktur zugreifen, was heißt ich muss vorher wissen, wie der Datenbaustein heißt. Indirekt geht es wiederum nicht symbolisch, was heißt ich muss die Adressen der Variablen im DB kennen und dementsprechend meinen Pointer anpassen.

Nun habe ich bisher noch keine Erfahrung mit SCL gemacht. Ist in SCL eine indirekte symbolische Adressierung möglich?
 
Hallo,
aus dem Any-Pointer kannst Du alle relevanten Informationen rausholen um indirekt zu adressieren. Du musst aber die offsetwerte der enizelnen Variablen deiner UDT Kennen.

Willst du Symbolisch adressieren, kannst Du den selben UDT in Temp hinterlegen, mit SFC 20 die Daten holen, bearbeiten und zurückspielen. Es geht aber nur über Umwegen und ist komplizeirt.

Empfehlung:
Kein Any sondern den UDT als Eingangsvariable (oder IN_OUT) deklarieren und beim Aufruf Dein DBx.[name des UDT] durchreichen.

Gruß: Geza
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Geza
Ich habe auch schon mit der Übergabe von UDTs rumgespielt. Dummerweise muss man immer den UDT absolut angeben. Somit darf dieser später nie umbenannt werden.

Meine Lösung sieht so aus, dass ich die Struktur des UDT's nocheinmal im Temp-Bereich des FBs schreibe. Und dann mit dem sfc20 den Inhalt kopiere.

Danke für deine Anregung, war sehr hilfreich

THX
 
Nun habe ich bisher noch keine Erfahrung mit SCL gemacht. Ist in SCL eine indirekte symbolische Adressierung möglich?

Nein ... das ist ja auch schon ein Widerspruch in sich. Entweder indirekt oder symbolisch. SCL mag am Liebsten symbolisch und das geht nur wenn Quelle oder Ziel bekannt. Dann kann man hier auch viel an Zugriffen ausschöpfen.

Zu dem, wozu dir geza schon geschrieben hat :
Wenn du dir in deinem Arbeitsbaustein den UDT (z.B. im TEMP-Bereich) abbildest, so hast du dabei das gleiche Problem, wie bei der direkten Übergabe als IN-Parameter : änderst du die Struktur des UDT, so mußt du auch den Arbeitsbaustein aktualisieren - so oder so ...
Ich würde hier auf jeden Fall zum 2mal-Nachdenken und zu gehöriger (Selbst-)Disziplin raten - sicherlich kann man immer alles irgendwie machen - aber muß man das auch immer tun ...?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich in meinem FB als Input-Variable einen UDT auswähle, dann muss ich immer mit angeben, wie dieser heißt zb. UDT1 (oder symbolische Bezeichnung).

Die Struktur an sich ändert sich nicht! Es ist allerdings möglich, das sich die Bezeichnung des UDT's ändert und somit muss auch der FB geändert werden, weil sonst die Referenz nicht stimmt.

Diese Problematik versuche ich so weit wie möglich zu umgehen.

Wie sieht es denn in SCL aus? Kann man dort einen DB übergeben und symbolisch auf dessen Inhalte zugreifen? Ich habe bislang nur CoDeSys Steuerungen in structured Text programmiert. Dort kann man eine Structur-Instanz als Pointer übergeben. Auf den Inhalt kann anschließend symbolisch zugreifen.

Aber du hast schon recht, es gibt viele Wege ;-)
 
Die Struktur an sich ändert sich nicht! Es ist allerdings möglich, das sich die Bezeichnung des UDT's ändert und somit muss auch der FB geändert werden, weil sonst die Referenz nicht stimmt.
Wieso sollte man den Namen ändern? Wenn ich ein UDT einmal benannt habe, bleibt es dabei. Wie schon Larry geschrieben hat:
Ich würde hier auf jeden Fall zum 2mal-Nachdenken und zu gehöriger (Selbst-)Disziplin raten
Abgesehen davon, es kann alles automatisch aktualisiert werden. Je nach dem, ob sich die UDT Nummer oder der symbolische Name ändert, wählt man die entsprechende Priorität und lässt man alles neu übersetzen.

Gruß: Geza
 
... wie auch immer ... es gibt in SCL da jedenfalls auch keinen Weg, das zu umgehen. SCL arbeitet (besonders gerne) mit Allem, wovon es den Aufbau kennt.

Vielleicht ist es aber auch nur ein Problem der Methodik ...
Was willst du denn genau machen ? Vielleicht läßt sich das Pferd ja auch anders aufzäumen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es denn in SCL die Möglichkeit einen Pointer auf ein Element einer Struktur zu legen und zwar symbolisch?

In AWL scheint dies ja nicht der Fall zu sein (siehe Link)
http://sps-forum.de/showthread.php?t=31830&highlight=Pointer+struktur

Also in etwa so
LAR1 P##MeineStrucktur.Element1
L B[AR1, P#0.0]
....

Was das Problem mit dem UDT angeht, ich habe mich für die Lösung mit der Übergabe eines UDT's entschieden.
 
Du kannst in SCL nicht mit Pointern arbeiten - du kannst dir aber z.B. eine AT-Sicht auf ein bekanntest Element machen um es anders zu interpretieren.

Ich wiederhole aber noch einmal die Frage :
Vielleicht ist es aber auch nur ein Problem der Methodik ...
Was willst du denn genau machen ? Vielleicht läßt sich das Pferd ja auch anders aufzäumen ...
Gruß
Larry
 
Problemstellung ist simpel, versuche auf Elemente in meinem UDT zuzugreifen. Dort sind diverse komplexte Strukturen enthalten(Arrays/Structs...). Ideal wäre ein dynamischer Zugriff mittels Pointern.

Dummerweise kenne ich nicht die Adressen dieser Elemente, sondern nur deren Namen! Dies liegt daran, da ich einen generativen Ansatz verfolge um Quellcode zu generieren. Meine erste Lösung war, dass ich mir im Vorfeld alle Adressen der Elemente berechnet habe. Von dieser Vorgehensweise wollte ich aber gern abgehen.

Daher meine Frage, ob SCL Code nicht die bessere Alternative wär. Aber wie es ausschaut hat beides Vor- und Nachteile.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... damit hast du mir nun nicht wirklich weitergeholfen - im Grunde war das eine Null-Info ... :rolleyes:

Aber ich versuche es mal anders herum :
Wie wäre es mit einem Ausgabe-FB ?
Der FB verwaltet in seiner Instanz (seinem I-DB) alle diese Sachen, auf die du Wert legst. Wenn du nun etwas von dessen Daten haben willst, so sagst du ihm das per Parameter - der Baustein stellt dir dann die angeforderten daten auf einem ANY-Pointer zur Verfügung. Das ginge dann auch zurück.
Mir würde es hier aber besser gefallen wenn du immer mit der korrekten Struktur auf der jeweiligen Schnittstelle arbeitest - wie ich schon sagte : "du schiesst dich irgendwann mit so einer Vorgehensweise mal selbst ab ...".

Gruß
Larry
 
Zurück
Oben