FUNCTION "FC_FachAuslesen" : VOIDTITLE =FachDaten und PalettenDaten auslesen
//dieser Baustein ermittelt der übgergebenen Fachnummer die Facheigenschaften und
//die PalettenDaten des Fachs und gibt diese an die Eingangs-AnyPointer zurück
AUTHOR : ROP
VERSION : 0.1
VAR_INPUT
iFachnummer : DINT ; //Fachnummer
iZielPalettenDaten : ANY ;
iZielFachDaten : ANY ;
END_VAR
VAR_TEMP
tPointerPalettenDaten : ANY ; //Pointer für Palettendaten
tPointerFachDaten : ANY ; //Pointer für Facheigenschaften
tZielPattenDaten : ANY ;
tZielFachDaten : ANY ;
retval : INT ;
tSYS : STRUCT //Systemvariablen
AR1 : DWORD ; //Adressregister sichern
AR2 : DWORD ; //Adressregister sichern
INSTANZOFS : DWORD ; //Instanzdatenoffset sichern
END_STRUCT ;
FachDaten : STRUCT
PalettenDaten : "UDT_Palette";
Facheigenschaften : "UDT_Facheigenschaften";
END_STRUCT ;
tDBNrRegal : INT ; //Nr des DBs des Quellfachs
tOffsetFach : DINT ;
tOffsetEigenschaften : DINT ;
tGasse : INT ;
tRegal : INT ;
tX : INT ;
tY : INT ;
tZ : INT ;
tZwischenergebnis : INT ;
tWerteGueltig : BOOL ;
tEinsmerker : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE ==== System save ===
//
TAR1 #tSYS.AR1; // Sichern AR1
TAR2 #tSYS.AR2; // Sichern AR2
TAR2 ;
UD DW#16#FFFFFF; // Bereichskennung ausmaskieren
T #tSYS.INSTANZOFS; // Sichern Instanzdatenanfang
NETWORK
TITLE =
UN #tEinsmerker;
S #tEinsmerker;
NETWORK
TITLE =Fachnummer in Koordinaten zerlegen
CALL "FC_KonvertFachnummer" (
iFachnummer := #iFachnummer,
oRegalnummer := #tRegal,
oX := #tX,
oY := #tY,
oZ := #tZ);
NOP 0;
NETWORK
TITLE =Koordinaten auf gültigen Wertebereich prüfen
//Regal >= 1 <= 14
//X >= 1 <= 61
//Y >= 1 <= 12
//Z >= 1 <= 2
U #tEinsmerker;
= L 161.0;
U L 161.0;
U( ;
L #tRegal;
L 1;
>=I ;
) ;
U( ;
L #tRegal;
L 14;
<=I ;
) ;
= #tWerteGueltig;
U L 161.0;
U #tWerteGueltig;
U( ;
L #tX;
L 1;
>=I ;
) ;
U( ;
L #tX;
L 61;
<=I ;
) ;
= #tWerteGueltig;
U L 161.0;
U #tWerteGueltig;
U( ;
L #tY;
L 1;
>=I ;
) ;
U( ;
L #tY;
L 12;
<=I ;
) ;
= #tWerteGueltig;
U L 161.0;
U #tWerteGueltig;
U( ;
L #tZ;
L 1;
>=I ;
) ;
U( ;
L #tZ;
L 2;
<=I ;
) ;
= #tWerteGueltig;
NETWORK
TITLE =Bausteinende wenn Werte nicht gültig
UN #tWerteGueltig;
SPB ende;
NETWORK
TITLE =Quell-Gasse aus Regalnummer ermitteln
L #tRegal;
+ 1;
L 2;
/I ;
T #tGasse;
NETWORK
TITLE =DB-Nr berechnen/festlegen
//tDBNrRegal = 100 + (tGasse*10) + ((tRegal / tGasse) - 1)*2 + tZ
L #tRegal;
L #tGasse;
/I ;
+ -1;
L 2;
*I ;
T #tZwischenergebnis; // Regaloffset 0 oder 2
L #tGasse; // 10er Schritte DB-Nr.
L 10;
*I ;
+ 100; // Grundoffset DB-Nr.
L #tZwischenergebnis;
+I ;
L #tZ; // Fachtiefe 1 oder 2
+I ;
T #tDBNrRegal;
NETWORK
TITLE =Offset (Fach) innerhalb vom Lager-DB berechnen
//Offset pro X-Koordinate = 1008 Byte
//Offset pro Y-Koordnate = 84 Byte
//
//Offset = [(iX-1)*1008] + [(iY-1)*84]
L #tX;
L 1;
-I ;
ITD ;
L L#1008;
*D ;
T #tOffsetFach;
L #tY;
L 1;
-I ;
ITD ;
L L#84;
*D ;
L #tOffsetFach;
+D ;
T #tOffsetFach;
NETWORK
TITLE =Anypointer bilden
NETWORK
TITLE =Any-Pointer PalettenDaten
L B#16#10; // ID (S7)
T LB 0;
L B#16#2; // Byte (siehe Hilfe "Format des Parametertyps ANY")
T LB 1;
L 80; // Länge: 80 byte
T LW 2;
L #tDBNrRegal;
T LW 4; // Quell-DB
L #tOffsetFach; // ab Adresse 0.0 (festlegen!)
SLD 3; // 2*8 (nicht ändern!)
L P#DBX 0.0; // Datenbaustein-Kennung (nicht ändern!)
OD ;
T LD 6;
NETWORK
TITLE =Any-Pointer Facheigenschaften
L B#16#10; // ID (S7)
T LB 10;
L B#16#2; // Byte (siehe Hilfe "Format des Parametertyps ANY")
T LB 11;
L 4; // Länge: 4 byte
T LW 12;
L #tDBNrRegal;
T LW 14; // Ziel-DB: = DBNrRegal
L #tOffsetFach; // ab Adresse 0.0 (=variabel)
L L#80;
+D ;
T #tOffsetEigenschaften;
L #tOffsetEigenschaften;
SLD 3; // *8 (nicht ändern!)
L P#DBX 0.0; // Datenbaustein-Kennung (nicht ändern!)
OD ;
T LD 16;
NETWORK
TITLE =AnyPointer ZielPalettenDaten
L P##iZielPalettenDaten;
TAR2 ;
UD DW#16#FFFFFF;
+D ;
LAR1 ;
L D [AR1,P#0.0];
T LD 20;
L D [AR1,P#4.0];
T LD 24;
L W [AR1,P#8.0];
T LW 28;
NETWORK
TITLE =AnyPointer ZielFachDaten
L P##iZielFachDaten;
TAR2 ;
UD DW#16#FFFFFF;
+D ;
LAR1 ;
L D [AR1,P#0.0];
T LD 30;
L D [AR1,P#4.0];
T LD 34;
L W [AR1,P#8.0];
T LW 38;
NETWORK
TITLE =Daten ausgeben
NETWORK
TITLE =PalettenDaten
CALL "BLKMOV" (
SRCBLK := #tPointerPalettenDaten,
RET_VAL := #retval,
DSTBLK := #tZielPattenDaten);
NOP 0;
NETWORK
TITLE =Facheigenschaften
CALL "BLKMOV" (
SRCBLK := #tPointerFachDaten,
RET_VAL := #retval,
DSTBLK := #tZielFachDaten);
NOP 0;
NETWORK
TITLE ==== System recovery ===
//
ende: LAR1 #tSYS.AR1; // Load AR1
LAR2 #tSYS.AR2; // Load AR2
SET ;
SAVE ;
CLR ;
END_FUNCTION