Pointer als IN (FC/FB) wieder übergeben als Pointer

saarlaender

Level-1
Beiträge
94
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich habe schon einige Threads hierzu gefunden, aber offenbar keinen der zu meinem Problem passt?!

Ich nutze den FC86 (TBL_FIND bzw. Table Find), welcher als IN einen Pointer (Datentyp Pointer) benötigt. Dieser FC86 befindet sich wiederum in einem FC oder FB.

Mein Vorhaben ist es nun, dem übergeordneten FC/FB als IN den Pointer zu übergeben, welcher dann innerhalb dieses FC/FB an den FC86 übergeben wird.
Hierzu muss man dem was ich gelesen habe nach erstmal den Pointer in eine TEMP-Variable bekommen und über das Adressregister einen neuen Pointer für den FC86 zusammen stellen - die direkte Verwendung des IN-Pointers vom übergeordneten FC/FB geht ja nicht.


Ich habe in den anderen Threads gelesen, wie man den Pointer (Datentyp Pointer) oder einen ANY-Pointer (Datentyp ANY) zerpflückt, aber nicht wie ich daraus wieder einen Pointer mache, welchen ich dem IN (Datentyp Pointer) des FC86 übergeben kann.



PS: Der übergeordnete FC/FB könnte statt einem Pointer-IN (Datentyp Pointer) auch mehrere Eingänge (z.B. INT) haben, über die man die notwendigen Angaben übergibt.

PPS: Wer den FC86 nicht kennt: Er benötigt nur einen Pointer zum Startpunkt, keinen Bereich ... also z.B. P#DB1.DBX0.0
 
In der FAQ gibt es einen recht guten Beitrag, ich glaube von Volker, der zeigt, wie man einen Any zusammenbaut.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Any ist aber was anderes als ein Pointer. Denn ein Pointer ist nur ein Parametertyp. Ich kann also nicht in den Temp-Variablen einen Pointer-Datentyp anlegen. Man kann natürlich eine 6-Byte Struktur dort beschalten, wenn ich diese jedoch an den entsprechenden Parameter des FC-Aufrufs schreibe, zeigt der Pointer auf die Struktur in den Temp-Daten.

Ich wüsste keine Lösung für dein Vorhaben wenn der aufzurufende FC einen Parameter vom Typ Pointer verlangt. Beim Parameter Any sieht das anders aus.

Aber vielleicht gibts da ja doch einen Trick. Wo ist 4lagig eigentlich? ;-)
 
Genau das is der Punkt... es muss ein Typ POINTER sein, kein ANY.

Beschrieben wird aber bisher immer nur der Aufbau vom ANY-Pointer (TYP ANY). Ich muss aber einen TYP POINTER zusammen bauen...


Über ein Struct im TEMP hab ichs gerade probiert, aber entweder gehts tatsächlich so nicht oder ich mache etwas falsch :-(
 
In der Onlinehilfe zum FC86 steht "* Pointer im Doppelwortformat bei der bereichsübergreifenden, registerindirekten Adressierung" ... aber wenn ich nur ein DWORD an den FC86 anlege, klappts auch nicht. Entweder meldet der FC86 dass er keine Übereinstimmung findet (obwohl eine da ist) oder er meldet keinen Fehler, aber auch einfalsches Ergebnis ... oder er meldet schnell abwechselnd kein Ergebnis bzw. keine Übereinstimmung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Pointer zeigt immer auf die Variable die du am Funktionsaufruf angibst, und nie dahin wo der Inhalt der Variable (wenn es ein Pointer sein soll) hinzeigt.
Wenn du also eine Variable in Temp-Bereich anlegst und die am FC angibst, zeigt der Pointer auf die Variable im Temp-Bereich.
Bei einem FB könntest du den Pointer als In/Out an eine weitere Funktion weiterleiten (zumindest meckert der Editor dann nicht). Das funktioniert aber trotzdem nicht, weil der Zeiger auf die Adresse der FB Instanz zeigt, und nicht auf den Aktualwert der außen angeschaltet wurde.
 
Kann ich denn irgendwie den Pointer so in dem FC/FB zusammen bauen, dass er am FC86 richtig angenommen wird?
Kann auch in SCL sein, da brauch ich dann aber wohl mehr Hilfe - hab da noch nicht viel mit gemacht...
 
Kann ich denn irgendwie den Pointer so in dem FC/FB zusammen bauen, dass er am FC86 richtig angenommen wird?
Kann auch in SCL sein, da brauch ich dann aber wohl mehr Hilfe - hab da noch nicht viel mit gemacht...

Meiner Meinung nach geht es nicht, aber vielleicht kommt ja noch was.
Und was in AWL schon nicht geht, das geht in SCL erstrecht nicht.

Aber wenn du SCL zur Verfügung hast ist es doch einfach sich einen Ersatz für diesen Baustein zu schreiben. Oder kannst du nicht mehr umstellen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der FC86 ist geschützt, keine Ahnung wie der funktioniert ... und da ich kaum SCL kann, könnte ich den niemals nachbauen ^^


Wenn sich keine Möglichkeit mehr findet, kennt evt. jemand eine andere Funktion die das gleiche Ergebnis bringt...


EDIT: Mache für die Suche nach einer geeigneten Funktion mal einen neuen Thread auf ^^
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab das mal durchprobiert, ich habe auch keine Möglichkeit gefunden, den Pointer irgendwie durchzureichen. Was geht, man kann den Pointer in eine Struct aus 3 Word schreiben, diese Struct dann an einen FC10 (z.Bsp.) wiederum an einen Pointer-IN übergeben. Aber dann muß man im FC 10 über die Adresse des Pointers einen Any bauen um dann an die Ursprungsdaten zu kommen und so wird das im FC86 des TE ja kaum gemacht sein. Die Frage ist da schon, warum und wozu setzt man einen Typ Pointer ein, wenn er die Einsatzmöglichkeiten eines FC dann derartig einschränkt?
 
Nur mal als Idee (hab grad kein Handbuch da):
Wenn ich's richtig im Kopf hab, dann werden doch bei Bausteinaufruf mit UC oder CC die Parameter per Stack übergeben.
Damit müsst sich doch das Problem lösen lassen?

Kann aber auch sein, dass ich da völlig auf dem Holzweg bin :)

Gruß
Dieter
 
Nur mal als Idee (hab grad kein Handbuch da):
Wenn ich's richtig im Kopf hab, dann werden doch bei Bausteinaufruf mit UC oder CC die Parameter per Stack übergeben.
Damit müsst sich doch das Problem lösen lassen?

Nur kannst du die entsprechenden Befehle dafür nicht in AWL eingeben, siehe http://www.sps-forum.de/showthread.php/53457-UC-mit-Parameterübergabe

Wie Ralle schon schrieb, der Step7 Pointer ist nicht das gelbe vom Ei. Da man es bei der SPS-Programmierung aber eher selten mit sich während der Laufzeit in der Größe ändernden Datenstrukturen zu tun hat, kann man das meistens anders (und schöner) lösen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur kannst du die entsprechenden Befehle dafür nicht in AWL eingeben, siehe http://www.sps-forum.de/showthread.php/53457-UC-mit-Parameter%C3%BCbergabe

Wie Ralle schon schrieb, der Step7 Pointer ist nicht das gelbe vom Ei. Da man es bei der SPS-Programmierung aber eher selten mit sich während der Laufzeit in der Größe ändernden Datenstrukturen zu tun hat, kann man das meistens anders (und schöner) lösen.

Zumal ein Any alle Möglichkeiten bietet, die man braucht.
 
Warum dort der Typ Pointer statt Any genutzt wird, kann ich auch nicht sagen - ist ja eine fertige Funktion von Siemens.


Also als Fazit kann man wohl festhalten, dass diese Funktion nicht dynamisch mit dem zu durchsuchenden DB versorgt werden kann. Schade :-/

Hab aber einen neuen Thread aufgemacht, um ggf. eine vergleichbare Funktion zu finden die dynamisch versorgt werden kann...
http://www.sps-forum.de/showthread....hsuchen-und-Adresse-des-Eintrags-herausfinden
 
Zurück
Oben