Wert formatunabhängig an FC übergeben

Isha

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

Ich möchte einen Wert in einem DB für Berechnungen an einen FC übergeben.
Der Wert kann als Integer oder Real-Wert daherkommen.

Fragen:
1. Kann der Wert unabhängig vom Format an ein FC übergeben werden und kann der FC das Format herausfinden? Wenn ja wie muss das gemacht werden? Wie muss die Eingangsvariable definiert werden und wie erfolgt die Abfrage im FC?
2. Wenn Punkt 1 nicht möglich ist:
Funktioniert es wenn ich das Format an den FC übergebe?

FC1
IN1: DB1.DBW10
IN2: 'I' (für Integer)

oder

FC1
IN1: DB1.DBD10
IN2: 'R' ('R' für Real)

und wie muss so die Eingangsvariable definiert werden dass sowohl 2 als auch 4 Byte Werte akzeptiert werden?

Gruss
Isha
 
Es geht entweder wordübergabe oder Doppelword. Das einfachste währe hier ein Übergabeparameter Word (INT) einen zweiten für Dword(Real) und der Parameter für Real oder Int. Der nichtbenötigte Eingang kann dann beliebig beschrieben werden und im FC nicht abgefragt werden.
 
Es geht entweder wordübergabe oder Doppelword. Das einfachste währe hier ein Übergabeparameter Word (INT) einen zweiten für Dword(Real) und der Parameter für Real oder Int. Der nichtbenötigte Eingang kann dann beliebig beschrieben werden und im FC nicht abgefragt werden.

wenn du es schon so machen willst dann geh hier und wandele vorher deinen int auf real übergebe deiner funktion das real und nach denn bearbeiteten wandelst du es wieder zurück und wenn es gleich ein real ist 1 zu 1 übergeben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe nun den ein Typ "any" an einen FC übergeben.

FC1
IN1: Var1 (Typ Any)

nun möchte ich im FC1 abfragen von welchem Datentyp der übergebene Wert ist. Leider komme ich auch mit Hilfe der Pointerbeschreibungen in anderen Threads nicht weiter.

Gruss
Isha
 
Ich weiss nicht wie ich die Eingangsvariable abfragen muss.

Ich möchte folgendes machen:

Wenn Eingangsvariable vom Typ INT dann .....
Wenn Eingangsvariable vom Typ REAL dann...

Den Pointer kann ich im AWL wie folgt laden:

L P##MyAny
nun prüfen ob INT
SPB TypI

Was ich auch Versuche. Nichts funktioniert. Ich habe das Prinzip noch nicht verstanden.

Gruss
Isha
 
... du musst den ANY-Pointer nun zerlegen, wie in dem Link weiter oben von Volker beschrieben. Auf die Weise erhälst du dann die Info des Variablen-Typs und der Speicher-Adresse, wo die Variable hinterlegt ist (MW , ED , DBW usw.) nun daraus einen Pointer bilden und die Variable laden und entsprechend deiner Vorstellung verarbeiten.
Das wäre der Weg ...

Alternative: Siehe Beitrag von kpeter ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ralle hat letztens einen Beitrag geschrieben mit etwas Code in SCL. Da hat er sich den Anypointer mittels eines Struct und eines AT gebaut, dass ging auch umgekehrt.

IMHO die übersichtlichste Art und Weise einen Anypointer zu zerlegen bzw. zusammen zubauen.

Hier noch der Link der auch eine Stolperfalle dabei aufzeigt: http://www.sps-forum.de/showthread.php?t=17406http://www.sps-forum.eu/showthread.php?t=17406
 
Zuletzt bearbeitet:
JA, habe ich gelesen.

Nur wie zerlege ich den Any-Pointer

LAR1 P##myAny (Eingangsvariable des FC) wird vom Editor nicht akzeptiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn du es schon so machen willst dann geh hier und wandele vorher deinen int auf real übergebe deiner funktion das real und nach denn bearbeiteten wandelst du es wieder zurück und wenn es gleich ein real ist 1 zu 1 übergeben

geht natürlich auch, aber die Frage war ja nach der Übergabe in den FC. Für die Lösung des Problems von Isha gibt es mehrere Möglichkeiten, die hier aufgelistet werden. Welches die Beste ist hängt auch vom Vorwissen ab.
 
INT oder REAL am selben Eingang ?!

Ich meine dass solche Übergabepraktiken in das Reich der OO
gehören, in S7 Programmen aber nichts verloren haben.

Dass man sowas mit dem ANY erschlagen kann ist gut.
Aber ist es wirklich nötig ?

Bitte entschuldigt, aber das musste jetzt mal sein !


UND WENN ES DENN UNBEDINGT SEIN MUSS:

Gib dem FB drei Parameter:
einer INT, einer REAL, einer BOOL.
Der BOOL entscheidet, ob der INT oder der REAL gültig ist....
 
Zuletzt bearbeitet:
:confused: na-na-na-na-na ...

Über Sinn und Unsinn wollen wir in diesem Zusammenhang nicht nachdenken. Es ist machbar und isha möchte es machen, somit es das seine Entscheidung. Abgesehen davon gibt es in der Praxis ja schon Funktionen, die genau das selbstständig machen, was isha vorhat.

Also ... Let's go ...
 
Das gleiche hatte ich vor ca. 4 Monaten auch vor. (Hatte ich auch im Forum nachgefragt)
Habe es im endeffekt auch mit 3 Eingangsvariablen gemacht. Funktioniert natürlich einwandfrei. Aber son AnyPointer is natürlich schöner.

Naja, jetz ist die Anlage in Betrieb, aber interessieren würde mich es trotzdem.


Nochmal meine Frage
Wenn ich jetzt den Anypointer geladen habe... also:

so.. jetzt ist er im Adressregister. Wie kann ich drauf zugreifen und ihn "zerpflücken"?

Einfach
L D [AR1,P#0.0] // als Beispiel
???

Was mich halt wundert, wenn ich an Stelle von diesem Anypointer einen Bereichszeiger ins Register lade, also

und nun
L DBD [AR1,P#0.0]
lade, greift er auf auf das Doppelwort in meinem Datenwort zu und nicht auf das Doppelwort was in meinem Adressregister steht. Woher weiß dat Ding, was ich will?
Das ich einmal D und einmal DBD geschrieben habe weiß ich, aber mit Bereichsübergreifen und intern hats doch nichts zu tun, oder?
 
Hallo Jordy,
gemäß deines Beispiels hast du schon alles gesagt.
Du willst ein DBD laden. Dabei beziehst du dich auf den aufgeschlagenen DB. Hättest du ED geschrieben, dann wäre das deine Basis. Genauso bei LD usw.
Du adressierst nun halt "indirekt" (im Gegensatz zu "L DBD 6" = direkt).

Eine andere Variante wäre hier :
L DBD [hPointer] // hPointer wäre hier ein DWORD aus dem TEMP-Bereich (z.B.)
das würde auch funktionieren.

Frage damit beantwortet ?

Gruß
LL
 
Zurück
Oben