-> Hier kostenlos registrieren
hallo,
ich hoffe ich bekomm ein bischen Klarheit darüber, ob man einen Standard-FC erstellen kann an dem man einen ANY-Zeiger als OUT ausgeben kann.
Ich hab folgendes Problem:
Ich möchte aus einem globalem Datenbaustein ( DB 90 in meinem Problem ) mit der SFC 20 BLKMOV Daten herausholen und in einem FB ( FB 8 ) verwenden. Da sich die Start-Adresse, wo ich die Daten aus dem DB heraushole ändert, habe ich mir dafür einen "dynamischen" ANY-Zeiger zusammengestzt, den ich dann an die SFC 20 angebunden hab und damit die Daten in den STAT-Teil des FB ( FB 8 ) kopiere. Soweit funktioiert das ganze schon ohne Probleme.
ABER:
Ich benötige jetzt den gleichen Ablauf in einem anderen FB auch, greif dort aber auf andere Daten aus einem anderen DB zu. Damit das ganze übersichtlich und verständlich wird, möchte ich nun eine FC erstellen in der ich mir den ANY-Zeiger zusammenstelle und über einen INOUT (oder OUT) zurückgebe um ihn nach dem FC-Aufruf an den SFC-Aufruf anbinden zu können. Ich möchte mir so einen Standard-Baustein erstellen, wo ich nur die Start-Adresse, die Länge und die DB-Nr. anbinde und ich den fertigen Zeiger zurückbekomme.
Das ganze funktioniert aber nicht so wie ich meine FC jetzt programmiert habe, da ich keinen ANY-Zeiger als INOUT oder OUT deklarieren kann.
Kann man überhaupt einen ANY-Zeiger zurückgeben? Oder kann man den Zeiger über das Arbeitsregister weiterverabeiten?
So hab ich meinen FC programmiert:
Ich kann aber keinen ANY-Zeiger als INOUT oder OUT deklarieren.
FUNCTION FC 55 : VOID
TITLE =ANY-Pointer DB zusammensetzen
AUTHOR : CH
VERSION : 0.1
VAR_INPUT
DB_NR : INT ; //DB-Nummer
Start_ADR : INT ; //Start-Adresse
Laenge : INT ; //Länge
END_VAR
VAR_TEMP
Temp_ANY_Pointer : ANY ; //ANY-Pointer
END_VAR
BEGIN
NETWORK
TITLE =
NETWORK
TITLE =Pointer zusammensetzen
LAR1 P##Temp_ANY_Pointer; // ANY-Pointer
L B#16#10; // Syntax ID
T LB [AR1,P#0.0];
L B#16#4; // Datentyp 4=Word
T LB [AR1,P#1.0];
L #Laenge; // Länge
T LW [AR1,P#2.0];
L #DB_NR; // DB-Nummer
T LW [AR1,P#4.0];
L P#DBX 0.0; // Speicherbereich Datenbaustein
L #Start_ADR; // Adresse des Datenbereiches
SLD 3; // In Pointerformat wandeln
+D ; // mit Bereichspointer verbinden
T LD [AR1,P#6.0];
END_FUNCTION
Danke schon für euere Hilfe!!!
ich hoffe ich bekomm ein bischen Klarheit darüber, ob man einen Standard-FC erstellen kann an dem man einen ANY-Zeiger als OUT ausgeben kann.
Ich hab folgendes Problem:
Ich möchte aus einem globalem Datenbaustein ( DB 90 in meinem Problem ) mit der SFC 20 BLKMOV Daten herausholen und in einem FB ( FB 8 ) verwenden. Da sich die Start-Adresse, wo ich die Daten aus dem DB heraushole ändert, habe ich mir dafür einen "dynamischen" ANY-Zeiger zusammengestzt, den ich dann an die SFC 20 angebunden hab und damit die Daten in den STAT-Teil des FB ( FB 8 ) kopiere. Soweit funktioiert das ganze schon ohne Probleme.
ABER:
Ich benötige jetzt den gleichen Ablauf in einem anderen FB auch, greif dort aber auf andere Daten aus einem anderen DB zu. Damit das ganze übersichtlich und verständlich wird, möchte ich nun eine FC erstellen in der ich mir den ANY-Zeiger zusammenstelle und über einen INOUT (oder OUT) zurückgebe um ihn nach dem FC-Aufruf an den SFC-Aufruf anbinden zu können. Ich möchte mir so einen Standard-Baustein erstellen, wo ich nur die Start-Adresse, die Länge und die DB-Nr. anbinde und ich den fertigen Zeiger zurückbekomme.
Das ganze funktioniert aber nicht so wie ich meine FC jetzt programmiert habe, da ich keinen ANY-Zeiger als INOUT oder OUT deklarieren kann.
Kann man überhaupt einen ANY-Zeiger zurückgeben? Oder kann man den Zeiger über das Arbeitsregister weiterverabeiten?
So hab ich meinen FC programmiert:
Ich kann aber keinen ANY-Zeiger als INOUT oder OUT deklarieren.
FUNCTION FC 55 : VOID
TITLE =ANY-Pointer DB zusammensetzen
AUTHOR : CH
VERSION : 0.1
VAR_INPUT
DB_NR : INT ; //DB-Nummer
Start_ADR : INT ; //Start-Adresse
Laenge : INT ; //Länge
END_VAR
VAR_TEMP
Temp_ANY_Pointer : ANY ; //ANY-Pointer
END_VAR
BEGIN
NETWORK
TITLE =
NETWORK
TITLE =Pointer zusammensetzen
LAR1 P##Temp_ANY_Pointer; // ANY-Pointer
L B#16#10; // Syntax ID
T LB [AR1,P#0.0];
L B#16#4; // Datentyp 4=Word
T LB [AR1,P#1.0];
L #Laenge; // Länge
T LW [AR1,P#2.0];
L #DB_NR; // DB-Nummer
T LW [AR1,P#4.0];
L P#DBX 0.0; // Speicherbereich Datenbaustein
L #Start_ADR; // Adresse des Datenbereiches
SLD 3; // In Pointerformat wandeln
+D ; // mit Bereichspointer verbinden
T LD [AR1,P#6.0];
END_FUNCTION
Danke schon für euere Hilfe!!!
Zuletzt bearbeitet: