TIA Baugruppenausfall erkennen

Zombie

Level-2
Beiträge
735
Reaktionspunkte
120
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen,

wie kann ich einen Baugruppenausfall in TIA erkennen.
Im Simatic Manager/ alten Step7 hab ich das mit dem SFC 51 RDSysst gelöst. Fällt eine Baugruppe aus, kann ich ne Fehlermeldung pro Baugruppe anzeigen.

Unter TIA hab ich mir bisher mit dem Get_DIAG Baustein ausgeholfen der im OB1 in jedem Zyklus aufgerufen wird und dann geprüft ob die Variable OwnState aus den Diagnosedaten was anderes als ne 0 beinhaltet.
Und zumindest beim testen im Büro hat das funktioniert.
Eine Nachfrage eines Kunden lässt mich jetzt aber daran zweifeln, weil bei ihm eine Baugruppe ausgefallen war, ohne dass es durch Get_DIAG diagnostiziert wurde.
Das zeigte in den Ausgelesenen Daten eine 0 an.

Bliebe noch der OB86, der in solchen Fällen aufgerufen wird.
Würde der Code mir eine Baugruppennummer zurückmelden, aus der ich auf die ausgefallene Baugruppe schließen könnte?

Code:
//Ausfall eines Profinet DevicesIF #Fault_ID = B#16#CB THEN
    //Kommendes Ereignis
    IF #Event_Class = B#16#39 THEN
        "dbSto".Test := #LADDR;
    ELSIF #Event_Class = B#16#38 THEN
        //Gehendes Ereignis
        "dbSto".Test := 0;
    END_IF;
END_IF;


Danke schonmal
 
Ist denn die entsprechende Diagnose an der Baugruppe aktiviert?
Ja, die muss man teilweise selber aktivieren:
Anhang anzeigen 53080

Hier noch Links mit Handbuch usw...
https://support.industry.siemens.co...ose-mit-s7-1500-und-tia-portal?dti=0&lc=de-WW

https://support.industry.siemens.co...m-anwenderprogramm-mit-s7-1500?dti=0&lc=de-WW

Das man die aktivieren muss wusste ich nicht. Aber ich will ja keine Eingangskarten Diagnostizieren, sondern den Profinet Teilnehmer. Da kann ich nichts aktivieren.
Die beiden Links hab ich auch schon durchgeschaut. Der zweite scheint genau das zu sein was ich will, leider brauche ich aber das Softwarepaket für den G120 Umrichter um das Beispiel öffnen zu können. Das hab ich nicht, also is nix. Und aus der PDF werde ich nicht schlau.

Dieser Haufen kacke geht mir so gegen den Strich. Zum Glück ist das hier mein letztes Projekt, danach gehe ich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dieser Haufen kacke geht mir so gegen den Strich. Zum Glück ist das hier mein letztes Projekt, danach gehe ich.

Das ist eine heftige Einstellung. Ich habe seinerzeit die zugehörigen Bausteine zur DIagnose von DP/PN Ausfall und Modul- /Stationszustand für modulare TIA-Anlage selber gemacht, und würde sie auch gerne hier mit dir teilen. Mich würde allerdings interessieren, weshalb du diese Herausforderung so sehr scheltest. Ich vermag hier keine "Kacke" zu erkennen, víelmehr, ein sehr spannendes Thema.

Es gibt darüber hinaus auch ausprogrammierte SW-Beispiele zur Diagnose von PN/DP Slaves auf 15xx und 12xx CPU's. Zwar insgesamt nicht immer gleich passend für deine Anwendung, aber doch hilfreich.
 
Wenn Du nur den PN Teilnehmer brauchst und nicht die einzelnen Module geht das doch mit DeviceStates super einfach...
In dem Fall tatsächlich einfach. Da stand ich mir mit meiner Laune echt selbst im Weg.

Danke für die Hilfe

Das ist eine heftige Einstellung. Ich habe seinerzeit die zugehörigen Bausteine zur DIagnose von DP/PN Ausfall und Modul- /Stationszustand für modulare TIA-Anlage selber gemacht, und würde sie auch gerne hier mit dir teilen. Mich würde allerdings interessieren, weshalb du diese Herausforderung so sehr scheltest. Ich vermag hier keine "Kacke" zu erkennen, víelmehr, ein sehr spannendes Thema.

Es gibt darüber hinaus auch ausprogrammierte SW-Beispiele zur Diagnose von PN/DP Slaves auf 15xx und 12xx CPU's. Zwar insgesamt nicht immer gleich passend für deine Anwendung, aber doch hilfreich.
Vielen Dank für das Angebot.
Die Einstellung ist heftig, ja das mag sein. Mir ist eine TIA Laus über die Leber gelaufen, deshalb hab ich grad nicht so die Laune mich mit irgend einem Bullshit von Siemens auseinander zu setzen. Und sei es tatsächlich etwas so einfaches wie das hier.
Mir gehts im Grunde darum, dass ich dem Instandhalter sagen muss, die EA Baugruppe auf der Hubeinheit des Krans ist ausgefallen. Mehr brauche ich nicht. Ob jetzt das Kabel gerissen ist, ob die Spannung ausgefallen ist, all das muss ich nicht wissen. Mit RDSYSST hat das in 100% der Fälle funktioniert. In TIA klappte das beim Test im Büro mit V13/V14 über Get_State mit der Prüfung auf OwnState 0. Unter V15 auf der Anlage kann das Ding munter ausfallen, Get_State interessiert es nicht. Und es ist ja nicht so, dass wir nur den einen Kran hätten.
Wenn ich jetzt alle Get_State gegen DeviceState austausche, kriege ich dann in einem halben Jahr, wenn das woanders ebenfalls passiert wieder nen Anruf, dass da was nicht funktioniert. Das verhagelt mir einfach gerade massiv die Laune und irgendwie ist es da gerade schwer die einfachsten PDF Dokumente zu lesen und zu verstehen.
Noch dazu wenn das Beispielprojekt das man von einer Website herunterladen kann, die andauernd auf eine Fehlerseite wechselt, nutzloserweise ein Softwarepaket benötigt, das ich nicht besitze. Anstatt eines G120 Umrichters hätte man auch ne simple ET200 Baugruppe detektieren können.
 
Ich habe dazu mal das UserDiag Paket von Siemens verwendet. Das macht man einmal, und kann es in jedes Projekt kopieren. Ich hab dann noch eine kleine Funktion dazugebastelt die Bitmeldungen aus dem Status generiert. Der einzige echte Aufwand denn man hat ist die Bezeichnungen der Geräte in die Bitmeldungen zu tippen. Und das kann man sicher auch irgendwie automatisieren.

Diagnostics in User Program with S7-1500 - ID: 98210758 - Industry Support Siemens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht hilft dir das weiter:


Code:
 IF #RQ.PARA THEN
            (* Diagnoserequest steht an *)
            REPEAT
        (* ================= CALL GET DIAG Function on the SUBMOD Address ======================== *)
                #i_RETURN_VALUE := GET_DIAG(
                                            MODE := UINT#1,              // Diagnosis of the HW Component witch describtion was given by HWIO
                                            LADDR := #RACK_ID,                // HW-IO Address of the Module
                                            CNT_DIAG => #CNT_DIAG,           // Placeholder
                                            DIAG := #RackGetDiag         // Target Area for RACK Data
                );
            UNTIL #i_RETURN_VALUE <> INT#0 OR #i_RETURN_VALUE = 0 END_REPEAT;
            
            #RQ.PARA := #i_RETURN_VALUE <> INT#0;
            
            IF #i_RETURN_VALUE <> INT#0 THEN
                (* Bearbeitungsfehler beim Aufruf von RDSYS aufgetreten => Parameterierung anfordern *)
                #RQ.PARA :=
            (* Placeholder *)#i_RETURN_VALUE = INT#16#8085 OR   (* Fehler W#16#8085 =>  Die Information ist systembedingt momentan nicht verfügbar *)
            (* Placeholder *)#i_RETURN_VALUE = INT#16#80A4 OR   (* Fehler W#16#80A4 =>  Kommunikation am K-Bus gestört (Fehler tritt auf zwischen CPU und externer DP-Anschaltung) *)
            (* Placeholder *)#i_RETURN_VALUE = INT#16#80A3 OR   (* Fehler W#16#80A3 =>  DP-Protokollfehler bei User-Interface/User (temporärer Fehler) *)
            (* Placeholder *)#i_RETURN_VALUE = INT#16#80A2 OR   (* Fehler W#16#80A2 =>  DP-Protokollfehler (Layer-2-Fehler) (temporärer Fehler)*)
            (* Placeholder *)#i_RETURN_VALUE = INT#16#80C5;     (* Fehler W#16#80C5 =>  Dezentrale Peripherie nicht verfügbar (temporärer Fehler) *)
                
                IF NOT #RQ.PARA THEN
                    
                    #x_ID_CHECK := FALSE;                           (* No ID Check possible because of SFC Failure  *)
                    #x_ERROR := TRUE;                            (* Error of DeviceState Resolution              *)
                    #w_ERROR_ID := INT_TO_WORD(#i_RETURN_VALUE);    (* Return Code of SFC51 to Output               *)
                    
                ELSE
                    #x_ID_CHECK := TRUE;
                END_IF;
            ELSE
                #x_ID_CHECK := TRUE;
            END_IF;
            (* 
            ===============================================================================
            ----------------------- Module State Information: -----------------------------
            =============================================================================== 
            
            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 (nur bei S7-300)
            Bit 8 = 1: Baugruppe Wartungsbedarf ("grün")
            Bit 9 = 1: Baugruppe Wartungsanforderung ("gelb")
            Bit 10 bis 15: reserviert
            
            =============================================================================== 
            *)
            IF NOT #RQ.PARA AND #x_ID_CHECK THEN
                
            (* ------------------------------------------------------------------------------
            1 = Substitute - Das Element wurde durch ein kompatibles Element ersetzt. 
            2 = Substitute - Das Element wurde durch ein nicht kompatibles Element ersetzt. 
            3 = Substitute - Das Element ist nicht erreichbar. 
            ------------------------------------------------------------------------------- *)
                #RACK_INF.ACT_TYP_EXP_TYP := DWORD_TO_WORD(SHR(IN := (#RackGetDiag.ComponentStateDetail AND DW#16#0000_7800), N := 11));    // 11 bis 14 (Enum)
                #IO_TYPE := WORD_TO_BYTE(#RACK_INF.ACT_TYP_EXP_TYP);
                
                #RACK_INF.IOSTATE.%X0 := #RackGetDiag.ComponentStateDetail.%X3;   // Bit 3 = 1, wenn mindestens eine qualifizierte Diagnose vorhanden ist
                #RACK_INF.IOSTATE.%X1 := #IO_TYPE <> B#16#3; // 3 (Bit 11 = 1, Bit 12 = 1, Bit 13 = 0, Bit 14 = 0): No Submodule - Das Element ist nicht vorhanden.
                #RACK_INF.IOSTATE.%X2 := (#RackGetDiag.ComponentStateDetail AND DW#16#0000_0780) <> DW#16#0000_0000 OR
            (*    Platzhalter      *)(#RackGetDiag.ComponentStateDetail AND DW#16#0000_9800) = DW#16#0000_9800 OR // Modul ausgesteckt
            (*    Platzhalter      *)(#IO_TYPE = B#16#3); // 0: Own - Hardware-Komponente ist verfügbar
                #RACK_INF.IOSTATE.%X3 := #RackGetDiag.ComponentStateDetail.%X16;  // Bit 16 = 1: Submodul oder Modul deaktiviert
                #RACK_INF.IOSTATE.%X4 := #RackGetDiag.ComponentStateDetail.%X6;   // Bit 6 = 1: Fehler bei mindestens einem Kanal oder der Komponente
                #RACK_INF.IOSTATE.%X5 := #RackGetDiag.ComponentStateDetail.%X17;  // Bit 17 = 1: CiR-Operation aktiv
                #RACK_INF.IOSTATE.%X8 := #RackGetDiag.ComponentStateDetail.%X4;   // Bit 4 = 1: Wartungsbedarf bei mindestens einem Kanal oder der Komponente
                #RACK_INF.IOSTATE.%X9 := #RackGetDiag.ComponentStateDetail.%X5;   // Bit 5 = 1: Wartungsanforderung bei mindestens einem Kanal oder der Komponente
            (* Bit 10 = 1: Inkonsistenzen im SOll-IST Ausbau => Falsche Baugruppe => *)
                #RACK_INF.IOSTATE.%X10 := (#RACK_INF.ACT_TYP_EXP_TYP <> B#16#0 AND #RACK_INF.ACT_TYP_EXP_TYP <> B#16#1) AND NOT // Modul stimmt oder Modul kompatibel => FBG trifft nicht zu
            (*    Platzhalter       *)(#RACK_INF.ACT_TYP_EXP_TYP = B#16#3);    // Modul nicht erreichbar => FBG trifft nicht zu
                
                
            (* ---------------------------------------------------------------------
            OwnState UINT  Enum Wartungszustand - OwnState hängt von MaintenanceState ab.
            ------------------------------------------------------------------------
            0 Gut Wenn MaintenanceState den Wert 0 hat.
            1 Deaktiviert Wenn MaintenanceState den Wert 1 hat.
            2 Wartungsbedarf Wenn MaintenanceState den Wert 5 hat.
            3 Wartungsanforderung Wenn MaintenanceState den Wert 6 hat.
            4 Fehler Wenn MaintenanceState den Wert 7 hat.
            5 Nicht erreichbar Wenn MaintenanceState den Wert 8 hat.
            6 Diagnosezustand unbekannt - Vorbelegungswert für Komponenten, die keine Diagnoseereignisse liefern.
            7 IO not available - Eingänge/Ausgänge stehen nicht zur Verfügung - Wenn MaintenanceState den Wert 10 hat.
            ------------------------------------------------------------------------ *)
                
            (* Localization of the HW component to be analyzed ( Resolution of RACK -GEO ) *)
                #i_RetVal := LOG2GEO(LADDR := #RACK_ID, GEOADDR := #GEO);
                
                IF #i_RetVal = INT#0 THEN
                (* ************************************************************
                               Att! QPERARF have to been generate here
                *************************************************************** *)
                    #RACK_INF.GEO := #GEO;
                    
                    #IO_ADDR := #GEO.AREA;      // W#16#1 = PROFINET
                    #IO_ADDR := #GEO.HWTYPE;    // W#16#5 = SUBMODULE, 2 IO DEVICE
                    #IO_ADDR := #GEO.IOSYSTEM;  // W#16#64 / INT#100 - PROFINET IO
                    #IO_ADDR := #GEO.SLOT;      // W#16#00 for IO DEVICE, W#16#01 for SUBMODULE
                    #IO_ADDR := #GEO.STATION;   // = GEO.STATION => leave it as is !
                    #IO_ADDR := #GEO.SUBSLOT;   // W#16#00 for IO DEVICE, W#16#02 for SUBMODULE
                    
                    
                    
                    IF #RACK_INF.IOSTATE.%X1 AND                         // Komponente verfügbar
                        NOT #RACK_INF.IOSTATE.%X2 AND
                        #RACK_INF.ACT_TYP_EXP_TYP = B#16#0 THEN         // Komponente Soll-Ist Check ist erfolgreich
                        
                        #RACKF.T_BG_ZS := 0;          (*  Baugruppe Begleitwert       *)
                        #RACKF.FBG := FALSE;
                        #RACKF.ZSMEL := FALSE;
                        #x_QRACKF := FALSE;
                        #x_ERROR := FALSE;
                        #w_ERROR_ID := W#16#0000;
                        
                        IF #RackGetDiag.ComponentStateDetail = DW#16#0000_8000 THEN
                        (* Fehler löschen bei einer vollständig grünen BG *)
                            #RQ.CHRS := TRUE;
                        END_IF;
                    ELSE
                        IF #RACK_INF.IOSTATE.%X10 THEN
                        (* Falsche Baugruppe gesteckt melden *)
                            #RACKF.FBG := TRUE;
                            #RACKF.T_BG_ZS := 35;          (*  Baugruppe Begleitwert       *)
                        END_IF;
                        
                        IF #RackGetDiag.ComponentStateDetail = DW#16#0000_9800 THEN
                        (* Fehler löschen bei einer gezogenen BG *)
                            #RQ.CHRS := TRUE;
                        END_IF;
                        
                    (* Generate 'wrong submodule ID' *)
                        #RACKF.ZSMEL := TRUE;
                        #x_QRACKF := TRUE;
                        #x_ERROR := TRUE;
                        #w_ERROR_ID := W#16#80_44;
                        #x_ID_CHECK := FALSE;
                    END_IF;
                ELSE
                (* Error while System Function Proceeding *)
                    #x_QRACKF := TRUE;
                    #x_ERROR := TRUE;
                    #w_ERROR_ID := INT_TO_WORD(#i_RetVal);
                    #x_ID_CHECK := FALSE;
                END_IF;
                
                #RACK_INF.RESERVE[1] := #ModGetDiag.IOState;    // Sichtbarkeit "IOSTATE" im HMI
                #RACK_INF.RESERVE[0] := #RACKF.T_BG_ZS;         // Sichtbarkeit Kasten im HMI
                #RACK_INF.GEO := #GEO;
                #RACK_INF.OWNSTATE := #RackGetDiag.OwnState;
                
                #RAC_DIAG.RACK_ERR := #x_QRACKF;
                #RAC_DIAG.RACK_NO := #RACK_ID;
                #RAC_DIAG.SUBN1_ID := #byHWIO_SYSTEM;
                #RAC_DIAG.SUBN1ERR := FALSE;
                #RAC_DIAG.SUBN2ERR := FALSE;
            END_IF;
        END_IF;


Und beim Aufruf im OB86:

Code:
    IF #OBSTART.OB_86 THEN
        (* ================= Ablauf im OB86 Baugruppenträgerausfall ================= *)
        IF #CPU_DIAG_PN.OB_86.AREA = #GEO.AREA AND
            #CPU_DIAG_PN.OB_86.SUBNET = #GEO.IOSYSTEM AND
            #CPU_DIAG_PN.OB_86.RACK = #GEO.STATION THEN  // !! HW_IO Rack !!
            (*  ------------------------------------------------------------------------------------------------------------    *)
            #DUSY := BYTE_TO_WORD(#CPU_DIAG_PN.OB_86.TINFO.Fault_ID);
            (*  ------------------------------------------------------------------------------------------------------------    *)
            (*
            IF #CPU_DIAG_PN.OB_86.TINFO.Event_Class = B#16#38 THEN
                (* gehendes Ereignis - Station kehrt wieder *)
                IF #CPU_DIAG_PN.OB_86.TINFO.Fault_ID = B#16#CB OR        // PROFINET IO-Stationsausfall/Stationswiederkehr
                    #CPU_DIAG_PN.OB_86.TINFO.Fault_ID = B#16#CC OR        // PROFINET IO-Stationswiederkehr mit Störung oder Wartung
                    #CPU_DIAG_PN.OB_86.TINFO.Fault_ID = B#16#CD OR        // PROFINET IO-Stationswiederkehr, Sollausbau weicht von Istausbau ab
                    #CPU_DIAG_PN.OB_86.TINFO.Fault_ID = B#16#CE THEN      // PROFINET IO-Stationswiederkehr, Fehler bei der Baugruppenparametrierung
                    
                    #RQ.DIAG := TRUE;   // Diagnose anfordern
                    #RQ.PARA := TRUE;   // Parametrierung anfordern
                    
                ELSE
                    
                    #RQ.CHRS := TRUE;   // Baugruppen-Diagnosealarme löschen
                    #RACKF.BG := FALSE; // Baugruppenfehler = false
                    #EN_OUTP := TRUE;   // Ausgänge freischalten
                    
                END_IF;
                
            ELSE
                (* Kommendes Ereignis - Station geht vom Netz *)
                #RQ.CHRS := TRUE;   // Baugruppen-Diagnosealarme löschen
                #RACKF.BG := FALSE; // Baugruppenfehler = false
                
            END_IF;
            *)
            
            CASE BYTE_TO_INT(#CPU_DIAG_PN.OB_86.TINFO.Fault_ID) OF
                    (* Analyze of Param = Event ID *)
                INT#16#CA, INT#16#CB, INT#16#C4:    // PROFINET IO-Systemausfall / PROFINET IO-Stationsausfall/Stationswiederkehr / Ausfall einer DP-Station
                    (* Event_Class = B#16#39/38, FAULT_ID = CB: PROFINET IO-Stationsausfall/Stationswiederkehr *)
                    #RACKF.ZS := #CPU_DIAG_PN.OB_86.TINFO.Event_Class = B#16#39;      (*  PROFINET IO-Station ausgefallen    *)
                    #RACKF.FBG := FALSE;                                             (*  Falsche Bauruppe 2.8.2001 SCH      *)
                    
                    IF #RACKF.ZS THEN
                        
                        #x_QRACKF := TRUE;              // 12.07.2018 
                        #x_WR_REQ_INTERNAL := FALSE;    // 12.07.2018 
                        #x_RD_REQ_INTERNAL := FAlse;    // 12.07.2018 
                        
                        #RACKF.ZSMEL := TRUE;        (*  Baugruppe gezogen melden    *)
                        #RACKF.T_BG_ZS := 18;          (*  Baugruppe Begleitwert       *)
                    ELSE
                        #RACKF.ACC := FALSE;       (*  Zugriffsfehler              *)
                        #RACKF.ZSMEL := FALSE;       (*  Baugruppe gezogen melden    *)
                        #RACKF.T_BG_ZS := 0;          (*  Baugruppe Begleitwert       *)
                    END_IF;
                    
                    IF #CPU_DIAG_PN.OB_86.TINFO.Event_Class = B#16#38 THEN
                        (* gehendes Event *)
                        (* HW_IO of RACK 
                        #GEO.AREA := WORD_TO_UINT(#RACK_INF.Ber_bgbr);
                        #GEO.HWTYPE := WORD_TO_UINT(#RACK_INF.RESERVE);
                        #GEO.STATION := BYTE_TO_UINT(#RACK_INF.RACK_NO);
                        #GEO.IOSYSTEM := BYTE_TO_UINT(#RACK_INF.SUBN_ID);
                        #GEO.SLOT := BYTE_TO_UINT(#RACK_INF.SLOT_NO);
                        #GEO.SUBSLOT := BYTE_TO_UINT(#RACK_INF.SUBSL_NO);
                        
                        #i_RetVal := GEO2LOG(GEOADDR := #GEO, LADDR => #HWIO_ADDR);*)
                        (* Outgoing, no more diagnostic errors are pending *)
                        #i_RETURN_VALUE := GET_DIAG(
                                                    MODE := UINT#1,                 // Diagnosis of the HW Component witch describtion was given by HWIO
                                                    LADDR := #RACK_ID,              // HW-IO Address of the Module
                                                    CNT_DIAG => #CNT_DIAG,          // Placeholder
                                                    DIAG := #statGetDiag            // Target Area for SUBMODULE Data
                        );
                        
                        IF #i_RETURN_VALUE = INT#0 THEN
                            (* Check the ModuleState *)
                            IF #statGetDiag.ComponentStateDetail = DW#16#0000_8000 THEN
                                (* No Diagnostic Interrupt pending *)
                                #x_QDIAG := FALSE;
                                (* ModuleState completely OK - clear the ErrorStorage *)
                                ;
                                // FOR #i_RetVal := 0 TO #c_EADD_MAX BY 1 DO
                                //     #DIAG_ALARM[#i_RetVal] := W#16#0000;
                                // END_FOR;
                            END_IF;
                        END_IF;
                    END_IF;
                    
                INT#16#CC, INT#16#C5:    // B#16#CC, B#16#C5:
                    (* Event_Class = B#16#38, FAULT_ID = CC: PROFINET IO-Stationswiederkehr mit Störung oder Wartung *)                    
                    IF #CPU_DIAG_PN.OB_86.TINFO.Event_Class = B#16#38 THEN
                        (* Wiederkehr *)
                        (* ======================================================================================== *)
                        (* **************************** RDREC 800A ON SLOT **************************************** *)
                        (* ======================================================================================== *)
                        
                        #x_QDIAG := TRUE;
                        #RQ.OB1PARA := TRUE;
                        #RQ.DIAG := TRUE; (* Neu 04.04.2019 *)
                        
                    END_IF;
                    
                    #RACKF.T_BG_ZS := 35; (* Falscher BG-Typ gesteckt *)
                    
                INT#16#CD, INT#16#C8:      // B#16#CD, B#16#C8:
                    (* Event_Class = B#16#38, FAULT_ID = CD: PROFINET IO-Stationswiederkehr, Sollausbau weicht von Istausbau ab *)
                    #RACKF.T_BG_ZS := 36; (* Gestörte BG gesteckt *)
                    #RACKF.FBG := TRUE;
                    #RACKF.ZSMEL := FALSE;
                    
                INT#16#CE, INT#16#C7:    // B#16#CE, B#16#C7:
                    (* Event_Class = B#16#38, FAULT_ID = CE: PROFINET IO-Stationswiederkehr, Fehler bei der Baugruppenparametrierung *)
                    #RACKF.T_BG_ZS := 37; (* BG gesteckt Parametrierfehler *)
                    #RACKF.FBG := TRUE;
                    #RACKF.ZSMEL := FALSE;
                    #RQ.DIAG := TRUE; (* Neu 04.04.2019 *)
                    
                INT#16#CF, INT#16#C9:   //  B#16#CF, B#16#C9:
                    (* Event_Class = B#16#32/33, FAULT_ID = CF: Aktivierung/Deaktivierung eines PROFINET IO-DEvices mit der Anweisung "D_ACT_DP" *)
                    #RACKF.ACC := #CPU_DIAG_PN.OB_86.TINFO.Event_Class = B#16#33;      (*  B#16#33: Deaktivierung einer Station mit der Anweisung "D_ACT_DP"    *)
                    
                    IF #RACKF.ACC THEN
                        #RACKF.ZS := FALSE;       (*  Baugruppe gezogen           *)
                        #RACKF.ZSMEL := FALSE;       (*  Baugruppe gezogen melden    *)
                        #RACKF.T_BG_ZS := 39;          (*  Baugruppe Begleitwert       *)
                    ELSE
                        #RACKF.ZS := FALSE;       (*  Baugruppe gezogen           *)
                        #RACKF.ZSMEL := FALSE;       (*  Baugruppe gezogen melden    *)
                        #RACKF.T_BG_ZS := W#16#0;      (*  Baugruppe Begleitwert       *)
                        #RQ.DIAG := TRUE; (* Neu 04.04.2019 *)
                    END_IF;
                ELSE:
                    #RACKF.T_BG_ZS := W#16#99;    (* Unbekannte Event-ID *)
            END_CASE;
            
            REGION Message OB86
                (* =========================================================================================================== *)
                (* ================= Message Generation with Programm Alarm for an OB83 Pull-/Plug Event ===================== *)
                (* =========================================================================================================== *)
                #RACK_INF.RESERVE[0] := #RACKF.T_BG_ZS;               // Sichtbarkeit Kasten im HMI
                
            END_REGION
            
        END_IF;
    END_IF;
 
Unter V15 auf der Anlage kann das Ding munter ausfallen, Get_State interessiert es nicht. Und es ist ja nicht so, dass wir nur den einen Kran hätten.

Was macht dann das Datum "ComponentStateDetail", welches im Struct enthalten ist, wo das Get_Diag zurückliefert ? Bleibt es auf DW#16#0000_8000 oder ändert das es seinen Wert ?
 
Hmm, bei wichtigen Überwachungen schalte ich schon mal einen DI auf Dauerplus... Aber eine Gewähr, dass TIA alle Eingänge wirklich immer bei Kommunikationsausfall auf false setzt, gibts auch nicht. Hatte da auch schonmal einen nicht reproduzierbaren Fall, wo das nicht so war...

Also ich bin da auf Zombis Seite, das TIA Dings ist schon irgendwie Mist, wenn man hohe Qualitätsansprüche hat...

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm, bei wichtigen Überwachungen schalte ich schon mal einen DI auf Dauerplus... Aber eine Gewähr, dass TIA alle Eingänge wirklich immer bei Kommunikationsausfall auf false setzt

Eben, diese Lösung ist für Anfänger auch mit Vorsicht zu genießen, z.B. wenn "Bei Ausfall letzen Wert halten" oder "Ersatzwerte" aktiviert ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was macht dann das Datum "ComponentStateDetail", welches im Struct enthalten ist, wo das Get_Diag zurückliefert ? Bleibt es auf DW#16#0000_8000 oder ändert das es seinen Wert ?
Das weiß ich leider nicht. Ich hab nur die Rückmeldung vom Instandhalter bekommen, dass der Wert den ich abfrage in der Steuerung 0 ist, obwohl die Baugruppe da wo sie liegt definitiv nicht mehr mit der Steuerung verbunden sein kann. Ich werde deine Bausteine mal testen, vielen Dank.

Hmm, bei wichtigen Überwachungen schalte ich schon mal einen DI auf Dauerplus... Aber eine Gewähr, dass TIA alle Eingänge wirklich immer bei Kommunikationsausfall auf false setzt, gibts auch nicht. Hatte da auch schonmal einen nicht reproduzierbaren Fall, wo das nicht so war...

Also ich bin da auf Zombis Seite, das TIA Dings ist schon irgendwie Mist, wenn man hohe Qualitätsansprüche hat...

Gruß
Qualitativansprüche hab ich ja gar keine. :D
Ich will nur ein verlässliches Signal dass Baugruppe X ausgefallen ist. Wenn ich mich nicht drauf verlassen kann ist der Mist alles nix wert.

Der Device State hat bei den Tests hier im Büro jedenfalls erstmal funktioniert. Wie damals die andere Lösung zwar auch, aber eventuell ist da ja was zwischen V14 und 15 unterschiedlich. Ich weiß es nicht.
Was ich auch seltsam finde, ich hab ne 1515F hier. An der hängen mehrere ET200 Module. Die kann ich abziehen wie ich will, die Steuerung ist nicht in den Stopp zu kriegen. hängt das daran dass es ne F Steuerung ist?
 
Was ich auch seltsam finde, ich hab ne 1515F hier. An der hängen mehrere ET200 Module. Die kann ich abziehen wie ich will, die Steuerung ist nicht in den Stopp zu kriegen. hängt das daran dass es ne F Steuerung ist?

Ne 1500er geht generell nicht in Stop, da fällt mir ausser Zykluszeitüberschreitung eigentlich nix ein...

Gruß.
 
Zurück
Oben