Prüfung eines FB`s der auf Änderung im DB Impus erzeugt

Bernard

Level-2
Beiträge
205
Reaktionspunkte
53
Zuviel Werbung?
-> 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
 
Bisher selbst keinen Fehler gefunden,
aber was heißt das Schon.
wäre dankbar für Rückmeldung auf gerüft Funktionalität
Also es ist schon mühsam einen Fehler zu suchen, wo vielleicht gar keiner ist. ;)
Wenn man so drüber fliegt, sieht man, dass Du alles schön getrennt und mit vielen Kommentaren versehen hast. Also im Programm schaut es sicher übersichtlich aus.
Das ist doch schon mal viel Wert.
Die Funktion kannst Du ja am besten testen, denn Du weißt ja was passieren soll und was nicht.
Ich glaube hier sagt keiner "Passt scho, rein damit in die Anlage". Ich kann mich aber auch täuschen. :rolleyes:
 
Hast du den FB auch mal mit einem DB getestet, der sehr groß ist, also z.Bsp. 16K? Kö

Testumgebung:
WINAC RTX 2008
DB4=48000 bit
Zyklusverlängerung ca.1-2 ms

Der eigentliche Problem besteht darin,eine dynamische Verbindung mittels MPI zwischen zwei SPSen zu erzeugen wenn eine Dateninformation in der Sende-SPS sich verändert hat.Der FB generiert mir den Verbindungsimpuls.
Daten:
SFC 65= Dynamischer Kommunikationsbaustein
DB=4=Datensammler
Der SFC 65 überträgt max. 76 byte,sodas selbst bei Kleinen SPSen keine Zykluszeitprobleme auftretten.
 
Hast du den FB auch mal mit einem DB getestet, der sehr groß ist, also z.Bsp. 16K? Kö

Testumgebung:
WINAC RTX 2008
DB4=48000 bit
Zyklusverlängerung ca.1-2 ms

Der eigentliche Problem besteht darin,eine dynamische Verbindung mittels MPI zwischen zwei SPSen zu erzeugen wenn eine Dateninformation in der Sende-SPS sich verändert hat.Der FB generiert mir den Verbindungsimpuls.
Daten:
SFC 65= Dynamischer Kommunikationsbaustein
DB=4=Datensammler
Der SFC 65 überträgt max. 76 byte,sodas selbst bei Kleinen SPSen keine Zykluszeitprobleme auftretten.
 
Zurück
Oben