Beiträge von rob76

    sieht eigentlich alles ok aus.
    hier mal die original fehlerbeschreibung:


    INTP-311 PAUSE (%s^4, %d^5) Uninitialized data is used
    Cause: KAREL program error. Untaught or uninitialized data was used.


    Remedy: Teach or initialize the data before using it.



    die fehlermeldung gibt dir doch den prg name und die zeilennummer an wo er aussteigt.
    genau diese zeile wäre mal interessant.

    das musst du mal genauer erläutern, fürchte sonst versteht hier keiner was du meinst.
    kann mir eigentlich nicht vorstellen das es mit dem call zusammenhängt. bei zutief verschachtelten call's bekommst du normal probleme mit dem stack aber nicht mit uninitialisierten daten. kannst ja mal einen prog auszug hier reinstellen.

    Ist wohl das einfachste die Lichtschranke zu versetzen.
    Funktioniert das ganze denn jetzt mit einem Teil?
    Falls nicht solltest du mal die ganzen Settings vom Linetracking überprüfen.



    p.s. nur weil man etwas nicht kann muss man es nicht gleich als schrott bezeichnen. :shock:
    kenne mich mit abb auch nicht aus, deshalb aber noch lange kein schrott für mich.
    dürfte bei allen herstellern gleich sein: wenn man es richtig macht funktionierts auch.

    der sicherheitskreis von fanucrobotern arbeitet nach der sog. kategorie 4. ein kanal wird mit 0v der andere mit 24v betrieben.
    häufige fehlerquelle ist ein kreuzen der kanäle was in einer defekten endet aber normalerweise nicht mit einem zerstörten pannelboard.
    zerstören kann man allerdings das board wenn man nicht mit potenzialfreien kontakten arbeitet und dem roboter eine fremdspannung eingibt.

    da fehlt dir noch etwas das funktioniert:
    PROG MAIN
    /MN
    1: ! MOVE TO HOME
    2: J P[1] 50% FINE ;
    3: ! ENABLE THE ENCODER
    4: LINE[1] ON ; -> schaltet den encoder ein, reicht wenn man das einmal macht
    5: ! WAIT FOR A PART DETECT
    6: WAIT DI[1] ON ; -> warten auf das teil, brauchst du um auf das teil zu syncronisieren
    7: ! GET TRIGGER VALUE
    8: LINECOUNT[1] R[1] ; -> nun wird der aktuelle encodercount in das register1 geschrieben
    9: ! SET TRIGGER VALUE
    10: SETTRIG LNSCH[1] R[1] ; ->dann wird der encodercount (R1) dem lineschedule 1 zugewiesen
    11: ! SELECT A BOUNDARY
    12: SELBOUND LNSCH[1] BOUND[1] ; -> hier wird das boundary gesetzt
    13: ! CALL TRACKING PROGRAM
    14: CALL TRACK ; ->alle erforderlichen schritte zum linetracking sind erfolgt, nun kann das eigentliche trackingprg
    gestartet
    werden.
    15: ! MOVE TO HOME
    16: J P[1] 50% FINE ;
    /END




    das sind eigentlich die "must have" befehle das es funktionieren kann.
    ein triggersignal ist unabdingbar um das teil zu "finden"
    zu der lichtschranke: entweder näher zum roboter oder du musst per multitasking dir jedes teil "merken" was durch die LS gekommen ist. du brauchst letztendlich zu jedem teil die encodercounts um das teil zu "finden"

    wieso soll er fertig sein bevor ein teil kommt?
    6: WAIT DI[1] ON ;
    er wartet ja immer erst auf den trigger der lichtschranke.



    poste doch mal dein prog inklusive logik. denke dann kann man besser weiterhelfen.

    ist dein prg vereinfacht dargestellt? wenn nicht fehlt dir ne ganze menge.
    hier mal ein bsp. aus dem handbuch:
    PROG MAIN
    /MN
    1: ! MOVE TO HOME
    2: J P[1] 50% FINE ;
    3: ! ENABLE THE ENCODER
    4: LINE[1] ON ;
    5: ! WAIT FOR A PART DETECT
    6: WAIT DI[1] ON ;
    7: ! GET TRIGGER VALUE
    8: LINECOUNT[1] R[1] ;
    9: ! SET TRIGGER VALUE
    10: SETTRIG LNSCH[1] R[1] ;
    11: ! SELECT A BOUNDARY
    12: SELBOUND LNSCH[1] BOUND[1] ;
    13: ! CALL TRACKING PROGRAM
    14: CALL TRACK ;
    15: ! MOVE TO HOME
    16: J P[1] 50% FINE ;
    /END




    /PROG TRACK
    /MN
    1: ! MOVE TO APPROACH POS
    2: L P[2] 500mm/sec FINE ;
    3: ! MOVE TO PART
    4: L P[3] 500mm/sec FINE ;
    5: ! WAIT FOR 5 SECONDS
    6: WAIT 5.00(sec) ;
    7: ! MOVE TO APPROACH POS
    8: L P[2] 500mm/sec FINE ;
    /END

    am einfachsten du besorgst dir das linetracking handbuch. steht alles drinn und ist mit prg-beispielen.
    falls du keins hast auf der fanuc hompage kannst du das finden. musst dich vorher kostenlos anmelden. du bekommst dann zugang zum sogenannten customer resource center. dort sind zahlreiche handbücher online.


    gruß rob76

    @ heini0707
    sooo schlecht ist das handbuch nun auch wieder nicht.
    schau mal nach OPEN FILE und READ.
    Wollte ja dein prog nicht kritisieren, sollte nur ein denkanstoß sein.
    Dachte du hast spass an karel und willst dein prog weiterentwickeln.

    Hallo CrisFTR,
    da hast du vollkommen recht.....ich sprach aber von RM-POS!
    Das ist übrigens natürlich keine Vermutung gewesen, das ist so.
    siehe Auszug Fanuc Schulungshandbuch Grundkurs:


    F1 (R-Logik):
    Kopiert und fügt Bewegungsanweisungen in umgekehrter Reihenfolge ein,
    ohne dass Positionsdaten spezifiziert sind.


    F4 (R-POS):
    Kopiert und fügt Bewegungsanweisungen in umgekehrter Reihenfolge ein.


    F5 (RM-POS):
    Kopiert die Bewegungsanweisungen der Kopierquelle in umgekehrter Reihenfolge. Der Bewegungstyp, die Bewegungsgeschwindigkeit usw. für jede Bewegungsanweisung werden verändert, sodass eine Bewegung gemacht wird, die vollkommen entgegengesetzt zu derjenigen der Quelldatei steht.

    Jep,so ist das.
    Mit der Interpolation is übrigens KEIN Problem. Dafür gibt es RM-POS oder RM-POS-ID.
    Da werden die Punkte so geändert das exakt dieselbe BAHN rückwärts rauskommt.

    Hallo Mike
    Mit Karel wäre das kein Thema aber ich denke mal du willst das in TPE haben.
    Pulslänge indirekt angeben geht leider nicht,gibt auch keine Systemvariabeln dazu.
    Es wäre aber machbar das ganze mit Multitasking oder zur not nen Makroaufruf zu realisieren.
    Man kann bei der WAIT...(sec) Anweisung die Zeit indirekt angeben.
    z.B
    DO[1]=ON
    WAIT R[1] --------im Register 1 steht die Zeit in Sekunden
    DO[1]=OFF
    Wenn du sowas mit Multitasking nebenbei ausführst sollte das funktionieren.
    Wenn der Roboter während des pulsens eh steht gehts natürlich auch ohne.





    Gruß Rob76

    Wenn du dir was selber basteln willst, schau dir im karelhandbuch mal den befehl an:
    SET_PORT_CMT(port_type, IOIndex, iocmtstr, status)
    sollte dir weiterhelfen.

    hallo heini0707,
    hier das orginal file. das muss sich aufjedenfall übersetzen lassen. und nein,das programm wird nicht mit hold angehalten.
    karelhandbuch gibt es leider bisher nur auf englisch.

    heini0707 was meinst du mit neunummerieren? fals du die zeilennr. meinst die spielen vor dem übersetzen garkeine rolle. du kannst auch 100 mal die zeile 1: nehmen.
    das wird beim übersetzen automatisch neu durchnummeriert.
    was übrigens komischerweise mit wintpe und RJ3iC funktioniert ist eine online verbindung. egal ob echte steuerung oder roboguide/olpcpro. bei mir macht wintpe so keine mucken.
    probierts mal aus.


    ich wäre vorsichtig hier kostenpflichtige software zu "vertreiben".
    man kann nie sicher sein wer mitliest.

    hier das ganze auch lauffähig......






    PROGRAM askres


    %ALPHABETIZE


    %NOLOCKGROUP


    %NOPAUSE = COMMAND + TPENABLE + ERROR
    %NOBUSYLAMP -- BUSY und RUNNING AUS
    %COMMENT = 'reset2dout'


    CONST
    tpireset = 153


    VAR


    -- Eigene Variablen
    status : INTEGER -- Statusvariable von Build In Routinen
    real_flag : BOOLEAN -- Identifizierung Integer oder Realwert in Register
    int_value : INTEGER -- R?ckgabe des Integerwert in Register
    real_value : REAL -- R?ckgabe des Realwertes in Register


    --*******************************************************************
    -- Hauptprogramm
    --*******************************************************************


    BEGIN
    repeat
    GET_REG(77, real_flag, int_value, real_value, status)
    -- Wert aus Register [77] lesen (Welcher Ausgang ist an solang TP-Reset gedrückt ist)
    DELAY 100 -- immer für eine unterbrechung in so kurzen hardloops sorgen sonst wird das tp-display extrem in die knie gezogen
    IF TPIN[153]= TRUE OR TPIN[159]= TRUE THEN -- TPIN153-->RESET TPIN159-->SHIFT+RESET
    dout[int_value] = TRUE
    ELSE
    dout[int_value] = FALSE
    ENDIF
    until int_value=0 --programm läuft endlos bis Register 77 eine 0 enthält
    END askres