Pointer einem parametrieren FC übergeben

S7_Mich

Well-known member
Beiträge
208
Punkte Reaktionen
3
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,

ich habe in dem FC2 denSFC68 aufgerufen. Als Empfangs und Sendefach muß man einen Zeiger Typ Any angeben. Also z. B. P#db10.dbx0.0 byte 10

Da ich diesen SFC68 merhmals benötige, und sich die anderen Variablen des SFC 68 nicht ändern, möchte ich gerne dieses FC2 über die Deklaration variabel gestalten und diesen FC2 dann im FC1 mehrmals aufrufen. Aber wenn ich den Pointer als in Variable deklarieren möchte, funktioniert das leider nicht, da die Schrift rot wird. Als Temp kann ich den Pointer schon deklarieren, aber warum nicht als In Variable. Übrigens In/Out geht auch nicht!

Gruß
Michael
 

Taddy

Well-known member
Beiträge
288
Punkte Reaktionen
34
Zuviel Werbung?
->Hier kostenlos registrieren
FUNCTION FC 1 : INT
TITLE =
AUTHOR : Taddy
VERSION : 1.0


VAR_INPUT
Quelle_DB : INT ; //Quelle Datenbaustein
Das_erste_Byte : INT ; //Das erste Byte
Anzahl_Bytes : INT ; //Anzahl der Bytes
Ziel_DB : INT ; //Ziel Datenbaustein
Zielanfang : INT ; //Ziel Anfangsadresse
END_VAR
VAR_TEMP
Quelle : ANY ; //ANY-Zeiger Quelle
Ziel : ANY ; //ANY-Zeiger Ziel
Busy : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =
// Zusammenstellung des Quellzeigers
L W#16#1002; //Typ BYTE
T LW 0;
L #Anzahl_Bytes; //Anzahl Bytes
T LW 2;
L #Quelle_DB; //Quell-DB
T LW 4;
L #Das_erste_Byte; //Anfang der Quelle
SLD 3;
OD DW#16#84000000;
T LD 6;
NETWORK
TITLE =
// Zusammenstellung des Zielzeigers
L W#16#1002; //Typ BYTE
T LW 10;
L #Anzahl_Bytes; //Anzahl Bytes
T LW 12;
L #Ziel_DB; //Ziel-DB
T LW 14;
L #Zielanfang; //Anfang der Ziels
SLD 3;
OD DW#16#84000000;
T LD 16;
NETWORK
TITLE =

CALL "X_PUT" (
REQ := TRUE,
CONT := TRUE,
DEST_ID := W#16#0,
VAR_ADDR := #Ziel,
SD := #Quelle,
RET_VAL := #RET_VAL,
BUSY := #Busy);

NETWORK
TITLE =
//Ende


END_FUNCTION

Achtung ! Restliche Parameter vom SFC 68 richtig eintragen !

:D
 
OP
S

S7_Mich

Well-known member
Beiträge
208
Punkte Reaktionen
3
Super, genau sowas hab ich gebraucht. Dankeschön. Habs mir fast schon gedacht, das man sich einen pointer selber basteln muß. Aber das hätte ich nicht gecheckt. Muß heute Nacht mir mal das Format Pointer zu Gemüte führen.

Dankschön und Gruß
Michael
 
OP
S

S7_Mich

Well-known member
Beiträge
208
Punkte Reaktionen
3
Hallo,

habe das heute Nacht mal getestet, aber irgendwas stimmt nicht. Hab gerade mal die Hilfefunktion von Step7 zu Hilfe genommen und soweit stimm ich dir voll und ganz zu. Aber warum schreibst du

// Zusammenstellung des Quellzeigers
L W#16#1002; //Typ BYTE
T LW 0;

Müßte das nicht heißen
L b#16#02 <-- Typ Byte
T LW 0


Du schreibst ja praktisch in den reservierten Bereich für S7 (laut Step7 Hilfe) B#16#10 rein. Für was soll das sein?

Müßte aber trotzdem funktionieren. Vielleicht war ich nicht mehr ganz wach ;-)

Gruß
Michael
 
OP
S

S7_Mich

Well-known member
Beiträge
208
Punkte Reaktionen
3
Zuviel Werbung?
->Hier kostenlos registrieren
Sorry, hast recht, habs gerade gesehen. In der Hilfe heißt es 10h für S7. Jetzt schließt sich der Kreis. 10 Hex meinen die damit

Muß nächste Woche nochmal nachschauen, warum das nicht so läuft.

Dankeschön
Michael
 

Taddy

Well-known member
Beiträge
288
Punkte Reaktionen
34
ANY Zeiger parametrieren
ANY Zeiger besteht aus 10 Byte
Bytebelegung

| n+00 | n+01 | n+02 | n+03 | n+04 | n+05 | n+06 | n+07 | n+08 | n+09

Byte n + 00 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Bit 7 <-- 1 = bereichsübergreifender Zeiger

Byte n + 01 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Bit 2,1,0 = Operandbereich - Tabelle A

Tabele A

BOOL 01 REAL 08 BLOCK_FB 17
BYTE 02 <-- hier steht deine zwei DATE 09 BLOCK_FC 18
CHAR 03 TOD 0A BLOCK_DB 19
WORD 04 TIME 0B BLOCK_SDB 1A
INT 05 S5TIME 0C COUNTER 1C
DWORD 06 DT 0E TIMER 1D
DINT 07 STRING 13

Byte
n + 02 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
n + 03

(Wieviel Daten sollen übertragen werden)

Byte
n + 04 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
n + 05

(DB Nummer, wenn kein DB dann -> Nullen !)


Byte n + 06 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |

Bit 7 <-- 1 = bereichsübergreifender Zeiger
Bit 2,1,0 Operandenbereich - Tabelle B

Tabele B

P - Perypherie |0 0 0
E - Eingänge |0 0 1
A - Ausgänge |0 1 0
M - Merker |0 1 1
DBX Globaldaten |1 0 0
DIX Instanzdaten |1 0 1

Byte n + 07 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Bit 7,6,5,4,3 nicht belegen, Bit 2,1,0 Byteadresse

Byte
n + 08 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
n + 09
weiter Byte-Adresse, Bit 2,1,0 = Bitadresse

Du kannst den SFC 68 durch SFC 20 ersetzen, dann hast du einen Baustein für unkmplizierte DB -> DB Copy
 
Oben