Beiträge von Hermann

    Hallole,
    meistens stimmt da was mit den ersten paar Zeilen nicht:


    &ACCESS RVO
    &REL 1
    &COMMENT Testprog
    &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
    &PARAM EDITMASK = *
    DEF Testprog( )


    Irgendwie auf der Tastatur vergrabbelt und ein Leerzeichen eingefügt oder so.


    Tschau
    Hermann

    Warum soll's denn was spezielles sein?
    Wenn es etwas universelles gibt.

    Hab's gerade mit Ultraedit probiert:
    Klappt wunderbar mit dem Einrücken, wenn man die passende Syntax-Beschreibungsdatei hat.
    Und das nachdem ich vor laanger Zeit mal selber ein kleines Programm
    geschrieben hatte, das die Aufgabe (nur das Einrücken, und wenn
    gewünscht das Entfernen der Folds für einen gscheiten Ausdruck)
    erledigt :-((

    Da gibt es ein Word/Excel-Makro (war mal frei verfügbar), das so
    einiges mit KUKA-Quellen anfangen kann, hab ich aber nur einmal kurz ausprobiert und wieder verworfen, da es grössere Programme komplett
    zerschiesst (war jedenfalls bei mir so).

    Gruss Hermann

    Hallo,
    da würde ich als erstes mal bei KUKA nachfragen (+49 821 1926).
    Hier mal meine Erfahrungen mit solchen oder ähnlichen Fehlern:

    Auf alle Fälle mal einen Kaltstart auslösen.

    ESC-Karte (rechts unten im Schaltschrank) defekt.
    PNOZ (für die Schutztür) schaltet nicht richtig/defekt.
    Betriebsspannung für das PNOZ (der Schutztür) nicht ok.
    Betriebssystem des Roboters zerschossen.

    Allgemeine Erfahrung mit Palletierroboter: Der hat einige Besonderheiten im Betriebssystem, Achtung beim Anfahren eines LIN-Satzes nach Satzanwahl. Wenn man da den Startknopf loslässt und anschliessend wieder drückt, dann fährt das Ding plötzlich PTP auf den Zielpunkt weiter! Wenn's eng hergeht, dann kann das natürlich einen Crash hervorrufen.

    Gruss Hermann

    Hallo,
    ich hab es damals in dem Beispielprogramm im Modul base_mt.sys gefunden. In der Doku habe ich nur bei der Beschreibung des Befehls 'StartLoad' in der Datei 'System_Datentypen_Routinen.pdf' etwas darüber gefunden.

    PROC CallByVar(string Name,
    num Number)
    IF (Number-Trunc(Number) <> 0) OR (Number<0) THEN
    ErrWrite "CallByVar fault", "Argument Number is not an integer or"
    \RL2:= "is negative.";
    Stop;
    EXIT;
    ENDIF
    %Name+NumToStr(Number,0)%;
    ENDPROC


    Sinn der Sache ist, das man einen Unterprogrammaufruf programmieren kann, obwohl das aufgerufene Unterprogramm noch gar nicht im Speicher vorhanden ist.
    Normalerweise wird ja schon beim Laden des Programms überprüft, ob alle augerufenen Unterprogramme vorhanden sind. Über die % kann man ein sogenanntes 'late binding' erreichen, dann wird der Unterprogrammname erst bei der Abarbeitung der Zeile zusammengebaut und ausgewertet.

    Lange Rede kurzer Sinn:

    Wenn das Programm so aussieht, dann kann man es laden ohne Fehler, erst beim Ablauf ergibt es einen Fehler.

    Module testprog


    Proc main()
    %"programm_1"%;
    %"programm_2"%;
    endproc

    Proc programm_1 ()
    waittime 1;
    endproc
    endmodule

    Sieht die Sache folgendermassen aus, dann gibt es schon beim Laden des Programms einen Fehler, weil die Routine programm_2 fehlt:

    Module testprog

    Proc main()
    programm_1;
    programm_2;
    endproc

    Proc programm_1 ()
    waittime 1;
    endproc
    endmodule

    Hoffe das hilft über die Schwierigkeiten hinweg.

    Gruss aus dem Schwabenland
    Hermann

    Hallo,
    sieh mal im Handbuch unter den Befehlen 'Load' und 'Unload' nach.

    Sollte sich so ähnlich wie im folgenden geschildert machen lassen (nur mal so aus dem Gedächtnis hingeschrieben, also ohne Gewähr auf absolute Richtigkeit)

    Var string NewModname;
    Var num ii;
    ii:=2; ! Hier Einlesen der Nummer von der SPS anstelle der 2
    NewModname:="Modul"+NumToStr(ii,0);
    Load "HOME:"\File:=NewModname+".MOD";
    ! Aufruf des Programms ueber Variable, damit ohne geladenes
    ! Modul kein Fehler auftritt
    %"Prog"+NumToStr(ii,0)%;
    ! Nach Programmende das Modul wieder rausschmeissen
    UnLoad "HOME:"\File:=NewModname+".MOD";

    Es müsste dann ein Modul Modul2.MOD im Home-Verzeichnis geben und in diesem Modul müsste eine Routine Prog2 existieren.

    Gruss Hermann

    Zu der Frage der Umwandlung Strings -> Integer:

    Da gibt es den Befehl SREAD, hier ein kleines Beispiel:

    DECL STATE_T STATE
    INT OFFSET
    INT INTVAR
    CHAR STRING[10]

    STRING[]="20"
    OFFSET=0
    SREAD(STRING[],STATE,OFFSET,"%D",INTVAR)

    Hermann

    Auch wenn 0.2mm seeehr wenig Spiel ist:
    Manchmal hilft es, wenn man 'rückwärts' teacht.
    Also Bauteil von Hand einlegen, mit dem Greifer hinfahren und solange mit Greifer auf/zu / Roboter verfahren spielen, bis sich das Bauteil beim Greifer schliessen nicht mehr bewegt,
    dann den Punkt teachen, und das Einfädeln dann von dieser
    Position aus rückwärts teachen.
    Vorsicht: das Hin- und Herfahren beim Herausfinden der genauen Greifposition, nicht übertreiben, dabei
    baut sich durch das unvermeidliche Spiel mit der Zeit so viel Ungenauigkeit auf, dass die Position hinterher nicht mehr stimmt. Dann lieber von vorne anfangen (deutlich von der Position wegfahren und neu ansetzen).

    Noch was zu der kleinen Toleranz: Schon mal an Fügehilfen / Ausgleichselemente gedacht?

    Gruss Hermann

    Ich musste das bei einem Projekt bei DC in Sindelfingen verwenden. Die verwenden das angeblich standardmässig.

    Gruss Hermann

    Sorry, dachte das wäre klar:
    Halt ganz am Anfang der Ausgaberoutine. wichtig ist dass
    danach zuerst mal $MSG_T.Valid auf false gesetzt wird.
    Also ungefähr so:
    DEF MSGTXT (NR :IN)
    DECL INT NR

    DECL INT ANSWER
    DECL INT COUNTER
    DECL INT OFFSET
    DECL STATE_T STATE
    DECL MSG_T EMPTY_MSG
    DECL INT I

    NOCHM:

    EMPTY_MSG={MSG_T: VALID FALSE,RELEASE FALSE,TYP #NOTIFY,MODUL[] " ",KEY[] " ",PARAM_TYP #VALUE,PARAM[] " ",DLG_FORMAT[] " ",ANSWER 0}

    $MSG_T.VALID=FALSE
    $MSG_T=EMPTY_MSG
    $MSG_T.MODUL[]=" "

    ;copy input-string, to make sure, that .key gets 40 characters
    FOR I=1 TO 58
    $MSG_T.KEY[i]=ERR_TEXT[NR].TEXT[i]
    ENDFOR


    $msg_t.param[]=" "

    $MSG_T.KEY[59]=" "
    $MSG_T.KEY[60]=" "
    $MSG_T.PARAM_TYP=#VALUE
    $MSG_T.VALID=TRUE

    COUNTER=0
    WHILE (($MSG_T.VALID==TRUE) AND (COUNTER<20))
    ;because sometimes valid does not change to false (KUKA-Live !!)
    COUNTER=COUNTER+1
    WAIT SEC 0.2
    ENDWHILE
    WAIT SEC 0.2

    IF COUNTER>=20 THEN
    GOTO NOCHM
    ENDIF

    Das lässt sich alles im KUKA-Sim erledigen.
    Da gibt es diese kleinen Greifersymbole, einmal
    'Zupacken' (geschlossener Greifer) und einmal loslassen (ge-
    öffneter Greifer).
    Es ist aber manchmal nicht so einfach die 'greifaktive
    Fläche' so auf dem zu greifenden Objekt zu platzieren,
    dass es auch mitgenommen wird. Das kann ganz schön an die
    Nerven gehen.

    Es gibt da zwei Möglichkeiten:

    1. Das Stahlstück (kann man bei Kuka kaufen),
    wenn dieses eingebaut wird, dann versteht es sich von selbst
    die Softwareendschalter so zu setzen, dass
    das Stahlstück nicht vom Roboter gerammt werden kann. (Ist
    ja standardmässig auch für die +/-185 Grad so gemacht). Die
    von Kuka gelieferten Anschläge sind nur 15 Grad genau
    einzustellen.

    2. Mit elektr. Achsbereichsschaltern (Standardmässig
    lieferbar für Achse 1 bis 3). Dazu benötigt man dann
    noch PNOZe, die die Achsbereichsschalter auswerten,
    die dann in den Schutztürkreis bzw. Not-Aus-Kreis
    eingebunden werden. Die Montage der Achsbereichsschalter
    bzw. der Nockenbahnen ist aber recht fummelig, und
    für eine Sache, die mit einem Anschlag realisiert werden
    kann entschieden zu teuer.

    Gruss Hermann

    Das Problem ist auch bei Kuka bekannt, denn im Beispiel von Kuka sieht das so aus:

    COUNTER=0
    WHILE (($MSG_T.VALID==TRUE) AND (COUNTER<20))
    ;because sometimes valid does not change to false
    COUNTER=COUNTER+1
    WAIT SEC 0.2
    ENDWHILE
    WAIT SEC 0.2
    IF COUNTER>=20 THEN
    GOTO NOCHM

    Da gibt es eine sogenannte 'College-CD'. Wie und ob man die offiziell bekommt weiss ich jetzt auch nicht. Aber da ist die Erstellung der Inlineformulare erklärt, im Dokument
    5_2_de.pdf im Ordner cd-standard-de\03_Software\Systemsoftware\Release22\Programmierung.

    Über das Menü, das sich beim Einlegen der CD öffnet habe ich die Datei nicht gefunden, habe mir aber mal einen Index über alle PDF-Dateien erstellt, da findet man das dann in Sekunden. (Ist bei der bescheidenen Form der Doku, ca. 800 pdf-Dateien, wer soll da schon was finden? sowieso empfehlenswert)

    Soweit ich mich erinnern kann gibt es da auch einen Kurs bei Kuka.

    Gruss

    Nein, das gilt eigentlich gar nicht, so wie ich es beschrieben habe, denn laut letzter Aussage von KUKA ist das Teach-In von Punkten in 'Nicht-Inlineformularen' eine Funktion des Expert-Tech-Pakets.
    Dieses war auf unserem Roboter nicht installiert.
    Bei der neuesten Version sind nur noch die Pakete installiert, die auch bestellt wurden.
    Was jetzt an den Grundbefehlen 'Expert-Tech' sein soll, das können wohl nur KUKA-Vertriebsstrategen sagen.

    Hallo,
    wenn man schon $tool und $base von hand zuweist, dann kann man das auch noch mit $IPO_mode machen:
    $ipo_mode = #tcp oder halt $ipo_mode = #base

    Die Sache mit dem Teachen der Positionen ohne Inline Formular hat in der neuesten Ausgabe des Betriebssystems (V5.2.5) einen Rückschritt gemacht, da geht es nämlich nicht mehr. Ich hoffe nur, dass das ein Fehler ist, der wieder behoben wird.

    Gruss Hermann

    Zu JVisu kann ich nichts sagen,
    aber bis zu den Versionen 4.x gab es eine COM-Schnittstelle (undokumentiert) über einen COM-Server, CROSSCOMMEXE.EXE (oder so ähnlich). Der stellt einige Befehle zur Verfügung, über die man sich Variableninhalte 'ansehen', oder ändern kann.
    Ausserdem kann man sich sogar automatisch benachrichtigen lassen, wenn sich eine Variable (bis zu 4 Stück) ändert.
    Man kann Programme hin- und herübertragen und weiss nicht was noch alles.

    Leider ist diese Schnittstelle ab der Version 5.x so wie es scheint nicht mehr vorhanden.