Step 7 tiefergehende PN Diagonse

ziede

Level-1
Beiträge
44
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
ich haette da gerne mal ein Problem...
So nun Spass beiseite und ernste frage gestellt.
Ich soll eine Profinet-diagnose projektieren die nicht nur abfragt ob ein PN-Teilnehmer i.O / n.i.O. ist sondern auch die module.
Beispiel:
ET200SP, darauf 3 Module DI, dann 3 Module DO

1642061988207.png

Da an den Modulen z.B. Pumpen angeschlossen sind (teilweise redundant) sollen bei ausfallen eines MODULS nur die dazugehoerigen aktoren
abschalten bzw. bei den redundanten Pumpen auf die reservepumpe umgeschaltet werden.

Leider habe ich bis jetzt nur PN diagnosen gefunden, die entweder TIA benoetigen (ich nutze Step 7 v5.7 (classic))

Die SZL-ID xy96 scheint das herzugeben was ich moechte jedoch weiss ich nicht wie ich den nu abfrage bzw. wie der Ziel DB aussehen muss / wie gross er sein muss.

Wuerde mich freuen wenn ihr weiterhelfen koenntet...

Mit freundlichen Gruessen
Bjoern
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da an den Modulen z.B. Pumpen angeschlossen sind (teilweise redundant) sollen bei ausfallen eines MODULS nur die dazugehoerigen aktoren
abschalten bzw. bei den redundanten Pumpen auf die reservepumpe umgeschaltet werden.
und wenn das Kabel ausfällt? oder die Pumpe selber?

Ich würd das anders lösen. Meldungen an den DIs sind ja drahtbruchsicher, also da krigst ja eh Störung Pumpe1, wenn die DI Karte defekt ist, und schaltest dann auf Pumpe 2 um. Wenn die DO ausfällt, krigst von der Pumpe1 keine Rückmeldung mehr->Rückmeldefehler->Umschaltung auf Pumpe 2...
 
ansonsten hier mal etwas in Step7 5.5 SCL war glaub für ET200M oder ET200S mit Profibus...

Code:
FUNCTION_BLOCK FB123
TITLE   = 'BG_OK'
NAME    : BG_OK
FAMILY  : xxx
AUTHOR  : xxx
VERSION : '0.1'

// Baustein zur Überprüfung einer zentralen oder dezentralen I/O-Baugruppe

// Typical-Attribute
{
//    S7_tasklist:='OB100';
//    S7_m_c:='true';
    S7_blockview:='big'
}

// Parameterattribute
// S7_visible       visible/unvisible   (default='true')
// S7_m_c           WinCC - Tag         (default='false')
// S7_dynamic       Test mode           (default='false')
// S7_link          Connection linkable (default='true')
// S7_archive:='shortterm'
// S7_shortcut:='Setpoint'
// S7_unit:='unit'


VAR_INPUT
    REQ          {S7_dynamic:='true'} :BOOL :=TRUE;                   //1=Anstoss der Bearbeitung
    SZL_ID       {S7_dynamic:='true'; S7_visible:='false'} :WORD := 16#0C91;               //SZL-ID der Teilliste oder des Teillistenauszuges
    OUT_BG       {S7_dynamic:='true'} :BOOL :=FALSE;                  //0=Eingabebaugruppe 1=Ausgabebaugruppe
    ADR          {S7_dynamic:='true'} :INT :=100;                     //erste Adresse der Baugruppe
END_VAR

VAR_OUTPUT
    BG_OK        {S7_dynamic:='true'} :BOOL :=FALSE;                  //Baugruppe OK
    BG_ERR       {S7_dynamic:='true'} :BOOL :=FALSE;                  //Baugruppe gestört
    ERR_CODE     {S7_dynamic:='true'} :WORD :=0;                      //Fehlercode des SFC51
    BUSY         {S7_dynamic:='true'} :BOOL :=FALSE;                  //1: Lesevorgang noch nicht abgeschlossen
    LENTHDR      {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //Länge eines Datensatzes der SZL-Teilliste
    N_DR         {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //Anzahl der Datensätze
    adr1         {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //siehe Doku adr1
    adr2         {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //siehe Doku adr2
    logadr       {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //logische Basisadresse
    solltyp      {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //bei Profinet IO Solltyp
    isttyp       {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //bei Profinet IO Isttyp
    reserviert   {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //siehe Doku Reserviert
    eastat       {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //E/A Satus
    ber_bgbr     {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; //Bereichskennung Baugruppenbreite
    INDEX        {S7_dynamic:='true'; S7_visible:='false'} :WORD :=0; // logische Basisadresse
END_VAR

VAR
SZL_HEADER            : STRUCT    //Struktur als Aktualoperand für SFC 51
LENTHDR               : WORD;     //Länge eines Datensatzes
N_DR                  : WORD;     //Anzahl der Datensätze
                        END_STRUCT;   
DR                    : ARRAY [0..9] OF WORD;      // Zielbereich für die gelesene SZL-Teilliste
eastat_t              : WORD :=0;                  // E/A-Status temporär byteweise gedreht
by_eastat AT eastat_t : ARRAY [0..1] OF BYTE;      // byteweise Sicht auf den E/A-Status
b_eastat AT eastat_t  : ARRAY [0..15] OF BOOL;     // bitweise Sicht auf den E/A-Status
by0_eastat_t          : BYTE :=0;                  // Byte 0 vom ungedrehten eastat
by1_eastat_t          : BYTE :=0;                  // Byte 1 vom ungedrehten eastat
END_VAR

VAR_TEMP
    
END_VAR       
 
    
BEGIN;
// Vorbereitende Anweisungen

INDEX := INT_TO_WORD(ADR);                              // Berechnung des INDEX als WORD
IF OUT_BG=1 THEN INDEX := INDEX OR 16#8000; END_IF;     // addieren von 8000hex wenn Ausgabebaugruppe

// Aufruf SFC 51

ERR_CODE := INT_TO_WORD (SFC51 (
       REQ         :=REQ,               // Eingänge
       SZL_ID      :=SZL_ID,
       INDEX       :=INDEX,
      
       BUSY        :=BUSY,              // Ausgänge
       SZL_HEADER  :=SZL_HEADER,
       DR          :=DR
 ));
 
// Auswertung der Signale

eastat_t := DR[6];                // Zuweisung von E/A Status

by0_eastat_t := by_eastat[0];    // byte 0 auslesen
by1_eastat_t := by_eastat[1];    // byte 1 auslesen
by_eastat[0] := by1_eastat_t;    // byte 0 mit Byte 1 tauschen
by_eastat[1] := by0_eastat_t;    // byte 1 mit Byte 0 tauschen

BG_ERR := NOT b_eastat[1] OR b_eastat[2] OR b_eastat[3] OR b_eastat[4] OR b_eastat[5];   // Erkennung ob Baugruppe gestört
// Bedeutung eastat bei Aufruf mit SZL_ID=16#xy91 (Baugruppenzustandsinformation)
// Bit 0 = 1: Baugruppe gestört (über Diagnosealarm erkannt)
// Bit 1 = 1: Baugruppe vorhanden
// Bit 2 = 1: Baugruppe nicht verfügbar
// Bit 3 = 1: Baugruppe deaktiviert
// Bit 4 = 1: Störung der Station (nur Stellvertreter-Slot)
// Bit 5 = 1: Ein CiR-Vorgang für diese Baugruppe /Station ist gerade aktiv oder noch nicht abgeschlossen
// Bit 6 = 1: reserviert für S7-400
// Bit 7 = 1: Baugruppe im Lokalbussegment
// Bit 8 bis 15: Datenkennung für logische Adresse (Eingang: B#16#B4, Ausgang: B#16#B5, externe DP-Anschaltung: B#16#FF)


// Ausgabe der Ausgaenge

BG_OK      := NOT BG_ERR;                         
LENTHDR    := SZL_HEADER.LENTHDR;   
N_DR       := SZL_HEADER.N_DR;
adr1       := DR[0]; 
adr2       := DR[1];   
logadr     := DR[2]; 
solltyp    := DR[3];
isttyp     := DR[4];
reserviert := DR[5]; 
eastat     := DR[6]; 
ber_bgbr   := DR[7];

 
 
END_FUNCTION_BLOCK
 
Das waren aber schon viele antworten,
versuche sie mal der Reihe nach abzuuarbeiten:

zu #2: Hilft ja nichts, wenn ich das damit tun muss dann ist das halt auchnoch so.

zu #3: Das kommt zusaetzlich, der Kunde will aber halt auch umschaltungen / Fehlermeldungen etc. ueber die Module...

zu #4: schaue ich mir spaeter mal an ob ich da etwas von fuer mein PN-Problem adaptieren kann. Danke auf jeden fall fuer den Quellcode.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
zu #3: Das kommt zusaetzlich, der Kunde will aber halt auch umschaltungen / Fehlermeldungen etc. ueber die Module...
wenn Du die Reserveumschaltung ordentlich durchdenkst, funktioniert die immer, egal ob Kabel oder Baugruppe oder Feldgerät oder sonstwas defekt...

Also, wenn die Rückmeldung der Pumpe1 nicht kommt, ist es egal warum, es wird auf Pumpe2 umgeschaltet...

Wenn der Kunde wirklich alle Fehlermeldungen der BAugruppen auf der Visu will, geht das am einfachsten mit "Systemfehler Melden" SFM...
 
Habe mir die Quelle von ducati etwas angepasst (Danke nochmal fuer die Quelle).
Meine Quelle funktioniert leider noch nicht so, wie ich es gerne haette.
Aus mir unbekannten gruenden wird der "index" immer mit 0 geschrieben...

Code:
// UDT zur PN-Diag to proNTo
TYPE "PN_DIAG_proNTo"            // UDT6
  STRUCT     
   bg_ok                : BOOL ;    // Baugruppe OK
   bg_err               : BOOL ;    // Baugruppe gestoert
   bg_diag              : BOOL ;    // Baugruppe gestört (über Diagnosealarm erkannt)
   bg_vorhanden         : BOOL ;    // Baugruppe vorhanden
   bg_nicht_verfuegbar  : BOOL ;    // Baugeruppe niciht verfuegbar
   bg_deaktiviert       : BOOL ;    // Baugruppe deaktiviert
   bg_error_station     : BOOL ;    // Stoerung der Station 
   bg_im_segment        : BOOL ;    // Baugruppe im Lokalbussegment
   bg_modul_equal       : BOOL ;    // Gestecktes Modul entspricht Projektiertem Modul
  END_STRUCT ;    
END_TYPE

// UDT zur Datenablage
TYPE "PN_DIAG_MODUL"            // UDT7
  STRUCT     
   solltyp              : WORD ;    // Profinet IO Solltyp
   isttyp               : WORD ;    // Profinet IO Isttyp
   reserviert           : WORD ;    // siehe Doku SZL-ID w#16#xy91 - Reserviert
   eastat               : WORD ;    // E/A Satus
   ber_bgbr             : WORD ;    // Bereichskennung Baugruppenbreite
   logadr               : WORD ;    // logische Basisadresse
   bg_ok                : BOOL ;    // Baugruppe OK
   bg_err               : BOOL ;    // Baugruppe gestoert
   bg_diag              : BOOL ;    // Baugruppe gestört (über Diagnosealarm erkannt)
   bg_vorhanden         : BOOL ;    // Baugruppe vorhanden
   bg_nicht_verfuegbar  : BOOL ;    // Baugeruppe niciht verfuegbar
   bg_deaktiviert       : BOOL ;    // Baugruppe deaktiviert
   bg_error_station     : BOOL ;    // Stoerung der Station
   bg_cir               : BOOL ;    // Ein CiR-Vorgang für diese Baugruppe /Station ist gerade aktiv 
   bg_res_s7_400        : BOOL ;    // reserviert für S7-400
   bg_im_segment        : BOOL ;    // Baugruppe im Lokalbussegment
  END_STRUCT ;    
END_TYPE


FUNCTION_BLOCK FB914
TITLE   = 'BG_OK'
NAME    : 'PN-Diag'
FAMILY  : 'PN'
AUTHOR  : 'oas_bf'
VERSION : '0.1'


// Baustein zur Überprüfung einer zentralen oder dezentralen I/O-Baugruppe

// Typical-Attribute
//{
//    S7_blockview:='big'
//}


VAR_INPUT
    REQ             :BOOL :=TRUE;                          //1=Anstoss der Bearbeitung
    BG_IO           :BOOL :=FALSE;                         //0=Eingabebaugruppe 1=Ausgabebaugruppe
    EA_ADR          :ARRAY [1 .. 256] OF INT ;             //Array der zu lesenden adressen
END_VAR

VAR_OUTPUT
    ERR_CODE        :WORD :=0;                             //Fehlercode des SFC51
    OUTPUT          :ARRAY [1 .. 256] OF PN_DIAG_MODUL ;   //Array der zu lesenden adressen
    PRONTO          :ARRAY [1 .. 256] OF PN_DIAG_proNTo ;  //Array der zu lesenden adressen

END_VAR

VAR
SZL_ID                : WORD := 16#0C91;        //SZL-ID der Teilliste oder des Teillistenauszuges
LENTHDR               : WORD :=0;               //Länge eines Datensatzes der SZL-Teilliste
N_DR                  : WORD :=0;               //Anzahl der Datensätze
adr1                  : WORD :=0;               //siehe Doku adr1
adr2                  : WORD :=0;               //siehe Doku adr2
logadr                : WORD :=0;               //logische Basisadresse
index                 : WORD :=0;               //logische Basisadresse
SZL_HEADER            : STRUCT                  //Struktur als Aktualoperand für SFC 51
LENTHDR               : WORD;                   //Länge eines Datensatzes
N_DR                  : WORD;                   //Anzahl der Datensätze
                        END_STRUCT;   
DR                    : ARRAY [0..9] OF WORD;   // Zielbereich für die gelesene SZL-Teilliste
eastat_t              : WORD :=0;               // E/A-Status temporär byteweise gedreht
by_eastat AT eastat_t : ARRAY [0..1] OF BYTE;   // byteweise Sicht auf den E/A-Status
b_eastat AT eastat_t  : ARRAY [0..15] OF BOOL;  // bitweise Sicht auf den E/A-Status
by0_eastat_t          : BYTE :=0;               // Byte 0 vom ungedrehten eastat
by1_eastat_t          : BYTE :=0;               // Byte 1 vom ungedrehten eastat
adr_index             : INT:= 1;                // Schleifenindex = Addresenindex des Array (EA-Adresse)
BUSY                  : BOOL :=FALSE;           //1: Lesevorgang noch nicht abgeschlossen
BG_ERR                : BOOL :=FALSE;           //Baugruppe gestört

END_VAR

VAR_TEMP
    
END_VAR       
 
    
BEGIN;
// Vorbereitende Anweisungen
IF REQ = 1 THEN
    WHILE  adr_index <=256 AND EA_ADR[adr_index]  < 65000 DO        
        index := INT_TO_WORD(EA_ADR[adr_index]);            // Berechnung des INDEX als WORD
        IF BG_IO = 1 THEN INDEX := INDEX OR 16#8000; END_IF; // addieren von 8000hex wenn Ausgabebaugruppe

        // Aufruf SFC 51

        ERR_CODE := INT_TO_WORD (SFC51 (
            REQ         :=( REQ AND NOT BUSY ), // Eingänge
            SZL_ID      :=SZL_ID,
            INDEX       :=index,
      
            BUSY        :=BUSY,                 // Ausgänge
            SZL_HEADER  :=SZL_HEADER,
            DR          :=DR
        ));
 
        // Auswertung der Signale

        eastat_t := DR[6];                // Zuweisung von E/A Status

        by0_eastat_t := by_eastat[0];    // byte 0 auslesen
        by1_eastat_t := by_eastat[1];    // byte 1 auslesen
        by_eastat[0] := by1_eastat_t;    // byte 0 mit Byte 1 tauschen
        by_eastat[1] := by0_eastat_t;    // byte 1 mit Byte 0 tauschen
        
        BG_ERR := NOT b_eastat[1] OR b_eastat[2] OR b_eastat[3] OR b_eastat[4]; // Erkennung ob Baugruppe gestört
        // Bedeutung eastat bei Aufruf mit SZL_ID=16#xy91 (Baugruppenzustandsinformation)
        // Bit 0 = 1: Baugruppe gestört (über Diagnosealarm erkannt)
        // Bit 1 = 1: Baugruppe vorhanden
        // Bit 2 = 1: Baugruppe nicht verfügbar
        // Bit 3 = 1: Baugruppe deaktiviert
        // Bit 4 = 1: Störung der Station (nur Stellvertreter-Slot)
        // Bit 5 = 1: Ein CiR-Vorgang für diese Baugruppe /Station ist gerade aktiv oder noch nicht abgeschlossen
        // Bit 6 = 1: reserviert für S7-400
        // Bit 7 = 1: Baugruppe im Lokalbussegment
        // Bit 8 bis 15: Datenkennung für logische Adresse (Eingang: B#16#B4, Ausgang: B#16#B5, externe DP-Anschaltung: B#16#FF)

        // Ausgabe der Ausgaenge
        OUTPUT[adr_index].bg_ok                  := NOT BG_ERR;                         
        OUTPUT[adr_index].bg_err                 := BG_ERR;  
        OUTPUT[adr_index].logadr                 := DR[2]; 
        OUTPUT[adr_index].solltyp                := DR[3];
        OUTPUT[adr_index].isttyp                 := DR[4];
        OUTPUT[adr_index].reserviert             := DR[5]; 
        OUTPUT[adr_index].eastat                 := DR[6]; 
        OUTPUT[adr_index].ber_bgbr               := DR[7];
        OUTPUT[adr_index].bg_diag                := b_eastat[1];
        OUTPUT[adr_index].bg_vorhanden           := b_eastat[2];
        OUTPUT[adr_index].bg_nicht_verfuegbar    := b_eastat[3];
        OUTPUT[adr_index].bg_deaktiviert         := b_eastat[4];
        OUTPUT[adr_index].bg_cir                 := b_eastat[5];
        OUTPUT[adr_index].bg_res_s7_400          := b_eastat[6];        
        OUTPUT[adr_index].bg_im_segment          := b_eastat[7]; 
               
        adr_index := adr_index + 1;
        END_WHILE; 
    adr_index := 1;
    END_IF;
 
END_FUNCTION_BLOCK
 
Zurück
Oben