Wert formatunabhängig an FC übergeben

Zuviel Werbung?
-> Hier kostenlos registrieren
Leider nicht! :(
Aber Danke schonmal!! ;)

L DBD [hPointer] // hPointer wäre hier ein DWORD aus dem TEMP-Bereich

Aber mit DBD lade ich ja aus Datenbaustein, nicht aus Temporär, oder???



Was ich mit meinem vorrigen Beitrag meinte: Ich sehe keinen Unterschied zwischen den beiden Befehlen:

AUF DB1
L P#DBX0.0
LAR1
L D [AR1,P#0.0]
So, nun lade ich DB1.DBD0, richtig?

Jetzt der zweite Fall
L P##ANYPOINTER // Eingansvariable, als ANY deklariert
LAR1
L D [AR1,P#0.0]

Hier, lade ich nun aus dem Adressregister, das erste Doppelwort vom Anypointer. Oder nicht? :confused:

Gruß
Jordy
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Onkel:
Das habe ich nun wieder nicht gewußt ...
Da kann man mal sehen ... man wir alt wie eine Kuh und lernt immer noch dazu ...

;) was besseres fiel mir jetzt nicht ein ...

@Jordy:
Ich denke, du hast es ...

Gruß
LL
 
Ne, eben nicht.

Warum greift er bei demselben Befehl, einmal auf ein DB zu und einmal auf das Adressregister?
 
...?
Du hast in das Adressregister (AR1) den "Offset" deiner Zieladresse geladen. Darauf greifst du dann zu ...
Du kannst den Offset auch noch weiter erhöhen :
L DBD [AR1,P#4.0] // <- noch 4 Byte weiter oben ...

DBD bezieht sich auf Datenbaustein ...
usw.
wie schon geschrieben ...

Der ANY-Pointer kommt m.E. nicht über einen DB sondern über den Lokal-Bereich (kann ich jetzt aber nicht gegenchecken - aus dem Handgelenk weiß ich das nicht, ich mache so etwas lieber mit SCL).
Vielleicht hängt sich Onkel Dagobert hier nochmal dran ...

... oder Ralle ... ich hatte nicht gesehen, dass du auch Online bist ...


Gruß
LL
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Any ist ein Parametertyp (suche das mal in der Step7-Hilfe). Es wird also nicht die Variable selbst übergeben, sondern 5 Wörter (wie der Any ebend definiert ist), z.Bsp. P#M50.0 BYTE 10. Wenn du nun L P## My_Any und LAR1 aufrufst, dann zeigt LAR 1 auf den Any, also kannst du dessen 5 Wörter adressieren und manipulieren.
 
DAAAAANKE!!!!

DAS war das woran ich zu knacken hatte! Klasse! Dann ist es klar. Und so ist es dann wohl auch wenn ich einen STRUCT an einen FC übergebe. Nur das es dann kein ANY-POinter ist, sondern normaler Pointer, ne?

Ja, das meinte ich. Hatte immer gedacht das die Variable selbst übergeben wird.


Suuuper, bin begeistert!!

Schönen Dank euch allen!!!!
 
Nun wurde schon viel diskutiert. Nur viel schlauer bin ich immer noch nicht.

Wäre schön wenn jemand einfach kurz die paar Zeilen Code posten könnte um den an die Funktion übergebenen any-Pointer zu zerlegen. Mich interessiert folgendes:
Wie komme ich an den Datentyp ran, und wie an die eigentlichen Daten.
Ich kriege den richtigen Syntax einfach nicht auf die Reihe.

Warum ich das überhaupt so machen möchte:
Ich möchte eine Funktion machen in der etwas berechnet wird und mehrere Variablen übergeben werden. Ich könnte nun für jeden Datentyp eine eigene Funktion schreiben oder für jeden Datentyp Eingangsvariablen definieren oder vor dem FC Aufruf die Variablen ins richtige Format wandeln. Doch dies sind alles nicht sehr elegante Lösungen.

Gruss
Isha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soll ich mich ma trauen Jungs? :D

Also, so müsste es dann gehen! ;)

// Any-Pointer aufsplitten
-------------------------------------
L P##IN_Any // IN-Variable
LAR1

L B [AR1,P#1.0]
T #Datentyp

L W [AR1,P#4.0]
T #DB_Nummer

L D [AR1,P#6.0]
T #Bereichszeiger

//; Auswerten
------------------------------
L #Datentyp
L B#16#5
==I
R #IST_Real // Out-Variable
S #IST_Int
R #IST_Dint

L #Datentyp
L B#16#8
==I
S #IST_Real
R #IST_Int
R #IST_Dint

L #Datentyp
L B#16#7
==I
R #IST_Real
R #IST_Int
S #IST_Dint

Was du dann nachher mit der Auswertung machst, musste natürlich ändern. Ich habe jetzt einfach mal ein Bit...


Gruß
Jordy
 
Wenn du z.B. immer einen Datenbaustein anbindest, kannst es nachher so machen:

AUF DB [#DB_Nummer]

L #Bereichszeiger
LAR1

U #IST_Real
SPB REAL

U #IST_Dint
SPB DINT

U #IST_Int
SPB INT

REAL: L DBD [AR1,P#0.0]
T #Istwert_Real
BEA

DINT: L DBD [AR1,P#0.0]
T #Istwert_DINT
BEA

INT: L DBW [AR1,P#0.0]
T #Istwert_INT
BEA
 
Hallo Isha,

..Ich könnte nun für jeden Datentyp eine eigene Funktion schreiben oder für jeden Datentyp Eingangsvariablen definieren oder vor dem FC Aufruf die Variablen ins richtige Format wandeln...
Mach das so und nicht anders! Versuche nicht eine eierlegende Wollmichsau zu kreieren! Ein Any übergibt ohnehin nur die Datenlänge, nicht den Datentyp. Der nächste schreibt ein DINT statt einer REAL an den Eingang. Selbst ein Parameter zur Parameterauswahl macht nur in Ausnahmefällen Sinn.


Gruß, Onkel

..um den an die Funktion übergebenen any-Pointer zu zerlegen...
Vielleicht beachtest du nun auch endlich mal die o.g. links! Dort ist eigentlich alles zum Any-Pointer beschrieben.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe selten Anys benutzt. Ich war auch der Meinung, daß er nicht den Typ übergibt; nur den Speicherbereich (E,A,M,DB,...). Habe daraufhin einen Beitrag geschrieben, unter anderem, daß nicht zwischen 4 Byte DINT und REAL unterschieden wird.. Als er fertig war, sah ich den Link auf Volkers Homepage. Dort ist sehr wohl ein Feld für den Typ vorgesehen und DINT und REAL sind unterscheidbar. Habe daraufhin meine Beitrag als Blödsinn gelöscht. Was denn nun?
 
Hallo Zottel,

Ich habe jetzt fix noch mal nachgeschlagen. Tatsächlich gibt es Unterscheidungenen im Any-Zeiger z.Bsp. zwischen Real und DINT. Das war mir aus meiner Sichtweise garnicht so bewusst. Alleine die Tatsache dass symbolisch übergebene Anys immer in Byte übergeben werden, führten mich zu der Aussage. Ok, dann wäre das machbar. Ich würde trotzdem davon absehen. Obwohl... vieleicht denke ich nochmal darüber nach..ist ja demnach eigentlich garkein Problem.

Danke ;) !
Gruß, Onkel


PS
Symbolische Anys auft STRUCTs oder ARRAYs werden mit dem Datentyp Byte übergeben.
 
Zuletzt bearbeitet:
@zottel @onkel

Einen Versuch, nur um das heraus zu bekomen wäre es ja mal wert. Wenn ich irgendwann etwas Zeit habe, was noch dauern kann, probiere ich es mal, schon aus Interesse. ;)
 
Zurück
Oben