Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Werte mit Pointer aus DB lesen und schreiben, nicht ganz klar

  1. #11
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    das sollte schon machbar sein ... wie machst du es aktuell ? Wie sieht dein Baustein mittlerweile aus ?

    Gruß
    Larry

  2. #12
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    rufe im OB1, ein FB auf, hier verwende ich den FC mehrmals.

    Code:
    // dies ist die STruktur im DB
    -----------------------------
    Test_AM    STRUCT        PEW300    
    Istwert                             REAL    0.000000e+000       
    Grenzwert_MinEin               REAL    -3.500000e+001    
    Grenzwert_MinAus              REAL    -2.500000e+001    
    Grenzwert_MaxEin              REAL    5.000000e+001      
    Grenzwert_MaxAus             REAL    4.500000e+001     
    Ersatzwert                        REAL    1.000000e+001    
    Alarm                               BOOL    FALSE    /    
    Alarm_Grenzwert_Min          BOOL    FALSE    /    
    Alarm_Grenzwert_Max         BOOL    FALSE    /    
    Grenzwert_Min_Meldezeit     INT    60    sec/    
    Grenzwert_Max_Meldezeit    INT    60    sec/    
    Offset_Fuehler                   REAL    0.000000e+000    K/  
       END_STRUCT  
    
    
    // Mehrfachaufruf diese FC 
    
    NW1
    //--- Datenbaustein öffnen
          L     #IN_DBNr
          T     #DB_open
          AUF   DB [#DB_open]
    
    //--- Pointer auf die Anfangsadresse des Datenbausteinbereichs 
          L     #IN_Start_Nr                //Anfangsadresse sprich erster Wert
          SLD   3
          T     #Zeiger_auf_Wert
    
    // Werte aus DB holen
          L     #Zeiger_auf_Wert            // hole Zeiger Wert
          L     P#4.0                       // erhöhe um 4x8 Bit
          +D    
          T     #Zeiger_auf_Wert            // schreibe Zeiger zurueck
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #GW_Min_Ein                 // schreibe in Temp Variable
    
          L     #Zeiger_auf_Wert
          L     P#4.0
          +D    
          T     #Zeiger_auf_Wert
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #GW_Min_Aus
    
          L     #Zeiger_auf_Wert
          L     P#4.0
          +D    
          T     #Zeiger_auf_Wert
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #GW_Max_Ein
    
          L     #Zeiger_auf_Wert
          L     P#4.0
          +D    
          T     #Zeiger_auf_Wert
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #GW_Max_Aus
    
          L     #Zeiger_auf_Wert
          L     P#4.0
          +D    
          T     #Zeiger_auf_Wert
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #Ersatzwert
    
          L     #Zeiger_auf_Wert
          L     P#10.0
          +D    
          T     #Zeiger_auf_Wert
          L     DBD [#Zeiger_auf_Wert]      // hole gezeigten Wert
          T     #Offset_Fuehler
    
    NW2
    //Skalierung REAL, Offset miteinbeziehen
          L     #IN_PEW
          ITD   
          DTR   
          L     1.000000e+001
          /R    
          L     #Offset_Fuehler
          +R    
          T     #Messwert_REAL
    
    NW3
    //--- Pointer zurueck auf die Anfangsadresse des Datenbausteinbereichs 
          L     #IN_Start_Nr                //Anfangsadresse sprich erster Wert
          SLD   3
          T     #Zeiger_auf_Wert
    
    
    // Messwert nach DB schreiben
          L     #Messwert_REAL              // hole umgewandelten Wert
          T     DBD [#Zeiger_auf_Wert]      // schreibe in DB
    
    // danach NW die Drahtbruch und Grenzwert auswerten

  3. #13
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Hallo,

    und was funktioniert nicht? Geht die CPU in Stop oder wie zeigt sich das "nicht funktionieren"?
    Ich kann da noch nichts falsches entdecken.

    Wie sieht die Deklaration des FB aus?
    Wie sieht ein Aufruf der FC aus?
    Wie übergibst Du die Startadresse der Struktur an #IN_Start_Nr?

    Du könntest die Struktur vielleicht besser als ANY übergeben.
    Oder noch besser als UDT an IN_OUT, dann brauchst Du keine indirekte Adressierung.

    Tip: aus dem Baustein eine "Quelle generieren" und den Text dann hierher kopieren.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #14
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Wenn schon indirekte Adressierung, dann ist bei Deiner Aufgabe die registerindirekte Adressierung mit AR1 besser geeignet. Da sparst Du Dir das dauernde Ändern des Pointers. Du lädst die Anfangsadresse der Struktur in AR1 (anstatt in #Zeiger_auf_Wert) und greifst danach mit "L DBD [AR1,P#...]" auf die einzelnen Struktur-Variablen zu. Bei P#... gibst Du direkt den Offset zum Strukturanfang an, also z.B. [AR1, P#4.0], [AR1, P#8.0], [AR1, P#12.0], ...

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #15
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    es wird nicht auf den korrekten Istwert (falsche Position im DB) zurückgeschrieben und irgendwie kann ich den Offset Fuehler nicht mehr vom DB aus beschreiben bzw. anpassen.
    Hab dann mal das lesen des Offset Fuehler auskommentiert, dann konnte ich wieder den Wert anpassen. Dachte ich lese nur aus dem DB?

    Werde aber Montag auch mal die Version mit dem AR probieren und mich mal an deinen Vorschlag mit UDT machen.

    Danke für die Mühe.

    dies ist der Aufruf des FC im FB

    Code:
    FUNCTION_BLOCK FB 301
    TITLE =
    VERSION : 0.1
    
    
    VAR_TEMP
      AM_Sm : BOOL ;    
      AM_GW_Min : BOOL ;    
      AM_GW_Max : BOOL ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
          U     M     66.6; 
          =     L      1.0; 
          BLD   103; 
          U     M     66.7; 
          =     L      1.1; 
          BLD   103; 
          U     #AM_Sm; 
          =     L      1.2; 
          BLD   103; 
          CALL "Test_FC_AM" (
               IN_PEW                   := 111,
               IN_DBNr                  := 222,
               IN_Start_Nr              := L#0,
               IN_Netz_OK               := L      1.0,
               IN_Quitt                 := L      1.1,
               IN_Ersatzw_ein           := L      1.2,
               IN_Timer_Nr              := T    100,
               OUT_Sm                   := #AM_Sm,
               OUT_GW_Min               := #AM_GW_Min,
               OUT_GW_Max               := #AM_GW_Max);
          NOP   0; 
    NETWORK
    TITLE =
    
          U     M     66.6; 
          =     L      1.0; 
          BLD   103; 
          U     M     66.7; 
          =     L      1.1; 
          BLD   103; 
          U     #AM_Sm; 
          =     L      1.2; 
          BLD   103; 
          CALL "Test_FC_AM" (
               IN_PEW                   := 222,
               IN_DBNr                  := 222,
               IN_Start_Nr              := L#34,
               IN_Netz_OK               := L      1.0,
               IN_Quitt                 := L      1.1,
               IN_Ersatzw_ein           := L      1.2,
               IN_Timer_Nr              := T    101,
               OUT_Sm                   := #AM_Sm,
               OUT_GW_Min               := #AM_GW_Min,
               OUT_GW_Max               := #AM_GW_Max);
          NOP   0; 
    NETWORK
    TITLE =
    
          U     M     66.6; 
          =     L      1.0; 
          BLD   103; 
          U     M     66.7; 
          =     L      1.1; 
          BLD   103; 
          U     #AM_Sm; 
          =     L      1.2; 
          BLD   103; 
          CALL "Test_FC_AM" (
               IN_PEW                   := 333,
               IN_DBNr                  := 222,
               IN_Start_Nr              := L#68,
               IN_Netz_OK               := L      1.0,
               IN_Quitt                 := L      1.1,
               IN_Ersatzw_ein           := L      1.2,
               IN_Timer_Nr              := T    102,
               OUT_Sm                   := #AM_Sm,
               OUT_GW_Min               := #AM_GW_Min,
               OUT_GW_Max               := #AM_GW_Max);
          NOP   0; 
    NETWORK
    TITLE =
    
          U     M     66.6; 
          =     L      1.0; 
          BLD   103; 
          U     M     66.7; 
          =     L      1.1; 
          BLD   103; 
          U     #AM_Sm; 
          =     L      1.2; 
          BLD   103; 
          CALL "Test_FC_AM" (
               IN_PEW                   := 444,
               IN_DBNr                  := 222,
               IN_Start_Nr              := L#102,
               IN_Netz_OK               := L      1.0,
               IN_Quitt                 := L      1.1,
               IN_Ersatzw_ein           := L      1.2,
               IN_Timer_Nr              := T    103,
               OUT_Sm                   := #AM_Sm,
               OUT_GW_Min               := #AM_GW_Min,
               OUT_GW_Max               := #AM_GW_Max);
          NOP   0; 
    END_FUNCTION_BLOCK
    hier der komplette FC

    Code:
    FUNCTION "Test_FC_AM" : VOID
    TITLE =
    //Der FC301 überwacht den Analogwert (Fuehler PT100)im Toleranzbereich
    //von -50 bis +300°C.
    //Wird dieser Bereich verletzt, werden entsprechende Meldungen ausgegeben.
    //Während eines Netzausfalles werden keine Störungsmeldungen erzeugt.
    //
    //Werte werden via Zeiger aus dem DB gelesen und geschrieben, DB angepasst.
    //
    //Timer muss uebergeben werden.
    VERSION : 0.1
    
    
    VAR_INPUT
      IN_PEW : INT ;    //Analoger Eingangswert
      IN_DBNr : INT ;    //Eingabe:DB Nummer Sensorik
      IN_Start_Nr : DINT ;    //Startadresse des ersten Wert
      IN_Netz_OK : BOOL ;    //Netz OK Meldung zur Fehlerunterdrückung
      IN_Quitt : BOOL ;    //Statische Meldungen quittieren
      IN_Ersatzw_ein : BOOL ;    //Freigabe der Aufschaltung Ersatzwert mit reset aller Störungen
      IN_Timer_Nr : TIMER ;    
    END_VAR
    VAR_OUTPUT
      OUT_Sm : BOOL ;    
      OUT_GW_Min : BOOL ;    
      OUT_GW_Max : BOOL ;    
    END_VAR
    VAR_TEMP
      Zeiger_auf_Wert : DINT ;    
      Realwert_Start_Adresse : DINT ;    
      Messwert_REAL : REAL ;    
      Messwert_INT : INT ;    
      DB_open : INT ;    
      GW_Min_Ein : REAL ;    
      GW_Min_Aus : REAL ;    
      GW_Max_Ein : REAL ;    
      GW_Max_Aus : REAL ;    
      Ersatzwert : REAL ;    
      Offset_Fuehler : REAL ;    
      test_int : INT ;    
      HmNull : BOOL ;    
      Sm_Drahtbr : BOOL ;    //Störung sofort: Messwert Drahtbruch
      Sm_Ueberlauf : BOOL ;    //Störung sofort: Messwert Überlauf
      Sm_sofort : BOOL ;    //Sammelstörung sofort: Messwert ist nicht plausibel ---> Funktionen sperren
      Sm_verzoegert : BOOL ;    
      test_am : BOOL ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Messwert skalieren
    
    //--- Datenbaustein öffnen
          L     #IN_DBNr; 
          T     #DB_open; 
          AUF   DB [#DB_open]; 
    
    //--- Pointer auf die Anfangsadresse des Datenbausteinbereichs 
          L     #IN_Start_Nr; //Anfangsadresse sprich erster Wert
          SLD   3; 
          T     #Zeiger_auf_Wert; 
    
    // Werte aus DB holen Versuch 1
          L     #Zeiger_auf_Wert; // hole Zeiger Wert
          L     P#4.0; // erhöhe um 4x8 Bit
          +D    ; 
          T     #Zeiger_auf_Wert; // schreibe Zeiger zurueck
          L     DBD [#Zeiger_auf_Wert]; // hole gezeigten Wert
          T     #GW_Min_Ein; // schreibe in Temp Variable
    
          L     #Zeiger_auf_Wert; 
          L     P#4.0; 
          +D    ; 
          T     #Zeiger_auf_Wert; 
          L     DBD [#Zeiger_auf_Wert]; // hole gezeigten Wert
          T     #GW_Min_Aus; 
    
          L     #Zeiger_auf_Wert; 
          L     P#4.0; 
          +D    ; 
          T     #Zeiger_auf_Wert; 
          L     DBD [#Zeiger_auf_Wert]; // hole gezeigten Wert
          T     #GW_Max_Ein; 
    
          L     #Zeiger_auf_Wert; 
          L     P#4.0; 
          +D    ; 
          T     #Zeiger_auf_Wert; 
          L     DBD [#Zeiger_auf_Wert]; // hole gezeigten Wert
          T     #GW_Max_Aus; 
    
          L     #Zeiger_auf_Wert; 
          L     P#4.0; 
          +D    ; 
          T     #Zeiger_auf_Wert; 
          L     DBD [#Zeiger_auf_Wert]; // hole gezeigten Wert
          T     #Ersatzwert; 
    
          L     #Zeiger_auf_Wert; 
          L     P#10.0; 
          +D    ; 
          T     #Zeiger_auf_Wert; 
          L     DBD [#Zeiger_auf_Wert]; // hole gezeigten Wert
          T     #Offset_Fuehler; 
    
    
    NETWORK
    TITLE =Messwert skalieren
    
    // Skalierung Integer
          L     #IN_PEW; 
          L     10; 
          /I    ; 
          T     #Messwert_INT; 
    
    //Skalierung REAL, Offset miteinbeziehen
          L     #IN_PEW; 
          ITD   ; 
          DTR   ; 
          L     1.000000e+001; 
          /R    ; 
          L     #Offset_Fuehler; 
          +R    ; 
          T     #Messwert_REAL; 
    
    NETWORK
    TITLE =
    //via Zeiger die Werte aus dem DB lesen und schreiben
    //angepasst auf die Struktur des DB
    //--- Pointer auf die Anfangsadresse des Datenbausteinbereichs 
          L     #IN_Start_Nr; //Anfangsadresse sprich erster Wert
          SLD   3; 
          T     #Zeiger_auf_Wert; 
    
    
    // Messwert nach DB schreiben
          L     #Messwert_REAL; // hole umgewandelten Wert
          T     DBD [#Zeiger_auf_Wert]; // schreibe in DB
    
    
    
    NETWORK
    TITLE =Grenzwert Min
    
          L     #Messwert_REAL; 
          L     #GW_Min_Ein; 
          <R    ; 
          S     #OUT_GW_Min; 
    
          L     #Messwert_REAL; 
          L     #GW_Min_Aus; 
          >R    ; 
          R     #OUT_GW_Min; 
    NETWORK
    TITLE =Grenzwert Max
    
          L     #Messwert_REAL; 
          L     #GW_Max_Ein; 
          >R    ; 
          S     #OUT_GW_Max; 
    
          L     #Messwert_REAL; 
          L     #GW_Max_Aus; 
          <R    ; 
          R     #OUT_GW_Max; 
    NETWORK
    TITLE =Überwachung auf Drahtbruch
    //Bildung Nullmerker
          SET   ; 
          R     #HmNull; 
    
    
    NETWORK
    TITLE =Überwachung auf Drahtbruch
    //Drahtbruch = Überlauf
          U     #HmNull; 
          =     #Sm_Drahtbr; 
    NETWORK
    TITLE =Überwachung auf Überlauf
    //0   =     0 Einheiten
    //300 =  3000 Einheiten
          U(    ; 
          L     #IN_PEW; 
          L     3000; 
          >=I   ; 
          )     ; 
          U     #IN_Netz_OK; 
          =     #Sm_Ueberlauf; 
    NETWORK
    TITLE =Sammelstörung sofort - Messwert nicht plausibel bzw. verwendbar
    //Meldung für sofortige Reaktionen z.B.: Sperrung von Aggregaten bei Messfehlern
    //auch ohne Netzspannung aktiv!
          O(    ; 
          L     #IN_PEW; 
          L     -500; 
          <=I   ; 
          )     ; 
          O(    ; 
          L     #IN_PEW; 
          L     3000; 
          >=I   ; 
          )     ; 
          =     #Sm_sofort; 
    NETWORK
    TITLE =Ausgabe einer verzögerten Analogwertsammelstörung
    
          U(    ; 
          O     #Sm_Drahtbr; 
          O     #Sm_Ueberlauf; 
          )     ; 
          UN    #IN_Ersatzw_ein; 
          L     S5T#5S; 
          SE    #IN_Timer_Nr; 
    NETWORK
    TITLE =Ausgabe der verzögerten Störung als statische Meldung
    //Diese Störung ist zur Weiterverabeitung für Sammelstörung, Prozessleitsytem,
    //Priotritätenerzeugung gedacht
          U     #IN_Quitt; 
          R     #Sm_verzoegert; 
          U     #IN_Timer_Nr; 
          S     #Sm_verzoegert; 
          U     #Sm_verzoegert; 
          =     #OUT_Sm; 
    NETWORK
    TITLE =
    
    
          L     0; 
          T     DBD [#Zeiger_auf_Wert]; 
    NETWORK
    TITLE =Bausteinende Normalbetrieb     --- Ersatzwertfreigabe ---
    
          UN    #IN_Ersatzw_ein; 
          BEB   ; 
    
    NETWORK
    TITLE =Ausgabe des skalierten Ersatzwertes als Messwert
    
    
          L     #Ersatzwert; 
          T     #Messwert_REAL; // Ersatzwert zum Real Out
    
          L     #Ersatzwert; 
          RND   ; 
          T     #Messwert_INT; // Ersatzwert zum Int Out
    
    NETWORK
    TITLE =Meldungen sperren
    //Die Verzögerte Störung wird direkt am TON verriegelt, um bei Rückschaltung
    //ohne Ersatzwert eine neu Störungsflanke zu erhalten.
          UN    #HmNull; 
          R     #Sm_Drahtbr; 
          R     #Sm_Ueberlauf; 
          R     #Sm_sofort; 
    END_FUNCTION

  6. #16
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Guten Morgen zusammen,

    dieser Versuch funktioniert nun. Der FC macht nun bei mehrfachaufruf das gewollte.
    Hab die registerindirekte Adressierung mit AR1 benutzt.
    Besten Dank nochmal für die Hilfe.

    Code:
    FUNCTION "Test_FC_AM" : VOID
    TITLE =
    //Der FC301 überwacht den Analogwert (Fuehler PT100)im Toleranzbereich
    //von -50 bis +300°C.
    //Wird dieser Bereich verletzt, werden entsprechende Meldungen ausgegeben.
    //Während eines Netzausfalles werden keine Störungsmeldungen erzeugt.
    //
    //Werte werden via Zeiger aus dem DB gelesen und geschrieben, DB angepasst.
    //
    //Timer muss uebergeben werden.
    VERSION : 0.1
    
    
    VAR_INPUT
      IN_PEW : INT ;    //Analoger Eingangswert
      IN_DBNr : INT ;    //Eingabe:DB Nummer Sensorik
      IN_Start_Nr : DINT ;    //Startadresse des ersten Wert
      IN_Netz_OK : BOOL ;    //Netz OK Meldung zur Fehlerunterdrückung
      IN_Quitt : BOOL ;    //Statische Meldungen quittieren
      IN_Ersatzw_ein : BOOL ;    //Freigabe der Aufschaltung Ersatzwert mit reset aller Störungen
      IN_Timer_Nr : TIMER ;    
    END_VAR
    VAR_OUTPUT
      OUT_Sm : BOOL ;    
      OUT_GW_Min : BOOL ;    
      OUT_GW_Max : BOOL ;    
    END_VAR
    VAR_TEMP
      Zeiger_auf_Wert : DINT ;    
      Realwert_Start_Adresse : DINT ;    
      Messwert_REAL : REAL ;    
      Messwert_INT : INT ;    
      DB_open : INT ;    
      GW_Min_Ein : REAL ;    
      GW_Min_Aus : REAL ;    
      GW_Max_Ein : REAL ;    
      GW_Max_Aus : REAL ;    
      Ersatzwert : REAL ;    
      Offset_Fuehler : REAL ;    
      test_int : INT ;    
      HmNull : BOOL ;    
      Sm_Drahtbr : BOOL ;    //Störung sofort: Messwert Drahtbruch
      Sm_Ueberlauf : BOOL ;    //Störung sofort: Messwert Überlauf
      Sm_sofort : BOOL ;    //Sammelstörung sofort: Messwert ist nicht plausibel ---> Funktionen sperren
      Sm_verzoegert : BOOL ;    
      test_am : BOOL ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    //via Zeiger (registerindirekte Adressierung mit AR1)
    //die Werte aus dem DB lesen und schreiben
    //angepasst auf die Struktur des DB
    
    //--- Datenbaustein öffnen
          L     #IN_DBNr; 
          T     #DB_open; 
          AUF   DB [#DB_open]; 
    
    //--- Pointer auf die Anfangsadresse des Datenbausteinbereichs 
          L     #IN_Start_Nr; //Anfangsadresse sprich erster Wert
          SLD   3; //mit 8 multiplizieren, um Pointerformat im DBD zu erhalten
          LAR1  ; //Lade den Pointer von AKKU 1 in AR1
    
    // ersten Werte holen, Startadresse +4
          L     DBD [AR1,P#4.0]; 
          T     #GW_Min_Ein; 
    
    // zweiten Werte holen, Startadresse +8
          L     DBD [AR1,P#8.0]; 
          T     #GW_Min_Aus; 
    
    // dritten Werte holen, Startadresse +12
          L     DBD [AR1,P#12.0]; 
          T     #GW_Max_Ein; 
    
    // vierten Werte holen, Startadresse +16
          L     DBD [AR1,P#16.0]; 
          T     #GW_Max_Aus; 
    
    // fuenften Werte holen, Startadresse +20
          L     DBD [AR1,P#20.0]; 
          T     #Ersatzwert; 
    
    // sechsten Werte holen, Startadresse +30
          L     DBD [AR1,P#30.0]; 
          T     #Offset_Fuehler; 
    
    NETWORK
    TITLE =Messwert skalieren
    
    // Skalierung Integer
          L     #IN_PEW; 
          L     10; 
          /I    ; 
          T     #Messwert_INT; 
    
    //Skalierung REAL, Offset miteinbeziehen
          L     #IN_PEW; 
          ITD   ; 
          DTR   ; 
          L     1.000000e+001; 
          /R    ; 
          L     #Offset_Fuehler; 
          +R    ; 
          T     #Messwert_REAL; 
    
    // schreibe Istwert in REAL nach Startadresse +0
          L     #Messwert_REAL; 
          T     DBD [AR1,P#0.0]; 
    
    NETWORK
    TITLE =Grenzwert Min
    
          L     #Messwert_REAL; 
          L     #GW_Min_Ein; 
          <R    ; 
          S     #OUT_GW_Min; 
    
          L     #Messwert_REAL; 
          L     #GW_Min_Aus; 
          >R    ; 
          R     #OUT_GW_Min; 
    NETWORK
    TITLE =Grenzwert Max
    
          L     #Messwert_REAL; 
          L     #GW_Max_Ein; 
          >R    ; 
          S     #OUT_GW_Max; 
    
          L     #Messwert_REAL; 
          L     #GW_Max_Aus; 
          <R    ; 
          R     #OUT_GW_Max; 
    NETWORK
    TITLE =Überwachung auf Drahtbruch
    //Bildung Nullmerker
          SET   ; 
          R     #HmNull; 
    
    
    NETWORK
    TITLE =Überwachung auf Drahtbruch
    //Drahtbruch = Überlauf
          U     #HmNull; 
          =     #Sm_Drahtbr; 
    NETWORK
    TITLE =Überwachung auf Überlauf
    //0   =     0 Einheiten
    //300 =  3000 Einheiten
          U(    ; 
          L     #IN_PEW; 
          L     3000; 
          >=I   ; 
          )     ; 
          U     #IN_Netz_OK; 
          =     #Sm_Ueberlauf; 
    NETWORK
    TITLE =Sammelstörung sofort - Messwert nicht plausibel bzw. verwendbar
    //Meldung für sofortige Reaktionen z.B.: Sperrung von Aggregaten bei Messfehlern
    //auch ohne Netzspannung aktiv!
          O(    ; 
          L     #IN_PEW; 
          L     -500; 
          <=I   ; 
          )     ; 
          O(    ; 
          L     #IN_PEW; 
          L     3000; 
          >=I   ; 
          )     ; 
          =     #Sm_sofort; 
    NETWORK
    TITLE =Ausgabe einer verzögerten Analogwertsammelstörung
    
          U(    ; 
          O     #Sm_Drahtbr; 
          O     #Sm_Ueberlauf; 
          )     ; 
          UN    #IN_Ersatzw_ein; 
          L     S5T#5S; 
          SE    #IN_Timer_Nr; 
    NETWORK
    TITLE =Ausgabe der verzögerten Störung als statische Meldung
    //Diese Störung ist zur Weiterverabeitung für Sammelstörung, Prozessleitsytem,
    //Priotritätenerzeugung gedacht
          U     #IN_Quitt; 
          R     #Sm_verzoegert; 
          U     #IN_Timer_Nr; 
          S     #Sm_verzoegert; 
          U     #Sm_verzoegert; 
          =     #OUT_Sm; 
    NETWORK
    TITLE =Bausteinende Normalbetrieb     --- Ersatzwertfreigabe ---
    
          UN    #IN_Ersatzw_ein; 
          BEB   ; 
    
    NETWORK
    TITLE =Ausgabe des skalierten Ersatzwertes als Messwert
    
    
          L     #Ersatzwert; 
          T     #Messwert_REAL; // Ersatzwert zum Real Out
    
          L     #Ersatzwert; 
          RND   ; 
          T     #Messwert_INT; // Ersatzwert zum Int Out
    
    NETWORK
    TITLE =Meldungen sperren
    //Die Verzögerte Störung wird direkt am TON verriegelt, um bei Rückschaltung
    //ohne Ersatzwert eine neu Störungsflanke zu erhalten.
          UN    #HmNull; 
          R     #Sm_Drahtbr; 
          R     #Sm_Ueberlauf; 
          R     #Sm_sofort; 
    END_FUNCTION

  7. Folgender Benutzer sagt Danke zu mzva für den nützlichen Beitrag:

    PN/DP (08.12.2014)

  8. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Danke für die Erfolgs-Rückmeldung und den nützlichen Baustein.

    Allerdings ist da noch eine Kleinigkeit:
    #Sm_verzoegert ist in TEMP deklariert, Du benutzt ihn aber speichernd (S/R).

    Der Inhalt von TEMP-Variablen ist beim Bausteineintritt unbestimmt solange man ihnen nichts zugewiesen hat, weil nach Verlassen des Bausteins bis zum nächsten Durchlauf andere Bausteine den Speicherplatz in TEMP benutzt und verändert haben können.
    Du müsstest dem FC noch ein IN_OUT gönnen, oder die Adresse des äußeren Störmerkers mitteilen und den dann direkt indirekt setzen/rücksetzen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #18
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Nachtrag:
    Am einfachsten ginge es wohl, wenn Du den Störmerker Sm_verzoegert mit in Deine Struktur im DB legst.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Variablen schreiben und lesen aus TwinCat3-Projekt
    Von patzer103040 im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 08.04.2013, 12:11
  2. Daten aus S7 lesen und schreiben
    Von pat125 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 01.11.2011, 19:35
  3. Libnodave C# - WORD und STRING aus S7 lesen/schreiben
    Von dolo280 im Forum Hochsprachen - OPC
    Antworten: 10
    Letzter Beitrag: 13.01.2011, 12:04
  4. Merkerwörter mit C# und Libnodave aus SPS lesen und schreiben
    Von Red-Sh4nks im Forum Hochsprachen - OPC
    Antworten: 14
    Letzter Beitrag: 04.06.2010, 15:10
  5. Antworten: 4
    Letzter Beitrag: 01.09.2008, 12:45

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •