Probleme mit Lokaldaten von FC

O

oliver2306

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich habe ein Proplem mit untenstehendem Code. Eigentlich dreht sich mein Problem nur um das letzte Netzwerk "Status Meldungen". Ich greife dort auf das gesamte Lokalbyte 1 zu, dessen Bits ich zuvor setze und tranferiere dessen Zustand in einen Datenbaustein. Wenn ich nun zuvor den Lokaldaten-Reset weglasse, habe ich immer falsche Werte die sich unbestimmt ändern. Dann habe ich das ganze mit Merkern getestet anstatt die Lokalbits zu verwenden und es funktioniert einwandfrei. Doch ich verwende diese Lokalbits und auch den Byte zugriff nur ein einziges mal pro Baustein. Die Lösung auf dieses Problem war dann die durchführung des Loakldaten-Resets wobei ich nicht weis warum ich dieses machen muß. Lokaldaten sind doch nur für den Zeitraum verfügbar in dem der Baustein bearbeitet wird. Ich hoffe mal das mir iener von euch da weiterhelfen kann. Schon mal danke im vorraus.

Code:
FUNCTION FC 81 : VOID
TITLE =Ein-/Ausschalten Pumpe 1
//Dieser Baustein erfüllt folgende Funktionen:
//1.Setzen des Lebensbit und Transferien des Resets
//2.Bilden der Ein- und Ausschaltbedingungen
//3.Pumpe 1 Ein- und Ausschalten
//4.Statusmeldungen für die Pumpe 1 bilden und Transferieren
AUTHOR : 
VERSION : 0.1


VAR_TEMP
  l_P1_EIN : BOOL ; //Pumpe 1 Einschalten
  l_P1_AUS : BOOL ; //Pumpe 1 Ausschalten
  l_Reserve0_1 : BOOL ; //Reserve
  l_Reserve0_2 : BOOL ; //Reserve
  l_Reserve0_3 : BOOL ; //Reserve
  l_Reserve0_4 : BOOL ; //Reserve
  l_Reserve0_5 : BOOL ; //Reserve
  l_Reserve0_6 : BOOL ; //Reserve
  l_P1_Status_Lauft : BOOL ;    //Status Pumpe 1 läuft
  l_P1_Status_Lauft_NOT : BOOL ;    //Status Pumpe 1 läuft im Notbetrieb
  l_P1_Status_Stoer : BOOL ;    //Status Pumpe 1 Störung
  l_P1_Status_Sperr : BOOL ;    //Status Pumpe 1 Gesperrt
  l_Reserve1_1 : BOOL ; //Reserve
  l_Reserve1_2 : BOOL ; //Reserve
  l_Reserve1_3 : BOOL ; //Reserve
  l_Reserve1_4 : BOOL ; //Reserve
END_VAR
BEGIN
NETWORK
TITLE =SPS Lebensüberwachung 
//Hier wird ein Watchdog Simuliert. Sobal der Simocode ein Low-Signal erkennt 
//(Stop oder Ausfall CPU) Schaltet er die Pumpe Aus.
      SET   ; 
      =     DB81.DBX   30.7; 

NETWORK
TITLE =Reset
//Quittierung von Störungen am Simocode.
//Dies geschieht duch Bedinung am MP370 oder Automatisch bei einem Neuanlauf der 
//CPU nach Netz-Wiederkehr.
      O     DB30.DBX   10.0; 
      O     DB30.DBX   80.2; 
      O     M    100.0; 
      =     DB81.DBX   30.6; 
NETWORK
TITLE =Störmeldung
//Eine Stoerung liegt vor wenn der Simocode eine Sammelstörung meldet oder das 
//"Ready" Signal fehlt.
      U(    ; 
      O     DB81.DBX    0.6; 
      ON    DB81.DBX    1.1; 
      )     ; 
      S     M     81.3; 
      U     DB81.DBX   30.6; 
      R     M     81.3; 
      NOP   0; 
NETWORK
TITLE =Einschaltbedingung Pumpe 1
//Die Einschaltbedingung ist erfüllt wenn für die Pumpe der
//ungesperrte Handbetrieb aktiv ist und über das MP370 eingeschaltet wird, oder 
//der Automatikbetrieb aktiv ist und das Einschaltniveau erreicht wurde.
//In beiden fällen darf das NOT-AUS Relais nicht betätigt sein.
      U(    ; 
      U     M      1.0; 
      UN    M      1.2; 
      U(    ; 
      U     DB30.DBX    0.3; 
      FP    M     81.0; 
      )     ; 
      O     ; 
      U     M      1.1; 
      U     M     20.1; 
      )     ; 
      U     E      2.6; 
      =     #l_P1_EIN; 
NETWORK
TITLE =Auschaltbedingung Pumpe 1
//Die Ausschaltbedingung ist erfüllt wenn für die Pumpe der
//ungesperrte Handbetrieb aktiv ist und über das MP370 ausgeschaltet wird, oder
//der Automatikbetrieb aktiv ist und das Ausschaltniveau erreicht wurde.
//Die Ausschalbedingung ist ebenfalls erfüllt wenn die Pumpe schon gesperrt ist 
//oder das NOT-AUS Relais angesprochen hat.
      U     M      1.0; 
      UN    M      1.2; 
      U(    ; 
      U     DB30.DBX    0.4; 
      FP    M     81.1; 
      )     ; 
      O     ; 
      U     M      1.1; 
      UN    M     20.1; 
      O     M      1.2; 
      ON    E      2.6; 
      =     #l_P1_AUS; 
NETWORK
TITLE =Pumpe einschalten
//Die Pumpe wird eingeschaltet wenn die Einschaltbedingung erfüllt ist oder der 
//Schwimmerschalter_Max angesprochen hat.
//Der Befehl "EIN" wird rückgesetzt wenn die Ausschaltbedingung erfüllt ist und 
//der Schwimmerschalter_Max nicht angesprochen hat,
//die Notsteuerung aktiv wird oder das NOT-AUS Relais betätigt wird oder eine 
//Störung der Pumpe vorliegt.
//Ist der Einschaltbefehl und der Handbetrieb aktiv wird der Status der Pumpe
//"Hand EIN" auf dem MP370 dargestellt.
      U(    ; 
      U(    ; 
      O     #l_P1_EIN; 
      O     E      2.4; 
      )     ; 
      S     DB81.DBX   30.2; 
      U(    ; 
      U     #l_P1_AUS; 
      UN    E      2.4; 
      ON    E      2.6; 
      O     M      1.3; 
      O     M     81.3; 
      )     ; 
      R     DB81.DBX   30.2; 
      U     DB81.DBX   30.2; 
      )     ; 
      U     M      1.0; 
      =     DB31.DBX    1.0; 
NETWORK
TITLE =Pumpe ausschalten
//Die Pumpe wird Ausgeschaltet wenn die Ausschaltbedingung erfüllt ist, das 
//NOT-AUS Relais betätigt wird, vom Notbetrieb zurückgeschaltet wird (nur wenn 
//vorher Handbetrieb aktiv war) oder eine Störung der Pumpe vorliegt.
//Der Befehl "AUS" wird rückgesetzt wenn die Einschaltbedingung erfüllt ist.
//Ist der Ausschaltbefehl und der Handbetrieb aktiv wird der Status der Pumpe
//"Hand AUS" auf dem MP370 dargestellt.
      U(    ; 
      U     #l_P1_EIN; 
      R     DB81.DBX   30.1; 
      U(    ; 
      O     #l_P1_AUS; 
      ON    E      2.6; 
      O(    ; 
      U     M      1.3; 
      FN    M     81.2; 
      )     ; 
      O     M     81.3; 
      )     ; 
      S     DB81.DBX   30.1; 
      U     DB81.DBX   30.1; 
      )     ; 
      U     M      1.0; 
      =     DB31.DBX    1.1; 
NETWORK
TITLE =Status-Meldungen
//Die Statusmeldungen werden gebildet und ins Lokal Byte 1 geschrieben.
//Je nach Priorität wird z.B. die Meldung "Pumpe Gesperrt" durch die Meldung
//"Pumpe läuft im Notbetrieb" überschrieben. Höchste Priorität hat hier die 
//Störmeldung.
//Anschließend wird das Lokalbyte in den "Senden" Datenbaustein geschrieben.
//Statusmeldungen Lokaldaten-Reset
      L     0; 
      T     LB     1; 
//Status-Meldungen bilden
      U     DB81.DBX   30.2; 
      U     DB81.DBX    1.3; 
      =     #l_P1_Status_Lauft; 

      U     M      1.2; 
      =     #l_P1_Status_Sperr; 

      U     M      1.3; 
      U     DB81.DBX    1.3; 
      R     #l_P1_Status_Sperr; 
      R     DB81.DBX   30.2; 
      =     #l_P1_Status_Lauft_NOT; 

      U     M     81.3; 
      R     #l_P1_Status_Lauft_NOT; 
      R     #l_P1_Status_Sperr; 
      =     #l_P1_Status_Stoer; 

//Status Meldungen Transferieren
      L     LB     1; 
      T     DB31.DBB    3; 
END_FUNCTION
 
Lokaldaten

Hallo Oliver,

Lokaldaten können bei Aufruf eines Bausteins einen unbestimmten Zustand haben und dürfen nur nach vorheriger Zuweisung abgefragt werden. Wenn du Bits setzt kann es passieren dass diese Bits schon beim Sprung in den Baustein 1 waren. Deshalb entweder mit Zuweisungen arbeiten (Zustand aus letztem Zyklus geht eh verloren) oder am Bausteinanfang initialieren. Wenn du nicht alle Bits aus dem Byte verwendest müssen auch die restlichen initialisiert werden.

MfG
André Räppel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke erstmal für die Antwort.

Mir ist nur noch nicht klar warum die Lokaldaten beim Aufruf einen undefinierten Zustand haben können.
Außerdem habei ch auch wohl vergessen noch eine Beobachtung zu erwähnen.
Bei der online betrachtung (ohne vorherigen Lokaldatenreset) konnte ich beobachten das die undefinierte änderung gleichzeitig mit den werten in Akku 2 ändert (haben aber nicht denselben wert. Ich denke mal das das eher etwas mit der zyklischen bearbeitung zu tun hat.
Bei einer vorherigen Programmversion hatte ich das Phenomän der sich ändernden Lokaldaten aber nicht. In dem besagten Baustein habe ich aber keine Änderung vorgenommen, sondern nur Änderungen der Analogwertverarbeitung in anderen Programmteilen. (Zusammenhang Analogwertverarbeitung ==> Änderung Akku2 ?)
 
Hallo,

die Lokaldaten werden in der S7 nicht für jeden Baustein oder jede Instanz eines Bausteines fest reserviert, sondern beim Bausteinaufruf dynamisch im Lokaldaten-Stack angelegt. Wenn der Baustein abgearbeitet ist dann wird der Speicherbereich auf dem Stack wieder freigegeben. Das heißt beim Bausteinaufruf sind die Lokaldaten mit Werten vorbelegt, die ein anderer Baustein dort irgendwann mal reingeschrieben hat. Die Änderung der Lokaldaten zusammen mit dem AKKU-2 wie Du es beschrieben hast deutet darauf hin daß auch in dem Analogwert-Baustein Lokaldaten verwendet werden. (Ich weiß es nicht mehr ganz genau aber es kann sogar sein daß auch Ein- und Ausgangsparameter an FCs auf dem Lokaldaten-Stack abgelegt werden).
 
Zurück
Oben