FUNCTION "CheckBCR" : VOID
TITLE =
VERSION : 0.1
VAR_TEMP
RV_BLKMove : INT ;
RV_FindString : INT ;
DB_APointer : ANY ;
CodeOffset : DINT ;
EofOffset : DINT ;
FileOffset : DINT ;
strDBCode : STRING [14 ];
END_VAR
BEGIN
NETWORK
TITLE =
U "M_Chk_BCRSet";
SPBN xChk;
R "M_Chk_BCRSet";
// Offset berechnen
L "MB_TraySet"; // wird nach Einlegen der Speicherkarte initialisiert
L L#426;
*D ;
L L#10;
+D ;
T #CodeOffset;
// Bereichsende berechnen
L L#240;
+D ;
T #EofOffset;
// Dateinamen Offset berechnen
L #CodeOffset;
L L#256;
+D ;
T #FileOffset;
// Erster von 10 Rx-Barcodes setzt Dateiname und Vergleichscode für folgende Barcodes
L "MB_EnumTSet";
L 0;
==I ;
SPBN nTCk;
// Barcode in Trayset enthalten?
[FONT=courier new]// Zeiger auf DB29.Set[0].Code[0] String[14] ausrichten
LAR1 P##DB_APointer;
L B#16#10; // S7 Syntax
T LB [AR1,P#0.0];
L B#16#2; // Datentyp (eigentlich String, hier Byte)
T LB [AR1,P#1.0];
L 16; // Wiederholung 16 Bytes kopieren mit BLKMove
T LW [AR1,P#2.0]; // EAN Code 13 Zeichen bei Code39 auch mal mehr
L 29; // DB Nummer
T LW [AR1,P#4.0];
L #CodeOffset; // Byte Position im DB
SLD 3; // Umwandeln in Pointer
T LD [AR1,P#6.0];
L B#16#84;
T LB [AR1,P#6.0]; // Codierung Speicherbereich (DB -> h84)
// ab hier Zeiger auf "DB_TRAYS".Set[n].Code[0]
Loop: NOP 0;
// String aus DB,Array in lokale Temp kopieren
CALL "BLKMOV" (
SRCBLK := #DB_APointer,
RET_VAL := #RV_BLKMove,
DSTBLK := #strDBCode);
L #RV_BLKMove;
L 0;
<I ;
S M 37.3; // Störungs Hilfsmerker
SPB nGef;
// lokaler String mit DB String (kein Array) vergleichen
// Anstatt EQ_Strng verwende Find, um CR und LF usw. zu vernachlässigen
CALL "FIND" (
IN1 := "DB_Rx_BC1".Puffer,
IN2 := #strDBCode,
RET_VAL := #RV_FindString);
L #RV_FindString;
L 1;
==I ;
SPBN Vgl0; // weiteres Array
// Barcode in Sollcode-Puffer kopieren
CALL "BLKMOV" (// Left(DB_Trays.Set[n].Code[x],16,DB_RS232.Sollcode)
SRCBLK := #strDBCode,
RET_VAL := #RV_BLKMove,
DSTBLK := "DB_RS232".SollCode);
L #RV_BLKMove;
L 0;
<I ;
S M 37.4;
SPB nGef;
// Zeiger auf DB_Trays.Set[n].File[x] ausrichten
LAR1 P##DB_APointer;
L B#16#2; // Datentyp (eigentlich String, hier Byte)
T LB [AR1,P#1.0];
L 10; // Wiederholung (8 Zeichen + 2Byte String Header)
T LW [AR1,P#2.0];
L #FileOffset; // Byte Position im DB
SLD 3; // Umwandeln in Pointer
T LD [AR1,P#6.0];
L B#16#84;
T LB [AR1,P#6.0]; // Codierung Speicherbereich (DB h84)
// Dateiname in Drucker Schnitstelle kopieren
CALL "BLKMOV" (// Left(DB_Trays.Set[n].File[x],10,"DB_Tx_TCU".Datei)
SRCBLK := #DB_APointer,
RET_VAL := #RV_BLKMove,
DSTBLK := "DB_Tx_TCU".Datei);
L #RV_BLKMove;
L 0;
<I ;
S M 37.5;
SPB nGef;
SPA Gefu;
Vgl0: NOP 0;
L #CodeOffset;
L #EofOffset;
>=D ;
S M 37.6;
SPB nGef; // loop nach 16 "Vergleichen" beenden.
// Zeiger auf DBx.Set[n].Code[x=x+1] ausrichten
LAR1 P##DB_APointer;
L B#16#2; // Datentyp (eigentlich String, hier Byte)
T LB [AR1,P#1.0];
L 16; // Wiederholung 16 Bytes kopieren mit BLKMove
T LW [AR1,P#2.0]; // EAN Code 13 Zeichen bei Code39 auch mal mehr
L #CodeOffset; // Byte Position im DB
L L#16;
+D ;
T #CodeOffset; // Für nächsten Durchlauf sichern
SLD 3; // Umwandeln in Pointer
T LD [AR1,P#6.0];
L B#16#84;
T LB [AR1,P#6.0]; // Codierung Speicherbereich (DB h84)
L #FileOffset; // Offset auf Dateinamen berechnen
L L#10;
+D ;
T #FileOffset;
SPA Loop; // Achtung mögliche Endlos-Schleife
nGef: NOP 0;
SET ;
S "Err_BCR_noMatch";
S "St_Störung";
SPA xChk;
Gefu: NOP 0;
SET ;
S "M_Freig_Schachtel";
L "MB_EnumTSet";
+ 1;
T "MB_EnumTSet";
SPA xChk;
nTCk: NOP 0;
CALL "FIND" (
IN1 := "DB_Rx_BC1".Puffer,
IN2 := "DB_RS232".SollCode,
RET_VAL := #RV_FindString);
L #RV_FindString;
L 1;
==I ;
SPBN nMat; // no Match -> ERR Codeleser
S "M_Freig_Schachtel";
L "MB_EnumTSet";
+ 1;
T "MB_EnumTSet";
L 10;
==I ;
SPBN xChk; // noch keine 10 Schachteln, kein Init
L 0;
T "MB_EnumTSet";
SPA xChk;
nMat: NOP 0;
SET ;
S M 37.2;
S "St_Störung";
xChk: NOP 0;
END_FUNCTION
[/FONT]