UH07 Original .awl Bausteine von Andi importiert

This commit is contained in:
2026-07-08 12:13:12 +02:00
parent 6c1a343fa8
commit 2cf730b338
125 changed files with 49373 additions and 41019 deletions
@@ -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