KRC1. Fehler an SPS ausgeben.

  • Hallo Robo-Leutz!!! :)


    Ich brauche Hilfe. :uglyhammer_2:


    Ich programmiere seit kurzem KRC1 Roboter.


    Muss Fehlerausgabe an SPS programmieren.


    Laut Kuka-Anleitung: muss p00.dat geändert werden. :kopfkratz:


    Ich habe p00.dat so vorbereitet:



    DEFDAT P00
    BOOL PLC_ENABLE=TRUE ; Enable error-code transmission to plc
    INT I
    INT F_NO=40
    INT MAXERR_C=23 ; maximum messages for $STOPMESS
    INT MAXERR_A=1 ; maximum messages for APPLICATION
    DECL STOPMESS MLD
    SIGNAL ERR $OUT[25] TO $OUT[32]
    BOOL FOUND


    STRUC PRESET INT OUT,CHAR PKG[3],INT ERR
    DECL PRESET P[255]


    ; z.B. P[1] FEHLERCODE AN SPS = 1
    ;WENN:
    ;AUTOMATIK_EXTERN PKG[] = "P00"
    ;PARITAETSFEHLER = 10


    ; z.B. P[128] FEHLERCODE AN SPS = 128
    ;WENN:
    ;$STOPMESS-MELDUNG PKG[] = "CTL"
    ;NOT-AUS: = 1


    ; APPLICATION MESSAGES: P[1]...P[127]
    P[1]={OUT 128,PKG[] "P00",ERR 10}
    ;...
    ;...
    ;P[127]={OUT 255,PKG[] "P00",ERR 10}



    ; $STOPMESS MESSAGES: P[128]...P[255]
    P[128]={OUT 1,PKG[] "CTL",ERR 1} ; NotAus
    P[129]={OUT 2,PKG[] "CTL",ERR 20} ; NotAus Extern
    P[130]={OUT 3,PKG[] "CTL",ERR 207} ; Schutztür offen
    P[131]={OUT 4,PKG[] "CTL",ERR 208} ; ESC-Sicherheitskreis ausgefallen
    P[132]={OUT 5,PKG[] "CTL",ERR 14} ; Fehler Zustimmkreis
    P[133]={OUT 6,PKG[] "CTL",ERR 1370} ; Passiver Stop (KCP)
    P[134]={OUT 7,PKG[] "CTL",ERR 205} ; Softwareendschalter einer Achse
    P[135]={OUT 8,PKG[] "CTL",ERR 117} ; Momentenueberschrei- tung einer Achse
    P[136]={OUT 9,PKG[] "CTL",ERR 121} ; Ueberstrom einer Achse
    P[137]={OUT 10,PKG[] "CTL",ERR 1131} ; Kollisionsueber- wachung einer Achse ausgeloest
    P[138]={OUT 11,PKG[] "CTL",ERR 1133} ; Max. Getriebemoment einer Achse ueberschritten
    P[139]={OUT 12,PKG[] "CTL",ERR 120} ; Motor blockiert
    P[140]={OUT 13,PKG[] "CTL",ERR 126} ; Stellgroese/Schlepp- fehler einer Achse
    P[141]={OUT 14,PKG[] "CTL",ERR 106} ; Rob. nicht justiert
    P[142]={OUT 15,PKG[] "CTL",ERR 4} ; AKKU-Spg. zu niedrig
    P[143]={OUT 16,PKG[] "CTL",ERR 286} ; PC-Luefter unter Nenndrehzahl
    P[144]={OUT 17,PKG[] "CTL",ERR 287} ; PC-Luefter defekt
    P[145]={OUT 18,PKG[] "CTL",ERR 289} ; Uebertemparatur Schrankluefter
    P[146]={OUT 19,PKG[] "CTL",ERR 1050} ; Profibusfehler Master
    P[147]={OUT 20,PKG[] "CTL",ERR 1051} ; Profibusfehler Slave
    P[148]={OUT 21,PKG[] "CTL",ERR 1033} ; Fehler Lesen Profibus
    P[149]={OUT 22,PKG[] "CTL",ERR 1034} ; Fehler Schreiben Profibus
    P[150]={OUT 23,PKG[] "CTL",ERR 148} ; Arbeitsraum verletzt: freifahren !


    ;...
    ;P[255]={OUT 127,PKG[] "CTL",ERR 1001}


    ABER!!! Fehlern werden an SPS nicht gesendet!!!


    Bei mehreren Testversuchen habe festgestellt: nur Fehler 220 (Antriebe aus, Zwischenkreisspannung noch geladen.) wird ausgegeben – alle andere nicht!!! :nocheck:


    Liegt das an p00-file oder mache ich was falsch?



    Ich bin beim Zweifeln :wallbash: – mindestens soll Not-Aus- und Not-Aus-Externausgabe an SPS funktionieren.


    :huh: Kann es sein das standart programm p00.src nicht richtig funktioniert :twisted:


    Hat jemand damit Erfahrung?

    Einmal editiert, zuletzt von privet199 ()

  • Schritt für Schritt zum Roboterprofi!
  • Hallo,


    ich kenne dein P00.src nicht, vermute aber, dass nur jeweils die letzte Stopmess-Meldung ausgegeben wird.
    Schau dir dein P00 mal an, die Meldungsnummer wird dort mit der Funktion MBX_REC in die Strucktur geschreiben.


    Gruss Stefan


  • Hallo,


    ich kenne dein P00.src nicht, vermute aber, dass nur jeweils die letzte Stopmess-Meldung ausgegeben wird.
    Schau dir dein P00 mal an, die Meldungsnummer wird dort mit der Funktion MBX_REC in die Strucktur geschreiben.


    Gruss Stefan


    So siet p00.src aus:


    Habe Datei p00 hinterlegt.



    DEF EXT_ERR (P_ID,E_NO :IN )
    ;******************************
    ;Function : ext. error messages
    ; for package P00
    ;******************************
    CHAR P_ID[]
    INT E_NO,M
    ;********* MODUL-/FEHLER-NUMMER AUSWERTEN ********
    I=1
    FOUND=FALSE
    IF (E_NO==0) THEN
    IF PLC_ENABLE THEN
    ERR=0
    WAIT SEC 0.2
    ELSE
    IF (ERR_TO_PLC>0) THEN
    $OUT[ERR_TO_PLC]=FALSE
    WAIT SEC 0.2
    ENDIF
    ENDIF
    ELSE
    IF PLC_ENABLE THEN
    FOUND=FALSE
    ;******************************
    ; APPLIKATIONS-FEHLER AUSWERTEN
    ;******************************
    I=1
    REPEAT
    IF (E_NO==P[I].ERR) THEN
    IF (P_ID[1]==P[I].PKG[1]) THEN
    IF (P_ID[2]==P[I].PKG[2]) THEN
    IF (P_ID[3]==P[I].PKG[3]) THEN
    FOUND=TRUE
    ERR=P[I].OUT
    F_WRITE ( )
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    I=I+1
    UNTIL (I>MAXERR_A) OR FOUND
    ;***************************
    ; $STOPMESS-FEHLER AUSWERTEN
    ;***************************
    I=128
    IF (P_ID[1]=="C") THEN
    IF (P_ID[2]=="T") THEN
    IF (P_ID[3]=="L") THEN
    M=MBX_REC(1,MLD)
    IF M==0 THEN
    REPEAT
    IF (MLD.MESSNO==P[I].ERR) THEN
    FOUND=TRUE
    ERR=P[I].OUT
    F_WRITE ( )
    ENDIF
    I=I+1
    UNTIL (I>MAXERR_C+128-1) OR FOUND
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (ERR_TO_PLC>0) THEN
    $OUT[ERR_TO_PLC]=TRUE
    ENDIF
    ENDIF
    ENDIF
    END



    DEF F_WRITE ( )
    IF (F_NO>64) THEN
    F_NO=1
    ENDIF
    ERR_FILE[F_NO].P[1]=P[I].PKG[1]
    ERR_FILE[F_NO].P[2]=P[I].PKG[2]
    ERR_FILE[F_NO].P[3]=P[I].PKG[3]
    ERR_FILE[F_NO].E=P[I].ERR
    F_NO=F_NO+1
    END



    DEF P00_MSG (MSG_NO :IN )
    DECL INT OFFSET,MSG_NO
    DECL STATE_T STATE
    DECL MSG_T P_MSG
    DECL MSG_T EMPTY_MSG
    EMPTY_MSG={MSG_T: VALID FALSE,RELEASE FALSE,TYP #NOTIFY,MODUL[] " ",KEY[] " ",PARAM_TYP #VALUE,PARAM[] " ",DLG_FORMAT[] " ",ANSWER 0}
    P_MSG={MSG_T: VALID FALSE,RELEASE FALSE,TYP #QUIT,MODUL[] "P00",KEY[] " ",PARAM_TYP #KEY,PARAM[] " ",DLG_FORMAT[] " ",ANSWER 0}
    $MSG_T=P_MSG
    SWITCH MSG_NO
    CASE 1
    $MSG_T.KEY[]="PgNo_TypeWrong"
    CASE 2
    $MSG_T.KEY[]="PgNo_LengthTooSmall"
    CASE 3
    $MSG_T.KEY[]="PgNo_LengthWrong"
    CASE 4
    $MSG_T.KEY[]="PgNo_FBitWrong"
    CASE 7
    $MSG_T.KEY[]="PgNo_ReqWrong"
    CASE 10
    $MSG_T.KEY[]="ParityFault"
    OFFSET=0
    SWRITE($MSG_T.PARAM[],STATE,OFFSET,"%d",PGNO)
    CASE 11
    $MSG_T.KEY[]="ProgramNotAvailable"
    OFFSET=0
    SWRITE($MSG_T.PARAM[],STATE,OFFSET,"%d",PGNO)
    CASE 12
    $MSG_T.KEY[]="BCDCodeError"
    OFFSET=0
    SWRITE($MSG_T.PARAM[],STATE,OFFSET,"%d",PGNO)
    CASE 13
    $MSG_T.KEY[]="OperatorModeWrong"
    CASE 14
    $MSG_T.KEY[]="MoveHomeInT1"
    CASE 15
    $MSG_T.KEY[]="ProgNumberWrong"
    ENDSWITCH
    $MSG_T.VALID=TRUE
    HALT
    $MSG_T.RELEASE=TRUE
    WHILE $MSG_T.VALID
    WAIT SEC 0.05
    ENDWHILE
    WAIT SEC 0.2
    $MSG_T=EMPTY_MSG
    END




    Kann ich dieses Problem (Fehlerausgabe an SPS) anders lösen?


    Danke vorraus!!!

    Einmal editiert, zuletzt von privet199 ()

  • Moin,


    wie bekommst du Fehler Nr. "220" Antriebe aus, Zwischenkreisspannung noch geladen auf die SPS. Denn hast du gar nicht deklariert.
    Vielleicht liegt dein Fehler im CELL Programm.
    :denk:


    Gruß Robotnix

  • Gibt es eine Liste dieser Fehlernummern? In folgendem Programmteil werden Nummern an unsre SPS rausgegeben allerdings. Dort taucht immer mal wieder Fehler 29 auf aber ohne Kommentar da der Nummer kein Text zugewiesen ist. Wie bekomme ich nun raus was Fehler Nr 29 (und auch andere) ist?


    Vielen Dank


    EDIT: Ist allerdings ein KRC2. Hab gerade erst gesehen dass es urspruenglich um KRC1 ging.


    Hier der Programmteil den ich angesprochen habe:


    INT K,M


    IF USER_ERR>0 THEN
    DO_ERROR_CODE=USER_ERR
    PULSE ($OUT[ERR_TO_PLC],TRUE,0.5 )
    ELSE
    IF $STOPMESS THEN
    M=MBX_REC(1,ERR_MLD)
    IF M==0 THEN
    FOR K=1 TO MAX_STOP_ERR
    IF ST[K].MESSNO==ERR_MLD.MESSNO THEN
    DO_ERROR_CODE=ST[K].OUT_ERR
    PULSE ($OUT[ERR_TO_PLC],TRUE,0.5 )
    EXIT
    ENDIF
    ENDFOR
    ENDIF
    ENDIF
    ENDIF

  • Hallo Privet199,


    - Als aller erstes muss PLC_ENABLE==TRUE sein, damit es überhaupt funktioniert.
    - Dann muss die Signalgruppe SIGNAL ERR $OUT[25] TO $OUT[32] so definiert sein, wie sie auch von der SPS gelesen wird.
    - Dann muss in der Variablen INT MAXERR_A die Anzahl verwendeten Fehlermeldungen von der eigenen Applikation stehen.
    - Dann muss in der Variablen INT MAXERR_C die Anzahl verwendeten Fehlermeldungen vom System stehen.
    - Dann musst du verstehen was die einzelnen Variablen im STRUC PRESET INT OUT,CHAR PKG[3],INT ERR (das sich im p00.dat befindet) bedeuten.
    CHAR PKG[3]: Ist die Identifikation für welches System die Fehlernummer gilt. (KUKA System, eigene Applikation etc.) Für KUKA Systemfehler muss da "CTL" drin stehen.
    INT ERR: Ist die Fehlernummer des aufgetretenen Fehlers im System PKG[]
    INT OUT: Ist die Nummer, die beim Fehler mit der Nummer ERR an die SPS geschickt wird.
    - Sodann kannst du die Variable DECL PRESET P[255] im p00.dat nach deinem Bedarf modifizieren.


    Mit dem folgenden Aufruf:

    Code
    char P_ID[]
    int E_NO
    
    
    P_ID[]="ABC"
    E_NO=1
    
    
    p00(#EXT_ERR, 0, P_ID[], E_NO)


    und folgender Definition im p00.dat

    Code
    INT MAXERR_A=2
    SIGNAL ERR $OUT[25]  TO $OUT[32]
    
    
    P[2]={OUT 73,PKG[] "ABC",ERR 1}


    wird auf die Ausgänge 25 bis 32 die Zahl 73 binär gelegt.


    Wenn du nun folgende Zeilen am Anfang deines Programms hast:

    Code
    INTERRUPT DECL 3 WHEN $STOPMESS == TRUE DO IR_STOPM ( )
    INTERRUPT ON 3


    werden die Systemfehler beim Auftreten automatisch an die SPS geschickt. (Die Fehlernummer von der Signalgruppe ERR wieder zu löschen ist deine Aufgabe soweit ich das sehe. Ich denke mal, dass du den Fehler 220 einmal da drauf geschrieben hast, aber nie wieder zurückgesetzt. Darum wirst du wohl den Fehler immernoch haben.)


    gruss
    drudge


    P.S.
    im p00.dat hat es am Schluss eine Liste

    Code
    STRUC ERR_MESS CHAR P[3],INT E
    DECL ERR_MESS ERR_FILE[64]


    Das ist ein Logg aller Fehler, die du an die SPS geschickt hast. Gemäss deinem gepostet p00.dat, hast du bis jetzt nur 15 Fehler übermittelt. Alles Systemfehler. Als erstes den Fehler #220, dann drei mal den Fehler #1 und dann noch elf mal den Fehler #207.

    Einmal editiert, zuletzt von Drudge ()


  • Hat jemand eine Idee zu meiner Frage?

  • hmm ich komme jetzt nicht ganz draus. Meinst du im Code wird ein Fehler mit der Nummer 29 übermittelt oder hast du den Fehler mit Nummer 29 auf dem KCP oder gar der SPS?


    Generell sind alle Fehler, die mit der Funktion p00(#EXT_ERR, 0, P_ID[], E_NO) übergeben werden im p00.dat aufgelistet. Zum einen sind das Applikations Meldungen, die du selber definierst oder sonst wie im einem SRC oder DAT zu finden sind. Zum anderen sind das Systemfehler, wobei die Fehlernummer der offiziellen Fehlernummer für KUKA Fehlermeldungen entspricht. Für diese gibt es eine Art Liste.


    Oder sag mir mal wo genau dein Fehler 29 auftritt. (Wenn im Code, dann poste mal den entsprechenden Code) Dann kann ich ev. besser verstehen, was du genau suchst.


    lg
    drudge

    Einmal editiert, zuletzt von Drudge ()

  • Die 29 bekomm ich ueber die Fehlerausgaenge des Roboters an die SPS. Dort taucht Fehler 29 auf dem aber keine meldung zugewiesen ist. Muss also eine KUKA fehlermeldung sein.


    Zum anderen sind das Systemfehler, wobei die Fehlernummer der offiziellen Fehlernummer für KUKA Fehlermeldungen entspricht. Für diese gibt es eine Art Liste.


    Unter 29 hab ich "Antriebsbus DSE <DSE Nummer> Teilnehmer Nr. <Interbus Teilnehmernr.>
    nicht konfiguriert" gefunden. Aber ich denke nicht dass dieser Fehler auftritt.

  • Nein die Zahlen, die du an die SPS kriegst müssen nicht zwingend eine gültige KUKA Fehlermeldung sein. Probier mal

    Code
    ERR = 0

    auszuführen. Hilft das? Ich sehe auch nicht gerade wo der Fehler her kommt. Kannst du mir mal dein Archiv senden oder hier posten?

  • Kann mir jemand sagen was dieser Teil des Programms genau macht? Besonders das hier ist mir nicht voellig klar "M=MBX_REC(1,ERR_MLD)"


    ...
    ELSE
    IF $STOPMESS THEN
    M=MBX_REC(1,ERR_MLD)
    IF M==0 THEN
    FOR K=1 TO MAX_STOP_ERR
    IF ST[K].MESSNO==ERR_MLD.MESSNO THEN
    DO_ERROR_CODE=ST[K].OUT_ERR
    PULSE ($OUT[ERR_TO_PLC],TRUE,0.5 )
    EXIT
    ....


    Dankeschoen!

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden