UH07 Original .awl Bausteine von Andi importiert
This commit is contained in:
@@ -1,87 +1,97 @@
|
||||
=== FC 78: BCD (4stellig)_to_INT [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
BCD_Wert : Word
|
||||
Output:
|
||||
Int_Wert : Int
|
||||
InOut:
|
||||
Temp:
|
||||
BCD_Vergleich : Word
|
||||
Multiplikator : Int
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "BCD (4stellig)_to_INT" : Void
|
||||
TITLE = BCD-Wert (2-Stellig) in INT-Wert wandeln (Max 00FF)
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
//
|
||||
//
|
||||
VAR_INPUT
|
||||
BCD_Wert : Word;
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Rückmeldung ---
|
||||
L 0 // erst mal köschen
|
||||
T Int_Wert
|
||||
VAR_OUTPUT
|
||||
Int_Wert : Int;
|
||||
END_VAR
|
||||
|
||||
L 1
|
||||
T Multiplikator
|
||||
|
||||
--- NW 2: BCD-Wert wandeln ---
|
||||
L BCD_Wert
|
||||
T BCD_Vergleich
|
||||
L 16#000F
|
||||
AW
|
||||
L Multiplikator
|
||||
*I
|
||||
L Int_Wert
|
||||
+I
|
||||
T Int_Wert
|
||||
|
||||
L Multiplikator
|
||||
L 16
|
||||
*I
|
||||
T Multiplikator
|
||||
|
||||
L BCD_Vergleich
|
||||
SRW 4
|
||||
T BCD_Vergleich
|
||||
|
||||
L 16#000F
|
||||
AW
|
||||
L Multiplikator
|
||||
*I
|
||||
L Int_Wert
|
||||
+I
|
||||
T Int_Wert
|
||||
|
||||
L Multiplikator
|
||||
L 16
|
||||
*I
|
||||
T Multiplikator
|
||||
|
||||
L BCD_Vergleich
|
||||
SRW 4
|
||||
T BCD_Vergleich
|
||||
|
||||
L 16#000F
|
||||
AW
|
||||
L Multiplikator
|
||||
*I
|
||||
L Int_Wert
|
||||
+I
|
||||
T Int_Wert
|
||||
|
||||
L Multiplikator
|
||||
L 16
|
||||
*I
|
||||
T Multiplikator
|
||||
|
||||
L BCD_Vergleich
|
||||
SRW 4
|
||||
T BCD_Vergleich
|
||||
|
||||
L 16#000F
|
||||
AW
|
||||
L Multiplikator
|
||||
*I
|
||||
L Int_Wert
|
||||
+I
|
||||
T Int_Wert
|
||||
VAR_TEMP
|
||||
BCD_Vergleich : Word;
|
||||
Multiplikator : Int;
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 3: Ende ---
|
||||
BE
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Rückmeldung
|
||||
L 0;//erst mal köschen
|
||||
T #Int_Wert;
|
||||
|
||||
L 1;
|
||||
T #Multiplikator;
|
||||
NETWORK
|
||||
TITLE = BCD-Wert wandeln
|
||||
L #BCD_Wert;
|
||||
T #BCD_Vergleich;
|
||||
L 16#000F;
|
||||
UW;
|
||||
L #Multiplikator;
|
||||
*I;
|
||||
L #Int_Wert;
|
||||
+I;
|
||||
T #Int_Wert;
|
||||
|
||||
L #Multiplikator;
|
||||
L 16;
|
||||
*I;
|
||||
T #Multiplikator;
|
||||
|
||||
L #BCD_Vergleich;
|
||||
SRW 4;
|
||||
T #BCD_Vergleich;
|
||||
|
||||
L 16#000F;
|
||||
UW;
|
||||
L #Multiplikator;
|
||||
*I;
|
||||
L #Int_Wert;
|
||||
+I;
|
||||
T #Int_Wert;
|
||||
|
||||
L #Multiplikator;
|
||||
L 16;
|
||||
*I;
|
||||
T #Multiplikator;
|
||||
|
||||
L #BCD_Vergleich;
|
||||
SRW 4;
|
||||
T #BCD_Vergleich;
|
||||
|
||||
L 16#000F;
|
||||
UW;
|
||||
L #Multiplikator;
|
||||
*I;
|
||||
L #Int_Wert;
|
||||
+I;
|
||||
T #Int_Wert;
|
||||
|
||||
L #Multiplikator;
|
||||
L 16;
|
||||
*I;
|
||||
T #Multiplikator;
|
||||
|
||||
L #BCD_Vergleich;
|
||||
SRW 4;
|
||||
T #BCD_Vergleich;
|
||||
|
||||
L 16#000F;
|
||||
UW;
|
||||
L #Multiplikator;
|
||||
*I;
|
||||
L #Int_Wert;
|
||||
+I;
|
||||
T #Int_Wert;
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,50 +1,72 @@
|
||||
=== FC 99: DBMOV [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
QuellDB : Int // Quell-DB
|
||||
QuellDW : Int // Quell-1.DW
|
||||
ZielDB : Int // Ziel-DB
|
||||
ZielDW : Int // Ziel-1.DW
|
||||
Anzahl_DW : Int // Anzahl der zu kopierenden DWs
|
||||
Output:
|
||||
RE_VAL : Int // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "DBMOV" : Void
|
||||
TITLE = DB-Bereiche kopieren
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
FAMILY : FIFO
|
||||
NAME : FifoIn
|
||||
VERSION : 0.1
|
||||
//COPYRIGHT by Ingenieurbüro A.Emmert
|
||||
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
||||
//Tel.: 0049(0)8243-1254
|
||||
//Version: H&M / 06.12.2025
|
||||
//
|
||||
VAR_INPUT
|
||||
QuellDB : Int; // Quell-DB
|
||||
QuellDW : Int; // Quell-1.DW
|
||||
ZielDB : Int; // Ziel-DB
|
||||
ZielDW : Int; // Ziel-1.DW
|
||||
Anzahl_DW : Int; // Anzahl der zu kopierenden DWs
|
||||
END_VAR
|
||||
|
||||
--- NW 1: ---
|
||||
// Kennung + Datenbytes
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Anzahl_DW // Datenwords speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
VAR_OUTPUT
|
||||
RE_VAL : Int; // Rückmeldung
|
||||
END_VAR
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L QuellDB
|
||||
T LW4 // DB_Nummer
|
||||
L QuellDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
L ZielDB
|
||||
T LW14 // DB_Nummer
|
||||
L ZielDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RE_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
|
||||
VAR_TEMP
|
||||
Quelle : Any; // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any; // Zeiger, FIFO-Stelle
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Ende ---
|
||||
BE
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE =
|
||||
|
||||
//Kennung + Datenbytes
|
||||
L 16#1004 ;//Kennung 10 + Word=04
|
||||
T %LW0;
|
||||
T %LW10;//Any-Kennung, Datentyp
|
||||
L #Anzahl_DW ;//Datenwords speichern
|
||||
T %LW2;
|
||||
T %LW12;//Wiederholungen
|
||||
|
||||
//Quelle-Pointer erzeugen:
|
||||
L #QuellDB;
|
||||
T %LW4;//DB_Nummer
|
||||
L #QuellDW ;//Adresse
|
||||
SLD 3;
|
||||
L 16#8400_0000;//Kennung: Daten
|
||||
OD;
|
||||
T %LD6;//Kennung, Adresse
|
||||
|
||||
//Ziel-Pointer erzeugen:
|
||||
L #ZielDB;
|
||||
T %LW14;//DB_Nummer
|
||||
L #ZielDW ;//Adresse
|
||||
SLD 3;
|
||||
L 16#8400_0000;//Kennung: Daten
|
||||
OD;
|
||||
T %LD16;//Kennung, Adresse
|
||||
|
||||
CALL BLKMOV//Datenliste-Daten speichern
|
||||
{blk_type := 'Variant'}
|
||||
( SRCBLK := #Quelle ,
|
||||
RET_VAL := #RE_VAL ,
|
||||
DSTBLK := #Ziel
|
||||
);
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,55 +1,68 @@
|
||||
=== FC 1004: DL_Einsprung [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Bereich_DL : Int // Nur für Stammdaten =1!
|
||||
ID : Int
|
||||
Output:
|
||||
Dyn.DB : Int
|
||||
AR_Start : DInt
|
||||
Error : Bool
|
||||
InOut:
|
||||
Temp:
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "DL_Einsprung" : Void
|
||||
TITLE = Bereich-DL: Einsprungs-DW ermitteln
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Bereich_DL : Int; // Nur für Stammdaten =1!
|
||||
ID : Int;
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Inittialisierung ---
|
||||
L 0
|
||||
T "Dyn.DB"
|
||||
L DINT#0
|
||||
T AR_Start
|
||||
SET
|
||||
S Error
|
||||
VAR_OUTPUT
|
||||
"Dyn.DB" : Int;
|
||||
AR_Start : DInt;
|
||||
Error : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: ID suchen ---
|
||||
L ID
|
||||
T "MW200"
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Inittialisierung
|
||||
L 0;
|
||||
T #"Dyn.DB";
|
||||
L DINT#0;
|
||||
T #AR_Start;
|
||||
SET;
|
||||
S #Error;
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=Bereich_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag lesen
|
||||
NETWORK
|
||||
TITLE = ID suchen
|
||||
L #ID;
|
||||
T "MW200";
|
||||
|
||||
L "MB199"
|
||||
L 2#1111111 // Bit 7 ausblenden
|
||||
AW
|
||||
L 0 // Fehler vorhanden?
|
||||
<>I // Ja
|
||||
= Error
|
||||
BEC
|
||||
CALL "DatenOut"
|
||||
( SSDB := #Bereich_DL ,
|
||||
SSDW := 0 ,
|
||||
PARA := 16#0000 , //Eintrag lesen
|
||||
SEARCHDATEN := P#M200.0 ,
|
||||
RE_VAL := "MB199" ,
|
||||
OUTDATEN := P#M220.0 ,
|
||||
Position := "MW196"
|
||||
);
|
||||
|
||||
L "MB199";
|
||||
L 2#1111111 ;//Bit 7 ausblenden
|
||||
UW;
|
||||
L 0;//Fehler vorhanden?
|
||||
<>I;//Ja
|
||||
= #Error;
|
||||
BEB;
|
||||
|
||||
--- NW 3: Daten übergeben ---
|
||||
L "MW224"
|
||||
T "Dyn.DB" // Dyn.DB
|
||||
L 0 // sinnvoller Wert ?
|
||||
<=I // Nein !
|
||||
S Error
|
||||
BEC
|
||||
NETWORK
|
||||
TITLE = Daten übergeben
|
||||
L "MW224";
|
||||
T #"Dyn.DB" ;//Dyn.DB
|
||||
L 0;//sinnvoller Wert ?
|
||||
<=I;//Nein !
|
||||
S #Error;
|
||||
BEB;
|
||||
|
||||
L "MW226"
|
||||
ITD
|
||||
T AR_Start
|
||||
L "MW226";
|
||||
ITD;
|
||||
T #AR_Start;
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,234 +1,286 @@
|
||||
=== FC 87: DatenReset [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
|
||||
Belegt14 : Int // reserviert von Sort-Datenliste
|
||||
Reserve16 : Int // Reserve
|
||||
Reserve18 : Int // Reserve
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word // Ende der Datenliste
|
||||
Schleife : Word // Loopzähler
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
DB_Länge : Int
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "DatenReset" : Void
|
||||
TITLE = Datenlisten-Modul
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
FAMILY : DLISTE
|
||||
NAME : DatenIn
|
||||
VERSION : 0.1
|
||||
//COPYRIGHT by Ingenieurbüro A.Emmert
|
||||
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
||||
//Tel.: 0049(0)8243-1254
|
||||
//Version: P&O / 10.2024
|
||||
//Version: ILS2100 / 06.11.2009
|
||||
//
|
||||
//Datenblock in Datenliste resetten
|
||||
//SSDB: Datenlisten-DB
|
||||
//SSDW: Datenlisten-1.DW
|
||||
//RE_VAL: Rückmeldungen:
|
||||
// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung
|
||||
// Bit1: SFC20-Aufruf mit Fehler
|
||||
// Bit2: Frei
|
||||
// Bit3: Frei
|
||||
// Bit4: Frei
|
||||
// Bit5: Frei
|
||||
// Bit6: Frei
|
||||
// Bit7: Frei
|
||||
//
|
||||
VAR_INPUT
|
||||
SSDB : Int; // Datenlisten-DB
|
||||
SSDW : Int; // Datenlisten-1.DW
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
VAR_OUTPUT
|
||||
RE_VAL : Byte; // Rückmeldung
|
||||
END_VAR
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
VAR_TEMP
|
||||
Quelle : Any; // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any; // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte; // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int; // Stammdatenlänge in Word (1 - 9)
|
||||
IndDB : Word; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDB_Laenge : Int; // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDaten_FC : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
Suchzeiger : Int; // Speicherung des letzten Zugriffs / Suchzeiger
|
||||
Belegt14 : Int; // reserviert von Sort-Datenliste
|
||||
Reserve16 : Int; // Reserve
|
||||
Reserve18 : Int; // Reserve
|
||||
DBDatenliste : Word; // Datenlisten-DB
|
||||
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word; // Ende der Datenliste
|
||||
Schleife : Word; // Loopzähler
|
||||
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
DB_Länge : Int;
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Schnittstellen-DB sinnvoll ?
|
||||
L #SSDB;
|
||||
T #DBDatenliste;
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
CALL "TEST_DB_TO_ATTR_DB"
|
||||
( DB_Number := #DBDatenliste ,
|
||||
RetVal := #SFC_RET_VAL ,
|
||||
DB_Length := #SFC_DB_LENGTH ,
|
||||
Write_Prot := #SFC_WRITE_PROT
|
||||
);
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
CALL "BCD (4stellig)_to_INT"
|
||||
( BCD_Wert := #SFC_DB_LENGTH ,
|
||||
Int_Wert := #DB_Länge
|
||||
);
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
O #SFC_WRITE_PROT;
|
||||
SPB Err0;//kein Datenlisten-Bereich
|
||||
|
||||
NETWORK
|
||||
TITLE = Datenlistekopf holen
|
||||
//Quelle-Pointer erzeugen:
|
||||
L 16#1004;//Kennung 10 + Word=04
|
||||
T %LW0;//Any-Kennung, Datentyp
|
||||
L 16#000A;//10 Dw´s holen
|
||||
T %LW2;//Wiederholungen
|
||||
L #SSDB;
|
||||
T %LW4;//DB_Nummer
|
||||
L #SSDW;//Adresse
|
||||
SLD 3;
|
||||
L 16#8400_0000;//Kennung: Daten
|
||||
OD;
|
||||
T %LD6;//Kennung, Adresse
|
||||
|
||||
CALL BLKMOV//1.-10.DW Datenliste holen
|
||||
{blk_type := 'Variant'}
|
||||
( SRCBLK := #Quelle ,
|
||||
RET_VAL := #SFC_RET_VAL ,
|
||||
DSTBLK := P#L20.0 WORD 10
|
||||
);
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
SPB Err1;
|
||||
|
||||
NETWORK
|
||||
TITLE = Zeigerüberprüfung
|
||||
L #Kopf;//Datenliste-Kopf
|
||||
L 16#DA;//= Datenlistekennung ?
|
||||
<>I;//Nein !
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L 1;
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L 128;
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L 1;
|
||||
L #Listenlaenge;//Max.Anzahl von Datenblöcken
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L 1;
|
||||
L #Stammdaten;//Anzahl der Stammdaten
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L 9;
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L #Stammdaten;//Anzahl der Stammdaten
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L #Listenlaenge;//Länge der Datenliste
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
*I;
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
+ 20;//Speichern ab 10.DW
|
||||
L #SSDW;
|
||||
+I;
|
||||
T #Datenlisten_Ende;
|
||||
ITD;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
AUF DB[ #DBDatenliste];
|
||||
|
||||
L #Datenlisten_Ende;
|
||||
L #DB_Länge;
|
||||
>I ;//Datenlisten-DB ist zu kurz!
|
||||
SPB Err0;//kein Datenlisten-Bereich
|
||||
|
||||
L DBW[ #AR1Zeiger];
|
||||
L 16#DAEE;//Datenliste-Endekennung ?
|
||||
<>I;//Nein !
|
||||
SPB Err0;//kein Datenlisten-Bereich
|
||||
|
||||
NETWORK
|
||||
TITLE = Indizierung löschen ?
|
||||
L #IndDB;//Indizierter DB
|
||||
L 0;//=0 ?
|
||||
==I;//Kein indizierter DB !
|
||||
SPB Nw05;
|
||||
|
||||
CALL "TEST_DB_TO_ATTR_DB"
|
||||
( DB_Number := #IndDB ,
|
||||
RetVal := #SFC_RET_VAL ,
|
||||
DB_Length := #SFC_DB_LENGTH ,
|
||||
Write_Prot := #SFC_WRITE_PROT
|
||||
);
|
||||
|
||||
CALL "BCD (4stellig)_to_INT"
|
||||
( BCD_Wert := #SFC_DB_LENGTH ,
|
||||
Int_Wert := #DB_Länge
|
||||
);
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
O #SFC_WRITE_PROT;
|
||||
SPB Nw05;//kein Indizier-DB vorhanden
|
||||
|
||||
L 0;
|
||||
ITD;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
AUF DB[ #IndDB];
|
||||
|
||||
L #DB_Länge ;//In Bytes angegeben
|
||||
L400: T #Schleife;
|
||||
|
||||
L 0;
|
||||
T DBB[ #AR1Zeiger] ;//Inhalte löschen
|
||||
|
||||
L #AR1Zeiger;
|
||||
SRD 3;
|
||||
L DINT#1;
|
||||
+D;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;
|
||||
|
||||
L #Schleife;
|
||||
LOOP L400;
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DA // = Datenlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
NETWORK
|
||||
TITLE = Datenliste löschen
|
||||
Nw05: L #SSDW;
|
||||
+ 12 ;//12.Dw
|
||||
ITD;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
AUF DB[ #DBDatenliste];
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
L 0;
|
||||
T DBW[ #AR1Zeiger] ;//Letzte Speicherung löschen
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
L #SSDW;
|
||||
+ 16 ;//16.Dw
|
||||
ITD;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
AUF DB[ #DBDatenliste];
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
L 0;
|
||||
T DBW[ #AR1Zeiger] ;//Anzahl Einträge löschen
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
L #SSDW;
|
||||
+ 20 ;//Daten ab 20.Dw
|
||||
ITD;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
L #Datensatzlaenge;
|
||||
L #Listenlaenge;
|
||||
*I;
|
||||
L500: T #Schleife;
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
AUF DB[ #DBDatenliste];
|
||||
|
||||
L Datenlisten_Ende
|
||||
L "DB_Länge"
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
L 0;
|
||||
T DBW[ #AR1Zeiger] ;//Inhalte löschen
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DAEE // Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
L #AR1Zeiger;
|
||||
SRD 3;
|
||||
L DINT#2;
|
||||
+D;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;
|
||||
|
||||
L #Schleife;
|
||||
LOOP L500;
|
||||
|
||||
|
||||
--- NW 4: Indizierung löschen ? ---
|
||||
L IndDB // Indizierter DB
|
||||
L 0 // =0 ?
|
||||
==I // Kein indizierter DB !
|
||||
JC Nw05
|
||||
NETWORK
|
||||
TITLE = Fehlerausgabe / RET_VAL
|
||||
SET;//VKE = 1 ohne Fehler !!!
|
||||
SPA Ok;
|
||||
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
|
||||
SPA Err;
|
||||
Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
Err: CLR;//VKE = 0 bei Fehler !!!
|
||||
Ok: T #RE_VAL;
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
SAVE;//VKE in BIE-Bit speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Nw05 // kein Indizier-DB vorhanden
|
||||
|
||||
L 0
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[IndDB]
|
||||
|
||||
L "DB_Länge" // In Bytes angegeben
|
||||
L400: T Schleife
|
||||
|
||||
L 0
|
||||
T DBB [AR1Zeiger] // Inhalte löschen
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L DINT#1
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L400
|
||||
|
||||
|
||||
|
||||
--- NW 5: Datenliste löschen ---
|
||||
Nw05: L SSDW
|
||||
+ 12 // 12.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger] // Letzte Speicherung löschen
|
||||
|
||||
L SSDW
|
||||
+ 16 // 16.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger] // Anzahl Einträge löschen
|
||||
|
||||
L SSDW
|
||||
+ 20 // Daten ab 20.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Datensatzlaenge
|
||||
L Listenlaenge
|
||||
*I
|
||||
L500: T Schleife
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger] // Inhalte löschen
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L DINT#2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
|
||||
|
||||
|
||||
--- NW 6: Fehlerausgabe / RET_VAL ---
|
||||
SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: T RE_VAL
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,183 +1,223 @@
|
||||
=== FC 90: DatenResetSort [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
Belegt06 : Int // reserviert von Datenliste
|
||||
Belegt08 : Int // reserviert von Datenliste
|
||||
Belegt10 : Int // reserviert von Datenliste
|
||||
Belegt12 : Int // reserviert von Datenliste
|
||||
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
|
||||
Reserve16 : Int // Reserve
|
||||
Reserve18 : Int // Reserve
|
||||
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word // Ende der Datenliste
|
||||
Schleife : Word // Loopzähler
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "DatenResetSort" : Void
|
||||
TITLE = Datenlisten-Modul
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
FAMILY : DLISTE
|
||||
NAME : DatenIn
|
||||
VERSION : 0.1
|
||||
//COPYRIGHT by Ingenieurbüro A.Emmert
|
||||
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
||||
//Tel.: 0049(0)8243-1254
|
||||
//Version: ILS2100 / 06.11.2009
|
||||
//
|
||||
//Datenblock in Datenliste resetten
|
||||
//SSDB: Datenlisten-DB
|
||||
//SSDW: Datenlisten-1.DW
|
||||
//RE_VAL: Rückmeldungen:
|
||||
// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung
|
||||
// Bit1: SFC20-Aufruf mit Fehler
|
||||
// Bit2: Frei
|
||||
// Bit3: Frei
|
||||
// Bit4: Frei
|
||||
// Bit5: Frei
|
||||
// Bit6: Frei
|
||||
// Bit7: Frei
|
||||
//
|
||||
VAR_INPUT
|
||||
SSDB : Int; // Datenlisten-DB
|
||||
SSDW : Int; // Datenlisten-1.DW
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
VAR_OUTPUT
|
||||
RE_VAL : Byte; // Rückmeldung
|
||||
END_VAR
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBDatenliste
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
VAR_TEMP
|
||||
Quelle : Any; // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any; // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte; // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int; // Stammdatenlänge in Word (1 - 9)
|
||||
Belegt06 : Int; // reserviert von Datenliste
|
||||
Belegt08 : Int; // reserviert von Datenliste
|
||||
Belegt10 : Int; // reserviert von Datenliste
|
||||
Belegt12 : Int; // reserviert von Datenliste
|
||||
AnzahlEintraege : Int; // Anzahl der eingetragenen Datensätze
|
||||
Reserve16 : Int; // Reserve
|
||||
Reserve18 : Int; // Reserve
|
||||
Suchzeiger : Int; // Speicherung des letzten Zugriffs / Suchzeiger
|
||||
DBDatenliste : Word; // Datenlisten-DB
|
||||
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word; // Ende der Datenliste
|
||||
Schleife : Word; // Loopzähler
|
||||
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Schnittstellen-DB sinnvoll ?
|
||||
L #SSDB;
|
||||
T #DBDatenliste;
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBDatenliste
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
CALL "TEST_DB_TO_ATTR_DB"
|
||||
( DB_Number := #DBDatenliste ,
|
||||
RetVal := #SFC_RET_VAL ,
|
||||
DB_Length := #SFC_DB_LENGTH ,
|
||||
Write_Prot := #SFC_WRITE_PROT
|
||||
);
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
O #SFC_WRITE_PROT;
|
||||
SPB Err0;//kein Datenlisten-Bereich
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DB // = DatenSortlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
NETWORK
|
||||
TITLE = Datenlistekopf holen
|
||||
//Quelle-Pointer erzeugen:
|
||||
L 16#1004;//Kennung 10 + Word=04
|
||||
T %LW0;//Any-Kennung, Datentyp
|
||||
L 16#000A;//10 Dw´s holen
|
||||
T %LW2;//Wiederholungen
|
||||
L #SSDB;
|
||||
T %LW4;//DB_Nummer
|
||||
L #SSDW;//Adresse
|
||||
SLD 3;
|
||||
L 16#8400_0000;//Kennung: Daten
|
||||
OD;
|
||||
T %LD6;//Kennung, Adresse
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
CALL BLKMOV//1.-10.DW Datenliste holen
|
||||
{blk_type := 'Variant'}
|
||||
( SRCBLK := #Quelle ,
|
||||
RET_VAL := #SFC_RET_VAL ,
|
||||
DSTBLK := P#L20.0 WORD 10
|
||||
);
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
SPB Err1;
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
NETWORK
|
||||
TITLE = Zeigerüberprüfung
|
||||
L #Kopf;//Datenliste-Kopf
|
||||
L 16#DB;//= DatenSortlistekennung ?
|
||||
<>I;//Nein !
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
L 1;
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
L 128;
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
L 1;
|
||||
L #Listenlaenge;//Max.Anzahl von Datenblöcken
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
L 1;
|
||||
L #Stammdaten;//Anzahl der Stammdaten
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L 9;
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L Datenlisten_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
L #Stammdaten;//Anzahl der Stammdaten
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
>I;
|
||||
SPB Err0;//kein Datenlistebereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DBEE // DatenSortliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
L #Listenlaenge;//Länge der Datenliste
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
*I;
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
+ 20;//Speichern ab 10.DW
|
||||
L #SSDW;
|
||||
+I;
|
||||
T #Datenlisten_Ende;
|
||||
ITD;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
AUF DB[ #DBDatenliste];
|
||||
|
||||
--- NW 4: Datenliste löschen ---
|
||||
L SSDW
|
||||
+ 14 // 14.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
L #Datenlisten_Ende;
|
||||
L #SFC_DB_LENGTH;
|
||||
>I;//Datenlisten-DB ist zu kurz!
|
||||
SPB Err0;//kein Datenlisten-Bereich
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L DBW[ #AR1Zeiger];
|
||||
L 16#DBEE;//DatenSortliste-Endekennung ?
|
||||
<>I;//Nein !
|
||||
SPB Err0;//kein Datenlisten-Bereich
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger] // Anzahl Einträge löschen
|
||||
NETWORK
|
||||
TITLE = Datenliste löschen
|
||||
L #SSDW;
|
||||
+ 14;//14.Dw
|
||||
ITD;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L SSDW
|
||||
+ 20 // 20.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
AUF DB[ #DBDatenliste];
|
||||
|
||||
L Datensatzlaenge
|
||||
L Listenlaenge
|
||||
*I
|
||||
L500: T Schleife
|
||||
L 0;
|
||||
T DBW[ #AR1Zeiger];//Anzahl Einträge löschen
|
||||
|
||||
L 0 // Daten löschen
|
||||
T DBW [AR1Zeiger]
|
||||
L #SSDW;
|
||||
+ 20;//20.Dw
|
||||
ITD;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L 2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
L #Datensatzlaenge;
|
||||
L #Listenlaenge;
|
||||
*I;
|
||||
L500: T #Schleife;
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
L 0;//Daten löschen
|
||||
T DBW[ #AR1Zeiger];
|
||||
|
||||
L #AR1Zeiger;
|
||||
SRD 3;
|
||||
L 2;
|
||||
+D;
|
||||
SLD 3;
|
||||
T #AR1Zeiger;
|
||||
|
||||
--- NW 5: Fehlerausgabe / RET_VAL ---
|
||||
SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
L #Schleife;
|
||||
LOOP L500;
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: T RE_VAL
|
||||
NETWORK
|
||||
TITLE = Fehlerausgabe / RET_VAL
|
||||
SET;//VKE = 1 ohne Fehler !!!
|
||||
SPA Ok;
|
||||
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
|
||||
SPA Err;
|
||||
Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
Err: CLR;//VKE = 0 bei Fehler !!!
|
||||
Ok: T #RE_VAL;
|
||||
|
||||
SAVE;//VKE in BIE-Bit speichern
|
||||
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,65 +1,73 @@
|
||||
=== FC 125: Err_vorhanden [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Check_DB : Int
|
||||
Anfangs_DW : DInt
|
||||
Ende_DW : DInt
|
||||
Output:
|
||||
Stoerung : Bool // Störung vorhanden
|
||||
ErrDW : DInt
|
||||
ErrBits : Int
|
||||
InOut:
|
||||
Temp:
|
||||
Anzeige_DB : Int
|
||||
Zeiger : DInt // Startwert mit Offset 0
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "Err_vorhanden" : Void
|
||||
TITLE = Störung aktiv
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Check_DB : Int;
|
||||
Anfangs_DW : DInt;
|
||||
Ende_DW : DInt;
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Check-DB von "Abfangs_DW" bis "Ende_DW" checken ---
|
||||
SET // GST
|
||||
R Stoerung
|
||||
L DINT#-1 // Sonst Störung in DBD0 nicht erkennbar
|
||||
T ErrDW
|
||||
L 0
|
||||
T ErrBits
|
||||
VAR_OUTPUT
|
||||
Stoerung : Bool; // Störung vorhanden
|
||||
ErrDW : DInt;
|
||||
ErrBits : Int;
|
||||
END_VAR
|
||||
|
||||
L Check_DB
|
||||
T Anzeige_DB
|
||||
|
||||
L Anfangs_DW // Mit diesem DW beginnen
|
||||
T Zeiger // Zeiger
|
||||
|
||||
Loop: L Zeiger // Zeiger
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[Anzeige_DB]
|
||||
|
||||
L DBW [AR1Zeiger] // Störungsbits
|
||||
T ErrBits
|
||||
L 0 // aktiv ?
|
||||
<>I // Ja !
|
||||
JC Err
|
||||
|
||||
L Zeiger // Startwert mit Offset 0
|
||||
L 2
|
||||
+D
|
||||
T Zeiger // Zeiger
|
||||
L Ende_DW // Letztes DW überschritten?
|
||||
<=D // Nein !
|
||||
JC Loop
|
||||
|
||||
BEU
|
||||
|
||||
Err: SET
|
||||
S Stoerung
|
||||
|
||||
L Zeiger // Zeiger
|
||||
T ErrDW
|
||||
VAR_TEMP
|
||||
Anzeige_DB : Int;
|
||||
Zeiger : DInt; // Startwert mit Offset 0
|
||||
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Ende ---
|
||||
BE
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Check-DB von "Abfangs_DW" bis "Ende_DW" checken
|
||||
SET;//GST
|
||||
R #Stoerung;
|
||||
L DINT#-1;//Sonst Störung in DBD0 nicht erkennbar
|
||||
T #ErrDW;
|
||||
L 0;
|
||||
T #ErrBits;
|
||||
|
||||
L #Check_DB;
|
||||
T #Anzeige_DB;
|
||||
|
||||
L #Anfangs_DW;//Mit diesem DW beginnen
|
||||
T #Zeiger;//Zeiger
|
||||
|
||||
Loop: L #Zeiger;//Zeiger
|
||||
SLD 3;
|
||||
T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
AUF DB[ #Anzeige_DB];
|
||||
|
||||
L DBW[ #AR1Zeiger];//Störungsbits
|
||||
T #ErrBits;
|
||||
L 0;//aktiv ?
|
||||
<>I;//Ja !
|
||||
SPB Err;
|
||||
|
||||
L #Zeiger;//Startwert mit Offset 0
|
||||
L 2;
|
||||
+D;
|
||||
T #Zeiger;//Zeiger
|
||||
L #Ende_DW;//Letztes DW überschritten?
|
||||
<=D;//Nein !
|
||||
SPB Loop;
|
||||
|
||||
BEA;
|
||||
|
||||
Err: SET;
|
||||
S #Stoerung;
|
||||
|
||||
L #Zeiger;//Zeiger
|
||||
T #ErrDW;
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,327 +1,375 @@
|
||||
=== FC 84: FIFOChange [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Schnittstellen-DB
|
||||
SSDW : Int // Schnittstellen-1.DW
|
||||
CH_POS : Int // Position des Eintrags, der zu ändernden Daten
|
||||
CHANGEDATEN : Pointer // Wechsel-Daten-Schnittstelle
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word // Status des Fifo
|
||||
Err : Byte // Fehlerbits
|
||||
MinHolzeiger : Int // Minimum Holzeiger
|
||||
MaxHolzeiger : Int // Maximum Holzeiger
|
||||
DBFifo : Word // FIFO-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word // Ende des Fifo
|
||||
AlleDaten : Word // Anzahl der bytes für alle Daten
|
||||
Offset : Word // Offset zu überschreibender Datensatz
|
||||
NixSave : Bool // Status nicht speichern
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
AR1Start : DInt // Startwert mit Offset 0
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "FIFOChange" : Void
|
||||
TITLE = Fifo-Modul
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
FAMILY : FIFO
|
||||
NAME : FifoIn
|
||||
VERSION : 0.1
|
||||
//COPYRIGHT by Ingenieurbüro A.Emmert
|
||||
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
||||
//Tel.: 0049(0)8243-960629
|
||||
//Version: KyungBang00 / 14.04.2009
|
||||
//
|
||||
//Datenblock in Fifo überschreiben
|
||||
//SSDB: FIFO-DB
|
||||
//SSDW: FIFO-1.DW
|
||||
//CH_POS: angegebene Position überschreiben
|
||||
//CHANGEDATEN: Pointer, wo zu ändernde Daten stehen (P#DB1.DBX0.0, P#M220.0)
|
||||
//RE_VAL: Rückmeldungen:
|
||||
// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung
|
||||
// Bit1: SFC20-Aufruf mit Fehler
|
||||
// Bit2: Fifo ist leer
|
||||
// Bit3: Falscher Parameter bei Aufruf
|
||||
// Bit4: Position nicht belegt
|
||||
// Bit5: Bringzeiger ist ausserhalb
|
||||
// Bit6: Holzeiger ist ausserhalb
|
||||
// Bit7: Versatz Bring-/Holzeiger
|
||||
//
|
||||
VAR_INPUT
|
||||
SSDB : Int; // Schnittstellen-DB
|
||||
SSDW : Int; // Schnittstellen-1.DW
|
||||
CH_POS : Int; // Position des Eintrags, der zu ändernden Daten
|
||||
CHANGEDATEN : Pointer; // Wechsel-Daten-Schnittstelle
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBFifo
|
||||
VAR_OUTPUT
|
||||
RE_VAL : Byte; // Rückmeldung
|
||||
END_VAR
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
VAR_TEMP
|
||||
Quelle : Any; // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any; // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte; // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int; // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word; // Status des Fifo
|
||||
Err : Byte; // Fehlerbits
|
||||
MinHolzeiger : Int; // Minimum Holzeiger
|
||||
MaxHolzeiger : Int; // Maximum Holzeiger
|
||||
DBFifo : Word; // FIFO-DB
|
||||
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word; // Ende des Fifo
|
||||
AlleDaten : Word; // Anzahl der bytes für alle Daten
|
||||
Offset : Word; // Offset zu überschreibender Datensatz
|
||||
NixSave : Bool; // Status nicht speichern
|
||||
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
AR1Start : DInt; // Startwert mit Offset 0
|
||||
END_VAR
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Schnittstellen-DB sinnvoll ?
|
||||
L #SSDB;
|
||||
T #DBFifo;
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL "TEST_DB_TO_ATTR_DB"
|
||||
( DB_Number := #DBFifo ,
|
||||
RetVal := #SFC_RET_VAL ,
|
||||
DB_Length := #SFC_DB_LENGTH ,
|
||||
Write_Prot := #SFC_WRITE_PROT
|
||||
);
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#0006 // 6 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
O #SFC_WRITE_PROT;
|
||||
= #NixSave;//Status nicht speichern
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
|
||||
NETWORK
|
||||
TITLE = Fifokopfdaten holen
|
||||
//Quelle-Pointer erzeugen:
|
||||
L 16#1004;//Kennung 10 + Word=04
|
||||
T %LW0;//Any-Kennung, Datentyp
|
||||
L 16#0006;//6 Dw´s holen
|
||||
T %LW2;//Wiederholungen
|
||||
L #SSDB;
|
||||
T %LW4;//DB_Nummer
|
||||
L #SSDW;//Adresse
|
||||
SLD 3;
|
||||
L 16#8400_0000;//Kennung: Daten
|
||||
OD;
|
||||
T %LD6;//Kennung, Adresse
|
||||
|
||||
L Status
|
||||
L 2#0000_0000_1110_0000
|
||||
AW
|
||||
T Err
|
||||
JP Err // Kapitalfehler vorhanden
|
||||
CALL BLKMOV//1.-6.DW FIFO holen
|
||||
{blk_type := 'Variant'}
|
||||
( SRCBLK := #Quelle ,
|
||||
RET_VAL := #SFC_RET_VAL ,
|
||||
DSTBLK := P#L20.0 WORD 6
|
||||
);
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
L #Status;
|
||||
L 2#0000_0000_1110_0000;
|
||||
UW;
|
||||
T #Err;
|
||||
SPP Err;//Kapitalfehler vorhanden
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
SPB Err1;
|
||||
|
||||
NETWORK
|
||||
TITLE = Zeigerüberprüfung
|
||||
L #Kopf;//Fifo-Kopf
|
||||
L 16#FF;//= Fifokennung ?
|
||||
<>I;//Nein !
|
||||
= #NixSave;//Status nicht speichern
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 1;
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 128;
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 1;
|
||||
L #FifoLaenge;//Max.Anzahl von Datenblöcken
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L #SSDW;
|
||||
+ 40;//Speichern ab 20.DW
|
||||
T #MinHolzeiger;//Minimum Bringzeiger
|
||||
|
||||
L #FifoLaenge;//Länge FIFO (in Word)
|
||||
+ -1;
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
*I;
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
+ 40;//Speichern ab 20.DW
|
||||
L #SSDW;
|
||||
+I;
|
||||
T #MaxHolzeiger;//Maximum Bringzeiger
|
||||
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
L #MaxHolzeiger;//Maximum Holzeiger
|
||||
+I;//Zeiger Endekennung
|
||||
T #Fifo_Ende;
|
||||
ITD;
|
||||
T #AR1Start;//Startwert mit Offset 0
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
AUF DB[ #DBFifo];
|
||||
|
||||
L #Fifo_Ende;
|
||||
L #SFC_DB_LENGTH;
|
||||
>I;//Fifo-DB ist zu kurz!
|
||||
SPB Err0;//kein Fifo-Bereich
|
||||
|
||||
L DBW[ #AR1Zeiger];
|
||||
L 16#FFEE;//Fifo-Endekennung ?
|
||||
<>I;//Nein !
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L #MinHolzeiger;//Minimum Holzeiger
|
||||
L #Holzeiger;//Holzeiger
|
||||
<=I;//Ok ?
|
||||
SPB W300;//Ja!
|
||||
|
||||
L 0;//Grundstellung ?
|
||||
<>I;//Nein !
|
||||
SPB Err6;//Holzeiger ist ausserhalb
|
||||
|
||||
L #Holzeiger;//Holzeiger Grundstellung ?
|
||||
<>I;//Nein !
|
||||
SPB Err6;//Holzeiger ist ausserhalb
|
||||
|
||||
L #Anzahl;//Anzahl Datensätze
|
||||
L 0;//Grundstellung ?
|
||||
<>I;//Nein !
|
||||
SPB Err6;//Holzeiger ist ausserhalb
|
||||
|
||||
L #MinHolzeiger;//Minimum Holzeiger
|
||||
T #Bringzeiger;//Bringzeiger
|
||||
T #Holzeiger;//Holzeiger
|
||||
|
||||
W300: L #MaxHolzeiger;//Maximum Holzeiger
|
||||
<=I;//Ok ?
|
||||
SPB W301;//Ja!
|
||||
SPA Err6;//Holzeiger ist ausserhalb
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Fifo-Kopf
|
||||
L 16#FF // = Fifokennung ?
|
||||
<>I // Nein !
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
W301: L #Bringzeiger;//Bringzeiger
|
||||
L #Holzeiger;//Holzeiger
|
||||
==I;//Identisch !
|
||||
U(;
|
||||
L #FifoLaenge;
|
||||
L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||||
<>I;//Fifo noch nicht voll !
|
||||
);
|
||||
U(;
|
||||
L 0;
|
||||
<>I;//Datensätze aber noch vorhanden !
|
||||
);
|
||||
SPB Err7;//Versatz Bring-/Holzeiger
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
L #Bringzeiger;//Bringzeiger
|
||||
L #Holzeiger;//Holzeiger
|
||||
<>I;//Ungleich !
|
||||
U(;
|
||||
L #FifoLaenge;
|
||||
L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||||
==I;//Aber Fifo ist voll !
|
||||
O(;
|
||||
L 0;
|
||||
==I;//Aber keine Datensätze vorhanden !
|
||||
);
|
||||
);
|
||||
SPB Err7;//Versatz Bring-/Holzeiger
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||||
L 0;
|
||||
==I;//Keine Datensätze vorhanden !
|
||||
SPB Err2;//Fifo ist leer
|
||||
|
||||
L 1
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
NETWORK
|
||||
TITLE = Offset bilden
|
||||
L 0;
|
||||
L #CH_POS;
|
||||
>=I;
|
||||
SPB Err3;//falscher Parameter bei Aufruf
|
||||
|
||||
L SSDW
|
||||
+ 40 // Speichern ab 20.DW
|
||||
T MinHolzeiger // Minimum Bringzeiger
|
||||
L #FifoLaenge;//Max.Anzahl von Datenblöcken
|
||||
>I;
|
||||
SPB Err3;//falscher Parameter bei Aufruf
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
+ -1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 40 // Speichern ab 20.DW
|
||||
L SSDW
|
||||
+I
|
||||
T MaxHolzeiger // Maximum Bringzeiger
|
||||
L #Anzahl;//Anzahl der Datensätze
|
||||
L #CH_POS;
|
||||
<I;
|
||||
SPB Err4;//Fifo ist leer
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
+I // Zeiger Endekennung
|
||||
T Fifo_Ende
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
+ -1;//1.Teil = Holzeiger !
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
*I;
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
L #Holzeiger;//Holzeiger
|
||||
+I;
|
||||
W400: T #Offset;//Schreibzeiger
|
||||
L #MaxHolzeiger;//Maximum Holzeiger
|
||||
<=I;
|
||||
SPB Nw05;
|
||||
|
||||
OPN DB[DBFifo]
|
||||
L #FifoLaenge;//Max.Anzahl von Datenblöcken
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
*I;
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
T #AlleDaten;//Bytes für alle Datensätze
|
||||
|
||||
L Fifo_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Fifo-DB ist zu kurz!
|
||||
JC Err0 // kein Fifo-Bereich
|
||||
L #Offset;//Schreibzeiger
|
||||
L #AlleDaten;
|
||||
-I;
|
||||
SPA W400;
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#FFEE // Fifo-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
NETWORK
|
||||
TITLE = Fifodaten überschreiben
|
||||
//Quelle-Pointer erzeugen:
|
||||
Nw05: L 16#1004;//Kennung 10 + Word=04
|
||||
T %LW0;
|
||||
T %LW10;//Any-Kennung, Datentyp
|
||||
L #Datensatzlaenge;//Datenbytes speichern
|
||||
T %LW2;
|
||||
T %LW12;//Wiederholungen
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W300 // Ja!
|
||||
//DATEN-Pointer übernehmen:
|
||||
L P##CHANGEDATEN;
|
||||
LAR1;
|
||||
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
L W[ AR1, P#0.0];
|
||||
T %LW4;//DB_Nummer
|
||||
L D[ AR1, P#2.0];
|
||||
T %LD6;//Kennung, Adresse
|
||||
|
||||
L Holzeiger // Holzeiger Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
//Ziel-Pointer erzeugen:
|
||||
//Kennung + Datenbytes s.o.
|
||||
|
||||
L Anzahl // Anzahl Datensätze
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
L #SSDB;
|
||||
T %LW14;//DB_Nummer
|
||||
L #Offset;//Adresse
|
||||
SLD 3;
|
||||
L 16#8400_0000;//Kennung: Daten
|
||||
OD;
|
||||
T %LD16;//Kennung, Adresse
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
T Bringzeiger // Bringzeiger
|
||||
T Holzeiger // Holzeiger
|
||||
CALL BLKMOV//FIFO-Daten speichern
|
||||
{blk_type := 'Variant'}
|
||||
( SRCBLK := #Quelle ,
|
||||
RET_VAL := #SFC_RET_VAL ,
|
||||
DSTBLK := #Ziel
|
||||
);
|
||||
|
||||
W300: L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W301 // Ja!
|
||||
JU Err6 // Holzeiger ist ausserhalb
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
SPB Err1;
|
||||
|
||||
NETWORK
|
||||
TITLE = Fehlerausgabe / RET_VAL
|
||||
SET;//VKE = 1 ohne Fehler !!!
|
||||
SPA Ok;
|
||||
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
|
||||
T #Err;
|
||||
SPA Err;
|
||||
Err1: S %L32.1;//SFC20-Aufruf mit Fehler
|
||||
SPA Err;
|
||||
Err2: S %L32.2;//Fifo ist voll
|
||||
SPA Err;
|
||||
Err3: S %L32.3;//Falscher Parameter
|
||||
SPA Err;
|
||||
Err4: S %L32.4;//Position nicht belegt
|
||||
SPA Err;
|
||||
Err6: S %L32.6;//Holzeiger außerhalb
|
||||
SPA Err;
|
||||
Err7: S %L32.7;//Versatz Bring-/Holzeiger
|
||||
|
||||
W301: L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
==I // Identisch !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
<>I // Fifo noch nicht voll !
|
||||
)
|
||||
A(
|
||||
L 0
|
||||
<>I // Datensätze aber noch vorhanden !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
Err: CLR;//VKE = 0 bei Fehler !!!
|
||||
Ok: L #Err;
|
||||
T #RE_VAL;
|
||||
L #Status;
|
||||
OW;
|
||||
T #Status;
|
||||
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<>I // Ungleich !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
==I // Aber Fifo ist voll !
|
||||
O(
|
||||
L 0
|
||||
==I // Aber keine Datensätze vorhanden !
|
||||
)
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
SAVE;//VKE in BIE-Bit speichern
|
||||
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
L 0
|
||||
==I // Keine Datensätze vorhanden !
|
||||
JC Err2 // Fifo ist leer
|
||||
NETWORK
|
||||
TITLE = Fifokopfdaten speichern
|
||||
U %L32.0;//Falscher Parameter
|
||||
U #NixSave;//Status nicht speichern
|
||||
BEB;
|
||||
|
||||
L #SSDW;
|
||||
+ 10;//Status
|
||||
ITD;
|
||||
T #AR1Start;//Startwert mit Offset 0
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
--- NW 4: Offset bilden ---
|
||||
L 0
|
||||
L CH_POS
|
||||
>=I
|
||||
JC Err3 // falscher Parameter bei Aufruf
|
||||
AUF DB[ #DBFifo];
|
||||
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err3 // falscher Parameter bei Aufruf
|
||||
L #Err;
|
||||
T DBW[ #AR1Zeiger];
|
||||
|
||||
L Anzahl // Anzahl der Datensätze
|
||||
L CH_POS
|
||||
<I
|
||||
JC Err4 // Fifo ist leer
|
||||
|
||||
+ -1 // 1.Teil = Holzeiger !
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L Holzeiger // Holzeiger
|
||||
+I
|
||||
W400: T Offset // Schreibzeiger
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I
|
||||
JC Nw05
|
||||
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
T AlleDaten // Bytes für alle Datensätze
|
||||
|
||||
L Offset // Schreibzeiger
|
||||
L AlleDaten
|
||||
-I
|
||||
JU W400
|
||||
|
||||
|
||||
--- NW 5: Quelle-Pointer erzeugen: ---
|
||||
Nw05: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenbytes speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L P#
|
||||
LAR1
|
||||
|
||||
L NoneW [AR1,]
|
||||
T LW4 // DB_Nummer
|
||||
L NoneD [AR1,]
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L SSDB
|
||||
T LW14 // DB_Nummer
|
||||
L Offset // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 6: Fehlerausgabe / RET_VAL ---
|
||||
SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
T Err
|
||||
JU Err
|
||||
Err1: S L32.1 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: S L32.2 // Fifo ist voll
|
||||
JU Err
|
||||
Err3: S L32.3 // Falscher Parameter
|
||||
JU Err
|
||||
Err4: S L32.4 // Position nicht belegt
|
||||
JU Err
|
||||
Err6: S L32.6 // Holzeiger außerhalb
|
||||
JU Err
|
||||
Err7: S L32.7 // Versatz Bring-/Holzeiger
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: L Err
|
||||
T RE_VAL
|
||||
L Status
|
||||
OW
|
||||
T Status
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
|
||||
--- NW 7: Fifokopfdaten speichern ---
|
||||
A L32.0 // Falscher Parameter
|
||||
A NixSave // Status nicht speichern
|
||||
BEC
|
||||
|
||||
L SSDW
|
||||
+ 10 // Status
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Err
|
||||
T DBW [AR1Zeiger]
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,376 +1,423 @@
|
||||
=== FC 83: FIFOSearch [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Schnittstellen-DB
|
||||
SSDW : Int // Schnittstellen-1.DW
|
||||
SEARCHDATEN : Pointer // SuchDaten-Schnittstelle
|
||||
Laenge : Int // Anzahl der DWs zum Vergleichen im Datensatz
|
||||
Output:
|
||||
RE_POS : Int // Position des Eintrags, der gesuchten Daten
|
||||
RE_VAL : Byte // Rückmeldungen
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word // Status des Fifo
|
||||
Err : Byte // Fehlerbits
|
||||
MinHolzeiger : Int // Minimum Holzeiger
|
||||
MaxHolzeiger : Int // Maximum Holzeiger
|
||||
DBFifo : Word // FIFO-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word // Ende des Fifo
|
||||
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
|
||||
DBSuchdaten : Word // Solldaten-DB, falls angegeben
|
||||
SuchDaten_Startpunkt : Word // SuchDaten-Startpunkt: Adresse
|
||||
SuchZeiger : Word // Suchzeiger
|
||||
Schleife : Word // Loopzähler
|
||||
NixSave : Bool // Status nicht speichern
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
AR1Start : DInt // Startwert mit Offset 0
|
||||
sRE_POS : Int // Position des Eintrags, der gesuchten Daten
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
TAR2
|
||||
T AR2_Speicher // AR2 zwischenspeichern
|
||||
|
||||
L SSDB
|
||||
T DBFifo
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
= NixSave // Status nicht speichern
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T sRE_POS // Any-Kennung, Datentyp
|
||||
L 16#0006 // 6 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
|
||||
|
||||
L Status
|
||||
L 2#0000_0000_1110_0000
|
||||
AW
|
||||
T Err
|
||||
JP Err // Kapitalfehler vorhanden
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Fifo-Kopf
|
||||
L 16#FF // = Fifokennung ?
|
||||
<>I // Nein !
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L SSDW
|
||||
+ 40 // Speichern ab 20.DW
|
||||
T MinHolzeiger // Minimum Holzeiger
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
+ -1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 40 // Speichern ab 20.DW
|
||||
L SSDW
|
||||
+I
|
||||
T MaxHolzeiger // Maximum Holzeiger
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
+I // Zeiger Endekennung
|
||||
T Fifo_Ende
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Fifo_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Fifo-DB ist zu kurz!
|
||||
JC Err0 // kein Fifo-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#FFEE // Fifo-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W300 // Ja!
|
||||
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L Bringzeiger // Bringzeiger Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L Anzahl // Anzahl Datensätze
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
T Bringzeiger // Bringzeiger
|
||||
T Holzeiger // Holzeiger
|
||||
|
||||
JU Err2 // Fifo ist leer
|
||||
|
||||
W300: L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W301 // Ja!
|
||||
JU Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
|
||||
W301: L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
==I // Identisch !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
<>I // Fifo noch nicht voll !
|
||||
)
|
||||
A(
|
||||
L 0
|
||||
<>I // Datensätze aber noch vorhanden !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<>I // Ungleich !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
==I // Aber Fifo ist voll !
|
||||
O(
|
||||
L 0
|
||||
==I // Aber keine Datensätze vorhanden !
|
||||
)
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
L 0
|
||||
==I // Keine Datensätze vorhanden !
|
||||
JC Err2 // Fifo ist leer
|
||||
|
||||
|
||||
--- NW 4: Fifodaten suchen ---
|
||||
L 1
|
||||
T sRE_POS // RET-POS
|
||||
|
||||
L Holzeiger // Holzeiger
|
||||
T SuchZeiger // Suchzeiger
|
||||
W400: ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBSuchdaten // Solldaten-DB
|
||||
|
||||
L DBSuchdaten // Solldaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W401
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBSuchdaten
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchdaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err1 // SFC20-Aufruf mit Fehler
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T SuchDaten_Startpunkt
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L SuchDaten_Startpunkt
|
||||
+I
|
||||
L SFC_DB_LENGTH
|
||||
>I // Indaten-DB ist zu kurz
|
||||
JC Err1 // SFC20-Aufruf mit Fehler
|
||||
|
||||
W401: L NoneD [AR2,] // Kennung, Adresse
|
||||
LAR2
|
||||
|
||||
L Laenge // Anzahl der DWs zum Vergleichen im Datensatz
|
||||
L400: T Schleife
|
||||
|
||||
L DBSuchdaten // Solldaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W402
|
||||
|
||||
OPN DB[DBSuchdaten]
|
||||
|
||||
W402: L NoneW [AR2,] // Mit Solldaten überprüfen
|
||||
OPN DB[DBFifo]
|
||||
L DBW [AR1Zeiger] // Fifo-Daten lesen
|
||||
<>I // nicht identisch !
|
||||
JC W403
|
||||
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#2
|
||||
T AR1Start // Startwert mit nächstem Offset
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L400
|
||||
|
||||
JU Ende // Datensatz ist in Fifo enthalten
|
||||
|
||||
W403: L sRE_POS // RET-POS
|
||||
+ 1
|
||||
T sRE_POS // RET-POS
|
||||
L Anzahl // Anzahl der Daten im Fifo
|
||||
>I // Alle Datensätze sind durchsucht
|
||||
JC Err2
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L SuchZeiger // Suchzeiger
|
||||
+I
|
||||
T SuchZeiger // Suchzeiger
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Ende erreicht? Nein!
|
||||
JC W404
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
T SuchZeiger
|
||||
|
||||
W404: L SuchZeiger // Suchzeiger
|
||||
JU W400
|
||||
|
||||
|
||||
--- NW 5: Fehlerausgabe / RET_VAL ---
|
||||
Ende: SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
T Err
|
||||
JU Err
|
||||
Err1: S L32.1 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: S L32.2 // Fifo ist leer
|
||||
JU Err
|
||||
Err6: S L32.6 // Holzeiger außerhalb
|
||||
JU Err
|
||||
Err7: S L32.7 // Versatz Bring-/Holzeiger
|
||||
|
||||
Err: L 0
|
||||
T sRE_POS // RET-POS = 0
|
||||
|
||||
CLR // VKE = 0 bei Fehler !!!
|
||||
|
||||
Ok: L Err
|
||||
T RE_VAL
|
||||
L Status
|
||||
OW
|
||||
T Status
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
|
||||
--- NW 6: Fifokopfdaten speichern ---
|
||||
L AR2_Speicher // AR2 zurückspeichern
|
||||
LAR2
|
||||
|
||||
A L32.0 // Falscher Parameter
|
||||
A NixSave // Status nicht speichern
|
||||
BEC
|
||||
|
||||
L SSDW
|
||||
+ 10 // Status
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
FUNCTION "FIFOSearch" : Void
|
||||
TITLE = Fifo-Modul
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
FAMILY : FIFO
|
||||
NAME : FifoIn
|
||||
VERSION : 0.1
|
||||
//COPYRIGHT by Ingenieurbüro A.Emmert
|
||||
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
||||
//Tel.: 0049(0)8243-960629
|
||||
//Version: KyungBang00 / 14.04.2009
|
||||
//
|
||||
//Datenblock in Fifo suchen
|
||||
//SSDB: FIFO-DB
|
||||
//SSDW: FIFO-1.DW
|
||||
//SEARCHDATEN: Pointer, wo zu suchende Daten stehen (P#DB1.DBX0.0, P#M220.0)
|
||||
//RE_POS: Position an welcher sich Datensatz befindet
|
||||
//RE_VAL: Rückmeldungen:
|
||||
// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung
|
||||
// Bit1: SFC20-Aufruf mit Fehler
|
||||
// Bit2: Fifo ist leer
|
||||
// Bit3: Frei
|
||||
// Bit4: Frei
|
||||
// Bit5: Bringzeiger ist ausserhalb
|
||||
// Bit6: Holzeiger ist ausserhalb
|
||||
// Bit7: Versatz Bring-/Holzeiger
|
||||
//
|
||||
VAR_INPUT
|
||||
SSDB : Int; // Schnittstellen-DB
|
||||
SSDW : Int; // Schnittstellen-1.DW
|
||||
SEARCHDATEN : Pointer; // SuchDaten-Schnittstelle
|
||||
Laenge : Int; // Anzahl der DWs zum Vergleichen im Datensatz
|
||||
END_VAR
|
||||
|
||||
VAR_OUTPUT
|
||||
RE_POS : Int; // Position des Eintrags, der gesuchten Daten
|
||||
RE_VAL : Byte; // Rückmeldungen
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
Quelle : Any; // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any; // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte; // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int; // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word; // Status des Fifo
|
||||
Err : Byte; // Fehlerbits
|
||||
MinHolzeiger : Int; // Minimum Holzeiger
|
||||
MaxHolzeiger : Int; // Maximum Holzeiger
|
||||
DBFifo : Word; // FIFO-DB
|
||||
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word; // Ende des Fifo
|
||||
AR2_Speicher : DWord; // Adress-Register 2 zwischenspeichern
|
||||
DBSuchdaten : Word; // Solldaten-DB, falls angegeben
|
||||
SuchDaten_Startpunkt : Word; // SuchDaten-Startpunkt: Adresse
|
||||
SuchZeiger : Word; // Suchzeiger
|
||||
Schleife : Word; // Loopzähler
|
||||
NixSave : Bool; // Status nicht speichern
|
||||
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
AR1Start : DInt; // Startwert mit Offset 0
|
||||
sRE_POS : Int; // Position des Eintrags, der gesuchten Daten
|
||||
END_VAR
|
||||
|
||||
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Schnittstellen-DB sinnvoll ?
|
||||
TAR2;
|
||||
T #AR2_Speicher;//AR2 zwischenspeichern
|
||||
|
||||
L #SSDB;
|
||||
T #DBFifo;
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL "TEST_DB_TO_ATTR_DB"
|
||||
( DB_Number := #DBFifo ,
|
||||
RetVal := #SFC_RET_VAL ,
|
||||
DB_Length := #SFC_DB_LENGTH ,
|
||||
Write_Prot := #SFC_WRITE_PROT
|
||||
);
|
||||
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
= #NixSave;//Status nicht speichern
|
||||
O #SFC_WRITE_PROT;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
NETWORK
|
||||
TITLE = Fifokopfdaten holen
|
||||
//Quelle-Pointer erzeugen:
|
||||
L 16#1004;//Kennung 10 + Word=04
|
||||
T #sRE_POS;//Any-Kennung, Datentyp
|
||||
L 16#0006;//6 Dw´s holen
|
||||
T %LW2;//Wiederholungen
|
||||
L #SSDB;
|
||||
T %LW4;//DB_Nummer
|
||||
L #SSDW;//Adresse
|
||||
SLD 3;
|
||||
L 16#8400_0000;//Kennung: Daten
|
||||
OD;
|
||||
T %LD6;//Kennung, Adresse
|
||||
|
||||
CALL BLKMOV//1.-6.DW FIFO holen
|
||||
{blk_type := 'Variant'}
|
||||
( SRCBLK := #Quelle ,
|
||||
RET_VAL := #SFC_RET_VAL ,
|
||||
DSTBLK := P#L20.0 WORD 6
|
||||
);
|
||||
|
||||
L #Status;
|
||||
L 2#0000_0000_1110_0000;
|
||||
UW;
|
||||
T #Err;
|
||||
SPP Err;//Kapitalfehler vorhanden
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
SPB Err1;
|
||||
|
||||
NETWORK
|
||||
TITLE = Zeigerüberprüfung
|
||||
L #Kopf;//Fifo-Kopf
|
||||
L 16#FF;//= Fifokennung ?
|
||||
<>I;//Nein !
|
||||
= #NixSave;//Status nicht speichern
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 1;
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 128;
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 1;
|
||||
L #FifoLaenge;//Max.Anzahl von Datenblöcken
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L #SSDW;
|
||||
+ 40;//Speichern ab 20.DW
|
||||
T #MinHolzeiger;//Minimum Holzeiger
|
||||
|
||||
L #FifoLaenge;//Länge FIFO (in Word)
|
||||
+ -1;
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
*I;
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
+ 40;//Speichern ab 20.DW
|
||||
L #SSDW;
|
||||
+I;
|
||||
T #MaxHolzeiger;//Maximum Holzeiger
|
||||
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
L #MaxHolzeiger;//Maximum Holzeiger
|
||||
+I;//Zeiger Endekennung
|
||||
T #Fifo_Ende;
|
||||
ITD;
|
||||
T #AR1Start;//Startwert mit Offset 0
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
AUF DB[ #DBFifo];
|
||||
|
||||
L #Fifo_Ende;
|
||||
L #SFC_DB_LENGTH;
|
||||
>I;//Fifo-DB ist zu kurz!
|
||||
SPB Err0;//kein Fifo-Bereich
|
||||
|
||||
L DBW[ #AR1Zeiger];
|
||||
L 16#FFEE;//Fifo-Endekennung ?
|
||||
<>I;//Nein !
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L #MinHolzeiger;//Minimum Holzeiger
|
||||
L #Holzeiger;//Holzeiger
|
||||
<=I;//Ok ?
|
||||
SPB W300;//Ja!
|
||||
|
||||
L 0;//Grundstellung ?
|
||||
<>I;//Nein !
|
||||
SPB Err6;//Holzeiger ist ausserhalb
|
||||
|
||||
L #Bringzeiger;//Bringzeiger Grundstellung ?
|
||||
<>I;//Nein !
|
||||
SPB Err6;//Holzeiger ist ausserhalb
|
||||
|
||||
L #Anzahl;//Anzahl Datensätze
|
||||
L 0;//Grundstellung ?
|
||||
<>I;//Nein !
|
||||
SPB Err6;//Holzeiger ist ausserhalb
|
||||
|
||||
L #MinHolzeiger;//Minimum Holzeiger
|
||||
T #Bringzeiger;//Bringzeiger
|
||||
T #Holzeiger;//Holzeiger
|
||||
|
||||
SPA Err2;//Fifo ist leer
|
||||
|
||||
W300: L #MaxHolzeiger;//Maximum Holzeiger
|
||||
<=I;//Ok ?
|
||||
SPB W301;//Ja!
|
||||
SPA Err6;//Holzeiger ist ausserhalb
|
||||
|
||||
|
||||
W301: L #Bringzeiger;//Bringzeiger
|
||||
L #Holzeiger;//Holzeiger
|
||||
==I;//Identisch !
|
||||
U(;
|
||||
L #FifoLaenge;
|
||||
L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||||
<>I;//Fifo noch nicht voll !
|
||||
);
|
||||
U(;
|
||||
L 0;
|
||||
<>I;//Datensätze aber noch vorhanden !
|
||||
);
|
||||
SPB Err7;//Versatz Bring-/Holzeiger
|
||||
|
||||
L #Bringzeiger;//Bringzeiger
|
||||
L #Holzeiger;//Holzeiger
|
||||
<>I;//Ungleich !
|
||||
U(;
|
||||
L #FifoLaenge;
|
||||
L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||||
==I;//Aber Fifo ist voll !
|
||||
O(;
|
||||
L 0;
|
||||
==I;//Aber keine Datensätze vorhanden !
|
||||
);
|
||||
);
|
||||
SPB Err7;//Versatz Bring-/Holzeiger
|
||||
|
||||
L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||||
L 0;
|
||||
==I;//Keine Datensätze vorhanden !
|
||||
SPB Err2;//Fifo ist leer
|
||||
|
||||
NETWORK
|
||||
TITLE = Fifodaten suchen
|
||||
L 1;
|
||||
T #sRE_POS;//RET-POS
|
||||
|
||||
L #Holzeiger;//Holzeiger
|
||||
T #SuchZeiger;//Suchzeiger
|
||||
W400: ITD;
|
||||
T #AR1Start;//Startwert mit Offset 0
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
//DATEN-Pointer übernehmen:
|
||||
L P##SEARCHDATEN;
|
||||
LAR2;
|
||||
|
||||
L W[ AR2, P#0.0];
|
||||
T #DBSuchdaten;//Solldaten-DB
|
||||
|
||||
L #DBSuchdaten;//Solldaten-DB
|
||||
L 0;//Angegeben ?
|
||||
==I;//Nein
|
||||
SPB W401;
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBSuchdaten
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL "TEST_DB_TO_ATTR_DB"
|
||||
( DB_Number := #DBSuchdaten ,
|
||||
RetVal := #SFC_RET_VAL ,
|
||||
DB_Length := #SFC_DB_LENGTH ,
|
||||
Write_Prot := #SFC_WRITE_PROT
|
||||
);
|
||||
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;//Fehler vorhanden ?
|
||||
<>I;//Ja !
|
||||
SPB Err1;//SFC20-Aufruf mit Fehler
|
||||
|
||||
L D[ AR2, P#2.0];//Kennung, Adresse
|
||||
L 16#00FF_FFFF;//Ohne Kennung
|
||||
UW;
|
||||
SRW 3;//Ohne Bit
|
||||
T #SuchDaten_Startpunkt;
|
||||
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
L #SuchDaten_Startpunkt;
|
||||
+I;
|
||||
L #SFC_DB_LENGTH;
|
||||
>I;//Indaten-DB ist zu kurz
|
||||
SPB Err1;//SFC20-Aufruf mit Fehler
|
||||
|
||||
W401: L D[ AR2, P#2.0];//Kennung, Adresse
|
||||
LAR2;
|
||||
|
||||
L #Laenge;//Anzahl der DWs zum Vergleichen im Datensatz
|
||||
L400: T #Schleife;
|
||||
|
||||
L #DBSuchdaten;//Solldaten-DB
|
||||
L 0;//Angegeben ?
|
||||
==I;//Nein
|
||||
SPB W402;
|
||||
|
||||
AUF DB[ #DBSuchdaten];
|
||||
|
||||
W402: L W[ AR2, P#0.0];//Mit Solldaten überprüfen
|
||||
AUF DB[ #DBFifo];
|
||||
L DBW[ #AR1Zeiger];//Fifo-Daten lesen
|
||||
<>I;//nicht identisch !
|
||||
SPB W403;
|
||||
|
||||
L #AR1Start;//Startwert mit Offset 0
|
||||
+ DINT#2;
|
||||
T #AR1Start;//Startwert mit nächstem Offset
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
+AR2 P#2.0;
|
||||
|
||||
L #Schleife;
|
||||
LOOP L400;
|
||||
|
||||
SPA Ende;//Datensatz ist in Fifo enthalten
|
||||
|
||||
W403: L #sRE_POS;//RET-POS
|
||||
+ 1;
|
||||
T #sRE_POS;//RET-POS
|
||||
L #Anzahl;//Anzahl der Daten im Fifo
|
||||
>I;//Alle Datensätze sind durchsucht
|
||||
SPB Err2;
|
||||
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
L #SuchZeiger;//Suchzeiger
|
||||
+I;
|
||||
T #SuchZeiger;//Suchzeiger
|
||||
L #MaxHolzeiger;//Maximum Holzeiger
|
||||
<=I;//Ende erreicht? Nein!
|
||||
SPB W404;
|
||||
|
||||
L #MinHolzeiger;//Minimum Holzeiger
|
||||
T #SuchZeiger;
|
||||
|
||||
W404: L #SuchZeiger;//Suchzeiger
|
||||
SPA W400;
|
||||
|
||||
NETWORK
|
||||
TITLE = Fehlerausgabe / RET_VAL
|
||||
Ende: SET;//VKE = 1 ohne Fehler !!!
|
||||
SPA Ok;
|
||||
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
|
||||
T #Err;
|
||||
SPA Err;
|
||||
Err1: S %L32.1;//SFC20-Aufruf mit Fehler
|
||||
SPA Err;
|
||||
Err2: S %L32.2;//Fifo ist leer
|
||||
SPA Err;
|
||||
Err6: S %L32.6;//Holzeiger außerhalb
|
||||
SPA Err;
|
||||
Err7: S %L32.7;//Versatz Bring-/Holzeiger
|
||||
|
||||
Err: L 0;
|
||||
T #sRE_POS;//RET-POS = 0
|
||||
|
||||
CLR;//VKE = 0 bei Fehler !!!
|
||||
|
||||
Ok: L #Err;
|
||||
T #RE_VAL;
|
||||
L #Status;
|
||||
OW;
|
||||
T #Status;
|
||||
|
||||
SAVE;//VKE in BIE-Bit speichern
|
||||
|
||||
NETWORK
|
||||
TITLE = Fifokopfdaten speichern
|
||||
L #AR2_Speicher;//AR2 zurückspeichern
|
||||
LAR2;
|
||||
|
||||
U %L32.0;//Falscher Parameter
|
||||
U #NixSave;//Status nicht speichern
|
||||
BEB;
|
||||
|
||||
L #SSDW;
|
||||
+ 10;//Status
|
||||
ITD;
|
||||
T #AR1Start;//Startwert mit Offset 0
|
||||
SLD 3;
|
||||
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
AUF DB[ #DBFifo];
|
||||
|
||||
L #Err;
|
||||
T DBW[ #AR1Zeiger];
|
||||
|
||||
NETWORK
|
||||
TITLE =
|
||||
L #sRE_POS;
|
||||
T #RE_POS;
|
||||
END_FUNCTION
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Err
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
|
||||
--- NW 7: ---
|
||||
L sRE_POS
|
||||
T RE_POS
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,204 +1,248 @@
|
||||
=== FC 82: FifoReset [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Schnittstellen-DB
|
||||
SSDW : Int // Schnittstellen-1.DW
|
||||
PARA : Word // Aufrufparameter (Durchlaufspeicher?)
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Kopf : Byte // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word // Status des Fifo
|
||||
DBFifo : Word // FIFO-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word // Ende des Fifo
|
||||
Schleife : Word // Loopzähler
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "FifoReset" : Void
|
||||
TITLE = Fifo-Modul
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
FAMILY : FIFO
|
||||
NAME : FifoIn
|
||||
VERSION : 0.1
|
||||
//COPYRIGHT by Ingenieurbüro A.Emmert
|
||||
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
||||
//Tel.: 0049(0)8243-1254
|
||||
//Version: ILS2100 / 06.11.2009
|
||||
//
|
||||
//Fifo resetten
|
||||
//SSDB: FIFO-DB
|
||||
//SSDW: FIFO-1.DW
|
||||
//PARA: Aufrufparameter 00XX:
|
||||
// XX: 00 = Normaler FIFO (alles löschen)
|
||||
// D0 = Durchlaufspeicher (alles mit Nullen füllen)
|
||||
// D1 = Durchlaufspeicher (alles mit FFFF füllen)
|
||||
// Rückmeldungen:
|
||||
// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung
|
||||
// Bit1: SFC20-Aufruf mit Fehler
|
||||
// Bit2: Frei
|
||||
// Bit3: Frei
|
||||
// Bit4: Frei
|
||||
// Bit5: Frei
|
||||
// Bit6: Frei
|
||||
// Bit7: Frei
|
||||
//
|
||||
VAR_INPUT
|
||||
SSDB : Int; // Schnittstellen-DB
|
||||
SSDW : Int; // Schnittstellen-1.DW
|
||||
PARA : Word; // Aufrufparameter (Durchlaufspeicher?)
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBFifo
|
||||
VAR_OUTPUT
|
||||
RE_VAL : Byte; // Rückmeldung
|
||||
END_VAR
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Fifobereich
|
||||
VAR_TEMP
|
||||
Quelle : Any; // Zeiger, wo Rein-Daten sind
|
||||
Kopf : Byte; // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int; // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word; // Status des Fifo
|
||||
DBFifo : Word; // FIFO-DB
|
||||
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word; // Ende des Fifo
|
||||
Schleife : Word; // Loopzähler
|
||||
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#0006 // 6 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Schnittstellen-DB sinnvoll ?
|
||||
L #SSDB;
|
||||
T #DBFifo;
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L10.0 WORD 6) // 1.-6.DW FIFO holen
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
CALL "TEST_DB_TO_ATTR_DB"
|
||||
( DB_Number := #DBFifo ,
|
||||
RetVal := #SFC_RET_VAL ,
|
||||
DB_Length := #SFC_DB_LENGTH ,
|
||||
Write_Prot := #SFC_WRITE_PROT
|
||||
);
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
O #SFC_WRITE_PROT;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
NETWORK
|
||||
TITLE = Fifokopfdaten holen
|
||||
//Quelle-Pointer erzeugen:
|
||||
L 16#1004;//Kennung 10 + Word=04
|
||||
T %LW0;//Any-Kennung, Datentyp
|
||||
L 16#0006;//6 Dw´s holen
|
||||
T %LW2;//Wiederholungen
|
||||
L #SSDB;
|
||||
T %LW4;//DB_Nummer
|
||||
L #SSDW;//Adresse
|
||||
SLD 3;
|
||||
L 16#8400_0000;//Kennung: Daten
|
||||
OD;
|
||||
T %LD6;//Kennung, Adresse
|
||||
|
||||
CALL BLKMOV//1.-6.DW FIFO holen
|
||||
{blk_type := 'Variant'}
|
||||
( SRCBLK := #Quelle ,
|
||||
RET_VAL := #SFC_RET_VAL ,
|
||||
DSTBLK := P#L10.0 WORD 6
|
||||
);
|
||||
|
||||
L #SFC_RET_VAL;
|
||||
L 2#0000_0000_0000_0000;
|
||||
<>I;
|
||||
SPB Err1;
|
||||
|
||||
NETWORK
|
||||
TITLE = Zeigerüberprüfung
|
||||
L #Kopf;//Fifo-Kopf
|
||||
L 16#FF;//= Fifokennung ?
|
||||
<>I;//Nein !
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 1;
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 128;
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L 1;
|
||||
L #FifoLaenge;//Max.Anzahl von Datenblöcken
|
||||
>I;
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
L #FifoLaenge;//Länge FIFO (in Word)
|
||||
L #Datensatzlaenge;//Datenblocklänge
|
||||
*I;
|
||||
L 2;//DB byteorientiert
|
||||
*I;
|
||||
+ 40;//Speichern ab 20.DW
|
||||
L #SSDW;
|
||||
+I;
|
||||
T #Fifo_Ende;
|
||||
SLW 3;//Pointer erzeugen
|
||||
LAR1;
|
||||
|
||||
AUF DB[ #DBFifo];
|
||||
|
||||
L #Fifo_Ende;
|
||||
L #SFC_DB_LENGTH;
|
||||
>I;//Fifo-DB ist zu kurz!
|
||||
SPB Err0;//kein Fifo-Bereich
|
||||
|
||||
L DBW[ AR1, P#0.0];
|
||||
L 16#FFEE;//Fifo-Endekennung ?
|
||||
<>I;//Nein !
|
||||
SPB Err0;//kein Fifobereich
|
||||
|
||||
NETWORK
|
||||
TITLE = Fifo-Daten löschen
|
||||
L #SSDW;
|
||||
+ 4;//Ab 2.Dw
|
||||
SLW 3;//Pointer erzeugen
|
||||
LAR1;
|
||||
|
||||
AUF DB[ #DBFifo];
|
||||
|
||||
L #Datensatzlaenge;
|
||||
L #FifoLaenge;
|
||||
*I;
|
||||
+ 18;//18 Datenwörter (wortorientiert)
|
||||
L400: T #Schleife;
|
||||
|
||||
L 0;
|
||||
T DBW[ AR1, P#0.0];
|
||||
|
||||
+AR1 P#2.0;
|
||||
|
||||
L #Schleife;
|
||||
LOOP L400;
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Fifo-Kopf
|
||||
L 16#FF // = Fifokennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
NETWORK
|
||||
TITLE = Durchlaufspeicher ?
|
||||
L #PARA;//Aufrufparameter
|
||||
SRW 4;
|
||||
L 16#000D;//Durchlaufspeicher ?
|
||||
<>I;//Nein !
|
||||
SPB N006;
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
L #SSDW;
|
||||
+ 4;//Speichern ab 4.DW
|
||||
SLW 3;//Pointer erzeugen
|
||||
LAR1;
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
AUF DB[ #DBFifo];
|
||||
|
||||
L 1
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
L #SSDW;
|
||||
+ 40;//1.Speicherzelle
|
||||
T DBW[ AR1, P#0.0];//Bringzeiger
|
||||
T DBW[ AR1, P#2.0];//Holzeiger
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 40 // Speichern ab 20.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Fifo_Ende
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
L #FifoLaenge;//Fifo ist voll
|
||||
T DBW[ AR1, P#4.0];//Anzahl
|
||||
|
||||
OPN DB[DBFifo]
|
||||
L #PARA;//Aufrufparameter
|
||||
L 16#00D1;//Durchlaufspeicher mit FFFF füllen
|
||||
<>I;//Nein !
|
||||
SPB N006;
|
||||
|
||||
L Fifo_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Fifo-DB ist zu kurz!
|
||||
JC Err0 // kein Fifo-Bereich
|
||||
L #FifoLaenge;//Fifo ist voll
|
||||
T DBW[ AR1, P#8.0];//1.Zusatz-Dw (Anzahl der Daten)
|
||||
|
||||
L DBW [AR1,]
|
||||
L 16#FFEE // Fifo-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
L 2#0000_0000_0000_0011;//Daten vorhanden/kommen raus
|
||||
T DBW[ AR1, P#14.0];//4.Zusatz-Dw (Status)
|
||||
|
||||
L #SSDW;
|
||||
+ 40;//Ab 20.Dw
|
||||
SLW 3;//Pointer erzeugen
|
||||
LAR1;
|
||||
|
||||
--- NW 4: Fifo-Daten löschen ---
|
||||
L SSDW
|
||||
+ 4 // Ab 2.Dw
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
AUF DB[ #DBFifo];
|
||||
|
||||
OPN DB[DBFifo]
|
||||
L #Datensatzlaenge;
|
||||
L #FifoLaenge;
|
||||
*I;
|
||||
L500: T #Schleife;
|
||||
|
||||
L Datensatzlaenge
|
||||
L FifoLaenge
|
||||
*I
|
||||
+ 18 // 18 Datenwörter (wortorientiert)
|
||||
L400: T Schleife
|
||||
L 16#FFFF;
|
||||
T DBW[ AR1, P#0.0];
|
||||
|
||||
L 0
|
||||
T DBW [AR1,]
|
||||
+AR1 P#2.0;
|
||||
|
||||
ADDAR1 P#2.0
|
||||
L #Schleife;
|
||||
LOOP L500;
|
||||
|
||||
L Schleife
|
||||
LOOP L400
|
||||
NETWORK
|
||||
TITLE = Fehlerausgabe / RET_VAL
|
||||
N006: SET;//VKE = 1 ohne Fehler !!!
|
||||
L 2#0000_0000_0000_0000;
|
||||
SPA Ok;
|
||||
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
|
||||
SPA Err;
|
||||
Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler
|
||||
|
||||
Err: CLR;//VKE = 0 bei Fehler !!!
|
||||
Ok: T #RE_VAL;
|
||||
|
||||
SAVE;//VKE in BIE-Bit speichern
|
||||
|
||||
--- NW 5: Durchlaufspeicher ? ---
|
||||
L PARA // Aufrufparameter
|
||||
SRW 4
|
||||
L 16#000D // Durchlaufspeicher ?
|
||||
<>I // Nein !
|
||||
JC N006
|
||||
|
||||
L SSDW
|
||||
+ 4 // Speichern ab 4.DW
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L SSDW
|
||||
+ 40 // 1.Speicherzelle
|
||||
T DBW [AR1,] // Bringzeiger
|
||||
T DBW [AR1,] // Holzeiger
|
||||
|
||||
L FifoLaenge // Fifo ist voll
|
||||
T DBW [AR1,] // Anzahl
|
||||
|
||||
L PARA // Aufrufparameter
|
||||
L 16#00D1 // Durchlaufspeicher mit FFFF füllen
|
||||
<>I // Nein !
|
||||
JC N006
|
||||
|
||||
L FifoLaenge // Fifo ist voll
|
||||
T DBW [AR1,] // 1.Zusatz-Dw (Anzahl der Daten)
|
||||
|
||||
L 2#0000_0000_0000_0011 // Daten vorhanden/kommen raus
|
||||
T DBW [AR1,] // 4.Zusatz-Dw (Status)
|
||||
|
||||
L SSDW
|
||||
+ 40 // Ab 20.Dw
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Datensatzlaenge
|
||||
L FifoLaenge
|
||||
*I
|
||||
L500: T Schleife
|
||||
|
||||
L 16#FFFF
|
||||
T DBW [AR1,]
|
||||
|
||||
ADDAR1 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
|
||||
|
||||
--- NW 6: Fehlerausgabe / RET_VAL ---
|
||||
N006: SET // VKE = 1 ohne Fehler !!!
|
||||
L 2#0000_0000_0000_0000
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: T RE_VAL
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,52 +1,62 @@
|
||||
=== FC 79: INT_to_BCD (4stellig) [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Int_Wert : Int
|
||||
Output:
|
||||
BCD_Wert : Word
|
||||
InOut:
|
||||
Temp:
|
||||
Rest : Int
|
||||
Ergebnis : Int
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "INT_to_BCD (4stellig)" : Void
|
||||
TITLE = INT-Wert (bis 9999) in BCD-Wert (4-Stellig) wandeln
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
//
|
||||
//
|
||||
VAR_INPUT
|
||||
Int_Wert : Int;
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Rückmeldung ---
|
||||
L 0 // erst mal köschen
|
||||
T BCD_Wert
|
||||
VAR_OUTPUT
|
||||
BCD_Wert : Word;
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
Rest : Int;
|
||||
Ergebnis : Int;
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Int-Wert ok ? ---
|
||||
L Int_Wert
|
||||
L 0
|
||||
<I
|
||||
BEC
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Rückmeldung
|
||||
L 0;//erst mal köschen
|
||||
T #BCD_Wert;
|
||||
|
||||
CAC
|
||||
L 9999
|
||||
>I
|
||||
BEC
|
||||
NETWORK
|
||||
TITLE = Int-Wert ok ?
|
||||
L #Int_Wert;
|
||||
L 0;
|
||||
<I;
|
||||
BEB;
|
||||
|
||||
TAK;
|
||||
L 9999;
|
||||
>I;
|
||||
BEB;
|
||||
|
||||
--- NW 3: INT-Wert wandeln ---
|
||||
L Int_Wert
|
||||
L 10 // Damit die linken 3 Stellen
|
||||
/I
|
||||
T LD0 // temporär speichen (s.o.)
|
||||
NETWORK
|
||||
TITLE = INT-Wert wandeln
|
||||
L #Int_Wert;
|
||||
L 10;//Damit die linken 3 Stellen
|
||||
/I;
|
||||
T %LD0;//temporär speichen (s.o.)
|
||||
|
||||
L Ergebnis // linken 3 Stellen
|
||||
ITB // wandeln
|
||||
SLW 4 // Wieder nach links schieben
|
||||
T BCD_Wert // zwischen speichern
|
||||
L #Ergebnis;//linken 3 Stellen
|
||||
ITB;//wandeln
|
||||
SLW 4;//Wieder nach links schieben
|
||||
T #BCD_Wert;//zwischen speichern
|
||||
|
||||
L Rest // rechte Stelle
|
||||
ITB // wandeln
|
||||
L BCD_Wert // Zwischenergebis
|
||||
OW // rechte Stelle dazu
|
||||
T BCD_Wert // BDC-Ergebnis
|
||||
L #Rest;//rechte Stelle
|
||||
ITB;//wandeln
|
||||
L #BCD_Wert;//Zwischenergebis
|
||||
OW;//rechte Stelle dazu
|
||||
T #BCD_Wert;//BDC-Ergebnis
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,82 +1,95 @@
|
||||
=== FB 182: MAusfahrFreigabe_neu [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Impuls : Bool // Zähl-Impuls
|
||||
Vorbei_1 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_2 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_3 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_4 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_5 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Inks_Vorbei_1 : Int // Rest-Inks für diese Position
|
||||
Inks_Vorbei_2 : Int // Rest-Inks für diese Position
|
||||
Inks_Vorbei_3 : Int // Rest-Inks für diese Position
|
||||
Inks_Vorbei_4 : Int // Rest-Inks für diese Position
|
||||
Inks_Vorbei_5 : Int // Rest-Inks für diese Position
|
||||
Output:
|
||||
InOut:
|
||||
Antrieb_ein : Bool // Antrieb einschalten
|
||||
Static:
|
||||
Dyn : Struct
|
||||
Rest_Inks : Int := 1 // BM noch unterwegs [Inks]
|
||||
Temp:
|
||||
tAktiv : Int
|
||||
Constant:
|
||||
FUNCTION_BLOCK "MAusfahrFreigabe_neu"
|
||||
TITLE = Ausfahrfreigabe für Pufferstrecken
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Impuls : Bool; // Zähl-Impuls
|
||||
Vorbei_1 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_2 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_3 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_4 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_5 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
|
||||
Inks_Vorbei_1 : Int; // Rest-Inks für diese Position
|
||||
Inks_Vorbei_2 : Int; // Rest-Inks für diese Position
|
||||
Inks_Vorbei_3 : Int; // Rest-Inks für diese Position
|
||||
Inks_Vorbei_4 : Int; // Rest-Inks für diese Position
|
||||
Inks_Vorbei_5 : Int; // Rest-Inks für diese Position
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Vorbei-Sensoren auswerten ---
|
||||
L Inks_Vorbei_5
|
||||
A Vorbei_5
|
||||
JC Chek
|
||||
L Inks_Vorbei_4
|
||||
A Vorbei_4
|
||||
JC Chek
|
||||
L Inks_Vorbei_3
|
||||
A Vorbei_3
|
||||
JC Chek
|
||||
L Inks_Vorbei_2
|
||||
A Vorbei_2
|
||||
JC Chek
|
||||
L Inks_Vorbei_1
|
||||
A Vorbei_1
|
||||
JC Chek
|
||||
VAR_IN_OUT
|
||||
Antrieb_ein : Bool; // Antrieb einschalten
|
||||
END_VAR
|
||||
|
||||
JU En02
|
||||
VAR
|
||||
Dyn : Struct
|
||||
Rest_Inks : Int := 1; // BM noch unterwegs [Inks]
|
||||
END_STRUCT;
|
||||
END_VAR
|
||||
|
||||
Chek: L Dyn.Rest_Inks // Neuer Wert kleiner?
|
||||
<I // Ja !
|
||||
JC En02 // Ohne Speicherung weiter
|
||||
|
||||
CAC // Neuen Wert übernehmen
|
||||
T Dyn.Rest_Inks // Wert speichern
|
||||
|
||||
En02: NOP 0
|
||||
VAR_TEMP
|
||||
tAktiv : Int;
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Rest-Inks verändern ---
|
||||
AN Impuls // Von MImpulsGeber
|
||||
JC En04
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Vorbei-Sensoren auswerten
|
||||
L #Inks_Vorbei_5;
|
||||
U #Vorbei_5;
|
||||
SPB Chek;
|
||||
L #Inks_Vorbei_4;
|
||||
U #Vorbei_4;
|
||||
SPB Chek;
|
||||
L #Inks_Vorbei_3;
|
||||
U #Vorbei_3;
|
||||
SPB Chek;
|
||||
L #Inks_Vorbei_2;
|
||||
U #Vorbei_2;
|
||||
SPB Chek;
|
||||
L #Inks_Vorbei_1;
|
||||
U #Vorbei_1;
|
||||
SPB Chek;
|
||||
|
||||
// BT ist unterwegs:
|
||||
L Dyn.Rest_Inks
|
||||
+ -1
|
||||
T Dyn.Rest_Inks
|
||||
SPA En02;
|
||||
|
||||
L 0 // Minimum erreicht?
|
||||
>I // Nein !
|
||||
JC En04
|
||||
Chek: L #Dyn.Rest_Inks ;//Neuer Wert kleiner?
|
||||
<I;//Ja !
|
||||
SPB En02 ;//Ohne Speicherung weiter
|
||||
|
||||
L 1
|
||||
T Dyn.Rest_Inks // Minimum übergeben
|
||||
TAK;//Neuen Wert übernehmen
|
||||
T #Dyn.Rest_Inks;//Wert speichern
|
||||
|
||||
En04: NOP 0
|
||||
En02: NOP 0;
|
||||
|
||||
NETWORK
|
||||
TITLE = Rest-Inks verändern
|
||||
UN #Impuls ;//Von MImpulsGeber
|
||||
SPB En04;
|
||||
|
||||
--- NW 3: Antrieb einschalten ---
|
||||
L Dyn.Rest_Inks
|
||||
L 1 // vorhanden ?
|
||||
>I // Ja !
|
||||
S Antrieb_ein
|
||||
//BT ist unterwegs:
|
||||
L #Dyn.Rest_Inks;
|
||||
+ -1;
|
||||
T #Dyn.Rest_Inks;
|
||||
|
||||
L 0;//Minimum erreicht?
|
||||
>I;//Nein !
|
||||
SPB En04;
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
L 1;
|
||||
T #Dyn.Rest_Inks;//Minimum übergeben
|
||||
|
||||
En04: NOP 0;
|
||||
|
||||
NETWORK
|
||||
TITLE = Antrieb einschalten
|
||||
L #Dyn.Rest_Inks;
|
||||
L 1 ;//vorhanden ?
|
||||
>I;//Ja !
|
||||
S #Antrieb_ein;
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
|
||||
@@ -1,153 +1,163 @@
|
||||
=== FB 94: MBlinken [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Impulsdauer : Bool // Impulsdauer
|
||||
Error_1 : Bool
|
||||
Error_2 : Bool
|
||||
Error_3 : Bool
|
||||
Error_4 : Bool
|
||||
Error_5 : Bool
|
||||
Error_6 : Bool
|
||||
Error_7 : Bool
|
||||
Error_8 : Bool
|
||||
Error_9 : Bool
|
||||
Error_10 : Bool
|
||||
Output:
|
||||
hAnzeige : Bool // Anzeige
|
||||
InOut:
|
||||
Static:
|
||||
Flanke_Ausschalttakt : Bool
|
||||
Kein_Blinken : Bool
|
||||
Ausschalttakte : Int // Betriebsbereit ist ausgeschaltet
|
||||
Temp:
|
||||
Constant:
|
||||
FUNCTION_BLOCK "MBlinken"
|
||||
TITLE = Anzeige blinken lassen
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Impulsdauer : Bool; // Impulsdauer
|
||||
Error_1 : Bool;
|
||||
Error_2 : Bool;
|
||||
Error_3 : Bool;
|
||||
Error_4 : Bool;
|
||||
Error_5 : Bool;
|
||||
Error_6 : Bool;
|
||||
Error_7 : Bool;
|
||||
Error_8 : Bool;
|
||||
Error_9 : Bool;
|
||||
Error_10 : Bool;
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Anzeige bei Error 1-10 1-10 mal blinken lassen ---
|
||||
// Anzeige ausschalten:
|
||||
AN Error_1
|
||||
AN Error_2
|
||||
AN Error_3
|
||||
AN Error_4
|
||||
AN Error_5
|
||||
AN Error_6
|
||||
AN Error_7
|
||||
AN Error_8
|
||||
AN Error_9
|
||||
AN Error_10
|
||||
R hAnzeige
|
||||
R Flanke_Ausschalttakt
|
||||
R Kein_Blinken
|
||||
JC NoAn
|
||||
VAR_OUTPUT
|
||||
hAnzeige : Bool; // Anzeige
|
||||
END_VAR
|
||||
|
||||
// Anzeige aktivieren
|
||||
A Impulsdauer
|
||||
AN Kein_Blinken
|
||||
= hAnzeige
|
||||
|
||||
A Impulsdauer
|
||||
Fall Flanke_Ausschalttakt
|
||||
JCN mHu
|
||||
|
||||
L Ausschalttakte
|
||||
+ 1
|
||||
T Ausschalttakte
|
||||
VAR
|
||||
Flanke_Ausschalttakt : Bool;
|
||||
Kein_Blinken : Bool;
|
||||
Ausschalttakte : Int; // Betriebsbereit ist ausgeschaltet
|
||||
END_VAR
|
||||
|
||||
|
||||
mHu: L Ausschalttakte
|
||||
L 2
|
||||
>=I
|
||||
A Kein_Blinken
|
||||
R Kein_Blinken
|
||||
JC NoAn
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Anzeige bei Error 1-10 1-10 mal blinken lassen
|
||||
|
||||
A Kein_Blinken
|
||||
JC En01
|
||||
//Anzeige ausschalten:
|
||||
UN #Error_1;
|
||||
UN #Error_2;
|
||||
UN #Error_3;
|
||||
UN #Error_4;
|
||||
UN #Error_5;
|
||||
UN #Error_6;
|
||||
UN #Error_7;
|
||||
UN #Error_8;
|
||||
UN #Error_9;
|
||||
UN #Error_10;
|
||||
R #hAnzeige;
|
||||
R #Flanke_Ausschalttakt;
|
||||
R #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
CAC
|
||||
L 1
|
||||
>=I
|
||||
A Error_1
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
//Anzeige aktivieren
|
||||
U #Impulsdauer;
|
||||
UN #Kein_Blinken;
|
||||
= #hAnzeige;
|
||||
|
||||
CAC
|
||||
L 2
|
||||
>=I
|
||||
A Error_2
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
U #Impulsdauer;
|
||||
FN #Flanke_Ausschalttakt;
|
||||
SPBN mHu;
|
||||
|
||||
CAC
|
||||
L 3
|
||||
>=I
|
||||
A Error_3
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 4
|
||||
>=I
|
||||
A Error_4
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 5
|
||||
>=I
|
||||
A Error_5
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 6
|
||||
>=I
|
||||
A Error_6
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 7
|
||||
>=I
|
||||
A Error_7
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 8
|
||||
>=I
|
||||
A Error_8
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 9
|
||||
>=I
|
||||
A Error_9
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 10
|
||||
>=I
|
||||
A Error_10
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 10
|
||||
>I
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
JU En01
|
||||
|
||||
NoAn: L 0
|
||||
T Ausschalttakte
|
||||
|
||||
En01: NOP 0
|
||||
L #Ausschalttakte;
|
||||
+ 1;
|
||||
T #Ausschalttakte;
|
||||
|
||||
|
||||
--- NW 2: Ende ---
|
||||
BE
|
||||
mHu: L #Ausschalttakte;
|
||||
L 2;
|
||||
>=I;
|
||||
U #Kein_Blinken;
|
||||
R #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
U #Kein_Blinken;
|
||||
SPB En01;
|
||||
|
||||
TAK;
|
||||
L 1;
|
||||
>=I;
|
||||
U #Error_1;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 2;
|
||||
>=I;
|
||||
U #Error_2;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 3;
|
||||
>=I;
|
||||
U #Error_3;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 4;
|
||||
>=I;
|
||||
U #Error_4;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 5;
|
||||
>=I;
|
||||
U #Error_5;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 6;
|
||||
>=I;
|
||||
U #Error_6;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 7;
|
||||
>=I;
|
||||
U #Error_7;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 8;
|
||||
>=I;
|
||||
U #Error_8;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 9;
|
||||
>=I;
|
||||
U #Error_9;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 10;
|
||||
>=I;
|
||||
U #Error_10;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
TAK;
|
||||
L 10;
|
||||
>I;
|
||||
S #Kein_Blinken;
|
||||
SPB NoAn;
|
||||
|
||||
SPA En01;
|
||||
|
||||
NoAn: L 0;
|
||||
T #Ausschalttakte;
|
||||
|
||||
En01: NOP 0;
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
|
||||
@@ -1,208 +1,278 @@
|
||||
=== FB 1278: MHMEntnahmepuffer [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
EntnahmePuffer_Nr : Int // Aufruf für Leer-Puffer
|
||||
B_LeerpufferEinfahrt : Bool // Sensor Trolley fährt in Leerpuffer
|
||||
Output:
|
||||
Error : Word // Störungen übergeben
|
||||
InOut:
|
||||
hStOk : Bool // Anzeige Start n. Störung aktivieren
|
||||
Static:
|
||||
Res16 : Array[1..4] of Int // Reserve
|
||||
SAVE : Struct
|
||||
Weichen_DB : Int // Weichen-FIFO-DB
|
||||
Weichen_DW : Int // Weichen-FIFO-DW
|
||||
Para : Struct // Parameter
|
||||
Entnahmepuffer_DL_DB : Int // Einsprung Leerpuffer-Datenliste-DB
|
||||
Entnahmepuffer_DL_DW : Int // Einsprung Leerpuffer-Datenliste-DW
|
||||
Res1 : Array[1..2] of Int // Reserve
|
||||
Status2 : Struct
|
||||
Abruf_ist_möglich : Bool // Abruf ist möglich
|
||||
Kein_Stop_mehr : Bool
|
||||
Eintrag_DL_Leerliste_erfolgt : Bool // Eintrag in DLLPPuffer_leer (DB500) erfolgt
|
||||
Eintrag_DL_Reinliste_erfolgt : Bool // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt
|
||||
Eintrag_Abrufliste_erfolgt : Bool // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt
|
||||
Puffer : "UDLHMEntnahmePuffer" // Statische Leerpufferdaten (aus DL)
|
||||
Dyn : Struct // Dynamische Daten
|
||||
Status : Struct
|
||||
Puffer_OUT_leer : Bool // Puffer ist leer
|
||||
Puffer_OUT_hat Platz : Bool // Puffer hat noch Kapazität
|
||||
Undef.Trolley_in_Schleuse_OUT : Bool // Undefinierter Trolley in Schleuse unten erkannt
|
||||
Trolley_fährt_in_Schleuse_OUT : Bool // Trolley fährt in Schleuse (unten)
|
||||
Trolley_wartet_Auftrag : Bool // Trolley wartet auf Auftrag (unten)
|
||||
Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 (unten)
|
||||
Trolley_fährt_aus_OUT : Bool // Trolley fährt aus (unten)
|
||||
MindestZeit_ok_OUT : Bool // Schleuse ist MindestZeit geöffnet
|
||||
Trolley_draussen_Out : Bool // Trolley ist ausgefahren
|
||||
Trolley_OUT_nicht_in_Schleuse : Bool // Trolley fährt nicht in Schleuse
|
||||
Leer_Check_OUT : Bool // Leerpuffer wird auf leer gecheckt
|
||||
Alles_ausfahren : Bool // Alle Trolleys ausfahren
|
||||
Leerpuffer_initialisieren : Bool // Leerpuffer initialisieren
|
||||
Error_aktiv : Bool // Störung vorhanden
|
||||
Reset_aktiv_OUT : Bool // Reset aktiv
|
||||
TrolleyID_Einfahrt : DInt // Trolley-Nr ist eingefahren
|
||||
Rueckmld : Struct
|
||||
RET_VAL_BLKMOV_EntnahmePuffer : Int // Rückmeldung nach BLKMOV-Aufruf
|
||||
RET_VAL_DL_EntnahmePuffer : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
RET_VAL_DL_Res_OUT : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
RET_VAL_DL_EntnahmePufferTrolley_IN : Byte // Rückmeldung nach DatenIN-Aufruf
|
||||
RET_VAL_DL_EntnahmePufferTrolley_OUT : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
Error : "UErrHMEntnahmePuffer"
|
||||
Stau_Zeit : Int // Sensor B_Einfahrt ist belegt [1s]
|
||||
Stop_Ursache : Word // Stop-Stelle: Nw + Position
|
||||
Res500 : Array[1..206] of Int
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Ueb_akt : Bool // Überwachungszeit aktivieren
|
||||
Weiter : Bool // Weiterschaltbedingung ist erfüllt
|
||||
Warte_neu : Bool // Wartezeit neu triggern
|
||||
Warte_stop : Bool // Wartezeit stoppen
|
||||
Inks_Ok : Bool // Starten aufgrund der Inks erlaubt
|
||||
Puffer_ist_leer : Bool // Leerpuffer zeitlang ohne Sensor
|
||||
Abruf_Trolley_vorne : Bool // Abruf-Trolley ist in Schleuse
|
||||
Oberen_Puffer_Freigeben : Bool
|
||||
GesamtAnzahl : Int
|
||||
SSDW : Int
|
||||
Schleife : Word // Loopzähler
|
||||
Trolley : Int
|
||||
Position : Int
|
||||
Constant:
|
||||
FUNCTION_BLOCK "MHMEntnahmepuffer"
|
||||
TITLE = Omni H&M-EntnahmePuffer-Modul
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : AE
|
||||
VERSION : 0.1
|
||||
//COPYRIGHT by Ingenieurbüro A.Emmert
|
||||
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
||||
//Tel.: 0049(0)8243-960629
|
||||
//
|
||||
//Version: H&M Leerpuffer / 10.2025
|
||||
//
|
||||
//Version: Omniflow 2100 / 10.2024
|
||||
//
|
||||
//Schritt 0: Warten auf Trolley
|
||||
//Schritt 1: Betriebsart ok/angegeben?
|
||||
//Schritt 5: Mit Scanner fahren: Defaultziel ?
|
||||
//Schritt 6: Scanner triggern
|
||||
//Schritt 7: "DREQ" an PC senden
|
||||
//Schritt 8: Warten auf PC-Antwort
|
||||
//Schritt 9: PC-Antwort auswerten
|
||||
//Schritt 10: Fahrtrichtung ermitteln
|
||||
//Schritt 11: Ausfahren ok ?
|
||||
//Schritt 12: Warten auf Pin-Signal
|
||||
//Schritt 13: Weichenbereich raus bereit ?
|
||||
//Schritt 14: Daten an Rausweiche übergeben
|
||||
//Schritt 15: Schleuse Mindestzeit öffnen
|
||||
//Schritt 16: Trolley ausgefahren ?
|
||||
//Schritt 17: Trolley ist draussen
|
||||
//Schritt 18: BM wurde vereinzelt
|
||||
//Schritt 19: Beladezustand checken
|
||||
//Schritt 20: Schleuse resetten
|
||||
//Schritt 21: Reset ist zu Ende
|
||||
//
|
||||
VAR_INPUT
|
||||
EntnahmePuffer_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Leer-Puffer
|
||||
B_LeerpufferEinfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in Leerpuffer
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Parameter-Übergabe ---
|
||||
L EntnahmePuffer_Nr
|
||||
VAR_OUTPUT
|
||||
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben
|
||||
END_VAR
|
||||
|
||||
L 275 // Einsprung Puffer-DL
|
||||
T Para.Entnahmepuffer_DL_DB // vor Aufruf übergeben!
|
||||
L 0
|
||||
T Para.Entnahmepuffer_DL_DW
|
||||
VAR_IN_OUT
|
||||
hStOk : Bool; // Anzeige Start n. Störung aktivieren
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
Res16 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..4] of Int; // Reserve
|
||||
SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
||||
Weichen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB
|
||||
Weichen_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DW
|
||||
END_STRUCT;
|
||||
Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter
|
||||
Entnahmepuffer_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Leerpuffer-Datenliste-DB
|
||||
Entnahmepuffer_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Leerpuffer-Datenliste-DW
|
||||
Res1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve
|
||||
END_STRUCT;
|
||||
Status2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
||||
Abruf_ist_möglich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Abruf ist möglich
|
||||
Kein_Stop_mehr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
||||
Eintrag_DL_Leerliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_leer (DB500) erfolgt
|
||||
Eintrag_DL_Reinliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt
|
||||
Eintrag_Abrufliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt
|
||||
END_STRUCT;
|
||||
Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UDLHMEntnahmePuffer"; // Statische Leerpufferdaten (aus DL)
|
||||
Dyn : Struct // Dynamische Daten
|
||||
Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
||||
Puffer_OUT_leer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer ist leer
|
||||
"Puffer_OUT_hat Platz" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer hat noch Kapazität
|
||||
"Undef.Trolley_in_Schleuse_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Undefinierter Trolley in Schleuse unten erkannt
|
||||
Trolley_fährt_in_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt in Schleuse (unten)
|
||||
Trolley_wartet_Auftrag { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Auftrag (unten)
|
||||
"Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1 (unten)
|
||||
Trolley_fährt_aus_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus (unten)
|
||||
MindestZeit_ok_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet
|
||||
Trolley_draussen_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren
|
||||
Trolley_OUT_nicht_in_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt nicht in Schleuse
|
||||
Leer_Check_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer wird auf leer gecheckt
|
||||
Alles_ausfahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Alle Trolleys ausfahren
|
||||
Leerpuffer_initialisieren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer initialisieren
|
||||
Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden
|
||||
Reset_aktiv_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset aktiv
|
||||
END_STRUCT;
|
||||
TrolleyID_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr ist eingefahren
|
||||
Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
||||
RET_VAL_BLKMOV_EntnahmePuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf
|
||||
RET_VAL_DL_EntnahmePuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
|
||||
RET_VAL_DL_Res_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
|
||||
RET_VAL_DL_EntnahmePufferTrolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenIN-Aufruf
|
||||
RET_VAL_DL_EntnahmePufferTrolley_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
|
||||
END_STRUCT;
|
||||
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UErrHMEntnahmePuffer";
|
||||
Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_Einfahrt ist belegt [1s]
|
||||
Stop_Ursache { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position
|
||||
Res500 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..206] of Int;
|
||||
END_STRUCT;
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
Quelle : Any; // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any; // Zeiger, FIFO-Stelle
|
||||
Ueb_akt : Bool; // Überwachungszeit aktivieren
|
||||
Weiter : Bool; // Weiterschaltbedingung ist erfüllt
|
||||
Warte_neu : Bool; // Wartezeit neu triggern
|
||||
Warte_stop : Bool; // Wartezeit stoppen
|
||||
Inks_Ok : Bool; // Starten aufgrund der Inks erlaubt
|
||||
Puffer_ist_leer : Bool; // Leerpuffer zeitlang ohne Sensor
|
||||
Abruf_Trolley_vorne : Bool; // Abruf-Trolley ist in Schleuse
|
||||
Oberen_Puffer_Freigeben : Bool;
|
||||
GesamtAnzahl : Int;
|
||||
SSDW : Int;
|
||||
Schleife : Word; // Loopzähler
|
||||
Trolley : Int;
|
||||
Position : Int;
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Statische Entnahmepuffer-Parameter holen ---
|
||||
L Puffer.EntnahmePuffer_Nr // Nummer des EntnahmePuffers
|
||||
L EntnahmePuffer_Nr // Aufruf-Parameter
|
||||
==I // Identisch ?
|
||||
R Dyn.Error.Entnahmepuffer_DL // EntnahmePufferdatenbank fehlerhaft
|
||||
R Dyn.Error.Undef_Entnahmepuffer // undefiniertes EntnahmePuffer
|
||||
JC en06 // Ja !
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Parameter-Übergabe
|
||||
L #EntnahmePuffer_Nr;
|
||||
|
||||
T "MW200" // Search-Daten
|
||||
L 275 ;//Einsprung Puffer-DL
|
||||
T #Para.Entnahmepuffer_DL_DB;//vor Aufruf übergeben!
|
||||
L 0;
|
||||
T #Para.Entnahmepuffer_DL_DW;
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=Para.Entnahmepuffer_DL_DB, SSDW:=Para.Entnahmepuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_EntnahmePuffer, OUTDATEN:=P#M220.0, Position:="MW196")
|
||||
NETWORK
|
||||
TITLE = Statische Entnahmepuffer-Parameter holen
|
||||
L #Puffer.EntnahmePuffer_Nr;//Nummer des EntnahmePuffers
|
||||
L #EntnahmePuffer_Nr ;//Aufruf-Parameter
|
||||
==I;//Identisch ?
|
||||
R #Dyn.Error.Entnahmepuffer_DL;//EntnahmePufferdatenbank fehlerhaft
|
||||
R #Dyn.Error.Undef_Entnahmepuffer;//undefiniertes EntnahmePuffer
|
||||
SPB en06;//Ja !
|
||||
|
||||
JBI G_Ok
|
||||
T "MW200";//Search-Daten
|
||||
|
||||
A "M199.0"
|
||||
JCN w060
|
||||
CALL "DatenOut"
|
||||
( SSDB := #Para.Entnahmepuffer_DL_DB ,
|
||||
SSDW := #Para.Entnahmepuffer_DL_DW ,
|
||||
PARA := WORD#16#0000 ,
|
||||
SEARCHDATEN := P#M200.0 ,
|
||||
RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_EntnahmePuffer ,
|
||||
OUTDATEN := P#M220.0 ,
|
||||
Position := "MW196"
|
||||
);
|
||||
|
||||
SET
|
||||
= Dyn.Error.Entnahmepuffer_DL // EntnahmePufferdatenbank fehlerhaft
|
||||
SPBI G_Ok;
|
||||
|
||||
L 16#A061
|
||||
T Dyn.Stop_Ursache
|
||||
U "M199.0";
|
||||
SPBN w060;
|
||||
|
||||
BEU
|
||||
SET;
|
||||
= #Dyn.Error.Entnahmepuffer_DL;//EntnahmePufferdatenbank fehlerhaft
|
||||
|
||||
w060: SET
|
||||
S Dyn.Error.Undef_Entnahmepuffer // undefinierter EntnahmePuffer
|
||||
L 16#A061;
|
||||
T #Dyn.Stop_Ursache;
|
||||
|
||||
L 16#0062
|
||||
T Dyn.Stop_Ursache
|
||||
BEA;
|
||||
|
||||
BEU
|
||||
w060: SET;
|
||||
S #Dyn.Error.Undef_Entnahmepuffer;//undefinierter EntnahmePuffer
|
||||
|
||||
// Kennung + Datenbytes
|
||||
G_Ok: SET
|
||||
R Dyn.Error.Entnahmepuffer_DL // Gefälledatenbank fehlerhaft
|
||||
R Dyn.Error.Undef_Entnahmepuffer // undefinierte Gefällestrecke
|
||||
L 16#0062;
|
||||
T #Dyn.Stop_Ursache;
|
||||
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 20 // Datenwords speichern
|
||||
T LW2 // Wiederholungen
|
||||
BEA;
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L 0 // Bei Merker = 0 !
|
||||
T LW4 // DB_Nummer
|
||||
L 220 // Adresse
|
||||
SLD 3
|
||||
L 16#8300_0000 // Kennung: Merker
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
//Kennung + Datenbytes
|
||||
G_Ok: SET;
|
||||
R #Dyn.Error.Entnahmepuffer_DL;//Gefälledatenbank fehlerhaft
|
||||
R #Dyn.Error.Undef_Entnahmepuffer;//undefinierte Gefällestrecke
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer, DSTBLK:=Puffer) // Datenliste-Daten speichern | #Ziel
|
||||
L 16#1004;//Kennung 10 + Word=04
|
||||
T %LW0;//Any-Kennung, Datentyp
|
||||
L 20;//Datenwords speichern
|
||||
T %LW2;//Wiederholungen
|
||||
|
||||
L 16#0063
|
||||
T Dyn.Stop_Ursache
|
||||
//Quelle-Pointer erzeugen:
|
||||
L 0;//Bei Merker = 0 !
|
||||
T %LW4;//DB_Nummer
|
||||
L 220;//Adresse
|
||||
SLD 3;
|
||||
L 16#8300_0000;//Kennung: Merker
|
||||
OD;
|
||||
T %LD6;//Kennung, Adresse
|
||||
|
||||
L Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer // Rückmeldung
|
||||
L 0 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
= Dyn.Error.Err_BLKMov // Error bei Block kopieren
|
||||
BEC
|
||||
CALL BLKMOV//Datenliste-Daten speichern
|
||||
{blk_type := 'Variant'}
|
||||
( SRCBLK := #Quelle ,
|
||||
RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer ,
|
||||
DSTBLK := #Puffer //#Ziel
|
||||
);
|
||||
|
||||
L Puffer.Puffer_Typ // Puffertyp = 1278 (EntnahmePuffer)
|
||||
L 1278 // Dieser Aufruf-FB ?
|
||||
==I // Ja !
|
||||
JC w061
|
||||
L 16#0063;
|
||||
T #Dyn.Stop_Ursache;
|
||||
|
||||
SET
|
||||
S Dyn.Error.Undef_Entnahmepuffer // undefinierter EntnahmePuffer
|
||||
L #Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer;//Rückmeldung
|
||||
L 0;//Fehler vorhanden ?
|
||||
<>I;//Ja !
|
||||
= #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren
|
||||
BEB;
|
||||
|
||||
L 0 // EntnahmePuffer ungültig !
|
||||
T Puffer.EntnahmePuffer_Nr // Nummer des EntnahmePuffers
|
||||
L #Puffer.Puffer_Typ ;//Puffertyp = 1278 (EntnahmePuffer)
|
||||
L 1278 ;//Dieser Aufruf-FB ?
|
||||
==I;//Ja !
|
||||
SPB w061;
|
||||
|
||||
L 16#0064
|
||||
T Dyn.Stop_Ursache
|
||||
SET;
|
||||
S #Dyn.Error.Undef_Entnahmepuffer;//undefinierter EntnahmePuffer
|
||||
|
||||
BEU
|
||||
L 0 ;//EntnahmePuffer ungültig !
|
||||
T #Puffer.EntnahmePuffer_Nr;//Nummer des EntnahmePuffers
|
||||
|
||||
// Defaultwerte übergeben:
|
||||
w061: NOP 0
|
||||
L 16#0064;
|
||||
T #Dyn.Stop_Ursache;
|
||||
|
||||
BEU
|
||||
BEA;
|
||||
|
||||
en06: NOP 0
|
||||
//Defaultwerte übergeben:
|
||||
w061: NOP 0;
|
||||
|
||||
BEA;
|
||||
|
||||
--- NW 3: Einfahrenden Trolley verarbeiten ---
|
||||
L Dyn.TrolleyID_Einfahrt
|
||||
T "MD220"
|
||||
L DINT#0
|
||||
==I
|
||||
JC NoNewT
|
||||
en06: NOP 0;
|
||||
|
||||
// Neue Position an Gesamt-Trolley-DL übergeben:
|
||||
CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Einfahrt, Position:=Puffer.Puffer_Position, ShopGroup:=Dint#0, Err:="M199.0")
|
||||
NETWORK
|
||||
TITLE = Einfahrenden Trolley verarbeiten
|
||||
L #Dyn.TrolleyID_Einfahrt;
|
||||
T "MD220";
|
||||
L DINT#0;
|
||||
==I;
|
||||
SPB NoNewT;
|
||||
|
||||
NoNewT: NOP 0
|
||||
//Neue Position an Gesamt-Trolley-DL übergeben:
|
||||
CALL "Trolley_DL_Neue_Pos"
|
||||
( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL ,
|
||||
TrolleyID := #Dyn.TrolleyID_Einfahrt ,
|
||||
Position := #Puffer.Puffer_Position ,
|
||||
ShopGroup := Dint#0 ,
|
||||
Err := "M199.0"
|
||||
);
|
||||
|
||||
NoNewT: NOP 0;
|
||||
|
||||
--- NW 4: Error: Stau Bereich-Eingang ---
|
||||
// Sensor bei Bereichs-Einfahrt bleibt belegt?:
|
||||
AN B_LeerpufferEinfahrt // Sensor Trolley fährt in Bereich (kein Stau !)
|
||||
R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt
|
||||
JC X090 // StauZeit neu aufziehen
|
||||
NETWORK
|
||||
TITLE = Error: Stau Bereich-Eingang
|
||||
|
||||
AN "1s-Impuls"
|
||||
O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen
|
||||
JC Xn09
|
||||
//Sensor bei Bereichs-Einfahrt bleibt belegt?:
|
||||
UN #B_LeerpufferEinfahrt ;//Sensor Trolley fährt in Bereich (kein Stau !)
|
||||
R #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt
|
||||
SPB X090 ;//StauZeit neu aufziehen
|
||||
|
||||
L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
||||
+ +1
|
||||
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
||||
UN "1s-Impuls";
|
||||
O #Dyn.Error.Err_Stau_Einfahrt;//Zeit bereits abgelaufen
|
||||
SPB Xn09;
|
||||
|
||||
L 25 // Stau-Zeit erreicht ?
|
||||
>=I // Ja !
|
||||
S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
|
||||
JCN Xn09
|
||||
L #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s]
|
||||
+ +1;
|
||||
T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s]
|
||||
|
||||
X090: L 0 // Zeiten löschen
|
||||
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
||||
L 25 ;//Stau-Zeit erreicht ?
|
||||
>=I;//Ja !
|
||||
S #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
|
||||
SPBN Xn09;
|
||||
|
||||
Xn09: NOP 0
|
||||
X090: L 0 ;//Zeiten löschen
|
||||
T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s]
|
||||
|
||||
Xn09: NOP 0;
|
||||
|
||||
--- NW 5: Ende ---
|
||||
BE
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,91 +1,122 @@
|
||||
=== FB 183: MHMÜbergang_ohne_Schleuse [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
ErrQuit : Bool
|
||||
B_Anfang : Bool
|
||||
B_Am_Übergang : Bool
|
||||
B_Stau_Antrieb_plus : Bool
|
||||
Antrieb_aktiv : Bool
|
||||
Antrieb_plus_aktiv : Bool
|
||||
Output:
|
||||
InOut:
|
||||
Antrieb_vor : Bool
|
||||
Antrieb_start : Bool
|
||||
Antrieb_stop : Bool
|
||||
Antrieb_plus_vor : Bool
|
||||
Antrieb_plus_start : Bool
|
||||
Static:
|
||||
Am_Übergang : "MSensoren"
|
||||
Stau_Antrieb_plus : "MSensoren"
|
||||
Temp:
|
||||
Antrieb : Bool
|
||||
Antrieb_gestoppt : Bool
|
||||
Constant:
|
||||
FUNCTION_BLOCK "MHMÜbergang_ohne_Schleuse"
|
||||
TITLE = Übergang ohne Schleuse zu anderem Antrieb
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
//COPYRIGHT by Ingenieurbüro A.Emmert
|
||||
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
||||
//Tel.: 0049(0)8243-960629
|
||||
//
|
||||
//Version: HM-Omniflow 2100 / 11.2025
|
||||
//
|
||||
VAR_INPUT
|
||||
ErrQuit : Bool;
|
||||
B_Anfang : Bool;
|
||||
B_Am_Übergang : Bool;
|
||||
B_Stau_Antrieb_plus : Bool;
|
||||
Antrieb_aktiv : Bool;
|
||||
Antrieb_plus_aktiv : Bool;
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Antrieb ansteuern ---
|
||||
SET
|
||||
R Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
|
||||
VAR_IN_OUT
|
||||
Antrieb_vor : Bool;
|
||||
Antrieb_start : Bool;
|
||||
Antrieb_stop : Bool;
|
||||
Antrieb_plus_vor : Bool;
|
||||
Antrieb_plus_start : Bool;
|
||||
END_VAR
|
||||
|
||||
// Antrieb starten:
|
||||
A ErrQuit
|
||||
O B_Anfang
|
||||
S Antrieb_start
|
||||
S Antrieb_vor
|
||||
VAR
|
||||
Am_Übergang { S7_SetPoint := 'False'} : "MSensoren";
|
||||
Stau_Antrieb_plus : "MSensoren";
|
||||
END_VAR
|
||||
|
||||
// Trolley am Übergang:
|
||||
AN "Am_Übergang".Stat.B_Akt
|
||||
JC Nix
|
||||
|
||||
// Antrieb stoppen:
|
||||
A Stau_Antrieb_plus.Stat.B_Akt
|
||||
S Antrieb_stop // Trolley stoppen
|
||||
S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
|
||||
JC Nix
|
||||
|
||||
AN Stau_Antrieb_plus.Stat.B_Akt
|
||||
S Antrieb_plus_vor // Antrieb plus einschalten
|
||||
|
||||
SET
|
||||
S Antrieb_plus_start // Antrieb plus zeitlang starten
|
||||
|
||||
AN Antrieb_plus_aktiv
|
||||
S Antrieb_stop // Trolley stoppen
|
||||
S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
|
||||
JC Nix
|
||||
|
||||
// Antrieb einschalten:
|
||||
SET
|
||||
S Antrieb_vor // Trolley weiterfahren
|
||||
|
||||
Nix: NOP 0
|
||||
VAR_TEMP
|
||||
Antrieb : Bool;
|
||||
Antrieb_gestoppt : Bool;
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Antrieb plus zusätzlich ansteuern ---
|
||||
// Antrieb plus starten:
|
||||
A B_Stau_Antrieb_plus // Sensor
|
||||
O ErrQuit
|
||||
S Antrieb_plus_start // Antrieb plus zeitlang starten
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Antrieb ansteuern
|
||||
SET;
|
||||
R #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird!
|
||||
|
||||
// Antrieb plus einschalten:
|
||||
A B_Stau_Antrieb_plus
|
||||
AN Stau_Antrieb_plus.Stat.B_Akt
|
||||
CLR // Nicht mehr!
|
||||
S Antrieb_plus_vor // Antrieb plus einschalten
|
||||
//Antrieb starten:
|
||||
U #ErrQuit;
|
||||
O #B_Anfang;
|
||||
S #Antrieb_start;
|
||||
S #Antrieb_vor;
|
||||
|
||||
//Trolley am Übergang:
|
||||
UN #Am_Übergang.Stat.B_Akt;
|
||||
SPB Nix;
|
||||
|
||||
--- NW 3: Trolley ist am Übergang ---
|
||||
A Antrieb_aktiv
|
||||
A Antrieb_plus_aktiv
|
||||
AN Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
|
||||
= Antrieb
|
||||
//Antrieb stoppen:
|
||||
U #Stau_Antrieb_plus.Stat.B_Akt;
|
||||
S #Antrieb_stop;//Trolley stoppen
|
||||
S #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird!
|
||||
SPB Nix;
|
||||
|
||||
CALL FB "None" , (ESensor:="B_Am_Übergang", T_Ein:=1, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=Antrieb)
|
||||
UN #Stau_Antrieb_plus.Stat.B_Akt;
|
||||
S #Antrieb_plus_vor ;//Antrieb plus einschalten
|
||||
|
||||
SET;
|
||||
S #Antrieb_plus_start;//Antrieb plus zeitlang starten
|
||||
|
||||
--- NW 4: Stau im Förderer plus ---
|
||||
CALL FB "None" , (ESensor:=B_Stau_Antrieb_plus, T_Ein:=100, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=1)
|
||||
UN #Antrieb_plus_aktiv;
|
||||
S #Antrieb_stop;//Trolley stoppen
|
||||
S #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird!
|
||||
SPB Nix;
|
||||
|
||||
//Antrieb einschalten:
|
||||
SET;
|
||||
S #Antrieb_vor;//Trolley weiterfahren
|
||||
|
||||
--- NW 5: Ende ---
|
||||
BE
|
||||
Nix: NOP 0;
|
||||
|
||||
NETWORK
|
||||
TITLE = Antrieb plus zusätzlich ansteuern
|
||||
|
||||
//Antrieb plus starten:
|
||||
U #B_Stau_Antrieb_plus;//Sensor
|
||||
O #ErrQuit;
|
||||
S #Antrieb_plus_start;//Antrieb plus zeitlang starten
|
||||
|
||||
//Antrieb plus einschalten:
|
||||
U #B_Stau_Antrieb_plus;
|
||||
UN #Stau_Antrieb_plus.Stat.B_Akt;
|
||||
CLR;//Nicht mehr!
|
||||
S #Antrieb_plus_vor ;//Antrieb plus einschalten
|
||||
|
||||
NETWORK
|
||||
TITLE = Trolley ist am Übergang
|
||||
U #Antrieb_aktiv;
|
||||
U #Antrieb_plus_aktiv;
|
||||
UN #Antrieb_gestoppt ;//Falls bei Aufruf nicht gestoppt wird!
|
||||
= #Antrieb;
|
||||
|
||||
CALL #Am_Übergang
|
||||
( ESensor := #B_Am_Übergang ,
|
||||
T_Ein := 1 ,
|
||||
T_Aus := 50 ,
|
||||
tein_aktiv := 1 ,
|
||||
taus_aktiv := #Antrieb
|
||||
);
|
||||
|
||||
NETWORK
|
||||
TITLE = Stau im Förderer plus
|
||||
CALL #Stau_Antrieb_plus
|
||||
( ESensor := #B_Stau_Antrieb_plus ,
|
||||
T_Ein := 100 ,
|
||||
T_Aus := 50 ,
|
||||
tein_aktiv := 1 ,
|
||||
taus_aktiv := 1
|
||||
);
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,122 +1,147 @@
|
||||
=== FB 100: MImpulsGeber [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Ink_DB : Int // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler
|
||||
B_Zaehlen : Bool // Sensor zum Zählen
|
||||
Antrieb_aktiv : Bool // Antrieb ist aktiv
|
||||
Quit : Bool
|
||||
Zeit_Signal_zu_lang : Time := T#350ms
|
||||
Zeit_Kein_Signal : Time := T#500ms
|
||||
Output:
|
||||
Signal : Bool // Falls kein InkDB
|
||||
InOut:
|
||||
Err_Kein_Signal : Bool // Kein_Signal bei laufenden Antrieb
|
||||
Err_Signal_zu_lang : Bool // Signal bei laufenden Antrieb zu lang
|
||||
Static:
|
||||
Sensor_entprellen : Bool
|
||||
Timer_1 : TON_TIME
|
||||
Timer_2 : TON_TIME
|
||||
Timer_3 : TON_TIME
|
||||
Temp:
|
||||
Constant:
|
||||
FUNCTION_BLOCK "MImpulsGeber"
|
||||
TITLE = Modul Zähler über Zahnrad-Sensor Wert in Zähler-DB eintragen
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Ink_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler
|
||||
B_Zaehlen : Bool; // Sensor zum Zählen
|
||||
Antrieb_aktiv : Bool; // Antrieb ist aktiv
|
||||
Quit : Bool;
|
||||
Zeit_Signal_zu_lang : Time := T#350ms;
|
||||
Zeit_Kein_Signal : Time := T#500ms;
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Initialisierung ---
|
||||
SET
|
||||
R Signal
|
||||
VAR_OUTPUT
|
||||
Signal : Bool; // Falls kein InkDB
|
||||
END_VAR
|
||||
|
||||
VAR_IN_OUT
|
||||
Err_Kein_Signal : Bool; // Kein_Signal bei laufenden Antrieb
|
||||
Err_Signal_zu_lang : Bool; // Signal bei laufenden Antrieb zu lang
|
||||
END_VAR
|
||||
|
||||
VAR
|
||||
Sensor_entprellen : Bool;
|
||||
Timer_1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
Timer_2 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
Timer_3 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Störungen ---
|
||||
// Störung quittieren:
|
||||
A Quit
|
||||
R Err_Signal_zu_lang
|
||||
R Err_Kein_Signal
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Initialisierung
|
||||
SET;
|
||||
R #Signal;
|
||||
|
||||
// Signal zu lang:
|
||||
A B_Zaehlen // Sensor zum Zählen
|
||||
A Antrieb_aktiv // Antrieb ist aktiv
|
||||
AN Quit
|
||||
= "M200.0"
|
||||
NETWORK
|
||||
TITLE = Störungen
|
||||
|
||||
CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Signal_zu_lang, Q:=?, ET:=?)
|
||||
//Störung quittieren:
|
||||
U #Quit;
|
||||
R #Err_Signal_zu_lang;
|
||||
R #Err_Kein_Signal;
|
||||
|
||||
A Timer_2.Q
|
||||
S Err_Signal_zu_lang
|
||||
//Signal zu lang:
|
||||
U #B_Zaehlen ;//Sensor zum Zählen
|
||||
U #Antrieb_aktiv ;//Antrieb ist aktiv
|
||||
UN #Quit;
|
||||
= "M200.0";
|
||||
|
||||
// Kein Signal:
|
||||
AN B_Zaehlen // Sensor zum Zählen
|
||||
A Antrieb_aktiv // Antrieb ist aktiv
|
||||
AN Quit
|
||||
= "M200.0"
|
||||
CALL #Timer_2
|
||||
{time_type := 'Time'}
|
||||
( IN := "M200.0" ,
|
||||
PT := #Zeit_Signal_zu_lang
|
||||
);
|
||||
|
||||
CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Kein_Signal, Q:=?, ET:=?)
|
||||
U #Timer_2.Q;
|
||||
S #Err_Signal_zu_lang;
|
||||
|
||||
A Timer_3.Q
|
||||
S Err_Kein_Signal
|
||||
//Kein Signal:
|
||||
UN #B_Zaehlen ;//Sensor zum Zählen
|
||||
U #Antrieb_aktiv ;//Antrieb ist aktiv
|
||||
UN #Quit;
|
||||
= "M200.0";
|
||||
|
||||
CALL #Timer_3
|
||||
{time_type := 'Time'}
|
||||
( IN := "M200.0" ,
|
||||
PT := #Zeit_Kein_Signal
|
||||
);
|
||||
|
||||
--- NW 3: Zählen über Sensor ---
|
||||
AN B_Zaehlen // Sensor zum Zählen
|
||||
A Sensor_entprellen // Sperre Auswertung schon erfolgt
|
||||
A Antrieb_aktiv // Antrieb ist aktiv
|
||||
= "M200.0"
|
||||
U #Timer_3.Q;
|
||||
S #Err_Kein_Signal;
|
||||
|
||||
CALL SYS "TON" (IN:="M200.0", PT:=t#50ms, Q:=?, ET:=?)
|
||||
NETWORK
|
||||
TITLE = Zählen über Sensor
|
||||
UN #B_Zaehlen ;//Sensor zum Zählen
|
||||
U #Sensor_entprellen ;//Sperre Auswertung schon erfolgt
|
||||
U #Antrieb_aktiv ;//Antrieb ist aktiv
|
||||
= "M200.0";
|
||||
|
||||
A Timer_1.Q
|
||||
R Sensor_entprellen // Sperre Auswertung schon erfolgt
|
||||
CALL #Timer_1
|
||||
{time_type := 'Time'}
|
||||
( IN := "M200.0" ,
|
||||
PT := t#50ms
|
||||
);
|
||||
|
||||
AN B_Zaehlen // Sensor zum Zählen
|
||||
O Sensor_entprellen
|
||||
BEC
|
||||
U #Timer_1.Q;
|
||||
R #Sensor_entprellen ;//Sperre Auswertung schon erfolgt
|
||||
|
||||
SET
|
||||
S Sensor_entprellen // Sperre Auswertung schon erfolgt
|
||||
S Signal // Für Signal-Auswertung ohne InkDB
|
||||
UN #B_Zaehlen ;//Sensor zum Zählen
|
||||
O #Sensor_entprellen;
|
||||
BEB;
|
||||
|
||||
SET;
|
||||
S #Sensor_entprellen ;//Sperre Auswertung schon erfolgt
|
||||
S #Signal ;//Für Signal-Auswertung ohne InkDB
|
||||
|
||||
--- NW 4: Übergabe an Inkrement-Baustein / max.Wert erreicht? ---
|
||||
L Ink_DB
|
||||
T "MW200"
|
||||
NETWORK
|
||||
TITLE = Übergabe an Inkrement-Baustein / max.Wert erreicht?
|
||||
L #Ink_DB;
|
||||
T "MW200";
|
||||
|
||||
L 0 // Sinnvolle Angabe?
|
||||
<=I // Nein!
|
||||
BEC // Also nur Signal-Auswertung !
|
||||
L 0;//Sinnvolle Angabe?
|
||||
<=I;//Nein!
|
||||
BEB;//Also nur Signal-Auswertung !
|
||||
|
||||
OPN DB["MW200"] // Zähler-DB öffnen
|
||||
AUF DB[ "MW200"] ;//Zähler-DB öffnen
|
||||
|
||||
L DBD80
|
||||
+ DINT#1 // Aktueller Zählerwert +1
|
||||
T DBD80
|
||||
L %DBD80;
|
||||
+ DINT#1 ;//Aktueller Zählerwert +1
|
||||
T %DBD80;
|
||||
|
||||
L DBD80 // Aktueller Zählerwert
|
||||
L DBD76 // Max. Wert erreicht ?
|
||||
<=D // Nein !
|
||||
R DBX74.5 // Ohne Flag-Lauf wurde beendet
|
||||
R DBX74.4 // Flag-Lauf wurde beendet
|
||||
BEC
|
||||
L %DBD80 ;//Aktueller Zählerwert
|
||||
L %DBD76 ;//Max. Wert erreicht ?
|
||||
<=D ;//Nein !
|
||||
R %DBX74.5 ;//Ohne Flag-Lauf wurde beendet
|
||||
R %DBX74.4 ;//Flag-Lauf wurde beendet
|
||||
BEB;
|
||||
|
||||
-D // Restwert als Startwert nehmen !
|
||||
T DBD80 // Keine Inkrementalgeber verbaut, sondern nur Sensor
|
||||
-D ;//Restwert als Startwert nehmen !
|
||||
T %DBD80 ;//Keine Inkrementalgeber verbaut, sondern nur Sensor
|
||||
|
||||
AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= DBX74.5 // Ohne Flag-Lauf wurde beendet
|
||||
A DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= DBX74.4 // Flag-Lauf wurde beendet
|
||||
UN %DBX74.3 ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= %DBX74.5 ;//Ohne Flag-Lauf wurde beendet
|
||||
U %DBX74.3 ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= %DBX74.4 ;//Flag-Lauf wurde beendet
|
||||
|
||||
AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= DBX74.3
|
||||
UN %DBX74.3 ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= %DBX74.3;
|
||||
|
||||
// Zähler auf 000 setzen ?:
|
||||
AN DBX74.6 // Zähler Zero-Load
|
||||
BEC
|
||||
//Zähler auf 000 setzen ?:
|
||||
UN %DBX74.6 ;//Zähler Zero-Load
|
||||
BEB;
|
||||
|
||||
SET
|
||||
R DBX74.6
|
||||
SET;
|
||||
R %DBX74.6;
|
||||
|
||||
L 0
|
||||
T DBD80 // Zählerwert zum Setzen
|
||||
L 0;
|
||||
T %DBD80 ;//Zählerwert zum Setzen
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
--- NW 5: Ende ---
|
||||
BE
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
|
||||
@@ -1,87 +1,94 @@
|
||||
=== FB 91: MSensoren [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
ESensor : Bool // Eingang des zu überwachenden Sensors
|
||||
T_Ein : Int := 1 // Einschaltzeitverzögerung (*100ms)
|
||||
T_Aus : Int := 5 // Ausschaltzeitverzögerung (*100ms)
|
||||
tein_aktiv : Bool := TRUE // Einschaltzeit aktivieren
|
||||
taus_aktiv : Bool := TRUE // Ausschaltzeit aktivieren
|
||||
Output:
|
||||
InOut:
|
||||
Static:
|
||||
Stat : "USensor_Ein_Aus" // Status des Endschalters
|
||||
Temp:
|
||||
Constant:
|
||||
FUNCTION_BLOCK "MSensoren"
|
||||
TITLE = Ein-/Ausschaltverzögerung für Entprellung der Sensoren
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : EAN
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
ESensor { ExternalWritable := 'False'} : Bool; // Eingang des zu überwachenden Sensors
|
||||
T_Ein { ExternalWritable := 'False'} : Int := 1; // Einschaltzeitverzögerung (*100ms)
|
||||
T_Aus { ExternalWritable := 'False'} : Int := 5; // Ausschaltzeitverzögerung (*100ms)
|
||||
tein_aktiv { ExternalWritable := 'False'} : Bool := TRUE; // Einschaltzeit aktivieren
|
||||
taus_aktiv { ExternalWritable := 'False'} : Bool := TRUE; // Ausschaltzeit aktivieren
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Zeitwert löschen ---
|
||||
A ESensor
|
||||
A Stat.B_Akt
|
||||
O
|
||||
AN ESensor
|
||||
AN Stat.B_Akt
|
||||
JCN Nw02
|
||||
VAR
|
||||
Stat { ExternalWritable := 'False'} : "USensor_Ein_Aus"; // Status des Endschalters
|
||||
END_VAR
|
||||
|
||||
|
||||
tdel: L 0 // Zeitwert löschen
|
||||
T Stat.T_Zelle
|
||||
|
||||
BEU
|
||||
|
||||
--- NW 2: Einschaltzeit abgelaufen ? ---
|
||||
Nw02: L Stat.T_Ein_Akt // Gewollter Zeitwert
|
||||
L 9999 // angegeben ?
|
||||
<>I // Ja !
|
||||
JC w020
|
||||
|
||||
L T_Ein // Sollwert übergeben
|
||||
T Stat.T_Ein_Akt // Gewollter Zeitwert
|
||||
|
||||
w020: A Stat.B_Akt
|
||||
JC Nw03
|
||||
|
||||
L Stat.T_Zelle // Aktueller Zeitwert
|
||||
L Stat.T_Ein_Akt // Gewollter Zeitwert erreicht ?
|
||||
>=I
|
||||
S Stat.B_Akt // Sensor ist nach Einschaltzeit aktiv
|
||||
JC tdel // Zeit löschen
|
||||
|
||||
JU Nw04
|
||||
|
||||
--- NW 3: Ausschaltzeit abgelaufen ? ---
|
||||
Nw03: L Stat.T_Aus_Akt // Gewollter Zeitwert
|
||||
L 9999 // angegeben ?
|
||||
<>I // Ja !
|
||||
JC w030
|
||||
|
||||
L T_Aus // Sollwert übergeben
|
||||
T Stat.T_Aus_Akt // Gewollter Zeitwert
|
||||
|
||||
w030: AN Stat.B_Akt
|
||||
JC Nw04
|
||||
|
||||
L Stat.T_Zelle // Aktueller Zeitwert
|
||||
L Stat.T_Aus_Akt // Gewollter Zeitwert erreicht ?
|
||||
>=I
|
||||
R Stat.B_Akt // Sensor ist nach Ausschaltzeit nicht mehr aktiv
|
||||
JC tdel // Zeit löschen
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Zeitwert löschen
|
||||
U #ESensor;
|
||||
U #Stat.B_Akt;
|
||||
O;
|
||||
UN #ESensor;
|
||||
UN #Stat.B_Akt;
|
||||
SPBN Nw02;
|
||||
|
||||
|
||||
--- NW 4: Zeit läuft ---
|
||||
Nw04: AN "100ms-Impuls" // nur als Impuls
|
||||
O
|
||||
AN Stat.B_Akt // Einschaltzeit läuft
|
||||
AN tein_aktiv // aber Zeit einfrieren
|
||||
O
|
||||
A Stat.B_Akt // Ausschaltzeit läuft
|
||||
AN taus_aktiv // aber Zeit einfrieren
|
||||
BEC
|
||||
tdel: L 0;//Zeitwert löschen
|
||||
T #Stat.T_Zelle;
|
||||
|
||||
L Stat.T_Zelle
|
||||
L "MW2"
|
||||
+I
|
||||
T Stat.T_Zelle
|
||||
BEA;
|
||||
NETWORK
|
||||
TITLE = Einschaltzeit abgelaufen ?
|
||||
Nw02: L #Stat.T_Ein_Akt;//Gewollter Zeitwert
|
||||
L 9999;//angegeben ?
|
||||
<>I;//Ja !
|
||||
SPB w020;
|
||||
|
||||
L #T_Ein;//Sollwert übergeben
|
||||
T #Stat.T_Ein_Akt;//Gewollter Zeitwert
|
||||
|
||||
--- NW 5: Ende ---
|
||||
BE
|
||||
w020: U #Stat.B_Akt;
|
||||
SPB Nw03;
|
||||
|
||||
L #Stat.T_Zelle;//Aktueller Zeitwert
|
||||
L #Stat.T_Ein_Akt;//Gewollter Zeitwert erreicht ?
|
||||
>=I;
|
||||
S #Stat.B_Akt;//Sensor ist nach Einschaltzeit aktiv
|
||||
SPB tdel;//Zeit löschen
|
||||
|
||||
SPA Nw04;
|
||||
NETWORK
|
||||
TITLE = Ausschaltzeit abgelaufen ?
|
||||
Nw03: L #Stat.T_Aus_Akt;//Gewollter Zeitwert
|
||||
L 9999;//angegeben ?
|
||||
<>I;//Ja !
|
||||
SPB w030;
|
||||
|
||||
L #T_Aus;//Sollwert übergeben
|
||||
T #Stat.T_Aus_Akt;//Gewollter Zeitwert
|
||||
|
||||
w030: UN #Stat.B_Akt;
|
||||
SPB Nw04;
|
||||
|
||||
L #Stat.T_Zelle;//Aktueller Zeitwert
|
||||
L #Stat.T_Aus_Akt;//Gewollter Zeitwert erreicht ?
|
||||
>=I;
|
||||
R #Stat.B_Akt;//Sensor ist nach Ausschaltzeit nicht mehr aktiv
|
||||
SPB tdel;//Zeit löschen
|
||||
|
||||
NETWORK
|
||||
TITLE = Zeit läuft
|
||||
Nw04: UN "100ms-Impuls";//nur als Impuls
|
||||
O;
|
||||
UN #Stat.B_Akt;//Einschaltzeit läuft
|
||||
UN #tein_aktiv;//aber Zeit einfrieren
|
||||
O;
|
||||
U #Stat.B_Akt;//Ausschaltzeit läuft
|
||||
UN #taus_aktiv;//aber Zeit einfrieren
|
||||
BEB;
|
||||
|
||||
L #Stat.T_Zelle;
|
||||
L "MW2";
|
||||
+I;
|
||||
T #Stat.T_Zelle;
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,203 +1,213 @@
|
||||
=== FB 92: MZylinder [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Automatik : Bool // Automatikbetrieb ist aktiv
|
||||
Handbetrieb : Bool // Handbetrieb ist aktiv
|
||||
T_Ast : Int := 5 // Zeit bis AST erreicht ist (*100ms)
|
||||
T_Gst : Int := 5 // Zeit bis GST erreicht ist (*100ms)
|
||||
Output:
|
||||
ZylAst : Bool // Vorwärts-Ausgang des Antriebs
|
||||
ZylGst : Bool // Rückwärts-Ausgang des Antriebs
|
||||
InOut:
|
||||
Static:
|
||||
Stat : "UZylinder"
|
||||
Temp:
|
||||
Constant:
|
||||
FUNCTION_BLOCK "MZylinder"
|
||||
TITLE = Zylinder mit 3/2 oder 5/2+3- Wegeventil und Endlagensimulation
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Automatik : Bool; // Automatikbetrieb ist aktiv
|
||||
Handbetrieb : Bool; // Handbetrieb ist aktiv
|
||||
T_Ast : Int := 5; // Zeit bis AST erreicht ist (*100ms)
|
||||
T_Gst : Int := 5; // Zeit bis GST erreicht ist (*100ms)
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Zeitwert löschen ---
|
||||
A ZylAst // Zylinder fährt nach AST
|
||||
A(
|
||||
O Stat.B_AST // Hat Endstellung erreicht
|
||||
ON Stat.Old_Ast // Fuhr letzten Zyklus anders
|
||||
)
|
||||
O
|
||||
AN ZylAst // Zylinder fährt nach GST
|
||||
A(
|
||||
O Stat.B_GST // Hat Endstellung erreicht
|
||||
O Stat.Old_Ast // Fuhr letzten Zyklus anders
|
||||
)
|
||||
JCN Nw02
|
||||
VAR_OUTPUT
|
||||
ZylAst : Bool; // Vorwärts-Ausgang des Antriebs
|
||||
ZylGst : Bool; // Rückwärts-Ausgang des Antriebs
|
||||
END_VAR
|
||||
|
||||
tdel: L 0 // Zeitwert löschen
|
||||
T Stat.T_Zelle
|
||||
|
||||
A ZylAst // Zylinder fährt nach AST
|
||||
= Stat.Old_Ast // Fuhr letzten Zyklus nach AST
|
||||
|
||||
JU Nw05
|
||||
|
||||
--- NW 2: AST-Erreichtzeit abgelaufen ? ---
|
||||
Nw02: L Stat.T_AST_Akt // Gewollter Zeitwert
|
||||
L 9999 // angegeben ?
|
||||
<>I // Ja !
|
||||
JC w020
|
||||
|
||||
L T_Ast // Sollwert übergeben
|
||||
T Stat.T_AST_Akt // Gewollter Zeitwert
|
||||
|
||||
w020: A ZylAst // Zylinder fährt nach AST ?
|
||||
JCN en02
|
||||
|
||||
SET
|
||||
R Stat.B_GST
|
||||
|
||||
L Stat.T_Zelle // Aktueller Zeitwert
|
||||
L Stat.T_AST_Akt // Gewollter Zeitwert erreicht ?
|
||||
>=I
|
||||
S Stat.B_AST // Zylinder hat AST erreicht
|
||||
JC tdel // Zeit nullen
|
||||
|
||||
JU Nw03
|
||||
|
||||
en02: AN Stat.Typ5_3 // Zylinder hält seine Stellung !
|
||||
R Stat.B_AST
|
||||
VAR
|
||||
Stat : "UZylinder";
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 3: GST-Erreichtzeit abgelaufen ? ---
|
||||
Nw03: L Stat.T_GST_Akt // Gewollter Zeitwert
|
||||
L 9999 // angegeben ?
|
||||
<>I // Ja !
|
||||
JC w030
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Zeitwert löschen
|
||||
U #ZylAst;//Zylinder fährt nach AST
|
||||
U(;
|
||||
O #Stat.B_AST;//Hat Endstellung erreicht
|
||||
ON #Stat.Old_Ast;//Fuhr letzten Zyklus anders
|
||||
);
|
||||
O;
|
||||
UN #ZylAst;//Zylinder fährt nach GST
|
||||
U(;
|
||||
O #Stat.B_GST;//Hat Endstellung erreicht
|
||||
O #Stat.Old_Ast;//Fuhr letzten Zyklus anders
|
||||
);
|
||||
SPBN Nw02;
|
||||
|
||||
L T_Gst // Sollwert übergeben
|
||||
T Stat.T_GST_Akt // Gewollter Zeitwert
|
||||
tdel: L 0;//Zeitwert löschen
|
||||
T #Stat.T_Zelle;
|
||||
|
||||
w030: A( // Zylinder fährt nach GST ?
|
||||
O Stat.Typ5_2 // Zylinder mit 2-facher Ansteuerung
|
||||
O Stat.Typ5_3
|
||||
)
|
||||
A ZylGst
|
||||
O
|
||||
A Stat.Typ3_2 // Zylinder mit 1-facher Ansteuerung
|
||||
AN ZylAst
|
||||
JCN en03
|
||||
U #ZylAst;//Zylinder fährt nach AST
|
||||
= #Stat.Old_Ast;//Fuhr letzten Zyklus nach AST
|
||||
|
||||
SET
|
||||
R Stat.B_AST
|
||||
SPA Nw05;
|
||||
NETWORK
|
||||
TITLE = AST-Erreichtzeit abgelaufen ?
|
||||
Nw02: L #Stat.T_AST_Akt;//Gewollter Zeitwert
|
||||
L 9999;//angegeben ?
|
||||
<>I;//Ja !
|
||||
SPB w020;
|
||||
|
||||
L Stat.T_Zelle // Aktueller Zeitwert
|
||||
L Stat.T_GST_Akt // Gewollter Zeitwert erreicht ?
|
||||
>=I
|
||||
S Stat.B_GST // Zylinder hat GST erreicht
|
||||
JC tdel // Zeit nullen
|
||||
L #T_Ast;//Sollwert übergeben
|
||||
T #Stat.T_AST_Akt;//Gewollter Zeitwert
|
||||
|
||||
JU Nw04
|
||||
w020: U #ZylAst;//Zylinder fährt nach AST ?
|
||||
SPBN en02;
|
||||
|
||||
en03: AN Stat.Typ5_3 // Zylinder hält seine Stellung !
|
||||
R Stat.B_GST
|
||||
SET;
|
||||
R #Stat.B_GST;
|
||||
|
||||
L #Stat.T_Zelle;//Aktueller Zeitwert
|
||||
L #Stat.T_AST_Akt;//Gewollter Zeitwert erreicht ?
|
||||
>=I;
|
||||
S #Stat.B_AST;//Zylinder hat AST erreicht
|
||||
SPB tdel;//Zeit nullen
|
||||
|
||||
--- NW 4: Zeit läuft ---
|
||||
Nw04: A( // Zylinder fährt nach GST ?
|
||||
O Stat.Typ5_2 // Zylinder mit 2-facher Ansteuerung
|
||||
O Stat.Typ5_3
|
||||
)
|
||||
AN ZylGst // Zylinder wird nicht angesteuert
|
||||
AN ZylAst
|
||||
ON "100ms-Impuls" // nur als Impuls
|
||||
JC Nw05
|
||||
SPA Nw03;
|
||||
|
||||
L Stat.T_Zelle
|
||||
L "MW2" // 100ms-Takte
|
||||
+I
|
||||
T Stat.T_Zelle
|
||||
en02: UN #Stat.Typ5_3;//Zylinder hält seine Stellung !
|
||||
R #Stat.B_AST;
|
||||
|
||||
NETWORK
|
||||
TITLE = GST-Erreichtzeit abgelaufen ?
|
||||
Nw03: L #Stat.T_GST_Akt;//Gewollter Zeitwert
|
||||
L 9999;//angegeben ?
|
||||
<>I;//Ja !
|
||||
SPB w030;
|
||||
|
||||
--- NW 5: Undefinierte Zustände / Befehle ---
|
||||
Nw05: A Automatik // Automatik + Hand aktiv
|
||||
A Handbetrieb
|
||||
O
|
||||
AN Automatik // keine Betriebsart
|
||||
AN Handbetrieb
|
||||
O
|
||||
A Stat.Ast // Arbeitsstellung- + Grundstellungfahren aktiv
|
||||
A Stat.Gst
|
||||
O
|
||||
AN Stat.Typ3_2 // Undefinierter Ventil-Typ
|
||||
AN Stat.Typ5_2
|
||||
AN Stat.Typ5_3
|
||||
O
|
||||
A Stat.Typ3_2
|
||||
A(
|
||||
O Stat.Typ5_2
|
||||
O Stat.Typ5_3
|
||||
)
|
||||
O
|
||||
A Stat.Typ5_2
|
||||
A Stat.Typ5_3
|
||||
JCN en06 // Zylinderstellung bleibt eingefroren
|
||||
L #T_Gst;//Sollwert übergeben
|
||||
T #Stat.T_GST_Akt;//Gewollter Zeitwert
|
||||
|
||||
A Stat.Typ5_3 // Zylinder hält seine Stellung !
|
||||
R Stat.Ast // Bewegungsbits löschen
|
||||
R Stat.Gst
|
||||
w030: U(;//Zylinder fährt nach GST ?
|
||||
O #Stat.Typ5_2;//Zylinder mit 2-facher Ansteuerung
|
||||
O #Stat.Typ5_3;
|
||||
);
|
||||
U #ZylGst;
|
||||
O;
|
||||
U #Stat.Typ3_2;//Zylinder mit 1-facher Ansteuerung
|
||||
UN #ZylAst;
|
||||
SPBN en03;
|
||||
|
||||
BEU
|
||||
SET;
|
||||
R #Stat.B_AST;
|
||||
|
||||
en06: NOP 0
|
||||
L #Stat.T_Zelle;//Aktueller Zeitwert
|
||||
L #Stat.T_GST_Akt;//Gewollter Zeitwert erreicht ?
|
||||
>=I;
|
||||
S #Stat.B_GST;//Zylinder hat GST erreicht
|
||||
SPB tdel;//Zeit nullen
|
||||
|
||||
--- NW 6: Zylinder auf Arbeitstellung fahren ---
|
||||
A Stat.Ast
|
||||
= ZylAst
|
||||
SPA Nw04;
|
||||
|
||||
en03: UN #Stat.Typ5_3;//Zylinder hält seine Stellung !
|
||||
R #Stat.B_GST;
|
||||
|
||||
--- NW 7: Zylinder auf Grundstellung fahren ---
|
||||
A(
|
||||
O Stat.Typ5_2
|
||||
O Stat.Typ5_3
|
||||
)
|
||||
A Stat.Gst
|
||||
= ZylGst
|
||||
NETWORK
|
||||
TITLE = Zeit läuft
|
||||
Nw04: U(;//Zylinder fährt nach GST ?
|
||||
O #Stat.Typ5_2;//Zylinder mit 2-facher Ansteuerung
|
||||
O #Stat.Typ5_3;
|
||||
);
|
||||
UN #ZylGst;//Zylinder wird nicht angesteuert
|
||||
UN #ZylAst;
|
||||
ON "100ms-Impuls";//nur als Impuls
|
||||
SPB Nw05;
|
||||
|
||||
L #Stat.T_Zelle;
|
||||
L "MW2" ;//100ms-Takte
|
||||
+I;
|
||||
T #Stat.T_Zelle;
|
||||
|
||||
--- NW 8: Daten, die zurückgesetzt werden ---
|
||||
A Stat.Typ5_3 // Zylinder hält seine Stellung !
|
||||
R Stat.Ast // Bewegungsbits löschen
|
||||
R Stat.Gst
|
||||
A Stat.Typ3_2
|
||||
R Stat.Gst // Es gibt kein GST fahren !
|
||||
NETWORK
|
||||
TITLE = Undefinierte Zustände / Befehle
|
||||
Nw05: U #Automatik;//Automatik + Hand aktiv
|
||||
U #Handbetrieb;
|
||||
O;
|
||||
UN #Automatik;//keine Betriebsart
|
||||
UN #Handbetrieb;
|
||||
O;
|
||||
U #Stat.Ast;//Arbeitsstellung- + Grundstellungfahren aktiv
|
||||
U #Stat.Gst;
|
||||
O;
|
||||
UN #Stat.Typ3_2;//Undefinierter Ventil-Typ
|
||||
UN #Stat.Typ5_2;
|
||||
UN #Stat.Typ5_3;
|
||||
O;
|
||||
U #Stat.Typ3_2;
|
||||
U(;
|
||||
O #Stat.Typ5_2;
|
||||
O #Stat.Typ5_3;
|
||||
);
|
||||
O;
|
||||
U #Stat.Typ5_2;
|
||||
U #Stat.Typ5_3;
|
||||
SPBN en06;//Zylinderstellung bleibt eingefroren
|
||||
|
||||
U #Stat.Typ5_3;//Zylinder hält seine Stellung !
|
||||
R #Stat.Ast;//Bewegungsbits löschen
|
||||
R #Stat.Gst;
|
||||
|
||||
--- NW 9: Ausgänge übergeben an OP übergeben ---
|
||||
A ZylGst
|
||||
= Stat.OP_Out_GST
|
||||
BEA;
|
||||
|
||||
A ZylAst
|
||||
= Stat.OP_Out_AST
|
||||
en06: NOP 0;
|
||||
NETWORK
|
||||
TITLE = Zylinder auf Arbeitstellung fahren
|
||||
U #Stat.Ast;
|
||||
= #ZylAst;
|
||||
|
||||
NETWORK
|
||||
TITLE = Zylinder auf Grundstellung fahren
|
||||
U(;
|
||||
O #Stat.Typ5_2;
|
||||
O #Stat.Typ5_3;
|
||||
);
|
||||
U #Stat.Gst;
|
||||
= #ZylGst;
|
||||
|
||||
--- NW 10: Statistik ---
|
||||
A ZylAst
|
||||
Rise Stat.FP_AST
|
||||
JCN AST2
|
||||
NETWORK
|
||||
TITLE = Daten, die zurückgesetzt werden
|
||||
U #Stat.Typ5_3;//Zylinder hält seine Stellung !
|
||||
R #Stat.Ast;//Bewegungsbits löschen
|
||||
R #Stat.Gst;
|
||||
U #Stat.Typ3_2;
|
||||
R #Stat.Gst;//Es gibt kein GST fahren !
|
||||
|
||||
L Stat.Statistik.AST_Schaltungen
|
||||
L DINT#1
|
||||
+D
|
||||
T Stat.Statistik.AST_Schaltungen
|
||||
NETWORK
|
||||
TITLE = Ausgänge übergeben an OP übergeben
|
||||
U #ZylGst;
|
||||
= #Stat.OP_Out_GST;
|
||||
|
||||
AST2: A ZylGst
|
||||
A Stat.Typ5_3
|
||||
Rise Stat.FP_AST2
|
||||
JCN StatEnde
|
||||
U #ZylAst;
|
||||
= #Stat.OP_Out_AST;
|
||||
|
||||
L Stat.Statistik.AST2_Schaltungen
|
||||
L DINT#1
|
||||
+D
|
||||
T Stat.Statistik.AST2_Schaltungen
|
||||
NETWORK
|
||||
TITLE = Statistik
|
||||
U #ZylAst;
|
||||
FP #Stat.FP_AST;
|
||||
SPBN AST2;
|
||||
|
||||
StatEnde: NOP 0
|
||||
L #Stat.Statistik.AST_Schaltungen;
|
||||
L DINT#1;
|
||||
+D;
|
||||
T #Stat.Statistik.AST_Schaltungen;
|
||||
|
||||
AST2: U #ZylGst;
|
||||
U #Stat.Typ5_3;
|
||||
FP #Stat.FP_AST2;
|
||||
SPBN StatEnde;
|
||||
|
||||
--- NW 11: Ende ---
|
||||
BE
|
||||
L #Stat.Statistik.AST2_Schaltungen;
|
||||
L DINT#1;
|
||||
+D;
|
||||
T #Stat.Statistik.AST2_Schaltungen;
|
||||
|
||||
StatEnde: NOP 0;
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION_BLOCK
|
||||
|
||||
|
||||
@@ -1,62 +1,76 @@
|
||||
=== FC 121: Save_CARR_Gesendet [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Kennung_1 : Char
|
||||
Kennung_2 : Char
|
||||
Kennung_3 : Char
|
||||
Kennung_4 : Char
|
||||
FIFO_DB : Int // FIFO-Ringspeicher
|
||||
Teil_IDX : Int // BT/MT-IDX (wird bei Auslagerung gemeldet)
|
||||
Teil_Ziel : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
|
||||
Sort_ID : Int // Sortier-Info (Sort-ID, mit welcher Fahrt gestartet wurde)
|
||||
Output:
|
||||
InOut:
|
||||
Temp:
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Kennung CARR ? ---
|
||||
L Kennung_1
|
||||
L 'C'
|
||||
<>I // Nein !
|
||||
BEC
|
||||
|
||||
L Kennung_2
|
||||
L 'A'
|
||||
<>I // Nein !
|
||||
BEC
|
||||
|
||||
L Kennung_3
|
||||
L 'R'
|
||||
<>I // Nein !
|
||||
BEC
|
||||
|
||||
L Kennung_4
|
||||
L 'R'
|
||||
<>I // Nein !
|
||||
BEC
|
||||
FUNCTION "Save_CARR_Gesendet" : Void
|
||||
TITLE = Gesendete CARR-Telegramme zusätzlich speichern
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Kennung_1 : Char;
|
||||
Kennung_2 : Char;
|
||||
Kennung_3 : Char;
|
||||
Kennung_4 : Char;
|
||||
FIFO_DB : Int; // FIFO-Ringspeicher
|
||||
Teil_IDX : Int; // BT/MT-IDX (wird bei Auslagerung gemeldet)
|
||||
Teil_Ziel : Int; // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
|
||||
Sort_ID : Int; // Sortier-Info (Sort-ID, mit welcher Fahrt gestartet wurde)
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Daten aufbereiten ---
|
||||
L Teil_IDX
|
||||
T "MW220"
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Kennung CARR ?
|
||||
L #Kennung_1;
|
||||
L 'C';
|
||||
<>I;//Nein !
|
||||
BEB;
|
||||
|
||||
L Teil_Ziel
|
||||
T "MW222"
|
||||
L #Kennung_2;
|
||||
L 'A';
|
||||
<>I;//Nein !
|
||||
BEB;
|
||||
|
||||
L Sort_ID
|
||||
T "MW224"
|
||||
L #Kennung_3;
|
||||
L 'R';
|
||||
<>I;//Nein !
|
||||
BEB;
|
||||
|
||||
L #Kennung_4;
|
||||
L 'R';
|
||||
<>I;//Nein !
|
||||
BEB;
|
||||
|
||||
--- NW 3: Daten speichern ---
|
||||
CALL FC "FifoOut" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#E100, OUTDATEN:=P#M200.0, RE_VAL:="MB199") // da Ringspeicher nächster Eintrag lesen + austragen
|
||||
NETWORK
|
||||
TITLE = Daten aufbereiten
|
||||
L #Teil_IDX;
|
||||
T "MW220";
|
||||
|
||||
CALL FC "FifoIn" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M220.0, RE_VAL:="MB199")
|
||||
L #Teil_Ziel;
|
||||
T "MW222";
|
||||
|
||||
L "MB199"
|
||||
L #Sort_ID;
|
||||
T "MW224";
|
||||
|
||||
NETWORK
|
||||
TITLE = Daten speichern
|
||||
CALL "FifoOut"
|
||||
( SSDB := #FIFO_DB ,
|
||||
SSDW := 0 ,
|
||||
PARA := WORD#16#E100 , //da Ringspeicher nächster Eintrag lesen + austragen
|
||||
OUTDATEN := P#M200.0 ,
|
||||
RE_VAL := "MB199"
|
||||
);
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
CALL "FifoIn"
|
||||
( SSDB := #FIFO_DB ,
|
||||
SSDW := 0 ,
|
||||
PARA := WORD#16#0000 ,
|
||||
INDATEN := P#M220.0 ,
|
||||
RE_VAL := "MB199"
|
||||
);
|
||||
|
||||
L "MB199";
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,32 +1,46 @@
|
||||
=== FC 122: Save_Ziel [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
FIFO_DB : Int // FIFO-Ringspeicher
|
||||
Teil_IDX : Int // BT/MT-IDX (wird bei Auslagerung gemeldet)
|
||||
Teil_Ziel : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
|
||||
Output:
|
||||
InOut:
|
||||
Temp:
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Daten aufbereiten ---
|
||||
L Teil_IDX
|
||||
T "MW220"
|
||||
|
||||
L Teil_Ziel
|
||||
T "MW222"
|
||||
FUNCTION "Save_Ziel" : Void
|
||||
TITLE = Gesendete CARR-Telegramme zusätzlich speichern
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
FIFO_DB : Int; // FIFO-Ringspeicher
|
||||
Teil_IDX : Int; // BT/MT-IDX (wird bei Auslagerung gemeldet)
|
||||
Teil_Ziel : Int; // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Daten speichern ---
|
||||
CALL FC "FifoOut" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#E100, OUTDATEN:=P#M200.0, RE_VAL:="MB199") // da Ringspeicher nächster Eintrag lesen + austragen
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Daten aufbereiten
|
||||
L #Teil_IDX;
|
||||
T "MW220";
|
||||
|
||||
CALL FC "FifoIn" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M220.0, RE_VAL:="MB199")
|
||||
L #Teil_Ziel;
|
||||
T "MW222";
|
||||
|
||||
L "MB199"
|
||||
NETWORK
|
||||
TITLE = Daten speichern
|
||||
CALL "FifoOut"
|
||||
( SSDB := #FIFO_DB ,
|
||||
SSDW := 0 ,
|
||||
PARA := WORD#16#E100 , //da Ringspeicher nächster Eintrag lesen + austragen
|
||||
OUTDATEN := P#M200.0 ,
|
||||
RE_VAL := "MB199"
|
||||
);
|
||||
|
||||
CALL "FifoIn"
|
||||
( SSDB := #FIFO_DB ,
|
||||
SSDW := 0 ,
|
||||
PARA := WORD#16#0000 ,
|
||||
INDATEN := P#M220.0 ,
|
||||
RE_VAL := "MB199"
|
||||
);
|
||||
|
||||
--- NW 3: Ende ---
|
||||
BE
|
||||
L "MB199";
|
||||
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,34 +1,39 @@
|
||||
=== FC 1028: Set_Input [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Enable : Bool // Baustein aktivieren
|
||||
Status : Bool // Angegebenen Ausgang auf diesen Status steuern
|
||||
InByte : DInt // Eingangsbyte zum Steuern
|
||||
InBit : Int // Eingangsbit zum Steuern
|
||||
Output:
|
||||
InOut:
|
||||
Temp:
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "Set_Input" : Void
|
||||
TITLE = Eingangsbit zwangssteuern
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Enable : Bool; // Baustein aktivieren
|
||||
Status : Bool; // Angegebenen Ausgang auf diesen Status steuern
|
||||
InByte : DInt; // Eingangsbyte zum Steuern
|
||||
InBit : Int; // Eingangsbit zum Steuern
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Baustein aktiviert ? ---
|
||||
AN Enable
|
||||
BEC
|
||||
VAR_TEMP
|
||||
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Eingang stuern ---
|
||||
L InByte // Ausgangsbyte zum Steuern
|
||||
SLD 3
|
||||
L InBit // Ausgangsbit zum Steuern
|
||||
OW
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Baustein aktiviert ?
|
||||
UN #Enable;
|
||||
BEB;
|
||||
|
||||
A Status
|
||||
= IX [AR1Zeiger] // Eingang steuern
|
||||
NETWORK
|
||||
TITLE = Eingang stuern
|
||||
L #InByte;//Ausgangsbyte zum Steuern
|
||||
SLD 3;
|
||||
L #InBit;//Ausgangsbit zum Steuern
|
||||
OW;
|
||||
T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
U #Status;
|
||||
= E[ #AR1Zeiger];//Eingang steuern
|
||||
|
||||
--- NW 3: Ende ---
|
||||
BE
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
@@ -1,34 +1,39 @@
|
||||
=== FC 127: Set_Output [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Enable : Bool // Baustein aktivieren
|
||||
Status : Bool // Angegebenen Ausgang auf diesen Status steuern
|
||||
OutByte : DInt // Ausgangsbyte zum Steuern
|
||||
OutBit : Int // Ausgangsbit zum Steuern
|
||||
Output:
|
||||
InOut:
|
||||
Temp:
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
FUNCTION "Set_Output" : Void
|
||||
TITLE = Ausgangsbit zwangsstuern
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
VERSION : 0.1
|
||||
VAR_INPUT
|
||||
Enable : Bool; // Baustein aktivieren
|
||||
Status : Bool; // Angegebenen Ausgang auf diesen Status steuern
|
||||
OutByte : DInt; // Ausgangsbyte zum Steuern
|
||||
OutBit : Int; // Ausgangsbit zum Steuern
|
||||
END_VAR
|
||||
|
||||
--- NW 1: Baustein aktiviert ? ---
|
||||
AN Enable
|
||||
BEC
|
||||
VAR_TEMP
|
||||
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
END_VAR
|
||||
|
||||
|
||||
--- NW 2: Ausgang steuern ---
|
||||
L OutByte // Ausgangsbyte zum Steuern
|
||||
SLD 3
|
||||
L OutBit // Ausgangsbit zum Steuern
|
||||
OW
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
BEGIN
|
||||
NETWORK
|
||||
TITLE = Baustein aktiviert ?
|
||||
UN #Enable;
|
||||
BEB;
|
||||
|
||||
A Status
|
||||
= QX [AR1Zeiger] // Ausgang steuern
|
||||
NETWORK
|
||||
TITLE = Ausgang steuern
|
||||
L #OutByte;//Ausgangsbyte zum Steuern
|
||||
SLD 3;
|
||||
L #OutBit;//Ausgangsbit zum Steuern
|
||||
OW;
|
||||
T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
U #Status;
|
||||
= A[ #AR1Zeiger];//Ausgang steuern
|
||||
|
||||
--- NW 3: Ende ---
|
||||
BE
|
||||
NETWORK
|
||||
TITLE = Ende
|
||||
BE;
|
||||
|
||||
END_FUNCTION
|
||||
|
||||
|
||||
Reference in New Issue
Block a user