FUNCTION_BLOCK FB 850
TITLE =Produktionsrate
AUTHOR : HF
VERSION : 0.1
VAR_INPUT
Taktimpuls : BOOL ; //Taktimpuls
Reset : BOOL ; //Reset Produktionsrate
Nr_DB_Speicher : INT ; //DB Nr von Speicher DB
Zykluszeit : INT ; //Zykluszeit
END_VAR
VAR
P_Rate : STRUCT //Produktionsrate
_1_min : INT ;
_5_min : INT ;
_30_min : INT ;
_1_h : INT ;
END_STRUCT ;
P_Rate_gespeichert : STRUCT //Produktionsrate gespeichert bei Auto Aus für Druck
_1_min : INT ;
_5_min : INT ;
_30_min : INT ;
_1_h : INT ;
END_STRUCT ;
Z_P_Rate : STRUCT //Zähler Produktionsrate
_1_min : INT ;
_5_min : INT ;
_30_min : INT ;
_1_h : INT ;
END_STRUCT ;
Summenzeit : STRUCT //Summenzeit
_1_min : TIME ;
_5_min : TIME ;
_30_min : TIME ;
_1_h : TIME ;
END_STRUCT ;
Zeiger_Out : STRUCT //Zeiger Speicher Wert auslesen
_1_min : DINT ;
_5_min : DINT ;
_30_min : DINT ;
_1_h : DINT ;
END_STRUCT ;
Zeiger_In : DINT ;
Pausenzeit : TIME ;
M_Flanke_1 : BOOL ; //Flankenmerker
M_Flanke_2 : BOOL ; //Flankenmerker
END_VAR
VAR_TEMP
Fehlercod : INT ; //Fehlercode Blockmove
Nr_DB : WORD ; //Nr. Speicherbaustein
MW_Temp : WORD ; //Zwischenmerker
Z_Merker : BOOL ; //Zwischenmerker
END_VAR
BEGIN
NETWORK
TITLE =Datenbaustein erzeugen
L #Nr_DB_Speicher; //Int wandeln in Word
T #Nr_DB;
CALL SFC 24 (//Test Speicher-DB schon vorhanden
DB_NUMBER := #Nr_DB,//Nr. DBxx
RET_VAL := #Fehlercod,
DB_LENGTH := #MW_Temp,
WRITE_PROT := #Z_Merker);
L #Fehlercod; //W#16#80B1 Der DB mit der angegebenen Nummer ist auf der CPU nicht vorhanden
L W#16#80B1;
==I ;
SPBN DBda;
// neuen Datenbaustein erzuegen
CALL SFC 22 (
LOW_LIMIT := #Nr_DB,//erste Nr. DBxx
UP_LIMIT := #Nr_DB,//letzte Nr. DBxx
COUNT := W#16#FFFE,//65534 Byte
RET_VAL := #Fehlercod,
DB_NUMBER := #MW_Temp);
SET ;
S #Reset;
DBda: NOP 0;
NETWORK
TITLE =Bei Reset alle Werte Nullen
U #Reset;
SPBN noNe;
R #Reset;
L L#0;
T #Z_P_Rate._1_min;
T #Z_P_Rate._5_min;
T #Z_P_Rate._30_min;
T #Z_P_Rate._1_h;
T #Summenzeit._1_min;
T #Summenzeit._5_min;
T #Summenzeit._30_min;
T #Summenzeit._1_h;
T #Zeiger_Out._1_min;
T #Zeiger_Out._5_min;
T #Zeiger_Out._30_min;
T #Zeiger_Out._1_h;
T #Pausenzeit;
T #Zeiger_In;
noNe: NOP 0;
NETWORK
TITLE =Bei Auto-Aus Produktionrate speichern (für Print)
U M 10.0;
FN #M_Flanke_2;
SPBN auto;
CALL SFC 20 (
SRCBLK := #P_Rate,
RET_VAL := #Fehlercod,
DSTBLK := #P_Rate_gespeichert);
auto: NOP 0;
NETWORK
TITLE =Pausenzeit aus Zykluszeit
L #Pausenzeit;
L #Zykluszeit;
+D ;
T #Pausenzeit;
NETWORK
TITLE =DB öffnen
AUF DB [#Nr_DB]; //Speicher Produktionsrate
NETWORK
TITLE =Bei Taktimpuls neue Zeit in Zeitspeicher
U #Taktimpuls;
FP #M_Flanke_1;
SPBN noSr;
L #Zeiger_In; //Zeiger Schreibposition
SLD 5; //4 Byte
LAR1 ; //Achtung +AR1 geht nur bis p#4095.7
L #Pausenzeit;
T DBD [AR1,P#0.0]; //Zeit in Zeitspeicher
// 1 min
L #Summenzeit._1_min; //Summenzeit = Pausenzeit + Summenzeit
+D ;
T #Summenzeit._1_min;
L #Z_P_Rate._1_min; //Produktionsrate erhöhen
+ 1;
T #Z_P_Rate._1_min;
// 5 min
L #Pausenzeit;
L #Summenzeit._5_min;
+D ;
T #Summenzeit._5_min;
L #Z_P_Rate._5_min;
+ 1;
T #Z_P_Rate._5_min;
// 30 min
L #Pausenzeit;
L #Summenzeit._30_min;
+D ;
T #Summenzeit._30_min;
L #Z_P_Rate._30_min;
+ 1;
T #Z_P_Rate._30_min;
// 1 h
L #Pausenzeit;
L #Summenzeit._1_h;
+D ;
T #Summenzeit._1_h;
L #Z_P_Rate._1_h;
+ 1;
T #Z_P_Rate._1_h;
// Pausenzeit löschen
L L#0; //Pausenzeit nach Eintrag löschen
T #Pausenzeit;
// Zeiger stellen
L #Zeiger_In; //Zeiger Schreibposition erhöhen
+ 1;
T #Zeiger_In;
L L#16383; //max.Grösse Summenspeicher
<D ;
SPB noSr;
L L#0; //Zeiger auf Anfang
T #Zeiger_In;
noSr: NOP 0;
NETWORK
TITLE =Produktionsrate berechnen 1 min
N_1m: L #Zeiger_Out._1_min; //Kontrolle Zeiger
L #Zeiger_In;
==D ;
SPB E_1m;
L #Pausenzeit;
L #Summenzeit._1_min; //Summenzeit
+D ;
L L#60000; //Abfragezeit in ms
<D ;
SPB E_1m;
L #Zeiger_Out._1_min; //Zeiger Leseposition
SLD 5; //4 Byte
LAR1 ; //Achtung +AR1 geht nur bis p#4095.7
L #Summenzeit._1_min;
L DBD [AR1,P#0.0]; //Zeit aus Zeitspeicher
-D ;
T #Summenzeit._1_min;
L #Z_P_Rate._1_min; //Produktionsrate erhöhen
+ -1;
T #Z_P_Rate._1_min;
L #Zeiger_Out._1_min; //Zeiger Leseposition erhöhen
+ 1;
T #Zeiger_Out._1_min;
L L#16383; //max.Grösse Summenspeicher
<D ;
SPB N_1m;
L L#0; //Zeiger auf Anfang
T #Zeiger_Out._1_min;
E_1m: L #Z_P_Rate._1_min; //Anzahl Zeiten im Messbereich
T #P_Rate._1_min; //xxx Teile/min
NETWORK
TITLE =Produktionsrate berechnen 5 min
N_5m: L #Zeiger_Out._5_min;
L #Zeiger_In;
==D ;
SPB E_5m;
L #Pausenzeit;
L #Summenzeit._5_min;
+D ;
L L#300000; //Abfragezeit in ms
<D ;
SPB E_5m;
L #Zeiger_Out._5_min;
SLD 5;
LAR1 ;
L #Summenzeit._5_min;
L DBD [AR1,P#0.0];
-D ;
T #Summenzeit._5_min;
L #Z_P_Rate._5_min;
+ -1;
T #Z_P_Rate._5_min;
L #Zeiger_Out._5_min;
+ 1;
T #Zeiger_Out._5_min;
L L#16383;
<D ;
SPB N_5m;
L L#0;
T #Zeiger_Out._5_min;
E_5m: L #Z_P_Rate._5_min;
L 10;
*I ;
L 5;
/I ;
T #P_Rate._5_min; //xxx Teile/min
NETWORK
TITLE =Produktionsrate berechnen 30 min
N30m: L #Zeiger_Out._30_min;
L #Zeiger_In;
==D ;
SPB E30m;
L #Pausenzeit;
L #Summenzeit._30_min;
+D ;
L L#1800000; //Abfragezeit in ms
<D ;
SPB E30m;
L #Zeiger_Out._30_min;
SLD 5;
LAR1 ;
L #Summenzeit._30_min;
L DBD [AR1,P#0.0];
-D ;
T #Summenzeit._30_min;
L #Z_P_Rate._30_min;
+ -1;
T #Z_P_Rate._30_min;
L #Zeiger_Out._30_min;
+ 1;
T #Zeiger_Out._30_min;
L L#16383;
<D ;
SPB N30m;
L L#0;
T #Zeiger_Out._30_min;
E30m: L #Z_P_Rate._30_min;
L 3;
/I ;
T #P_Rate._30_min; //xxx,x Teile/min
NETWORK
TITLE =Produktionsrate berechnen 1 h
N_1h: L #Zeiger_Out._1_h;
L #Zeiger_In;
==D ;
SPB E_1h;
L #Pausenzeit;
L #Summenzeit._1_h;
+D ;
L L#3600000;
<D ;
SPB E_1h;
L #Zeiger_Out._1_h;
SLD 5;
LAR1 ;
L #Summenzeit._1_h;
L DBD [AR1,P#0.0];
-D ;
T #Summenzeit._1_h;
L #Z_P_Rate._1_h;
+ -1;
T #Z_P_Rate._1_h;
L #Zeiger_Out._1_h;
+ 1;
T #Zeiger_Out._1_h;
L L#16383;
<D ;
SPB N_1h;
L L#0;
T #Zeiger_Out._1_h;
E_1h: L #Z_P_Rate._1_h;
L 6;
/I ;
T #P_Rate._1_h; //xxx,x Teile/min
END_FUNCTION_BLOCK