SCL FB Parameter ANY Pointer

_pi_

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will an einen Baustein die Adresse des Ausgangs übergeben; damit ich den FB-Aufruf elegant in einer Zeile schreiben kann..ungefähr so:

Code:
FUNCTION_BLOCK fb_called
VAR_INPUT
    pOUT:   ANY;
 END_VAR
....
BEGIN
...
pOUT := TRUE;
 

Aufruf:
fb_called(pOUT:=%M900.7);

ich bekomme aber keinen Wert in M900.7! was mache ich falsch?
oder gibt es einfachere Lösungen??
 
Zuviel Werbung?
-> Hier kostenlos registrieren
geht genau so wie in AWL.

Var_Output
MyBool : Bool;
end_var;

MyBool := MyTrueOrFalse;

ja, soweit ist das richtig...aber wie schreib ich dann den aufruf?
ich bekomme das nur so hin:

Code:
fb_called();
M900.7 := fb_called.MyBool;
wie kann ich den Aktualoperanden (VAR_OUT) direkt im Aufuf angeben?
 
Willst du den FB in AWL aufrufen oder in SCL mit einbinden ?

in AWL:
Code:
call FB10,db10
pOut: p#M900.0
in SCL:
Code:
den FB im STAT-Bereich deklarieren ... dann brauchst du den I-DB nicht mehr
fb_called (pOUT:=M900.7);
 
ich will alles in SCL schreiben, also auch den Aufruf;
dann wäre ich ja fast bei meiner anfangslösung...aber es funktioniert nicht! ich bekomm keine Wertänderung im M900.7 !?

Willst du den FB in AWL aufrufen oder in SCL mit einbinden ?

in AWL:
Code:
call FB10,db10
pOut: p#M900.0
in SCL:
Code:
den FB im STAT-Bereich deklarieren ... dann brauchst du den I-DB nicht mehr
fb_called (pOUT:=M900.7);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube, jetzt habe ich's ...

Du musst in deinem SCL-Script natürlich zunächst den Pointer zerlegen, damit du damit eine Variable adressieren kannst ... Ich denke, das hast du nicht gemacht ...

Da das etwas umständlich ist muss ich doch mal fragen was du vorhast ...

Gruß
LL
 
Ich glaube, jetzt habe ich's ...

Du musst in deinem SCL-Script natürlich zunächst den Pointer zerlegen, damit du damit eine Variable adressieren kannst ... Ich denke, das hast du nicht gemacht ...

Da das etwas umständlich ist muss ich doch mal fragen was du vorhast ...

Gruß
LL

"pointer zerlegen"....ups, jetzt wird's kompliziert! ;-)
eigentlich will ich was ganz einfaches und im prinzip geht es mir nur um die "optik":

wenn ich eine VAR_OUTPUT-Variable habe,kann ich anscheinend diese nicht direkt im Aufruf übergeben, ich muß zuerst die Instanz aufrufen mit allen INPUT Parametern und dann kann ich auf die einzelnen OUTPUT-Parameter zugreifen:

Code:
fb_called(IN1:=...,IN2:=...);
M900.7 := fb_called.MyBool

das gefällt mir nicht, vor allem dann, wenn ich mehrere Outvariablen und viele Instanzen vom FB habe.
Also suche ich einen weg, alles im Aufruf anzugeben...ideal wäre:
Code:
fb_called(IN1:=...,IN2:=...,M900.6:=OUT1,M900.7:=OUT2,....);
das lässt sich aber nicht übersetzen; Deswegen bin ich auf die Idee mit dem ANY-Pointer für die Outputs gekommen; was ich zwar übersetzen kann, aber nicht das tut, was ich will

p.s. sorry für den delay...ich war out of office!
 
Hallo,
ich verstehe leider dein Problem nicht ganz richtig ...

Grundsätzlich: wenn du einer Prozedur (in einer Hochsprache) oder einem FB / FC (in der Siemens-Welt) Informationen übergeben willst, dann musst es auch tun ... sonst gehts nicht ...

Vielleicht solltest du einfach mal schildern, was du eigentlich genau machen möchtest und vielleicht finden wir dann einen "schicken" Weg. Ich glaube nicht, das du mit dem ANY-Pointer dahin kommst ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Out1 : Bool

Willst Du die Ausgangsparameter von der Datenbreite variabel halten?
Wenn ja, wird a bisl komplizierter (gerade in SCL), wenn nicht, deklariere die Outputs doch als BOOL, dann hast du direkten Zugriff.

Code:
FUNCTION_BLOCK fb_called
VAR_INPUT
    pOUT:   BOOL;
 END_VAR
....
BEGIN
...
pOUT := TRUE;
 

Aufruf:
fb_called(pOUT:=M900.7);
 
Mit Funktionen funktioniert das:

Beispiel mit Vorlage von SCL:

MYFUNCTION(PunktNr := // IN: INT
,Wert_Strom := // OUT: INT
,Wert_Draht := // OUT: INT
); // BOOL


Mit Funktionsbausteinen kommst Du wohl nicht um die separaten Zuweisungen der Ausgänge a la:

MyVar := MYFB.MyOut;

nicht herum...
 
@Grubba: _Pi_ möchte (im Augenblick) nicht die Variablen an die Ausgänge des Bausteins schreiben, sondern einen Zeiger darauf (ANY-Pointer). Das hat nichts mit FB oder FC zu tun ...
 
Zurück
Oben