Step 7 S7-400H Profibus Slavediagnose hinter Y-Link

Lockenfrosch

Level-1
Beiträge
79
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe ein 400er H-System mit Profibus Teilnehmern hinter einem Y-Link. Meine Frage ist nun, wie ich den Status dieser Teilnehmer auslesen kann (mich interessiert eigentlich nur der Zustand "gestört")? Normalerweise nutze ich für ein "einfaches" System den SFC51 und lese die SZL-Teiliste aus, aber das habe ich für das H-System nicht zum laufen bekommen. Falls jemand Erfahrung mit dem Thema hat und mir ein paar tipps geben könnte wäre ich sehr dankbar !

Für einen groben Eindruck wie mein System aufgebaut ist hier noch ein kleines Bildchen:

Bsp_HW_konfig.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habs Projekt doch grad noch auf nem Stick gefunden. Also mit SCF51 geht das nicht, sondern mit SFC13:


Code:
[FONT=Verdana]      CALL  "DPNRM_DG"[/FONT]
[FONT=Verdana]       REQ    :=#DIAG.REQ[/FONT]
[FONT=Verdana]       LADDR  :=W#16#1FE2               // Diagnoseadresse vom Y-Link[/FONT]
[FONT=Verdana]       RET_VAL:=#DIAG.Fehler[/FONT]
[FONT=Verdana]       RECORD :="DIAGNOSE PB".YLink[1]  // Daten ablegen für Y-Link Strang [X][/FONT]
[FONT=Verdana]       BUSY   :=#DIAG.BUSY[/FONT]
[FONT=Verdana]
// "DIAGNOSE PB".YLink[1] sieht so aus:

YLink    ARRAY[1..2]        Profibus Diagnose für Y-Link 1 bis 2    
    STRUCT            
Diagbyte    ARRAY[0..223]        Diagnosedaten von DP Diagnose    
    BYTE            
PBTNOK    ARRAY[0..125]        Profibusteilnehmer OK [Busadresse] hier steht drin ob der jeweilige Teilnehmer mit der jeweiligen Busadresse erreichbar ist.    
    BOOL            
    END_STRUCT            


// Profibusteilnehmer erreichbar kopiere ich mit dem Code:

      CALL  "BLKMOV"                    // Kopieren der PB Teilnehmer OK Meldungen in separates Array
       SRCBLK :=P#DB125.DBX120.0 BYTE 16    // "DIAGNOSE PB".YLink[1].diagbyte[120] byte 16 
       RET_VAL:=#DIAG.Fehler
       DSTBLK :="DIAGNOSE PB".YLink[1].PBTNOK


[/FONT]

Also ich verwende das Bit Teilnehmer erreichbar ("Slaves, die im Datenaustausch mit dem IM 153-2 sind"), der SFC13 liefert aber noch weitere Infos, bin mir grad nicht sicher, wo das dokumentiert war. Da schau ich nächste Woche nochmal, hab die Handbücher nicht hier.

Das ganze funktioniert aber nur, wenn der Y-Link auch erreichbar ist. Bei gestörtem Y-Link setze ich die ganzen bits im PBTNOK noch auf FALSE, da sie sonst ihren bisherigen Wert beibehalten...


Gruß.

PS: Das Handbuch gibts HIer:
https://support.industry.siemens.com/cs/ww/de/view/1142696

Und korrekterweise sollte das Array PBTNOK von [0..127] gehen...

PPS: im Handbuch ist da noch nen Fehler drin. Auf Seite 204 stimmen die Adressen vom DB nicht. Status_Message fängt bei Adresse 100 an. Da hat der Praktikant sich verzählt...

so, jetzt Feierabend.
 
Zuletzt bearbeitet:
Du musst aber auch den Status vom Y-Link an sich diagnostizieren. Dafür gibt es in der BL den Baustein DPAY_V0. Intern wird dort SFC51 bemüht.
das habe ich für das H-System nicht zum laufen bekommen
Für H-Systeme musst Du besondere Zustandslisten auslesen:
Code:
IF CPU_DIAG.H_MODE AND BUSY_T THEN

    BUSY_T  :=  FALSE;
    //SSL-ID W#16#xy71 - H CPU Group Information
    ERROR   :=  RDSYSST (   
                        REQ         := TRUE,
                        SZL_ID      := W#16#71,
                        INDEX       := W#16#0,
                        BUSY        := BUSY_T,
                        SZL_HEADER  := SZL_HEADER,
                        DR          := SZL_71
                        );
                        
    IF (ERROR < INT#32767) AND NOT BUSY_T AND NOT (ERROR = INT#-32638) THEN
    
        CPU_DIAG.H_MODE :=  SZL_71.REDINF   =   W#16#12;
        
    ELSIF ERROR =  INT#-32638 THEN
        
        CPU_DIAG.H_MODE     :=  FALSE;
        SZL_71.REDINF       :=  W#16#0;
        SZL_71.MASTER_0     :=  TRUE;
        SZL_71.MASTER_1     :=  FALSE;
        SZL_71.CPU_RAC0     :=  FALSE;
        SZL_71.CPU_RAC1     :=  FALSE;
        
    END_IF;
   
    MASTER_0    :=  SZL_71.MASTER_0;
    MASTER_1    :=  SZL_71.MASTER_1; 
           
    IF CPU_DIAG.H_MODE THEN
        CPUERR_0            :=  SZL_71.CPU_RAC1;
        CPUERR_1            :=  SZL_71.CPU_RAC0;
    ELSE
        CPUERR_0            :=  SZL_71.CPU_ERR0;
        CPUERR_1            :=  SZL_71.CPU_ERR1;
    END_IF;
    CPU_DIAG.CPU_ERR0   :=  CPUERR_0;
    CPU_DIAG.CPU_ERR1   :=  CPUERR_1;
ELSE
    ;
END_IF;

Wenn Du Subnetzte oder Racks in einem H-System diagnostizierst, ist wichtig die korrekte Subnetz-ID zur Geografie deiner Teilnehmer zuzuordnen. Es gibt nämlich eine "normale" Subnetz-ID und eine redundante Subnetz-ID. Bei Abfrage der SZL Listen werden dabei unterschiedliche Zustände ausgelesen, wenn ein Teilnehmer teil-ausgefallen ist.

Code:
    //===============================================================================================
    //*********************************** DP/PN Interface *******************************************
    //===============================================================================================
    IF NOT CPU_DIAG_PN.CPU_ERR0 AND sdwRESERVE_bool[24] AND SUBN1_ID <> B#16#0 AND SUBN1_ID <> B#16#FF THEN
        REPEAT
            (* Actual status of the rack in the central configuration / the stations of a DP master system / 
            IO controller system that is connected via an integrated DP/PN interface module  *)
            RETURN_CODE         :=  RDSYSST (   
                                            REQ         :=  TRUE,
                                            SZL_ID      :=  W#16#294,
                                            INDEX       :=  BYTE_TO_WORD(SUBN1_ID),
                                            BUSY        :=  sdwRESERVE_bool[24],
                                            SZL_HEADER  :=  SZL_HEADER,
                                            DR          :=  STAT_ZUST0
                                            );
                                            
        UNTIL NOT OB_START_bool[7] OR NOT sdwRESERVE_bool[24] END_REPEAT;
             
        IF NOT sdwRESERVE_bool[24] THEN
            IF RETURN_CODE  =   0 THEN
                IF (STAT_ZUST0[0] OR STAT_ZUST0[1] OR STAT_ZUST0[2] OR STAT_ZUST0[3]) =  DW#16#0 THEN
                    M1ERR               :=  TRUE;   
                    (* 1=Fehler in Master 1 *)
                    M1REDF              :=  NOT (M2ERR OR CPU_ERR1) AND SUB_DIAG.SUBN2_ID   <>  B#16#FF;
                    (* Master 2 verfügbar, wenn kein Master 2 Fehler oder CPU Fehler und Subnetz 2 aktiv *)
                    IF NOT (SUB_DIAG.SUBN1_ID = B#16#0 OR SUB_DIAG.SUBN2_ID = B#16#0) THEN
                        ASIG0_bool[0]       :=  M1ERR AND M1REDF AND NOT M2ERR; // kein Fehler in Master 1 AND Master 2 verfügbar und kein Fehler in Master 2
                        ASIG0_bool[2]       :=  NOT M1REDF AND M1ERR;           // Master 2 nicht verfügbar und Master 1 Fehler
                        ASIG0_bool[1]       :=  M2ERR AND M2REDF AND NOT M1ERR; // kein Fehler in Master 2 AND Master 1 verfügbar und kein Fehler in Master 1
                        ASIG0_bool[3]       :=  NOT M2REDF AND M2ERR;           // Master 1 nicht verfügbar und Master 2 Fehler
                    END_IF;
                    EN_ALRM             :=  ASIG0 <> sbASIG0;
                ELSE
                    M1ERR               :=  FALSE;
                    IF NOT (SUB_DIAG.SUBN1_ID = B#16#0 OR SUB_DIAG.SUBN2_ID = B#16#0) THEN
                        ASIG0_bool[0]       :=  M1ERR AND M1REDF AND NOT M2ERR; // kein Fehler in Master 1 AND Master 2 verfügbar und kein Fehler in Master 2
                        ASIG0_bool[2]       :=  NOT M1REDF AND M1ERR;           // Master 2 nicht verfügbar und Master 1 Fehler
                        ASIG0_bool[1]       :=  M2ERR AND M2REDF AND NOT M1ERR;
                        ASIG0_bool[3]       :=  NOT M2REDF AND M2ERR;
                    END_IF;
                    EN_ALRM             :=  ASIG0 <> sbASIG0;
                END_IF;
            ELSIF RETURN_CODE   =   -32635 THEN
                (* 8085hex - Die Information ist systembedingt momentan nicht verfügbar *)
                sdwRESERVE_bool[24]     :=  TRUE;  
            END_IF;
        END_IF;
    END_IF;

Um den Zustand von einem DP/PA Link oder Y-Link in einem H-System auszulesen, musst Du die 0C75h SZL benutzen.
 
Zuletzt bearbeitet:
jo, den Y-Link diagnostiziere ich auch mit dem SFC51. Die PB-Teilnehmer danach aber mit den Slots Subslots zu machen ist ein Krampf. Vor allem wenn man nur ein Bit "Teilnehmer OK" braucht und die Teilnehmer bei Umbauten sich auch noch oeffter mal aendern. Deshalb der SFC13...
Ich geh mal davon aus, dass der TE kein PCS7 nutzt und auch kein SFM...
Gruss
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich geh mal davon aus, dass der TE kein PCS7 nutzt und auch kein SFM... Gruss
Leider. Sonst hätte es zwar auch die Fragen wahrscheinlich nicht gegeben. Aber ich finde es immer wieder faszinierend, daß bestimmte Leute zwar 15-30 k€ in die Hand nehmen, um ein vollausgestattetes H-System zu erwerben, aber dann für die wenigen k€ für Lizenzen einer BL und Baugruppenträger-Erzeugung im PCS7 sich zu schade sind, und stattdessen alles selber programmieren wollen.
jo, den Y-Link diagnostiziere ich auch mit dem SFC51. Die PB-Teilnehmer danach aber mit den Slots Subslots zu machen ist ein Krampf. Vor allem wenn man nur ein Bit "Teilnehmer OK" braucht und die Teilnehmer bei Umbauten sich auch noch oeffter mal aendern. Deshalb der SFC13...
Nun ja, Siemens nutzt in dem DPAY_V0 teilweise auch den SFC13, daher machst du wahrscheinlich nichts falsch.
 
Zuletzt bearbeitet:
Schon mal besten dank an euch beide. Im Laufe der nächsten Woche habe ich Zugriff auf ein H-System und dann schaue ich mal was ich erreichen kann.


Habs Projekt doch grad noch auf nem Stick gefunden. Also mit SCF51 geht das nicht, sondern mit SFC13:

Den SFC13 hatte ich gefühlt vor 100 Jahren standardmäßig zur Slavediagnose genutzt, bevor ich auf den SFC51 umgestiegen bin. Das ist schon so lange her das ich den gar nicht mehr auf dem Schirm hatte und ich nur noch im SFC51-Tunnel war...


....
Wenn Du Subnetzte oder Racks in einem H-System diagnostizierst, ist wichtig die korrekte Subnetz-ID zur Geografie deiner Teilnehmer zuzuordnen. Es gibt nämlich eine "normale" Subnetz-ID und eine redundante Subnetz-ID. Bei Abfrage der SZL Listen werden dabei unterschiedliche Zustände ausgelesen, wenn ein Teilnehmer teil-ausgefallen ist.
....
Um den Zustand von einem DP/PA Link oder Y-Link in einem H-System auszulesen, musst Du die 0C75h SZL benutzen.

Kriegsentscheide Informationen, danke !


Ich geh mal davon aus, dass der TE kein PCS7 nutzt und auch kein SFM...

Nzute Step7 und oute mich als jemand der keine Ahnung hat was SFM ist.
 
Zurück
Oben