-> Hier kostenlos registrieren
Hallo,
in unserem Unternehmen haben wir eine Förderbahn bei der wir die Geschwindigkeit mithilfe einer Walze messen.
Auf der Walze ist ein Inkrementalgeber mit 1000 Impulse / Umdrehung befestigt. Die Impulse werden auf die Zählerkarte FM 450-1 übergeben.
Bei der Messung der Geschwindigkeit zwischen 0 m/min und 70 m/min haben wir einer Abweichung von +-2%. Schlupf können wir ausschließen.
Meine Vermutung ist, dass es an einer zu großen Zykluszeit liegt. Das Programm ist ziemlich umfangreich und hat eine Zykluszeit von 61ms.
Falls jemand noch eine andere Vermutung oder eine andere Lösung für die Geschwindigkeitsmessung hat und mich aufklären kann, wäre ich sehr dankbar.
Datei von filehorst.de laden
Hier ist ein Ausschnitt aus dem Programm
Programmiersprache: Simatic STEP7 v5.3
CPU: 417-4 H
Vielen Dank im Voraus.
in unserem Unternehmen haben wir eine Förderbahn bei der wir die Geschwindigkeit mithilfe einer Walze messen.
Auf der Walze ist ein Inkrementalgeber mit 1000 Impulse / Umdrehung befestigt. Die Impulse werden auf die Zählerkarte FM 450-1 übergeben.
Bei der Messung der Geschwindigkeit zwischen 0 m/min und 70 m/min haben wir einer Abweichung von +-2%. Schlupf können wir ausschließen.
Meine Vermutung ist, dass es an einer zu großen Zykluszeit liegt. Das Programm ist ziemlich umfangreich und hat eine Zykluszeit von 61ms.
Falls jemand noch eine andere Vermutung oder eine andere Lösung für die Geschwindigkeitsmessung hat und mich aufklären kann, wäre ich sehr dankbar.
Datei von filehorst.de laden
Hier ist ein Ausschnitt aus dem Programm
Code:
TYPE UDT 1
STRUCT
AR1_BUFFER : DWORD ; // AR1 buffer (FC internal use)
FP : BYTE ; // flag byte (FC internal use)
RESERVED : BYTE ; // reserved for FC use
MOD_ADR : WORD ; // module adress (write user)
CH_ADR : DWORD ; // channel adress (write user)
U_D_LGTH : BYTE ; // user data length (write user)
A_BYTE_0 : BYTE ; // reserved
LOAD_VAL : DINT ; // new load value (write user)
CMP_V1 : DINT ; // new comparator value 1 (write user)
CMP_V2 : DINT ; // new comparator value 2 (write user)
A_BIT0_0 : BOOL ; // reserved
TFB : BOOL ; // test free (internal use)
A_BIT0_2 : BOOL ; // reserved
A_BIT0_3 : BOOL ; // reserved
A_BIT0_4 : BOOL ; // reserved
A_BIT0_5 : BOOL ; // reserved
A_BIT0_6 : BOOL ; // reserved
A_BIT0_7 : BOOL ; // reserved
ENSET_UP : BOOL ; // enable set in direction up (=forward) (write user)
ENSET_DN : BOOL ; // enable set in direction down (= backward) (write user)
A_BIT1_2 : BOOL ; // reserved
A_BIT1_3 : BOOL ; // reserved
A_BIT1_4 : BOOL ; // reserved
A_BIT1_5 : BOOL ; // reserved
A_BIT1_6 : BOOL ; // reserved
A_BIT1_7 : BOOL ; // reserved
CTRL_DQ0 : BOOL ; // control digital output DQ0 (write user)
CTRL_DQ1 : BOOL ; // control digital output DQ1 (write user)
A_BIT2_2 : BOOL ; // reserved
A_BIT2_3 : BOOL ; // reserved
A_BIT2_4 : BOOL ; // reserved
A_BIT2_5 : BOOL ; // reserved
A_BIT2_6 : BOOL ; // reserved
A_BIT2_7 : BOOL ; // reserved
A_BIT3_0 : BOOL ; // reserved
A_BIT3_1 : BOOL ; // reserved
A_BIT3_2 : BOOL ; // reserved
A_BIT3_3 : BOOL ; // reserved
A_BIT3_4 : BOOL ; // reserved
A_BIT3_5 : BOOL ; // reserved
A_BIT3_6 : BOOL ; // reserved
A_BIT3_7 : BOOL ; // reserved
LATCH_LOAD : DINT ; // actual latch or load value (read user)
ACT_CNTV : DINT ; // actual counter value (read user)
DA_ERR_W : WORD ; // data error word (read user)
OT_ERR_B : BYTE ; // operator error byte (read user)
E_BIT0_0 : BOOL ; // reserved
STS_TFB : BOOL ; // status test free bit (internal use)
E_BIT0_2 : BOOL ; // reserved
E_BIT0_3 : BOOL ; // reserved
DATA_ERR : BOOL ; // data error bit (read user)
E_BIT0_5 : BOOL ; // reserved
E_BIT0_6 : BOOL ; // reserved
PARA : BOOL ; // module parametrized (read user)
E_BYTE_0 : BYTE ; // reserved
STS_RUN : BOOL ; // status counter is running (read user)
STS_DIR : BOOL ; // status of the counter direction bit (read user)
STS_ZERO : BOOL ; // status of the counter zero crossing bit (read user)
STS_OFLW : BOOL ; // status counter passed the overflow value (read user)
STS_UFLW : BOOL ; // status counter passed the underflow value (read user)
STS_SYNC : BOOL ; // status counter is synchronized (read user)
STS_GATE : BOOL ; // status of the internal gate (read user)
STS_SW_G : BOOL ; // status of the software gate (read user)
STS_SET : BOOL ; // status digital input SET (read user)
E_BIT2_1 : BOOL ; // reserved
STS_STA : BOOL ; // status of the digital input start (read user)
STS_STP : BOOL ; // status of the digital input stop (read user)
STS_CMP1 : BOOL ; // status of the comparator output 1 (read user)
STS_CMP2 : BOOL ; // status of the comparator output 2 (read user)
E_BIT2_6 : BOOL ; // reserved
E_BIT2_7 : BOOL ; // reserved
E_BIT3_0 : BOOL ; // reserved
E_BIT3_1 : BOOL ; // reserved
E_BIT3_2 : BOOL ; // reserved
E_BIT3_3 : BOOL ; // reserved
E_BIT3_4 : BOOL ; // reserved
E_BIT3_5 : BOOL ; // reserved
E_BIT3_6 : BOOL ; // reserved
E_BIT3_7 : BOOL ; // reserved
ACT_CMP1 : DINT ; // actual comparator value 1 (read user)
ACT_CMP2 : DINT ; // actual comparator value 2 (read user)
MDL_DEFECT : BOOL ; // module defective
INT_FAULT : BOOL ; // internal fault
EXT_FAULT : BOOL ; // external fault
PNT_INFO : BOOL ; // point information
EXT_VOLTAGE : BOOL ; // external voltage low
FLD_CONNCTR : BOOL ; // field wiring connector missing
NO_CONFIG : BOOL ; // module has no configuration data
CONFIG_ERR : BOOL ; // module has configuration error
MDL_TYPE : BYTE ; // Type of module
SUB_MDL_ERR : BOOL ; // Sub-Module is missing or has error
COMM_FAULT : BOOL ; // communication fault
MDL_STOP : BOOL ; // module is stopped
WTCH_DOG_FLT : BOOL ; // watch dog timer stopped module
INT_PS_FLT : BOOL ; // internal power supply fault
PRIM_BATT_FLT : BOOL ; // primary battery is in fault
BCKUP_BATT_FLT : BOOL ; // backup battary is in fault
RESERVED_2 : BOOL ; // reserved for system
RACK_FLT : BOOL ; // rack fault, only for bus interface module
PROC_FLT : BOOL ; // processor fault
EPROM_FLT : BOOL ; // EPROM fault
RAM_FLT : BOOL ; // RAM fault
ADU_FLT : BOOL ; // ADU fault
FUSE_FLT : BOOL ; // fuse fault
HW_INTR_FLT : BOOL ; // hardware interrupt input in fault
RESERVED_3 : BOOL ; // reserved for system
CH_TYPE : BYTE ; // channel type
LGTH_DIA : BYTE ; // length of diagnostics data per channel
CH_NO : BYTE ; // channel number (numero)
GRP_ERR1 : BOOL ; // group error channel 1
GRP_ERR2 : BOOL ; // group error channel 2
D_BIT7_2 : BOOL ; // DS1 byte 7 bit 2
D_BIT7_3 : BOOL ; // DS1 byte 7 bit 3
D_BIT7_4 : BOOL ; // DS1 byte 7 bit 4
D_BIT7_5 : BOOL ; // DS1 byte 7 bit 5
D_BIT7_6 : BOOL ; // DS1 byte 7 bit 6
D_BIT7_7 : BOOL ; // DS1 byte 7 bit 7
CH1_SIGA : BOOL ; // channel 1, signal A malfunction
CH1_SIGB : BOOL ; // channel 1, signal B malfunction
CH1_SIGZ : BOOL ; // channel 1, signal Zero mark malfunction
CH1_BETW : BOOL ; // channel 1, malfunction between channels
CH1_5V2 : BOOL ; // channel 1, malfunction of encoder supply voltage 5.2V
D_BIT8_5 : BOOL ; // DS1 byte 8 bit 5
D_BIT8_6 : BOOL ; // DS1 byte 8 bit 6
D_BIT8_7 : BOOL ; // DS1 byte 8 bit 7
D_BYTE9 : BYTE ; // DS1 byte 9
CH2_SIGA : BOOL ; // channel 2, signal A malfunction
CH2_SIGB : BOOL ; // channel 2, signal B malfunction
CH2_SIGZ : BOOL ; // channel 2, signal Zero mark malfunction
CH2_BETW : BOOL ; // channel 2, malfunction between channels
CH2_5V2 : BOOL ; // channel 2, malfunction of encoder supply voltage 5.2V
D_BIT10_5 : BOOL ; // DS1 byte 10 bit 5
D_BIT10_6 : BOOL ; // DS1 byte 10 bit 6
D_BIT10_7 : BOOL ; // DS1 byte 10 bit 7
D_BYTE11 : BYTE ; // DS1 byte 11
D_BYTE12 : BYTE ; // DS1 byte 12
D_BYTE13 : BYTE ; // DS1 byte 13
D_BYTE14 : BYTE ; // DS1 byte 14
D_BYTE15 : BYTE ; // DS1 byte 15
END_STRUCT ;
END_TYPE
DATA_BLOCK DB 455
TITLE =
VERSION : 0.1
UDT 1
BEGIN
AR1_BUFFER := DW#16#0;
FP := B#16#0;
RESERVED := B#16#0;
MOD_ADR := W#16#0;
CH_ADR := DW#16#0;
U_D_LGTH := B#16#0;
A_BYTE_0 := B#16#0;
LOAD_VAL := L#0;
CMP_V1 := L#0;
CMP_V2 := L#0;
A_BIT0_0 := FALSE;
TFB := FALSE;
A_BIT0_2 := FALSE;
A_BIT0_3 := FALSE;
A_BIT0_4 := FALSE;
A_BIT0_5 := FALSE;
A_BIT0_6 := FALSE;
A_BIT0_7 := FALSE;
ENSET_UP := FALSE;
ENSET_DN := FALSE;
A_BIT1_2 := FALSE;
A_BIT1_3 := FALSE;
A_BIT1_4 := FALSE;
A_BIT1_5 := FALSE;
A_BIT1_6 := FALSE;
A_BIT1_7 := FALSE;
CTRL_DQ0 := FALSE;
CTRL_DQ1 := FALSE;
A_BIT2_2 := FALSE;
A_BIT2_3 := FALSE;
A_BIT2_4 := FALSE;
A_BIT2_5 := FALSE;
A_BIT2_6 := FALSE;
A_BIT2_7 := FALSE;
A_BIT3_0 := FALSE;
A_BIT3_1 := FALSE;
A_BIT3_2 := FALSE;
A_BIT3_3 := FALSE;
A_BIT3_4 := FALSE;
A_BIT3_5 := FALSE;
A_BIT3_6 := FALSE;
A_BIT3_7 := FALSE;
LATCH_LOAD := L#0;
ACT_CNTV := L#0;
DA_ERR_W := W#16#0;
OT_ERR_B := B#16#0;
E_BIT0_0 := FALSE;
STS_TFB := FALSE;
E_BIT0_2 := FALSE;
E_BIT0_3 := FALSE;
DATA_ERR := FALSE;
E_BIT0_5 := FALSE;
E_BIT0_6 := FALSE;
PARA := FALSE;
E_BYTE_0 := B#16#0;
STS_RUN := FALSE;
STS_DIR := FALSE;
STS_ZERO := FALSE;
STS_OFLW := FALSE;
STS_UFLW := FALSE;
STS_SYNC := FALSE;
STS_GATE := FALSE;
STS_SW_G := FALSE;
STS_SET := FALSE;
E_BIT2_1 := FALSE;
STS_STA := FALSE;
STS_STP := FALSE;
STS_CMP1 := FALSE;
STS_CMP2 := FALSE;
E_BIT2_6 := FALSE;
E_BIT2_7 := FALSE;
E_BIT3_0 := FALSE;
E_BIT3_1 := FALSE;
E_BIT3_2 := FALSE;
E_BIT3_3 := FALSE;
E_BIT3_4 := FALSE;
E_BIT3_5 := FALSE;
E_BIT3_6 := FALSE;
E_BIT3_7 := FALSE;
ACT_CMP1 := L#0;
ACT_CMP2 := L#0;
MDL_DEFECT := FALSE;
INT_FAULT := FALSE;
EXT_FAULT := FALSE;
PNT_INFO := FALSE;
EXT_VOLTAGE := FALSE;
FLD_CONNCTR := FALSE;
NO_CONFIG := FALSE;
CONFIG_ERR := FALSE;
MDL_TYPE := B#16#0;
SUB_MDL_ERR := FALSE;
COMM_FAULT := FALSE;
MDL_STOP := FALSE;
WTCH_DOG_FLT := FALSE;
INT_PS_FLT := FALSE;
PRIM_BATT_FLT := FALSE;
BCKUP_BATT_FLT := FALSE;
RESERVED_2 := FALSE;
RACK_FLT := FALSE;
PROC_FLT := FALSE;
EPROM_FLT := FALSE;
RAM_FLT := FALSE;
ADU_FLT := FALSE;
FUSE_FLT := FALSE;
HW_INTR_FLT := FALSE;
RESERVED_3 := FALSE;
CH_TYPE := B#16#0;
LGTH_DIA := B#16#0;
CH_NO := B#16#0;
GRP_ERR1 := FALSE;
GRP_ERR2 := FALSE;
D_BIT7_2 := FALSE;
D_BIT7_3 := FALSE;
D_BIT7_4 := FALSE;
D_BIT7_5 := FALSE;
D_BIT7_6 := FALSE;
D_BIT7_7 := FALSE;
CH1_SIGA := FALSE;
CH1_SIGB := FALSE;
CH1_SIGZ := FALSE;
CH1_BETW := FALSE;
CH1_5V2 := FALSE;
D_BIT8_5 := FALSE;
D_BIT8_6 := FALSE;
D_BIT8_7 := FALSE;
D_BYTE9 := B#16#0;
CH2_SIGA := FALSE;
CH2_SIGB := FALSE;
CH2_SIGZ := FALSE;
CH2_BETW := FALSE;
CH2_5V2 := FALSE;
D_BIT10_5 := FALSE;
D_BIT10_6 := FALSE;
D_BIT10_7 := FALSE;
D_BYTE11 := B#16#0;
D_BYTE12 := B#16#0;
D_BYTE13 := B#16#0;
D_BYTE14 := B#16#0;
D_BYTE15 := B#16#0;
END_DATA_BLOCK
DATA_BLOCK DB 456
TITLE =
VERSION : 0.1
UDT 1
BEGIN
AR1_BUFFER := DW#16#0;
FP := B#16#0;
RESERVED := B#16#0;
MOD_ADR := W#16#0;
CH_ADR := DW#16#0;
U_D_LGTH := B#16#0;
A_BYTE_0 := B#16#0;
LOAD_VAL := L#0;
CMP_V1 := L#0;
CMP_V2 := L#0;
A_BIT0_0 := FALSE;
TFB := FALSE;
A_BIT0_2 := FALSE;
A_BIT0_3 := FALSE;
A_BIT0_4 := FALSE;
A_BIT0_5 := FALSE;
A_BIT0_6 := FALSE;
A_BIT0_7 := FALSE;
ENSET_UP := FALSE;
ENSET_DN := FALSE;
A_BIT1_2 := FALSE;
A_BIT1_3 := FALSE;
A_BIT1_4 := FALSE;
A_BIT1_5 := FALSE;
A_BIT1_6 := FALSE;
A_BIT1_7 := FALSE;
CTRL_DQ0 := FALSE;
CTRL_DQ1 := FALSE;
A_BIT2_2 := FALSE;
A_BIT2_3 := FALSE;
A_BIT2_4 := FALSE;
A_BIT2_5 := FALSE;
A_BIT2_6 := FALSE;
A_BIT2_7 := FALSE;
A_BIT3_0 := FALSE;
A_BIT3_1 := FALSE;
A_BIT3_2 := FALSE;
A_BIT3_3 := FALSE;
A_BIT3_4 := FALSE;
A_BIT3_5 := FALSE;
A_BIT3_6 := FALSE;
A_BIT3_7 := FALSE;
LATCH_LOAD := L#0;
ACT_CNTV := L#0;
DA_ERR_W := W#16#0;
OT_ERR_B := B#16#0;
E_BIT0_0 := FALSE;
STS_TFB := FALSE;
E_BIT0_2 := FALSE;
E_BIT0_3 := FALSE;
DATA_ERR := FALSE;
E_BIT0_5 := FALSE;
E_BIT0_6 := FALSE;
PARA := FALSE;
E_BYTE_0 := B#16#0;
STS_RUN := FALSE;
STS_DIR := FALSE;
STS_ZERO := FALSE;
STS_OFLW := FALSE;
STS_UFLW := FALSE;
STS_SYNC := FALSE;
STS_GATE := FALSE;
STS_SW_G := FALSE;
STS_SET := FALSE;
E_BIT2_1 := FALSE;
STS_STA := FALSE;
STS_STP := FALSE;
STS_CMP1 := FALSE;
STS_CMP2 := FALSE;
E_BIT2_6 := FALSE;
E_BIT2_7 := FALSE;
E_BIT3_0 := FALSE;
E_BIT3_1 := FALSE;
E_BIT3_2 := FALSE;
E_BIT3_3 := FALSE;
E_BIT3_4 := FALSE;
E_BIT3_5 := FALSE;
E_BIT3_6 := FALSE;
E_BIT3_7 := FALSE;
ACT_CMP1 := L#0;
ACT_CMP2 := L#0;
MDL_DEFECT := FALSE;
INT_FAULT := FALSE;
EXT_FAULT := FALSE;
PNT_INFO := FALSE;
EXT_VOLTAGE := FALSE;
FLD_CONNCTR := FALSE;
NO_CONFIG := FALSE;
CONFIG_ERR := FALSE;
MDL_TYPE := B#16#0;
SUB_MDL_ERR := FALSE;
COMM_FAULT := FALSE;
MDL_STOP := FALSE;
WTCH_DOG_FLT := FALSE;
INT_PS_FLT := FALSE;
PRIM_BATT_FLT := FALSE;
BCKUP_BATT_FLT := FALSE;
RESERVED_2 := FALSE;
RACK_FLT := FALSE;
PROC_FLT := FALSE;
EPROM_FLT := FALSE;
RAM_FLT := FALSE;
ADU_FLT := FALSE;
FUSE_FLT := FALSE;
HW_INTR_FLT := FALSE;
RESERVED_3 := FALSE;
CH_TYPE := B#16#0;
LGTH_DIA := B#16#0;
CH_NO := B#16#0;
GRP_ERR1 := FALSE;
GRP_ERR2 := FALSE;
D_BIT7_2 := FALSE;
D_BIT7_3 := FALSE;
D_BIT7_4 := FALSE;
D_BIT7_5 := FALSE;
D_BIT7_6 := FALSE;
D_BIT7_7 := FALSE;
CH1_SIGA := FALSE;
CH1_SIGB := FALSE;
CH1_SIGZ := FALSE;
CH1_BETW := FALSE;
CH1_5V2 := FALSE;
D_BIT8_5 := FALSE;
D_BIT8_6 := FALSE;
D_BIT8_7 := FALSE;
D_BYTE9 := B#16#0;
CH2_SIGA := FALSE;
CH2_SIGB := FALSE;
CH2_SIGZ := FALSE;
CH2_BETW := FALSE;
CH2_5V2 := FALSE;
D_BIT10_5 := FALSE;
D_BIT10_6 := FALSE;
D_BIT10_7 := FALSE;
D_BYTE11 := B#16#0;
D_BYTE12 := B#16#0;
D_BYTE13 := B#16#0;
D_BYTE14 := B#16#0;
D_BYTE15 := B#16#0;
END_DATA_BLOCK
FUNCTION FC 450 : VOID
TITLE =COUNTER MODULE CONTROL
AUTHOR : FM
FAMILY : FM_CNT_1
NAME : CNT_CTRL
VERSION : 3.0
VAR_INPUT
DB_NO : INT ; // module datablock number
SW_GATE : BOOL ; // software gate
GATE_STP : BOOL ; // gate stop
OT_ERR_A : BOOL ; // operator error acknowledge
END_VAR
VAR_OUTPUT
OT_ERR : BOOL ; // operator error
END_VAR
VAR_IN_OUT
L_DIRECT : BOOL ; // load direct
L_PREPAR : BOOL ; // load prepared
T_CMP_V1 : BOOL ; // transfer comparator value 1
T_CMP_V2 : BOOL ; // transfer comparator value 2
RES_SYNC : BOOL ; // reset synchronisation bit
RES_ZERO : BOOL ; // reset zero crossing bit
END_VAR
VAR_TEMP
dbnr : WORD ; // DB-Nr. als Lokaldatum
rett_dbnr : WORD ; // Nummer des DB, der beim Aufruf des FC gerade offen war (von AWL benutzt)
END_VAR
BEGIN
NETWORK
TITLE =
// Zuordnung Parameter <==> DB Bit
//
// OT_ERR_A = A_BIT0_3 Bedienfehler quittieren
// NEUSTQ = A_BIT0_6 Neustart quittieren
// GATE_STP = A_BIT1_2 Torstopp
// SW_GATE = A_BIT1_3 SW-Tor Start/Stopp
// L_DIRECT = A_BIT3_0 Zähler mit Loadwert laden
// L_PREPAR = A_BIT3_1 Loadwert ins Loadregister
// T_CMP_V1 = A_BIT3_2 Vergleichswert 2 übernehmen
// T_CMP_V2 = A_BIT3_3 Vergleichswert 1 übernehmen
// RES_SYNC = A_BIT3_4 Synchronisationsbit rücksetzen
// RES_ZERO = A_BIT3_5 Nulldurchgangsbit rücksetzen
// OT_ERR = E_BIT0_3 Bedienfehler
// FM-NEUSTQ = E_BIT0_5 FM-Neustart quittiert
// FM-NEUST = E_BIT0_6 FM-Neustart
// E_BIT3_0 Loadwert in Zähler übernommen
// E_BIT3_1 Loadwert ins Loadregister übernommen
// E_BIT3_2 Vergleichswert 1 übernommen
// E_BIT3_3 Vergleichswert 2 übernommen
// E_BIT3_4 Synchronisationsbit gelöscht
// E_BIT3_5 Nulldurchgangsbit gelöscht
//
//
// ************************************************************************
// Rueckmeldungen in der Instanz durch Lesen von der FM aktualisieren
// ************************************************************************
SET ;
SAVE ; // BIE fest auf 1 !!!
L #DB_NO; // Übergebene Nummer in dbnr zwischenspeichern
T #dbnr;
L DBNO; // Lade Nummer Global-DB in AKKU 1
T #rett_dbnr; // und rette sie in rett_dbnr
AUF DB [#dbnr]; // öffne Kanal-DB mit übergebener Nummer
TAR1 DBD 0; // Adressregister 1 retten
L DBD 8; // (CH_ADR) Kanalanfangsadresse
LAR1 ; // in das Adressregister 1
L PED [AR1,P#8.0]; // Datenfehler, Bedienfehler und Koordinierungsbyte
T DBD 38;
U DBX 41.6; // FM-NEUST (E_BIT0_6)
UN DBX 41.5; // FM-NEUSTQ (E_BIT0_5)
= DBX 26.6; // NEUSTQ (A_BIT0_6)
SPBN OK; // Kein Neustart
L DW#16#40000000; // Koordinierungsbyte schreiben
T PAD [AR1,P#12.0]; // und Steuerbits löschen
L B#16#0;
T DBB 4; // (FP) Flankenmerker löschen
SPA END; // und Baustein verlassen
OK: L PED [AR1,P#0.0]; // (ACT_LOAD) Loadwert in die Instanz
T DBD 30;
L PED [AR1,P#4.0]; // (ACT_CNTV) Zaehlstand in die Instanz
T DBD 34;
L PED [AR1,P#12.0]; // Reserve und Statusbytes
T DBD 42;
L DBB 12; // (U_D_LGTH) 16 : S7-300, 32 : S7-400
L B#16#20;
<I ; // Wenn kleiner : Keine Vergleichswerte lesen
SPB L1;
L PED [AR1,P#16.0]; // Aktueller Vergleichswert 1
T DBD 46; // (ACT_CMP1)
L PED [AR1,P#20.0]; // Aktueller Vergleichswert 2
T DBD 50; // (ACT_CMP2)
// ***********************************************************************
// FB-Steuer-Parameter Bitweise in den Instanz-Datenbaustein übertragen
// ***********************************************************************
// Zähler mit Loadwert laden
L1: U #L_DIRECT; // FB-Parameter einlesen
FP DBX 4.0; // 1. Anstoß
S DBX 29.0; // (A_BIT3_0) Steuernsignal setzen
U DBX 45.0; // (E_BIT3_0) Rückmeldung erhalten
R DBX 29.0; // (A_BIT3_0) Steuersignal löschen
UN DBX 45.0; // (E_BIT3_0) Bearbeitung fertig
UN DBX 29.0; // (A_BIT3_0)
R #L_DIRECT; // FB-Parameter löschen
R DBX 4.0; // Merker 1. Anstoß löschen
// Loadwert ins Loadregister
U #L_PREPAR; // FB-Parameter einlesen
FP DBX 4.1; // 1. Anstoß
S DBX 29.1; // (A_BIT3_1) Steuernsignal setzen
U DBX 45.1; // (E_BIT3_1) Rückmeldung erhalten
R DBX 29.1; // (A_BIT3_1) Steuersignal löschen
UN DBX 45.1; // (E_BIT3_1) Bearbeitung fertig
UN DBX 29.1; // (A_BIT3_1)
R #L_PREPAR; // FB-Parameter löschen
R DBX 4.1; // Merker 1. Anstoß löschen
// Vergleichswert 1 übernehmen
U #T_CMP_V1; // FB-Parameter einlesen
FP DBX 4.2; // 1. Anstoß
S DBX 29.2; // (A_BIT3_2) Steuernsignal setzen
U DBX 45.2; // (E_BIT3_2) Rückmeldung erhalten
R DBX 29.2; // (A_BIT3_2) Steuersignal löschen
UN DBX 45.2; // (E_BIT3_2) Bearbeitung fertig
UN DBX 29.2; // (A_BIT3_2)
R #T_CMP_V1; // FB-Parameter löschen
R DBX 4.2; // Merker 1. Anstoß löschen
// Vergleichswert 2 übernehmen
U #T_CMP_V2; // FB-Parameter einlesen
FP DBX 4.3; // 1. Anstoß
S DBX 29.3; // (A_BIT3_3) Steuernsignal setzen
U DBX 45.3; // (E_BIT3_3) Rückmeldung erhalten
R DBX 29.3; // (A_BIT3_3) Steuersignal löschen
UN DBX 45.3; // (E_BIT3_3) Bearbeitung fertig
UN DBX 29.3; // (A_BIT3_3)
R #T_CMP_V2; // FB-Parameter löschen
R DBX 4.3; // Merker 1. Anstoß löschen
// Synchronisationsbit rücksetzen
U #RES_SYNC; // FB-Parameter einlesen
FP DBX 4.4; // 1. Anstoß
S DBX 29.4; // (A_BIT3_4) Steuernsignal setzen
U DBX 45.4; // (E_BIT3_4) Rückmeldung erhalten
R DBX 29.4; // (A_BIT3_4) Steuersignal löschen
UN DBX 45.4; // (E_BIT3_4) Bearbeitung fertig
UN DBX 29.4; // (A_BIT3_4)
R #RES_SYNC; // FB-Parameter löschen
R DBX 4.4; // Merker 1. Anstoß löschen
// Nulldurchgangsbit rücksetzen
U #RES_ZERO; // FB-Parameter einlesen
FP DBX 4.5; // 1. Anstoß
S DBX 29.5; // (A_BIT3_5) Steuernsignal setzen
U DBX 45.5; // (E_BIT3_5) Rückmeldung erhalten
R DBX 29.5; // (A_BIT3_5) Steuersignal löschen
UN DBX 45.5; // (E_BIT3_5) Bearbeitung fertig
UN DBX 29.5; // (A_BIT3_5)
R #RES_ZERO; // FB-Parameter löschen
R DBX 4.5; // Merker 1. Anstoß löschen
// Tor Steuerung
U #GATE_STP; // Torstopp
= DBX 27.2; // (A_BIT1_2) Steuern Zähler
U #SW_GATE; // SW-Tor Start/Stopp
= DBX 27.3; // (A_BIT1_3) Steuern Zähler
// Bedienfehler Bearbeitung
U DBX 41.3; // (E_BIT0_3) Status Bedienfehler
= #OT_ERR; // am FB-Parameter mitteilen
U #OT_ERR_A; // Fehler quittieren
= DBX 26.3; // (A_BIT0_3)
// ************************************************************************
// Der Load- und die Vergleichswerte zur FM transferieren
// ************************************************************************
L DBD 14; // (LOAD_VAL) Loadwert in Steuerschnittstelle
T PAD [AR1,P#0.0];
L DBD 18; // (CMP_V1) Vergleichswert 1 in Steuerschnittstelle
T PAD [AR1,P#4.0];
L DBD 22; // (CMP_V2) Vergleichswert 2 in Steuerschnittstelle
T PAD [AR1,P#8.0];
// ************************************************************************
// Das Koordinierungs- und die Steuerbytes zur FM transferieren
// ************************************************************************
L DBD 26; // Doppelwort mit den Koord.- und Steuerbytes
T PAD [AR1,P#12.0];
END: LAR1 DBD 0; // Adressregister 1 laden
AUF DB [#rett_dbnr]; // alten vor Aufruf geöffneten DB wieder öffnen
BE ;
END_FUNCTION
FUNCTION FC 1 : VOID
TITLE =Allgemeine Funktionen
AUTHOR : EMPGK
FAMILY : ALLGFKT
NAME : AUFALLG
VERSION : 0.1
BEGIN
NETWORK
TITLE =Null-Merker
U "M1.0";
R "M1.0";
NETWORK
TITLE =Eins-Merker
UN "M1.1";
S "M1.1";
END_FUNCTION
FUNCTION_BLOCK FB 450
TITLE =
//
AUTHOR : 'EMP/SZ'
VERSION : 0.1
VAR
TOR_STOP : BOOL ; //TOR stoppen
FEHL_QUIT : BOOL ; //Bedienfehler quittieren
BEDIEN_FEHLER : BOOL ; //Bedienfehler aufgetreten
LADE_INDIREKT : BOOL ; //Neuen Zählerwert vorbereiten
VERGL1_LADEN : BOOL ; //Neuen Vergleichswert 1 laden
VERGL2_LADEN : BOOL ; //Neuen Vergleichswert 2 laden
RES_SYNCHRO : BOOL ; //Statusbit Synchronisation löschen
RES_NULL : BOOL ; //Statusbit Nulldurchgang löschen
TP_1 : "TP";
Q_1 : BOOL ;
P_1 : BOOL ;
N_1 : BOOL ;
Anfang : DINT ; //Zählerstand für Geschwindigkeit
Ende : DINT ; //Zählerstand für Geschwindigkeit
FP_L_DIREKT_Zaeler : BOOL ;
LADE_DIREKT_Zaeler : BOOL ;
Frequenz : DINT ;
Drehzahl : DINT ;
Material_Geschw : REAL ; //Statischer <merker <maschinengeschwinigkeit
END_VAR
VAR_TEMP
t_Real : REAL ;
t_Time : TIME ;
t_Dint : DINT ;
END_VAR
BEGIN
NETWORK
TITLE =Störung Zähler Quittieren
U "E0.0";
= #FEHL_QUIT;
NETWORK
TITLE =Impuls 1s
UN #Q_1;
= L 12.0;
BLD 103;
CALL #TP_1 (
IN := L 12.0,
PT := T#1S,
Q := #Q_1,
ET := #t_Time);
NOP 0;
NETWORK
TITLE =Anstoß der Funktion "Direktes Laden" in Adresse "952"
//Der Zähler wird auf Null zurückgesetzt.
//DB451.DBD14 = 0 (load value)
U "E0.1";
FP #FP_L_DIREKT_Zaeler;
= #LADE_DIREKT_Zaeler;
NETWORK
TITLE =Zählerbaugruppe Adresse "952" Kanal-1 Geschwindigkeit
U "M1.1";
= L 12.0;
BLD 103;
U #TOR_STOP;
= L 12.1;
BLD 103;
U #FEHL_QUIT;
= L 12.2;
BLD 103;
CALL FC 450 (
DB_NO := 455,
SW_GATE := L 12.0,
GATE_STP := L 12.1,
OT_ERR_A := L 12.2,
OT_ERR := #BEDIEN_FEHLER,
L_DIRECT := #LADE_DIREKT_Zaeler,
L_PREPAR := #LADE_INDIREKT,
T_CMP_V1 := #VERGL1_LADEN,
T_CMP_V2 := #VERGL2_LADEN,
RES_SYNC := #RES_SYNCHRO,
RES_ZERO := #RES_NULL);
NOP 0;
NETWORK
TITLE =
U #Q_1;
FP #P_1;
SPBNB _001;
L DB455.DBD 34;
T #Anfang;
_001: NOP 0;
NETWORK
TITLE =Frequenz 1/s
U( ;
U #Q_1;
FN #N_1;
SPBNB _002;
L DB455.DBD 34;
T #Ende;
SET ;
SAVE ;
CLR ;
_002: U BIE;
) ;
SPBNB _003;
L #Ende;
L #Anfang;
-D ;
T #Frequenz;
_003: NOP 0;
NETWORK
TITLE =Drehzahl U/min
//Inkremental Geber 1000Imp/U ---> U/min = f x 60 /1000
U( ;
L #Frequenz;
L L#60;
*D ;
T #t_Dint;
UN OV;
SAVE ;
CLR ;
U BIE;
) ;
SPBNB _004;
L #t_Dint;
L L#1000;
/D ;
T #Drehzahl;
_004: NOP 0;
NETWORK
TITLE =Material Geschwindigkeit m/min
// Walzenumfang = 245,0 mm
//m/min = D x 0.245
U( ;
L #Drehzahl;
DTR ;
T #t_Real;
SET ;
SAVE ;
CLR ;
U BIE;
) ;
SPBNB _005;
L #t_Real;
L 2.450000e-001;
*R ;
T #Material_Geschw;
_005: NOP 0;
NETWORK
TITLE =Zählerbaugruppe Adresse "952" Kanal-2 Reserve
U "M1.0";
= L 12.0;
BLD 103;
U #TOR_STOP;
= L 12.1;
BLD 103;
U #FEHL_QUIT;
= L 12.2;
BLD 103;
CALL FC 450 (
DB_NO := 456,
SW_GATE := L 12.0,
GATE_STP := L 12.1,
OT_ERR_A := L 12.2,
OT_ERR := #BEDIEN_FEHLER,
L_DIRECT := "M1.0",
L_PREPAR := #LADE_INDIREKT,
T_CMP_V1 := #VERGL1_LADEN,
T_CMP_V2 := #VERGL2_LADEN,
RES_SYNC := #RES_SYNCHRO,
RES_ZERO := #RES_NULL);
NOP 0;
END_FUNCTION_BLOCK
DATA_BLOCK DB 450
TITLE =
AUTHOR : 'EMP/SZ'
VERSION : 0.0
FB 450
BEGIN
TOR_STOP := FALSE;
FEHL_QUIT := FALSE;
BEDIEN_FEHLER := FALSE;
LADE_INDIREKT := FALSE;
VERGL1_LADEN := FALSE;
VERGL2_LADEN := FALSE;
RES_SYNCHRO := FALSE;
RES_NULL := FALSE;
TP_1.IN := FALSE;
TP_1.PT := T#0MS;
TP_1.Q := FALSE;
TP_1.ET := T#0MS;
TP_1.STATE := B#16#0;
TP_1.STIME := T#0MS;
TP_1.ATIME := T#0MS;
Q_1 := FALSE;
P_1 := FALSE;
N_1 := FALSE;
Anfang := L#0;
Ende := L#0;
FP_L_DIREKT_Zaeler := FALSE;
LADE_DIREKT_Zaeler := FALSE;
Frequenz := L#0;
Drehzahl := L#0;
Material_Geschw := 0.000000e+000;
END_DATA_BLOCK
ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1
VAR_TEMP
OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ; //Priority of OB Execution
OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =Allgemeine Programmfunktionen
CALL FC 1 ;
NETWORK
TITLE =Zählerkarte und Anzeigen vor ORT (PROFIBUS)
CALL FB 450 , DB 450 ;
END_ORGANIZATION_BLOCK
ORGANIZATION_BLOCK OB 100
TITLE = "Complete Restart"
VERSION : 0.1
VAR_TEMP
OB100_EV_CLASS : BYTE ; //16#13, Event class 1, Entering event state, Event logged in diagnostic buffer
OB100_STRTUP : BYTE ; //16#81/82/83/84 Method of startup
OB100_PRIORITY : BYTE ; //Priority of OB Execution
OB100_OB_NUMBR : BYTE ; //100 (Organization block 100, OB100)
OB100_RESERVED_1 : BYTE ; //Reserved for system
OB100_RESERVED_2 : BYTE ; //Reserved for system
OB100_STOP : WORD ; //Event that caused CPU to stop (16#4xxx)
OB100_STRT_INFO : DWORD ; //Information on how system started
OB100_DATE_TIME : DATE_AND_TIME ; //Date and time OB100 started
END_VAR
BEGIN
NETWORK
TITLE =Zählerbaugruppe Adresse "512" Kanal-1 Geschwindigkeit
U( ;
U( ;
L 512;
T DB455.DBW 6;
SET ;
SAVE ;
CLR ;
U BIE;
) ;
SPBNB _001;
L P#512.0;
T DB455.DBD 8;
SET ;
SAVE ;
CLR ;
_001: U BIE;
) ;
SPBNB _002;
L 32;
T DB455.DBB 12;
_002: NOP 0;
NETWORK
TITLE =Zählerbaugruppe Adresse "512" Kanal-2 Reserve
U( ;
U( ;
L 512;
T DB456.DBW 6;
SET ;
SAVE ;
CLR ;
U BIE;
) ;
SPBNB _003;
L P#544.0;
T DB456.DBD 8;
SET ;
SAVE ;
CLR ;
_003: U BIE;
) ;
SPBNB _004;
L 32;
T DB456.DBB 12;
_004: NOP 0;
END_ORGANIZATION_BLOCK
Programmiersprache: Simatic STEP7 v5.3
CPU: 417-4 H
Vielen Dank im Voraus.