Bernard
Level-2
- Beiträge
- 205
- Reaktionspunkte
- 53
-> Hier kostenlos registrieren
Hallo liebes Forum,
vielleicht hat jemand Lust den von mir erstellten FB querzuprüfen.
Viel Augen sehen mehr als Zwei !.
Problembeschreibung:
Wenn im einem DB sich eine Information ändert,soll ein Controll FB einen z.yklischen Impuls ausgeben
FB und Aufruf im OB1 hängen als AWL_Quelle an.
Datenbausteine sind selbst zu bauen.
AWL_Quelle OB1:
ORGANIZATION_BLOCK "CYCL_EXC"
TITLE = "Main Program Sweep (Cycle)"
//Bausteinbeschreibung fb 2 "datenvergleicher_DB"
//
//Ändert sich im DB 4 eine Information,gibt der FB einen Impuls aus.
//DB5 wird Verwendet um den Altzustandsspeicher des DB4 zurealisieren.
//Vorgaben für die DB`s: gleiche Grösse
//
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 =
//Bedeutung von Ret_Val_fb
//w#16#0=OK
//w#16#8000=ungültige DB Nummern z.b. negativ
//w#16#8001=beide DB`S indentische Nummer
//w#16#8002=Fehler beide DB`s ungleiche Datenbausteinlänge
CALL "datenvergleicher_DB" , DB 44 (
DBNR := 4,//Angabe in Integer welcher DB Überwacht werden soll
DBNR_alt_Info := 5,//Angabe in Integer welcher DB als Altzustandsspeicher verwendet werden soll
Impuls_Unterscheidung := "Aenderungungsimpuls",// 1 als Impuls bedeuted Imformation hat sich geändert
Ret_Val_FB := MW 22);//w#16#0=OK,w#16#8000=ungültige DB Nummern z.b. negativ,w#16#8001=beide DB`S indentische Nummer,w#16#8002=Fehler beide DB`s ungleiche Datenbausteinlänge
NETWORK
TITLE =Einfangen des Änderungsimpuls
U "Aenderungungsimpuls";
S "Impulsfangbit"; //Impulsfänger
U "Reset_Impulsfang_bit";
R "Impulsfangbit";
END_ORGANIZATION_BLOCK
FB Quelle
FUNCTION_BLOCK "datenvergleicher_DB"
TITLE =
VERSION : 0.1
VAR_INPUT
DBNR : INT ; //Gibt sie Nr. des zu überprüfenden DB`s an
DBNR_alt_Info : INT ; //Speicher DB für Altinformation von DBNR,gleiche Grösse wie DBNR
END_VAR
VAR_OUTPUT
Impuls_Unterscheidung : BOOL ; //1=Impuls Unterscheidung
Ret_Val_FB : WORD ; //w#16#0=ok,w#16#800x=fehler
END_VAR
VAR
Unterscheidung : BOOL ; //1=aktiv
END_VAR
VAR_TEMP
DBNR_t : INT ;
DBNR_alt_Info_t : INT ;
Ret_Val_FB_t : WORD ;
schleife : INT ;
Pointer_Word : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =Dateninformation der DB`s auf Fehler überprüfen
L #DBNR; //Datenbaustein NR:-Übergabe an Lokal zur Indrekten Adressierung
T #DBNR_t;
L #DBNR_alt_Info;
T #DBNR_alt_Info_t;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
L W#16#0; //Fehlerkennung auf null setzten
T #Ret_Val_FB_t;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
L #DBNR; //Vergleichen auf negative db Nummern,wenn <1=Fehler_0
L 1;
<I ;
SPB Feh0;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CLR ; //Vke=0 für Vergleicher
L #DBNR_alt_Info;
L 1;
<I ;
SPB Feh0;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
L #DBNR_t; //Vergleichen auf ungleiche db Nummern,wenn gleich=Fehler_1
L #DBNR_alt_Info_t;
==I ;
SPB Feh1;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
AUF DB [#DBNR_alt_Info_t]; //Vergleichen der Datenlänge beider DB`s,wenn ungleich=Fehler_2
L DBLG;
AUF DB [#DBNR_t];
L DBLG;
<>I ;
SPB Feh2;
NETWORK
TITLE =Auswertung ob Information in DBNR sich geändert hat
L P#0.0; //Vorbelegung des word Pointers mit p#0.0
T #Pointer_Word;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
AUF DB [#DBNR_t]; //öffnen eines Datenbausteines
L DBLG; // errechnung der Datenbausteinlänge in Byte
L 2; //Umrechnung in Word
/D ; //Division in D da Intergrenze überschritten werden kann,nach division Integer ausreichend
nex1: T #schleife; //Vorspannen der Anzahl Schleifendurchläufe
AUF DB [#DBNR_alt_Info_t];
L DBW [#Pointer_Word]; //Lade Word aus Altzustand DBNR
AUF DB [#DBNR_t];
L DBW [#Pointer_Word]; //Lade Word aus überwachenden DBNR
XOW ; //Unterscheidung auf Gleichheit (exklusiv oder word)
L 0;
<>I ;
SPBN spin; //wenn gleich dann springe
SET ; //1=unterscheidung vorhanden
S #Unterscheidung;
CLR ; //vke=0
spin: AUF DB [#DBNR_t]; //Übergebe DBNR wordinformation an Altwert
L DBW [#Pointer_Word];
AUF DB [#DBNR_alt_Info_t];
T DBW [#Pointer_Word];
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
L P#2.0; //Pointererhöhung für nächste Schleife
L #Pointer_Word;
+D ;
T #Pointer_Word;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
L #schleife; //Rücksprung in Schleife wenn nicht alle DB-Wörter bearbeiteten wurden
LOOP nex1;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
NETWORK
TITLE =Impulausgabe DB Veränderung Vorhanden
CLR ; //vke=0
U #Unterscheidung;
= #Impuls_Unterscheidung; //Impulsausgabe bit=1 Unterscheidung Vorhanden
CLR ;
= #Unterscheidung;
NETWORK
TITLE =fehlerauswertung
SPA End1;
Feh0: NOP 0;
L W#16#8000; //Fehler ungültige Datenbaustein Nummern
L #Ret_Val_FB_t;
+D ;
T #Ret_Val_FB_t;
SPA End1;
Feh1: L W#16#8001; //Fehler beide DB`s gleiche Datenbaustein Nummer
L #Ret_Val_FB_t;
+D ;
T #Ret_Val_FB_t;
SPA End1;
Feh2: L W#16#8002; //Fehler beide DB`s ungleiche Datenbaustein Länge
L #Ret_Val_FB_t;
+D ;
T #Ret_Val_FB_t;
End1: L #Ret_Val_FB_t; //Zustandsausgabe Lokal nach OUT
T #Ret_Val_FB;
NETWORK
TITLE =ENO Bearbeitung,kein Fehler ENO=1
L #Ret_Val_FB_t;
L W#16#0;
==I ;
SPB m002;
CLR ;
SAVE ;
SPA ende;
m002: SET ;
SAVE ;
CLR ; //vke Bereinigung
ende: NOP 0;
END_FUNCTION_BLOCK
vielleicht hat jemand Lust den von mir erstellten FB querzuprüfen.
Viel Augen sehen mehr als Zwei !.
Problembeschreibung:
Wenn im einem DB sich eine Information ändert,soll ein Controll FB einen z.yklischen Impuls ausgeben
FB und Aufruf im OB1 hängen als AWL_Quelle an.
Datenbausteine sind selbst zu bauen.
AWL_Quelle OB1:
ORGANIZATION_BLOCK "CYCL_EXC"
TITLE = "Main Program Sweep (Cycle)"
//Bausteinbeschreibung fb 2 "datenvergleicher_DB"
//
//Ändert sich im DB 4 eine Information,gibt der FB einen Impuls aus.
//DB5 wird Verwendet um den Altzustandsspeicher des DB4 zurealisieren.
//Vorgaben für die DB`s: gleiche Grösse
//
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 =
//Bedeutung von Ret_Val_fb
//w#16#0=OK
//w#16#8000=ungültige DB Nummern z.b. negativ
//w#16#8001=beide DB`S indentische Nummer
//w#16#8002=Fehler beide DB`s ungleiche Datenbausteinlänge
CALL "datenvergleicher_DB" , DB 44 (
DBNR := 4,//Angabe in Integer welcher DB Überwacht werden soll
DBNR_alt_Info := 5,//Angabe in Integer welcher DB als Altzustandsspeicher verwendet werden soll
Impuls_Unterscheidung := "Aenderungungsimpuls",// 1 als Impuls bedeuted Imformation hat sich geändert
Ret_Val_FB := MW 22);//w#16#0=OK,w#16#8000=ungültige DB Nummern z.b. negativ,w#16#8001=beide DB`S indentische Nummer,w#16#8002=Fehler beide DB`s ungleiche Datenbausteinlänge
NETWORK
TITLE =Einfangen des Änderungsimpuls
U "Aenderungungsimpuls";
S "Impulsfangbit"; //Impulsfänger
U "Reset_Impulsfang_bit";
R "Impulsfangbit";
END_ORGANIZATION_BLOCK
FB Quelle
FUNCTION_BLOCK "datenvergleicher_DB"
TITLE =
VERSION : 0.1
VAR_INPUT
DBNR : INT ; //Gibt sie Nr. des zu überprüfenden DB`s an
DBNR_alt_Info : INT ; //Speicher DB für Altinformation von DBNR,gleiche Grösse wie DBNR
END_VAR
VAR_OUTPUT
Impuls_Unterscheidung : BOOL ; //1=Impuls Unterscheidung
Ret_Val_FB : WORD ; //w#16#0=ok,w#16#800x=fehler
END_VAR
VAR
Unterscheidung : BOOL ; //1=aktiv
END_VAR
VAR_TEMP
DBNR_t : INT ;
DBNR_alt_Info_t : INT ;
Ret_Val_FB_t : WORD ;
schleife : INT ;
Pointer_Word : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =Dateninformation der DB`s auf Fehler überprüfen
L #DBNR; //Datenbaustein NR:-Übergabe an Lokal zur Indrekten Adressierung
T #DBNR_t;
L #DBNR_alt_Info;
T #DBNR_alt_Info_t;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
L W#16#0; //Fehlerkennung auf null setzten
T #Ret_Val_FB_t;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
L #DBNR; //Vergleichen auf negative db Nummern,wenn <1=Fehler_0
L 1;
<I ;
SPB Feh0;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CLR ; //Vke=0 für Vergleicher
L #DBNR_alt_Info;
L 1;
<I ;
SPB Feh0;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
L #DBNR_t; //Vergleichen auf ungleiche db Nummern,wenn gleich=Fehler_1
L #DBNR_alt_Info_t;
==I ;
SPB Feh1;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
AUF DB [#DBNR_alt_Info_t]; //Vergleichen der Datenlänge beider DB`s,wenn ungleich=Fehler_2
L DBLG;
AUF DB [#DBNR_t];
L DBLG;
<>I ;
SPB Feh2;
NETWORK
TITLE =Auswertung ob Information in DBNR sich geändert hat
L P#0.0; //Vorbelegung des word Pointers mit p#0.0
T #Pointer_Word;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
AUF DB [#DBNR_t]; //öffnen eines Datenbausteines
L DBLG; // errechnung der Datenbausteinlänge in Byte
L 2; //Umrechnung in Word
/D ; //Division in D da Intergrenze überschritten werden kann,nach division Integer ausreichend
nex1: T #schleife; //Vorspannen der Anzahl Schleifendurchläufe
AUF DB [#DBNR_alt_Info_t];
L DBW [#Pointer_Word]; //Lade Word aus Altzustand DBNR
AUF DB [#DBNR_t];
L DBW [#Pointer_Word]; //Lade Word aus überwachenden DBNR
XOW ; //Unterscheidung auf Gleichheit (exklusiv oder word)
L 0;
<>I ;
SPBN spin; //wenn gleich dann springe
SET ; //1=unterscheidung vorhanden
S #Unterscheidung;
CLR ; //vke=0
spin: AUF DB [#DBNR_t]; //Übergebe DBNR wordinformation an Altwert
L DBW [#Pointer_Word];
AUF DB [#DBNR_alt_Info_t];
T DBW [#Pointer_Word];
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
L P#2.0; //Pointererhöhung für nächste Schleife
L #Pointer_Word;
+D ;
T #Pointer_Word;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
L #schleife; //Rücksprung in Schleife wenn nicht alle DB-Wörter bearbeiteten wurden
LOOP nex1;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
NETWORK
TITLE =Impulausgabe DB Veränderung Vorhanden
CLR ; //vke=0
U #Unterscheidung;
= #Impuls_Unterscheidung; //Impulsausgabe bit=1 Unterscheidung Vorhanden
CLR ;
= #Unterscheidung;
NETWORK
TITLE =fehlerauswertung
SPA End1;
Feh0: NOP 0;
L W#16#8000; //Fehler ungültige Datenbaustein Nummern
L #Ret_Val_FB_t;
+D ;
T #Ret_Val_FB_t;
SPA End1;
Feh1: L W#16#8001; //Fehler beide DB`s gleiche Datenbaustein Nummer
L #Ret_Val_FB_t;
+D ;
T #Ret_Val_FB_t;
SPA End1;
Feh2: L W#16#8002; //Fehler beide DB`s ungleiche Datenbaustein Länge
L #Ret_Val_FB_t;
+D ;
T #Ret_Val_FB_t;
End1: L #Ret_Val_FB_t; //Zustandsausgabe Lokal nach OUT
T #Ret_Val_FB;
NETWORK
TITLE =ENO Bearbeitung,kein Fehler ENO=1
L #Ret_Val_FB_t;
L W#16#0;
==I ;
SPB m002;
CLR ;
SAVE ;
SPA ende;
m002: SET ;
SAVE ;
CLR ; //vke Bereinigung
ende: NOP 0;
END_FUNCTION_BLOCK