-> Hier kostenlos registrieren
Hallo,
ich habe folgendes Problem:
Ich habe einen DB in dem 20 Doppelworte stehen DB200.dbd0 – db200.dbd80.
Aus diesem möchte ich dynamisch, zu bestimmten Zeitpunkten jeweils Bytes in einen Anderen DB kopieren nämlich immer DB202.dbb0.
Die Quelladresse wird jeweils neu berechnet und liegt folgendermaßen vor:
Adresse DW: Integer (0 – 80)
Adresse Byte: Integer (0 – 3)
Dazu habe ich mir hier im Forum folgenden SCR-Code zusammengeklaut (Ich habe bisher noch nie mit SCR gearbeitet) und angepasst.
FUNCTION FC205: VOID
VAR_INPUT
Kopieren: BOOL;
Quell_Doppelwort: INT;
Quell_Byte: INT;
Ziel_Byte: INT;
Quell_DB: BLOCK_DB;
Ziel_DB: Block_DB;
END_VAR
VAR_OUTPUT
Wert_Byte: BYTE;
END_VAR
VAR_TEMP
Temp: Dword;
Temp_Quell_Byte: DWORD;
Temp_Ziel_Byte: DWORD;
END_VAR
VAR
Quelle: STRUCT //ANY Struktur 1 anlegen
ANY_id: BYTE;
Source_DataType: BYTE;
Source_Lenght: WORD;
Source_DB_Nummer: WORD;
Source_Byte_Pointer: DWORD;
END_STRUCT;
Ziel: STRUCT //ANY Struktur 2 anlegen
ANY_id: BYTE;
Destin_DataType: BYTE;
Destin_Lenght: WORD;
Destin_DB_Nummer: WORD;
Destin_Byte_Pointer: DWORD;
END_STRUCT;
//Deklaration ANY Pointer für Quell-DB
pAny_source AT Quelle: ANY;
//Deklaration ANY Pointer für Ziel-DB
pAny_destin AT Ziel: ANY;
erg: INT; //Rückgabewert / Return value
END_VAR
//Vorbelegen der Quell-ANY-Pointer Variablen
Temp_Quell_Byte:= WORD_TO_DWORD(INT_TO_WORD(Quell_Byte));
Temp_Quell_Byte:= SHL(IN:=Temp_Quell_Byte,N:=3);
Quelle.ANY_id:= 16#1;
Quelle.Source_DataType:= 16#2;
Quelle.Source_Lenght:= 16#0a;
Quelle.Source_DB_Nummer:= BLOCK_DB_TO_WORD(Quell_DB);
Quelle.Source_Byte_Pointer:= Temp_Quell_Byte;
//Vorbelegen der Ziel-ANY-Pointer Variablen
Temp_Ziel_Byte:= WORD_TO_DWORD(INT_TO_WORD(Ziel_Byte));
Temp_Ziel_Byte:= SHL(IN:=Temp_Ziel_Byte,N:=3);
Ziel.ANY_id:= 16#1;
Ziel.Destin_DataType:= 16#2;
Ziel.Destin_Lenght:= 16#0a;
Ziel.Destin_DB_Nummer:= BLOCK_DB_TO_WORD(Ziel_DB);
Ziel.Destin_Byte_Pointer:= Temp_Ziel_Byte;
//Aufruf SFC20 und Parametrierung der ANY-Pointer-Variablen
IF Kopieren = True THEN
erg:= SFC20(srcblk:= pAny_source, dstblk:= pAny_destin);
End_IF;
END_FUNCTION
Aufruf des FCs zu Testzecken im OB 1mit Statischen Parametern:
U "M 0.1"
= L 20.0
BLD 103
U "M 0.1"
SPBNB _001
CALL FC 205
Kopieren :=L20.0
Quell_Doppelwort:=20
Quell_Byte :=3
Ziel_Byte :=1
Quell_DB :="Fehlerliste Isra"
Ziel_DB :="Vergleich_Fehlernummer"
Wert_Byte :=MB200
_001: NOP 0
Leider funktioniert das ganze nicht. Zu allem Überfluss bekomme ich wenn ich den Baustein beobachten möchte immer die Meldung, dass der Baustein nicht Testbar sei.
Was mache ich falsch?
Danke schon mal für eure Mühe.
Gruß,
Norbert
ich habe folgendes Problem:
Ich habe einen DB in dem 20 Doppelworte stehen DB200.dbd0 – db200.dbd80.
Aus diesem möchte ich dynamisch, zu bestimmten Zeitpunkten jeweils Bytes in einen Anderen DB kopieren nämlich immer DB202.dbb0.
Die Quelladresse wird jeweils neu berechnet und liegt folgendermaßen vor:
Adresse DW: Integer (0 – 80)
Adresse Byte: Integer (0 – 3)
Dazu habe ich mir hier im Forum folgenden SCR-Code zusammengeklaut (Ich habe bisher noch nie mit SCR gearbeitet) und angepasst.
FUNCTION FC205: VOID
VAR_INPUT
Kopieren: BOOL;
Quell_Doppelwort: INT;
Quell_Byte: INT;
Ziel_Byte: INT;
Quell_DB: BLOCK_DB;
Ziel_DB: Block_DB;
END_VAR
VAR_OUTPUT
Wert_Byte: BYTE;
END_VAR
VAR_TEMP
Temp: Dword;
Temp_Quell_Byte: DWORD;
Temp_Ziel_Byte: DWORD;
END_VAR
VAR
Quelle: STRUCT //ANY Struktur 1 anlegen
ANY_id: BYTE;
Source_DataType: BYTE;
Source_Lenght: WORD;
Source_DB_Nummer: WORD;
Source_Byte_Pointer: DWORD;
END_STRUCT;
Ziel: STRUCT //ANY Struktur 2 anlegen
ANY_id: BYTE;
Destin_DataType: BYTE;
Destin_Lenght: WORD;
Destin_DB_Nummer: WORD;
Destin_Byte_Pointer: DWORD;
END_STRUCT;
//Deklaration ANY Pointer für Quell-DB
pAny_source AT Quelle: ANY;
//Deklaration ANY Pointer für Ziel-DB
pAny_destin AT Ziel: ANY;
erg: INT; //Rückgabewert / Return value
END_VAR
//Vorbelegen der Quell-ANY-Pointer Variablen
Temp_Quell_Byte:= WORD_TO_DWORD(INT_TO_WORD(Quell_Byte));
Temp_Quell_Byte:= SHL(IN:=Temp_Quell_Byte,N:=3);
Quelle.ANY_id:= 16#1;
Quelle.Source_DataType:= 16#2;
Quelle.Source_Lenght:= 16#0a;
Quelle.Source_DB_Nummer:= BLOCK_DB_TO_WORD(Quell_DB);
Quelle.Source_Byte_Pointer:= Temp_Quell_Byte;
//Vorbelegen der Ziel-ANY-Pointer Variablen
Temp_Ziel_Byte:= WORD_TO_DWORD(INT_TO_WORD(Ziel_Byte));
Temp_Ziel_Byte:= SHL(IN:=Temp_Ziel_Byte,N:=3);
Ziel.ANY_id:= 16#1;
Ziel.Destin_DataType:= 16#2;
Ziel.Destin_Lenght:= 16#0a;
Ziel.Destin_DB_Nummer:= BLOCK_DB_TO_WORD(Ziel_DB);
Ziel.Destin_Byte_Pointer:= Temp_Ziel_Byte;
//Aufruf SFC20 und Parametrierung der ANY-Pointer-Variablen
IF Kopieren = True THEN
erg:= SFC20(srcblk:= pAny_source, dstblk:= pAny_destin);
End_IF;
END_FUNCTION
Aufruf des FCs zu Testzecken im OB 1mit Statischen Parametern:
U "M 0.1"
= L 20.0
BLD 103
U "M 0.1"
SPBNB _001
CALL FC 205
Kopieren :=L20.0
Quell_Doppelwort:=20
Quell_Byte :=3
Ziel_Byte :=1
Quell_DB :="Fehlerliste Isra"
Ziel_DB :="Vergleich_Fehlernummer"
Wert_Byte :=MB200
_001: NOP 0
Leider funktioniert das ganze nicht. Zu allem Überfluss bekomme ich wenn ich den Baustein beobachten möchte immer die Meldung, dass der Baustein nicht Testbar sei.
Was mache ich falsch?
Danke schon mal für eure Mühe.
Gruß,
Norbert