Code Working in PLCsim Not in CPu

Berra

Member
Join Date
Mar 2007
Location
Sweden
Posts
137
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
 
I do not see any begin_function_block and end_function_block.. Have to have begin after the declarations and end last.. So i dont even see how this would compile..
 
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;

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;
;
END_FUNCTION_BLOCK
 
begin still missing.. look below

Code:
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

BEGIN

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;

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;
;
END_FUNCTION_BLOCK
 
We call the block in a PCS7 chart,

When we a runnig the code in PLCsim is working correct, The error comes after downloadning in it to the CPU.
 
Lets see if I have the correct picture..

1. The code compiles.
2. The code runs in PLC-sim in the same project that you have downloaded in the PLC?
3. The code doesnt run in the PLC.
4. The error code 8x28 comes from BLKMOV?

8x28 from BLKMOV = Alignment error when reading a parameter.

Which leads me to believe that either the inputs for DBread/write are zero or points to a non existent db? The pointers is larger than the DB, the calculations of LSB are incorrect or something alike..
 
Bad english what I meant was that they could be incorrect not that they were.. Havent checked them.. Now I must go out and split some wood.. Hope you solve the problem..
 
Back in started raining heavy..

Ok.. When you get the error what do you have in the ANY pointers ?

The easiest way I can think of is copying the data to outputs.. Copy the data for the source pointer.

Is the bit adress in the pointer non equal to 0? from the manual:

This error code indicates that the reference to parameter x is a bit address that is not equal to 0.

Code:
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
SRCDBNumber : INT; // Data block Number 
SRCByteAddressMSB : BYTE; // Byte address most significant bits 
SRCByteAddressLSB : WORD; // Byte address least significant bits
DSTDBNumber : INT; // Data block Number 
DSTByteAddressMSB : BYTE; // Byte address most significant bits 
DSTByteAddressLSB : WORD; // Byte address least significant bits
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

BEGIN

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;

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;
SRCDBNumber := DBAnySRC.DBNumber;
SRCByteAddressMSB := DBAnySRC.ByteAddressMSB;
SRCByteAddressLSB := DBAnySRC.ByteAddressLSB;
DSTDBNumber := DBAnyDST.DBNumber;
DSTByteAddressMSB := DBAnyDST.ByteAddressMSB;
DSTByteAddressLSB := DBAnyDST.ByteAddressLSB;
END_FUNCTION_BLOCK
 
HI

When QERROR = 1
SRCDBNum=12
SRCByteAMSB=16#1
SCRBytALSB=16#CD58
DSTDBnum=0
DSTByteAMSB=
0DSTByteALSB=0
 

Similar Topics

Hi all, I have my DataMan 8100 all set up in RSLogix 5000 (compactlogix controller). The scanner reads bar codes just fine and brings in the...
Replies
1
Views
1,836
Hi there, (Actually a continuation of this thread (http://www.plctalk.net/qanda/showthread.php?t=47163) but title not really getting attention...
Replies
7
Views
5,042
I have a machine which is undergoing upgradation. As part of the process two SEW drives are being replaced., existing Gen B with new Gen C. The...
Replies
2
Views
95
I want to set user security level based on the value of a tag in my PLC called "ActiveUser". That tag will contain the A-P code which we use for...
Replies
6
Views
200
Hi All, Can anyone advise me on how to determine the AN of a genie instance I writing to. I have created a genie to display a valve and some text...
Replies
0
Views
85
Back
Top Bottom