TIA TIA Bereichslängenfehler in FB

GrafZ4hl

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Einen wunderschönen Guten Morgen,
ich bin Student im Bereich Elektrotechnik - Automatisierungstechnik und bin in unserer Hochschule für eine kleine Modellanlage verantwortlich. Diese funktioniert leider seit neustem nicht mehr, da eine der SPSen beim Hochfahren direkt in den Stop-Modus übergeht. Dafür verantwortlich ist anscheinend ein Bereichslängenfehler in einem der Funktionsbausteine, welcher die die Bestandsanzeige des Hochregallagers mit dem MES-System synchronisiert. Wir haben schon einen Workaround gefunden um die Anlage wieder funktionstüchtig zu bekommen, allerdings hebelt dieser Workaround die Anzeige aus. Folgende Fehlerbeschreibung liefert mir TIA V13 beim Starten der zuständigen CPU:

Code:
Temporärer CPU-Fehler: Bereichslängenfehler in FB 802 betrifft OB 1 Ausführung 
Lesezugriff DB-Bereich 
fehlerhafte Adresse, Operand ersetzt 
 
 ASRS
interne Adressierungsdetails: Caddr=16#00000177, Bereich: DB-Bereich, Adr: 486

Die angeblich fehlerhafte Adresse ist im Code Rot hinterlegt:

Code:
    //********************************************************************************
    // Initialization
    //********************************************************************************
    IF #xInit THEN  
        #iStep := 1;
        #iZero := 0;
    END_IF;    
    
    //********************************************************************************
    // Initialization
    //********************************************************************************
    IF #iMode <> 3 THEN  
        #iZero := 0;
        #iRetVal := FILL(BVAL := #iZero, BLK => #MesASRS);
    END_IF;    


    //********************************************************************************
    // check Send-Timeout
    //********************************************************************************
    #EN1 := (#xEnable AND (#iStep = 10) AND (#iMode = 3)); 
    #TON_Delay(IN := #EN1 , PT := T#1s);




    CASE #iStep OF
        
        1:  //*********************************
            //  Init
            //*********************************
            #iZero := 0;
            #iStep := 10;


                
        10: // wait until delay time passed --> send MES Query "MesRdBuffer"
            IF "dbHmi"."MES".ReqTrayData THEN
                "GetPalletInfo"(iPalletId := "dbHmi"."MES".ASRS.Overview["dbHmi"."Inventory".ShelfNo].[COLOR=#ff0000]PalletId[/COLOR]
                                  ,pRcvHeader := #RcvHeader
                                  ,pRcvPar := #RcvParPallet
                                  ); 
                 "dbHmi"."MES".ReqTrayData := False;
                 #iStep := 20;
            
            ELSIF "dbHmi"."MES".ReqBottleData THEN
                #iOPos := "dbHmi"."Inventory".BottleNo + ("dbHmi"."MES".ASRS.Detail.OPos * 100);
                "GetParSubPos"(diONo :=  "dbHmi"."MES".ASRS.Detail.ONo
                                 ,iOPos :=  #iOPos
                                 ,iMaxRecords := 12
                                 ,pRcvHeader := #RcvHeader
                                 ,pRcvPar := #RcvParBottle
                                 ); 
                 "dbHmi"."MES".ReqBottleData := False;
                 #iStep := 25;
                 
            ELSIF #TON_Delay.Q THEN
                "GetBufForBufNo"(iResourceId := "dbMes".iResourceId
                            ,iBufNo := 1
                            ,iMaxRecords := 16
                            ,pRcvHeader := #RcvHeader
                            ,pRcvPar := #RcvPar
                            );
                #iStep := 15; 
            END_IF;               
             
             
        15: // Wait Mes Query finished
            IF #RcvHeader.xDone THEN
                // Mes Query finished
                #iRetVal := BLKMOV( SRCBLK := #RcvPar, DSTBLK => #MesASRS );
                #iStep := 10;
            END_IF;




        20: // Wait "MesShowPalletInfo" finished
            IF #RcvHeader.xDone THEN
                // Mes Query finished
                "dbHmi"."MES".ASRS.Detail.ONo := #RcvHeader.diONo;
                "dbHmi"."MES".ASRS.Detail.OPos := #RcvHeader.iOPos;
                "dbHmi"."MES".ASRS.Detail.PNo := #RcvHeader.diPNo;
                "dbHmi"."MES".ASRS.Detail.PalletId := #RcvHeader.iPalletId;
                "dbHmi"."MES".ASRS.Detail.CNo := #RcvHeader.diCNo;
                "dbHmi"."MES".ASRS.Detail.ResourceId := #RcvHeader.iResourceId;
                "dbHmi"."MES".ASRS.Detail.StepNo := #RcvHeader.iStepNo;
                "dbHmi"."MES".ASRS.Detail.Release := #RcvParPallet.Release;
                "dbHmi"."MES".ASRS.Detail.Start := #RcvParPallet.Start;
                #iStep := 10;
            END_IF;


        25: // Wait "MesShowParSubPos" finished
            IF #RcvHeader.xDone THEN
                // Mes Query finished
                #iRetVal := BLKMOV( SRCBLK := #RcvParBottle, DSTBLK => "dbHmi"."MES".ASRS.Bottle );
                #iStep := 10;
            END_IF;


    END_CASE;

Habt ihr eine Idee wo das Problem liegen könnte? Es hat niemand etwas weder an der physikalischen SPS noch an der Software geändert, das Problem ist einfach über Nacht aufgetaucht.

Viele Grüße und ein großes Danke im Vorraus!
Graf Z4hl
 
Ist in "dbHmi"."Inventory".ShelfNo ein für das Array "dbHmi"."MES".ASRS.Overview[..] zulässiger Wert?
PS: Ist der DB "dbHmi" online OK? (groß genug? entspricht dem offline-DB im Projekt?)
PPS: stehen im Diagnosepuffer der CPU Einträge über Remanenzverluste, Fehler Speicherverwaltung, Urlöschen oder überhaupt Fehler-Einträge seit vor dem Problem?

Harald
 
Zuletzt bearbeitet:
Zurück
Oben