Hallole,
Werkzeugwechselsysteme gibt es auch bei Schunk.
Und Tschüss
Hallole,
Werkzeugwechselsysteme gibt es auch bei Schunk.
Und Tschüss
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.
DEFDAT BAHNEN1 PUBLIC
IMPORT E6POS Pfad8[500] IS /R1/BAHNEN2..Pfad8
IMPORT E6POS Pfad9[500] IS /R1/BAHNEN2..Pfad9
IMPORT E6POS Pfad10[500] IS /R1/BAHNEN2..Pfad10
IMPORT E6POS Pfad11[500] IS /R1/BAHNEN2..Pfad11
IMPORT E6POS Pfad12[500] IS /R1/BAHNEN2..Pfad12
IMPORT E6POS Pfad13[500] IS /R1/BAHNEN2..Pfad13
IMPORT E6POS Pfad14[500] IS /R1/BAHNEN2..Pfad14
DECL E6POS pfad1[500]
pfad1[1]={x 0.0,y 0.0,z 0.0,a 0.0,b 0.0,c 0.0,s 0,t 0,e1 0.0}
pfad1[2]={x 0.0,y 0.0,z 0.0,a 0.0,b 0.0,c 0.0,s 0,t 0,e1 0.0}
..
pfad1[500]={x 0.0,y 0.0,z 0.0,a 0.0,b 0.0,c 0.0,s 0,t 0,e1 0.0}
DECL E6POS pfad2[500]
pfad2[1]={x 0.0,y 0.0,z 0.0,a 0.0,b 0.0,c 0.0,s 0,t 0,e1 0.0}
...
enddat
Alles anzeigen
eine zweite enstsprechende bahnen2.dat
Und im .SRC dazu:
Global DEFFCT e6pos GETARRAY(INDEX :IN)
DECL INT INDEX
DECL e6pos ANSWER
DECL INT INDEX1
DECL INT INDEX2
; Modulodivision
INDEX1=INDEX/500
INDEX2=INDEX-INDEX1*500+1
SWITCH INDEX1
CASE 0
ANSWER=pfad1[INDEX2]
CASE 1
ANSWER=pfad2[INDEX2]
...
ENDSWITCH
RETURN (ANSWER)
ENDFCT
GLOBAL DEF SETARRAY (INDEX :IN,POINT :IN )
DECL INT INDEX
DECL E6POS POINT
DECL INT INDEX1
DECL INT INDEX2
; Modulodivision
INDEX1=INDEX/1000
INDEX2=INDEX-INDEX1*1000+1
SWITCH INDEX1
CASE 0
pfad1[INDEX2]=POINT
CASE 1
pfad2[INDEX2]=POINT
...
ENDSWITCH
END
Alles anzeigen
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,
also bei mir läuft's ohne Probleme.
Hab noch nie ACCESS installiert gehabt (da bin ich allergisch
gegen).
Und diese ominöse DAOxxx.DLL hab ich auch nirgends gefunden
Tschau, 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
Hallo,
das geht zum Beispiel so:
Signal irgend_ein_name $in[1] to $in[16]
Zugriff darauf dann so:
if irgend_ein_name==1 then
wait sec 1
endif
Gruss und 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
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,
nächste Frage wäre:
Hat die Funktion eine genauso üble Performance wie VARTSTATE ?
(Siehe thread zum 'langen SPS.SUB-Zyklus' http://www.roboterforum.de/rob…opic=1334.msg2773#msg2773
Das wäre schade und würde den häufigen Gebrauch der Funktion stark einschränken.
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,
leider lässt sich das ohne GripperTech oder UserTech nicht machen.
Gruss 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