Hi
Why does this code not working in a CPU 416-2 ?
FUNCTION_BLOCK FB840
TITLE = 'Read and write to Kval-DB'
//
// Block Comment...
//
VERSION: '1.0'
AUTHOR: FrSv
NAME: READ_DB
VAR_INPUT
// Input Parameters
WRITE : BOOL; //Ingång för att skriva(positiv flank)
READ : BOOL; //Ingång för att läsa(positiv flank)
KVALW : INT; //Ingång för att välja kvalitet vid skrivning
KVALR : INT; //Ingång för att välja kvalitet vid läsning
DB_WRITE : INT; //DB att använda vid skrivning till kvalbib
DB_READ : INT; //DB att använda vid läsning från kvalbib
DB_LIB : INT; //DB som innehåller kvalitetsbiblioteket
END_VAR
VAR_OUTPUT
// Output Parameters
QERROR : BOOL; //Fel vid läsning/skrivning
QFULL : BOOL; //Kvalitetsbibliotek fullt
QNFOUND : BOOL; //Kvalitet finns ej vid läsning
END_VAR
VAR_TEMP
// Temporary Variables
ADDRESS1, ADDRESS2 : INT;
ERRORHEX : WORD;
I : INT;
ERROR : INT;
KVALWH, KVALRH : WORD;
DBSRC, DBDEST : ANY; //Pekare för läs och skriv-DB
DBAnySRC AT DBSRC :
STRUCT // Diassembled ANY pointer structure
S7Code : BYTE; // Code for S7 (fixed at 16#10)
DataType : BYTE; // Code for data type
Length : INT; // Repetition factor = Send/receive length
DBNumber : INT; // Data block Number
MemoryArea : BYTE; // Specified memory area
ByteAddressMSB : BYTE; // Byte address most significant bits
ByteAddressLSB : WORD; // Byte address least significant bits
END_STRUCT;
DBAnyDEST AT DBDEST :
STRUCT // Diassembled ANY pointer structure
S7Code : BYTE; // Code for S7 (fixed at 16#10)
DataType : BYTE; // Code for data type
Length : INT; // Repetition factor = Send/receive length
DBNumber : INT; // Data block Number
MemoryArea : BYTE; // Specified memory area
ByteAddressMSB : BYTE; // Byte address most significant bits
ByteAddressLSB : WORD; // Byte address least significant bits
END_STRUCT;
END_VAR
VAR
// Static Variables
FLANKW, FLANKR : BOOL;
EXISTS : BOOL;
END_VAR
EXISTS := 0;
KVALWH := INT_TO_WORD(KVALW);
KVALRH := INT_TO_WORD(KVALR);
DBAnySRC.S7Code := 16#10;
DBAnySRC.DataType := 16#02; //Datatyp, 02=Bytes
DBAnySRC.Length := 164; //Längd att läsa i bytes
DBAnySRC.MemoryArea := B#16#84; //Minnesarea, 84=DB
DBAnyDEST.S7Code := 16#10;
DBAnyDEST.DataType := 16#02; //Datatyp, 02=Bytes
DBAnyDEST.Length := 164; //Längd att skriva i bytes
DBAnyDEST.MemoryArea := B#16#84; //Minnesarea, 84=DB
IF WRITE AND NOT FLANKW = 1 THEN
FOR ADDRESS1 := 0 TO 9840 BY 164 DO //Sök om kvalitetskoden finns
IF ADDRESS1 > 8196 THEN
DBAnyDEST.ByteAddressMSB := 1;
ELSE
DBAnyDEST.ByteAddressMSB := 0;
END_IF;
// Statement Section
IF WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DW[ADDRESS1+2] = KVALWH AND WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DX[ADDRESS1,0] = 1 THEN //Kontrollera om platsen har rätt kvalkod
DBAnyDEST.DBNumber := DB_LIB; //DB att skriva till
DBAnySRC.DBNumber := DB_WRITE; //DB att läsa data ifrån
DBAnyDEST.ByteAddressLSB := INT_TO_WORD(ADDRESS1*8); //Välj aktuell position i kvalbib
ERROR := BLKMOV(SRCBLK := DBSRC, DSTBLK := DBDEST); //Uppdatera med nya värden
IF ERROR <> 0 THEN
QERROR := 1;
ELSE
QERROR := 0;
QFULL := 0;
END_IF;
EXISTS := 1; //Kvalitetskod finns
EXIT;
END_IF;
END_FOR;
DBAnyDEST.ByteAddressMSB :=0;
DBAnyDEST.ByteAddressLSB :=0;
IF EXISTS=0 THEN //Kontrollera om kvalitetskoden fanns
FOR ADDRESS2 := 0 TO 9840 BY 164 DO //Sök efter ledig plats
IF ADDRESS2 > 8196 THEN
DBAnyDEST.ByteAddressMSB := 1;
ELSE
DBAnyDEST.ByteAddressMSB := 0;
END_IF;
// Statement Section
IF WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DX[ADDRESS2,0] = 0 THEN //Kontrollera om platsen är upptagen
// Statement Section_IF
QFULL := FALSE; //DB ej fullt
DBAnyDEST.DBNumber := DB_LIB; //DB att skriva till
DBAnySRC.DBNumber := DB_WRITE; //DB att läsa data ifrån
DBAnyDEST.ByteAddressLSB := INT_TO_WORD(ADDRESS2*8); //Välj aktuell position i kvalbib
ERROR := BLKMOV(SRCBLK := DBSRC, DSTBLK := DBDEST); //Skriv datat till Kvalbib
ERRORHEX := INT_TO_WORD(ERROR);
IF ERROR <> 0 THEN
QERROR := 1;
ELSE
QERROR := 0;
END_IF;
EXIT;
ELSE
QFULL := TRUE; //DB Fullt
END_IF;
END_FOR;
END_IF;
FLANKW:=TRUE; //Åtgärd utförd
QNFOUND := 0; //Nollställ vid skrivning
END_IF;
IF WRITE = 0 THEN
FLANKW := 0;
END_IF;
IF READ AND NOT FLANKR = 1 THEN
FOR ADDRESS1 := 0 TO 9840 BY 164 DO //Sök om kvalitetskoden finns
IF ADDRESS1 > 8196 THEN
DBAnySRC.ByteAddressMSB := 1;
ELSE
DBAnySRC.ByteAddressMSB := 0;
END_IF;
// Statement Section
IF WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DW[ADDRESS1+2] = KVALRH AND WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DX[ADDRESS1,0] = 1 THEN //Kontrollera om platsen har rätt kvalkod
DBAnyDEST.DBNumber := DB_READ; //DB att skriva till
DBAnySRC.DBNumber := DB_LIB; //DB att läsa data ifrån
DBAnySRC.ByteAddressLSB := INT_TO_WORD(ADDRESS1*8); //Välj aktuell position i kvalbib
ERROR := BLKMOV(SRCBLK := DBSRC, DSTBLK := DBDEST); //Uppdatera med nya värden
EXISTS := 1; //Kvalitetskod finns
QNFOUND := 0; //Kvalitetskod hittat
IF ERROR <> 0 THEN
QERROR := 1;
ELSE
QERROR := 0;
END_IF;
EXIT;
END_IF;
END_FOR;
IF EXISTS=0 THEN //Kontrollera om kvalitetskoden fanns
QNFOUND := 1; //Kvalitetskod hittades ej
QERROR := 0;
END_IF;
FLANKR:=TRUE; //Åtgärd utförd
END_IF;
IF READ = 0 THEN
FLANKR := 0;
END_IF;
;
Regards
Berra
Why does this code not working in a CPU 416-2 ?
FUNCTION_BLOCK FB840
TITLE = 'Read and write to Kval-DB'
//
// Block Comment...
//
VERSION: '1.0'
AUTHOR: FrSv
NAME: READ_DB
VAR_INPUT
// Input Parameters
WRITE : BOOL; //Ingång för att skriva(positiv flank)
READ : BOOL; //Ingång för att läsa(positiv flank)
KVALW : INT; //Ingång för att välja kvalitet vid skrivning
KVALR : INT; //Ingång för att välja kvalitet vid läsning
DB_WRITE : INT; //DB att använda vid skrivning till kvalbib
DB_READ : INT; //DB att använda vid läsning från kvalbib
DB_LIB : INT; //DB som innehåller kvalitetsbiblioteket
END_VAR
VAR_OUTPUT
// Output Parameters
QERROR : BOOL; //Fel vid läsning/skrivning
QFULL : BOOL; //Kvalitetsbibliotek fullt
QNFOUND : BOOL; //Kvalitet finns ej vid läsning
END_VAR
VAR_TEMP
// Temporary Variables
ADDRESS1, ADDRESS2 : INT;
ERRORHEX : WORD;
I : INT;
ERROR : INT;
KVALWH, KVALRH : WORD;
DBSRC, DBDEST : ANY; //Pekare för läs och skriv-DB
DBAnySRC AT DBSRC :
STRUCT // Diassembled ANY pointer structure
S7Code : BYTE; // Code for S7 (fixed at 16#10)
DataType : BYTE; // Code for data type
Length : INT; // Repetition factor = Send/receive length
DBNumber : INT; // Data block Number
MemoryArea : BYTE; // Specified memory area
ByteAddressMSB : BYTE; // Byte address most significant bits
ByteAddressLSB : WORD; // Byte address least significant bits
END_STRUCT;
DBAnyDEST AT DBDEST :
STRUCT // Diassembled ANY pointer structure
S7Code : BYTE; // Code for S7 (fixed at 16#10)
DataType : BYTE; // Code for data type
Length : INT; // Repetition factor = Send/receive length
DBNumber : INT; // Data block Number
MemoryArea : BYTE; // Specified memory area
ByteAddressMSB : BYTE; // Byte address most significant bits
ByteAddressLSB : WORD; // Byte address least significant bits
END_STRUCT;
END_VAR
VAR
// Static Variables
FLANKW, FLANKR : BOOL;
EXISTS : BOOL;
END_VAR
EXISTS := 0;
KVALWH := INT_TO_WORD(KVALW);
KVALRH := INT_TO_WORD(KVALR);
DBAnySRC.S7Code := 16#10;
DBAnySRC.DataType := 16#02; //Datatyp, 02=Bytes
DBAnySRC.Length := 164; //Längd att läsa i bytes
DBAnySRC.MemoryArea := B#16#84; //Minnesarea, 84=DB
DBAnyDEST.S7Code := 16#10;
DBAnyDEST.DataType := 16#02; //Datatyp, 02=Bytes
DBAnyDEST.Length := 164; //Längd att skriva i bytes
DBAnyDEST.MemoryArea := B#16#84; //Minnesarea, 84=DB
IF WRITE AND NOT FLANKW = 1 THEN
FOR ADDRESS1 := 0 TO 9840 BY 164 DO //Sök om kvalitetskoden finns
IF ADDRESS1 > 8196 THEN
DBAnyDEST.ByteAddressMSB := 1;
ELSE
DBAnyDEST.ByteAddressMSB := 0;
END_IF;
// Statement Section
IF WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DW[ADDRESS1+2] = KVALWH AND WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DX[ADDRESS1,0] = 1 THEN //Kontrollera om platsen har rätt kvalkod
DBAnyDEST.DBNumber := DB_LIB; //DB att skriva till
DBAnySRC.DBNumber := DB_WRITE; //DB att läsa data ifrån
DBAnyDEST.ByteAddressLSB := INT_TO_WORD(ADDRESS1*8); //Välj aktuell position i kvalbib
ERROR := BLKMOV(SRCBLK := DBSRC, DSTBLK := DBDEST); //Uppdatera med nya värden
IF ERROR <> 0 THEN
QERROR := 1;
ELSE
QERROR := 0;
QFULL := 0;
END_IF;
EXISTS := 1; //Kvalitetskod finns
EXIT;
END_IF;
END_FOR;
DBAnyDEST.ByteAddressMSB :=0;
DBAnyDEST.ByteAddressLSB :=0;
IF EXISTS=0 THEN //Kontrollera om kvalitetskoden fanns
FOR ADDRESS2 := 0 TO 9840 BY 164 DO //Sök efter ledig plats
IF ADDRESS2 > 8196 THEN
DBAnyDEST.ByteAddressMSB := 1;
ELSE
DBAnyDEST.ByteAddressMSB := 0;
END_IF;
// Statement Section
IF WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DX[ADDRESS2,0] = 0 THEN //Kontrollera om platsen är upptagen
// Statement Section_IF
QFULL := FALSE; //DB ej fullt
DBAnyDEST.DBNumber := DB_LIB; //DB att skriva till
DBAnySRC.DBNumber := DB_WRITE; //DB att läsa data ifrån
DBAnyDEST.ByteAddressLSB := INT_TO_WORD(ADDRESS2*8); //Välj aktuell position i kvalbib
ERROR := BLKMOV(SRCBLK := DBSRC, DSTBLK := DBDEST); //Skriv datat till Kvalbib
ERRORHEX := INT_TO_WORD(ERROR);
IF ERROR <> 0 THEN
QERROR := 1;
ELSE
QERROR := 0;
END_IF;
EXIT;
ELSE
QFULL := TRUE; //DB Fullt
END_IF;
END_FOR;
END_IF;
FLANKW:=TRUE; //Åtgärd utförd
QNFOUND := 0; //Nollställ vid skrivning
END_IF;
IF WRITE = 0 THEN
FLANKW := 0;
END_IF;
IF READ AND NOT FLANKR = 1 THEN
FOR ADDRESS1 := 0 TO 9840 BY 164 DO //Sök om kvalitetskoden finns
IF ADDRESS1 > 8196 THEN
DBAnySRC.ByteAddressMSB := 1;
ELSE
DBAnySRC.ByteAddressMSB := 0;
END_IF;
// Statement Section
IF WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DW[ADDRESS1+2] = KVALRH AND WORD_TO_BLOCK_DB(INT_TO_WORD(DB_LIB)).DX[ADDRESS1,0] = 1 THEN //Kontrollera om platsen har rätt kvalkod
DBAnyDEST.DBNumber := DB_READ; //DB att skriva till
DBAnySRC.DBNumber := DB_LIB; //DB att läsa data ifrån
DBAnySRC.ByteAddressLSB := INT_TO_WORD(ADDRESS1*8); //Välj aktuell position i kvalbib
ERROR := BLKMOV(SRCBLK := DBSRC, DSTBLK := DBDEST); //Uppdatera med nya värden
EXISTS := 1; //Kvalitetskod finns
QNFOUND := 0; //Kvalitetskod hittat
IF ERROR <> 0 THEN
QERROR := 1;
ELSE
QERROR := 0;
END_IF;
EXIT;
END_IF;
END_FOR;
IF EXISTS=0 THEN //Kontrollera om kvalitetskoden fanns
QNFOUND := 1; //Kvalitetskod hittades ej
QERROR := 0;
END_IF;
FLANKR:=TRUE; //Åtgärd utförd
END_IF;
IF READ = 0 THEN
FLANKR := 0;
END_IF;
;
Regards
Berra