SCL, mit ANY-Pointer auf temp-Variablen des aufrufenden Bausteins zugreifen.

Markus89

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

ich habe ein kleines, nicht ganz einfaches Problem in SCL. Ich möchte einen FB-Baustein schreiben der als Eingang einen ANY Parameter besitzt. Nun sollen diesem Baustein neben Merker oder DB-Variablen auch temporäre Variablen des aufrunden Bausteins übergeben werden können. Das mit der DB Geschichte und den Merkern funktioniert problemlos über den entsprechenden indirekten Zugriff. Wie kann ich aber auf die temporären Daten kommen, ich habe mir schon überlegt über SFC20 irgendetwas hinundher zu kopieren , jedoch erfolglos. Und ja es muss eine Möglichkeit geben, denn ein Kollege von mir hat es auch geschafft, er lässt mich aber noch zappeln. Es soll jetzt mal davon ausgegangen werden, dass nur Wörter als Paramter reinkommen, sonst wird es so viel Code zum schreiben:p Noch kurz etwas die STruktur zum besseren Verständis:

FUNCTION BLOCK Test

CONST
OPERAND_DBX : W#16#84; //Operandenbereich Globaldaten
OPERAND_M : W#16#83; //Operandenbereich Merkern
OPERAND_V : W#16#87; //Operandenbereich temporäre Lokaldaten des //Vorgängerbausteins

END_CONST

VAR_INPUT
value : ANY
END_VAR

VAR
Data : ANY;

Data_value AT Data : STRUCT
ID : BYTE;
TYP : BYTE;
ANZ : INT;
DBN : WORD;
PTR : DWORD;
END_STRUCT;

DB_Nummer : WORD;
Adresse : INT;
Operand := BYTE;
y: INT;
END_VAR

BEGIN

Data := value;

Adresse := DWORD_TO_INT(SHR(IN := Data_value.PTR, N:= INT#3 ));

Operand := DWORD_TO_BYTE(ROL(IN := Data_value.PTR, N:= INT#8 ));

IF Operand = OPERAND_DBX THEN

y := WORD_TO_INT(WORD_TO_BLOCK_DB(Data_value.DBN).DW[Adresse]);

ELSIF Operand = OPERAND_M THEN

y := WORD_TO_INT(MW[Adresse]);

ELSIF Operand = OPERAND_V THEN

y := ????????????? HIER STEHEN DIE GROßEN FRAGEZEICHEN...

END_IF;

END_FUNCTION_BLOCK


//////////
Ich bin um jeden Hinweis dankbar

mfg

Markus
 
Hallo,
hier fällt mir dann wirklich nur ein "von hinten durch die Brust ins Auge" - Sorry ... :rolleyes:

Wie du schon richtig festgestellt hast kann SCL nicht auf den Datenbereich "L" und auch nicht auf "LV" zugreifen. Ganz bestimmt gibt es mit dem "SFC Blockmove" eine Möglichkeit das hinzubekommen (wie hast du das denn bisher versucht ?) - wenn es allerdings nur um Daten vom Typ WORD geht - warum dann nicht "byValue" (also über die Schnittstelle IN) ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,

naja warum kein "byValue" ist ganz einfach. Der Baustein soll nachher fast alle verschiedenen Datentypen entgegennehmen können. Also INT, REAL, DINT, WORD und DINT. Das WORD war nur so als Beispiel. Bei dem Baustein handelt es sich um eine Polygonzugberechnung, bei der eben für die Stützpunktparameter unterschiedliche Datentypen verlangt sind.

Was den Blockmove angeht, ich hatte eben versucht den Eingangsparameter in irgendein DB zu kopieren aber das macht ja auch kein Sinn, weil es sich ja wieder nur um den Zeiger handelt und nicht um die Daten. Naja ich werde weiter dran bleiben und weitere Ideen gerne entgegennehmen. Danke Larry für deine Einschätzung:)

mfg

Markus
 
Ich wiederhole noch einmal meine Frage von eben :
Ganz bestimmt gibt es mit dem "SFC Blockmove" eine Möglichkeit das hinzubekommen (wie hast du das denn bisher versucht ?)
... ich dachte dabei an einen Code-Auszug ...

Ich hätte es ggf. so versucht :
Code:
meinANY := meine_ZielVariable ;
  // hierbei wird dann ein ANY-Pointer auf deine (im Baustein eigene) Zielvariable erzeugt. Nun den und den IN-Any an den SFC20 übergeben.
Als Problematisch sehe ich hierbei, dass du je nach Eingangs-Datentyp ja auf unterschiedliche Zielvariablen schreibt und dann auch im Code unterschiedlich verarbeitest. Das wird auf jeden fall ziemlich aufwändig, da sich hierbei ja jeweils um eigene Funktionen handeln würde. Mit einer Hochsprache (z.B. Visual Studio) würde ich hier mit Überlagerungen arbeiten - das gibt es aber in der SPS nicht (vielleicht mal in weiter Zukunft ... :rolleyes:).

Ich könnte mir also vorstellen, dass dein Code, der lediglich eine Variable korrekt einlesen soll umfangreicher wird als deine eigentliche Berechnung, weil du ja alle Eventualitäten berücksichtigen mußt. Das ist eigentlich eher etwas für eine (Machbarkeits-)Studie und nicht so sehr für etwas mit einem "echten" Nutzen ...

Aber es ist ja dein Spiel ... :ROFLMAO:

Gruß
Larry
 
Also wenn du den Code von meinem ersten Beitrag anschaust, dann in etwa sowas:

error := BLKMOV(SRCBLK := value //IN
,DSTBLK := Data );//OUT


Aber das macht ja dann keine SInn wie ich bereits geschrieben habe. Da macht dann deine Variante mehr Sinn.

Ich habe mir das Spiel nicht selber ausgedacht;) es ist ein Wunsch meines Chefs. Das die ganze Sache am Ende ein großer Bündel Code wird, das ist mir bewusst. Und ja auf den Tag, an dem SPS mit Hochsprache programmieren, auf den Warte ich noch:D

mfg Markus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... wenn Data deine Ziel-Variable im Baustein ist, dann mußt du (wie von mir beschrieben) davon erst einen ANY-Pointer bilden. Probier das doch einmal so aus.

Ob nun Zielvorgabe deines Chefs oder nicht - man kann als Ausführender auch die Sinnhaftigkeit von Etwas in Frage stellen - denk mal drüber nach.
Ungeachtet dessen ist das aber realisierbar (den Aufwand lassen wir hier mal "Aussen vor").

Gruß
Larry
 
Jetzt nochmal einmal zum mitschreiben.

VAR_INPUT
value : ANY;
END_VAR;

VAR
meinANY : ANY;
meineZielVariable : REAL;

END_VAR

BEGIN

meinANY := meineZielVariable;

BLKMOV (IN := value, OUT:= meinANY);



So in etwa habe ich jetzt deine Variante verstanden.

Gruß Markus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja-woll ... genau so ...

Und ... geht es so ?


Ergänzung:
Ggf. müßtest du bei dem IN-Any im Fall von Lokaldaten den Typ auf LV ändern. Ich könnte mir aber vorstellen, dass es geht ...
 
Nee, einen Any in den In Parametern kannst du nicht weiterreichen...

Und dann würde er ja trotzdem nur auf die Lokaldaten des FCs aus dem SFC20 aufgerufen und nicht auf die des vorigen zeigen!
 
Ja er hat recht, es geht nicht... Jochen hast du eine Idee, wo du sagen würdest das könnte funktionieren?

Gruß Markus
 
ich habe ein kleines, nicht ganz einfaches Problem in SCL. Ich möchte einen FB-Baustein schreiben der als Eingang einen ANY Parameter besitzt. Nun sollen diesem Baustein neben Merker oder DB-Variablen auch temporäre Variablen des aufrunden Bausteins übergeben werden können.
[...]
Und ja es muss eine Möglichkeit geben, denn ein Kollege von mir hat es auch geschafft, er lässt mich aber noch zappeln.
Dann frage doch Deinen Kollegen, WIE er es geschafft haben will (und zeige uns hier die Lösung).
Meines Wissens geht das nämlich nur in AWL, nicht in SCL.

Absolute sowie indizierte Zugriffe auf L oder V sind in SCL nicht möglich und das Weiterreichen eines V-Any an einen weiteren Baustein macht keinen Sinn, weil dann auf den Lokaldatenbereich des SCL-Bausteins zugegriffen würde statt auf den des ursprünglich aufrufenden Bausteins.
Man kann zwar den SFC20 BLKMOV mit dem V-Any aufrufen - BLKMOV kopiert auch was mit Fehlerstatus 0 - doch nicht den Wert, auf den der V-Any zeigt.

Ich habe mir das Spiel nicht selber ausgedacht;) es ist ein Wunsch meines Chefs.
Gerade wenn es der Wunsch Deines Chefs ist, sollte Dein Kollege Deine Arbeitszeit nicht sinnlos vergeuden, indem er Dich mit der Hoffnung auf eine Möglichkeit "zappeln" läßt.

Harald
 
Zurück
Oben