Beiträge von Hermann

    Schön, dass das so klappt,
    aber manchmal braucht man dann doch etwas grössere
    Arrays.


    Hatte da auch mal eine Aufgabe mit einem
    20000 Punkte Array gelöst.


    Dazu die Punkte in mehrere .DAT-Dateien aufgeteilt,
    in einem anderen dann importiert. Und zwei Routinen
    geschrieben, die dann jeweils den Index und den Namen
    des entsprechenden Arrays ermitteln und darauf zugreifen.


    Hier das etwas gekürze Beispiel.



    eine zweite enstsprechende bahnen2.dat


    Und im .SRC dazu:



    Und Tschüss.

    Hallole,
    also ich hatte da mal was über die crosscommexe.exe Schnittstelle
    gestrickt. Aber die ist ja leider jetzt weggefallen.


    Da wurde die Kamera über ein Windows-Programm gesteuert,
    dieses kommunizierte dann über die crosscommexe mit
    dem Roboter.


    Gruss Hermann

    Hallole,
    ja genau, der Zugriff auf NAME liefert schon eine Ganzzahl (Integer).


    Zu beachten ist, falls man auch negative Zahlen verarbeiten will/muss:


    Automatisch geht's nur wenn das SIGNAL 32 Bit lang ist. Der Roboter
    wertet dann das höchste Bit als Vorzeichen aus. Die komplette Zahl wird
    korrekt als Zweierkomplement ausgewertet.


    Will man nur 16-Bit-Zahlen austauschen, dann muss man sich die negativen
    Zahlen selber ausrechnen.
    Gibt dann sowas wie


    if NAME>32767 then
    zahl = NAME-65536
    else
    zahl = NAME
    endif


    Ausserdem könnte es sein, dass die Low- und High-Bytes vertauscht auf
    dem Profibus ankommen, dann entweder in der SPS vor der Ausgabe tauschen,
    oder in der IOSYS.INI die Bytes tauschen,z. Bsp. so,


    [PBMASL]


    INB0=1,1,x1
    INB1=1,0,x1


    Tschau, Hermann

    Hallole,
    für mich hört es sich auch wie ein Problem mit den Bits in S und T an.


    Kenn' mich jetzt bei der KRC32 nicht sonderlich gut aus, aber bei
    den KRC's hilfts, wenn man die Punkte statt E6AXIS als FRAME deklariert.


    Da es da S und T nicht gibt, übernimmt der Roboter einfach das
    aktuelle S und T.


    Tschau, Hermann

    Hallole,
    es kommt eigentlich nicht auf den Softwarestand an. Man braucht immer UserTech(R) dazu.,
    Bei den älteren Betriebssystemen ist das nur immer mit dabei, auch wenn man es nicht bezahlt hat. Theoretisch darf man es dann aber auch nicht benutzen.

    Tschau Hermann

    Hallole,
    da trägt man ganz einfach 16 Dig. Eingänge ein, genau so, als ob es normale dig. Eingänge wären. Also so was wie:


    INW10=5,16,X1


    Ach ja, müsste natürlich $in[1] to $in[16] heissen. Oder eben $in[12], je nach dem was man da genau angeschlossen hat.


    Tschau,
    Hermann

    Hallole,


    die Konfiguration der analogen Eingänge bei Kuka war mir schon immer supsekt. Daher konfiguriere ich die immer als Integer-Eingang und mache die Umrechnung im .SRC selber.


    also

    Code
    Signal Analogwert $in[1] to $in[15]
    decl real wert
    decl real faktor = 0.1 ; oder jeder andere sinnvolle wert
    decl offset = 0           ; oder jeder andere sinnvolle wert
    
    
    wert = analogwert * faktor - offset


    Wenn tatsächlich negative Werte auftreten, dann sieht die Sache etwas 'komplizierter' aus (Fallunterscheidung und Subtraktion).


    Tschau,
    Hermann

    Hallole,
    also bei unseren KRC1'en war es immer der unbeschriftete 25polige
    Stecker.
    Was anderes serielles gibt es bei der KRC1 doch gar nicht.
    Die Sache mit COM3 ist bei der KRC2. Da geht glaube ich COM2
    irgendwie gar nicht.


    Und Tschüss,
    Hermann

    Hallole,
    es ist schon möglich einen Ausgang ohne geschlossenen Schutzkreis zu setzen:


    Im SPS.SUB kann man das prinzipiell machen. Ob die Anlage dann noch als
    handhabungssicher einzustufen ist, ist dann einen andere Frage.


    Vorgehensweise wäre dann: Im SPS.SUB einen Ausgang über eine Variable
    steuern, die Variable dann von Hand setzen. So sollte es eigentlich gehen.
    Verkürzt wiedergegeben:


    decl bool zustand1
    $out[1]=zustand1


    Variable zustand1 von Hand setzen / rücksetzen. In einem evtl. Hauptprogramm
    muss man dann auch die Variable zustand1 benutzen, um den Ausgang zu
    ändern. So könnte man sich auch ein Greifer auf/zu über
    Anzeige - Variable - Anzeige - Übersicht basteln.


    Und Tschüss,
    Hermann

    Hallole,
    die Ursache für die 'Stockungen' dürfte das cread mit
    dem timeout sein.
    Man sollte stattdessen die Variable $DATA_SER1
    hermnehmen, und nur dann das cread starten, wenn
    die Variable $DATA_SER1 > 0 ist.


    Tschüss und guten Rutsch.
    Hermann

    Oha,
    habe vor kurzem erfahren, dass bei den neuen Robotern (KRC2 mit
    WIN-XP) das COM-Profibus nicht mehr verwendet werden soll/darf.


    Jetzt muss der NCM-Manager von Siemens verwendet werden. Ist aber
    auf einer der Kuka-CD's enthalten (oder man verwendet die S7-Software).
    Die Bedienung ist für "nicht S7-Programmierer" aber mehr als gewöhnungs-
    bedürftig.


    Tschau und guten Rutsch,
    Hermann

    Hallole,


    - Wenn eine Variable mit einem Wert dahinter deklariert wird, dann
    wird der Wert bei JEDER Änderung in die $config.dat übernommen.
    (decl frame f1 = {x 0,y0,z0....)
    Man könnte ja auch schreiben:
    (decl frame f1 )
    Dann wird kein Wert gespeichert, er hat ohne aktive Zuweisung aber
    auch keinen Wert. D.h. bei einem Zugriff wie $base=f1 kommt es zu
    einem Laufzeitfehler.
    Einstellen lässt sich da nichts.


    - Startwert: Man setzt die Variable am Anfang des Programms auf den
    gewünschten Wert (ist die althergebrachte Methode), ehrlich gesagt
    weiss ich auch nicht warum es da in anderen Programmiesprachen
    andere Methoden gibt .


    - Der 'Deklarationsteil' des SPS.SUB (ich nehme mal an es ist der
    Teil vor dem Loop - Endloop gemeint) wird nur ein einziges mal
    beim Start des SPS.sub ausgeführt (Einschalten des Steuerschranks).
    Bin mir nicht mal sicher ob der bei einem Warmstart überhaupt ausgeführt
    wird. Ist also nicht unbedingt das was man braucht.


    Und tschüss.
    Hermann

    Hallole,


    also unsicherer als die Sache mit Interrupt und Brake (wenn es denn
    funktionieren würde), oder $ov_jog=0 ist das mit dem enable_eingang
    auch nicht.


    Wenn das eine akzeptiert wird, dann sollte das andere genauso akzeptiert
    werden.


    Tschau,
    Hermann

    Hallole nochmal,
    da kommt mir gerade wieder mal eine komische Idee:


    Man könnte einen dig. Eingang direkt mit einem dig. Ausgang verbinden.
    Den Eingang in der Automatik-Extern Schnittstelle auf Move_enable
    legen (der wirkt in allen Betriebsarten).
    Dann im SPS.SUB den Ausgang bei Fehlerfall deaktivieren .
    Freifahren durch Setzen des Ausgangs per Hand.


    Und tschüss, Hermann

    Hallole,


    Zu dem Problem mit dem nicht versetzbaren Satzzeiger:


    Ist der Verfahrsatz ziemlich am Ende eines Unterprogramms?
    Dann ist der Vorlaufzeiger schon aus dem Unterprogramm raus
    in das aufrufende Programm zurückgesprungen.
    Und die Satzanwahl funktioniert nicht mehr.


    Für diese Situation müsste dann der Stack irgendwie rückwärts manipuliert
    werden, und das ist wohl nicht so einfach zu lösen.


    Gruss Hermann