Beiträge von Micky
-
-
Hi,
du kannst die Instruktion GetDataval zum auslesen einer Variablen verwenden. Desweiteren besteht die Möglichkeit nach allen Robtargets zu suchen und ggf. noch einen Namensfilter zu setzen (siehe SetDataSearch)
Anbei ein Beispiel:
Code
Alles anzeigenproc PosVergleich() VAR datapos dpBlock; VAR string stName; VAR robtarget pTemp; !Alle robtargets suchen SetDataSearch "robtarget"\PersSym\ConstSym\InTask\GlobalSym; !Alle gefundenen robtargets durchlaufen WHILE GetNextSym(stName,dpBlock\recursive) DO !pActPos ausschließen IF stName<>"pActPos" THEN !Wert der robtarget auslesen und in pTemp speichern GetDataVal stName\block:=dpBlock,pTemp; ! !Vergleich zwischen pActPos und pTemp durchführen if .... return; ENDIF ENDIF ! ENDWHILE endproc
Ich hoffe das hilft Dir weiter.
Gruß
Micky -
Hallo Lars,
RobInstall ist nur für die Roboter mit einer S4c-Plus Steuerung gedacht und kann bei einer S4c-Steuerung nicht verwendet werden.
Das Betriebssystem der S4c-Steuerung hat die Bezeichnung OS3.1 oder OS3.2, bei der S4c-Plus heißt das Betriebsystem OS4.0.Ab der S4c-Plus gibt es eine neue Rechnerhardware, die auf einem PC-Board basiert, und ist somit nicht mehr kompatibel mit der S4c.
Für die S4c gibt es keine RobInstall-Software, sondern nur die Bootdisketten.
Mfg
Micky -
Hallo Lars,
also ich würde mich an den Service von ABB Robotics wenden, die können Dir bestimmt einen Bootdiskettensatz für genau Deinen Roboter erstellen.
Weiterhin können sie Dir bestimmt auch bei Deinem Problem mit dem Joystick und dem fehlenden Kabel weiterhelfen.
Eventuell musst Du die Bootdisketten bezahlen, aber das ist mit Sicherheit immer noch günstiger als die Steuerung wegzuschmeißen
Kontaktinformation:
ABB Robotics GmbH
MCI/CS/CS-TSU
Grüner Weg 6
D-61169 FriedbergTelefon +49 6031 85-307
Fax +49 6031 85-426http://www.abb.de/product/ge/9AAC128747.aspx
Gruß
Micky -
Hallo Lars,
eine Verbindung zu einem Roboter kannst Du bisher nur bei der S4c-Plus per FTp-Zugriff auf die Flashdisk herstellen.
Ein Online-Zugriff direkt auf das Roboterprogramm geht erst ab der IRC5.
Bei allen Steuerungsgeneration vor S4c-Plus, also bis Robotware 3.2, erfolgt der Zugriff auf das Roboterprogramm durch Laden bzw. Speichern auf einer Diskette, Ramdisk oder einer Remote Mounted Disk.
Auf die Ramdisk der S4c Steuerung, kann man mit einem FTP-Programm nicht zugreifen, da die S4c-Steuerung keinen FTP-Server besitzt.
Die serielle Kommunikation kann man nutzen um Daten z.B. mit einer Kamera (Visionsystem) auzutauschen.
Über einen Terminalserver kann man auch einen Roboter seriell an ein Ethernet basiertes Netzwerk anschliessen.
Es gibt die Möglichkeit eine Neztwerkkarte bei der S4c nachzurüsten, mit der z.B. ein Zugriff auf eine Remote Mounted Disk (PC) über FTP bzw- NFS-Zugriff möglich ist, also zum Laden und Speichern von Modulen von einem Server, dazu wird aber zusätzlich eine Roboteroption benötigt.
Über eine Software die auf der Webware bzw. WebWare SDK basiert kann man, auf die Variablen, Signale zugreifen oder ein Backup bzw. Restore durchführen, hierzu ist einerseits am Roboter die Option FactoryInterface erforderlich und anderseits ein Programm wie "S4Online" oder ein selbst erstelltes PC-Programm das auf der Webware SDK basiert.
Das ganze ist aber nicht ganz billig, da Du zusätzliche Hardware und Software benötigst.
Gruß
Micky
-
Hallo Lars,
soweit ich mich erinnere, waren die Bootdisketten seriennummerabhängig und haben Eure Zusatzoptionen entsprechend freigeschaltet.
Wenn Du jetzt einen Bootdiskettesatz von einem anderen Roboter verwendest, so sind ggf. nicht alle Deiner benötigten Optionen vorhanden.
Außerdem würde sich Dein Roboter mit der Seriennummer des neuen Bootdiskettensatzes melden.
Gruß
Micky
-
Hallo,
um einzelne Bits eines Bytes, also maximal 8 Bits, setzen oder löschen zu können gibt es in RAPID die Instruktionen BitSet und BitClear.
Der Programmcode könnte z.B. wie folgt aussehen:
Code
Alles anzeigenPROC SetBit() VAR num nByte; !Aktuellen Wert der Gruppe auslesen nByte = Goutput(goGroup); ! !2. Bit setzen Bitset nByte,2; ! !Gruppe wieder zurückschreiben SetGo goGroup,nByte; ! ENDPROC
Gruß
Micky
-
Hallo,
versuchs doch mal bei ABB in Friedberg, die haben glaube ich so viele, dass Sie die sogar verkaufen.
Gruß
Micky
-
Hallo,
probier bitte folgendes aus:
Im Eigenschaftsfenster des Buttons gibt es den Abschnitt "States"
1. Setze die Eigenschaft "AllowMultipleStates" auf True und wähle dabei "Text" und Backcolor" in dem sich öffnenden Dialog aus.
2. Verbinde die Eigenschaft "SelectedStateValue" mit dem Ausgang den Du schalten möchtest
3. In der Eigenschaft "States" füge die folgenden Zustände in der Auflistung hinzu:
0: Backcolor: red, Text: Luft aus, Value: 0
1: Backcolor: lime, Text: Luft ein, Value: 14. Erzeuge das Clickereignis für den Button
5. Füge in dem Event panel die Action "Invert a digital signal" hinzu und wähle dann Deinen Ausgang aus der geschaltet werden soll.
Sobald die Applikation gestartet wird, wird der Button in der erforderlichen Farbe rot bzw. grün, sowie mit den eingestellten Texten in Abhängigkeit von dem Zustand des Ausgangs angezeigt.
Beim Betätigen des Buttons wird der Ausgang invertiert und der Button aktualisiert automatisch seinen Zustand (Farbe und Text)
Gruß
Micky
-
Hallo,
ich glaube die Funktion GetTaskName hilft hier nicht weiter.
Meines Erachtens müsstest Du in jedes Modul eine Kennzeichnung für den Modulnamen hinterlegen, der mit SetDataSearch gesucht werden kann.
Zum Beispiel könnte man einen String mit dem Modulnamen oder die Codenummer in einem eigenen Datentyp (z.B. codenum) in jedem Modul deklarieren
und diese Variable über SetDataSearch suchen.Über eine While-Schleife können alle Deklarationen nacheinader aufglistet werden (siehe unten).
Code
Alles anzeigenModule MainMod ALIAS dnum CodeNum; proc GetModules var codenum nCode; SetDataSearch "codenum"\ConstSym\InTask\LocalSym; WHILE GetNextSym(stVariable,block\Recursive) DO GetDataVal strEP_stVariable\Block:=block,nCode; Tpwrite "Code: "\dnum:=nCode; ENDWHILE endproc Module M_1234567 Local const codenum dnModule:=1234567; Local const string stModule:="1234567"; Endmodule
Gruß
Micky
-
Hallo,
SpeedRefresh gibt es erst seit der Robotware 5.09, so dass alle vorherigen Versionen mit der Instruktionen Velset auskommen mussten.
SpeedRefresh arbeitet unabhängig von dem am Flexpendant eingestelltem Override und ist Bewegungstaskbezogen.
Über die Instruktion CSpeedOverride() kann der am Flexpendant eingestellte Systemoverride ausgelesen werden, aber durch SpeedRefresh nicht beinflusst werden.
Der über SpeedRefresh eingestellte Override wird über die Funktion CSpeedOverride(\CTask) ausgelesen.
Die beiden Overides beinflussen sich gegenseitig, da die einzelnen Prozentwerte multipliziert werden
z.B. Systemoveride 50%, SpeedRefresh 75% ==> Resultiernder Override = 0.5 * 0.75 = 0,375 = 37,5%Gruß
Micky -
Hallo,
beim ABB Roboter besteht die Möglichkeit die Motorströme, etc. auch über RAPID (Funktion TestSignRead) auszulesen.
Mit den vordefinierten Testsignalen können aber nur die Werte einer externen Achse ausgelesenen werden.
Um die Testsignal-Codes für das Auslesen der Roboterachsen zu erhalten, wendest Du Dich am besten direkt an ABB.
Gruß
Micky -
Hallo,
Du könntest einen Aktivfilter von 500ms in den Systemparametern für den Eingang "diMouldinPos" definieren, so dass dieser Eingang erst im Programm verarbeitet wird, wenn dieser mindestens 500ms angestanden hat.
Weitere Informationen kannst Du auch dem folgenden Eintrag entnehmen:
http://www.roboterforum.de/rob….0.html;msg30324#msg30324
Gruß
Micky
-
Hallo,
meines Erachtens benötigt die Funktion "ReadStr" ein <LF> als Endekennung für das Einlesen eines Strings.
Probier doch mal ob Du ein LineFeed-Zeichen (<LF> = 0A h) an Deinen zu sendenden Text anhängen kannst.
Alternativ könntest Du auch mal probieren ob das zeichenweise Einlesen mit "ReadBin" funktioniert, also nur um sicherzustellen ob die Übertragung funktioniert.
Es könnte aber auch sein, dass Deine Baudrate zu hoch eingestellt ist, bzw. dein Kabel zu lang ist. Beim seriellen Übertragen über RS232 beträgt die max. Kabellänge 15m.
Gruß
Micky
-
Hi,
wenn Du das Robotersystem noch auf deinem Rechner hast kannst, Du mit RobInstall den Key auslesen, indem Du auf Update klickst und anschließend Dein System in der Listbox auswählst.
Rechts in der Optionsanzeige musst Du ganz nach unten scrollen und kannst dann die "Loaded Keys" sehen.
Gruß
Micky
-
Hallo,
ich habe bisher die serielle Kommunikation immer nur über einen binär geöffneten Kanal durchgeführt, so dass man sich das Öffnen und Schließen spart, wenn man Schreiben bzw. Lesen will.
Desweiteren solltest Du eine Fehlerbehandlung für die Überschreitung der Wartezeit einfügen, denn sonst wird der Timeout-Fehler als Systemfehler angezeigt.
Anbei ein kurzes Beispiel für den binären Zugriff, wobei Du die Fehlerbehandlung noch fertig programmieren musst.
Code
Alles anzeigenOpen "sio1:", com1\Bin; ClearIOBuff com1; !Löschen des Eingangspuffers (evtl. gibt es diese Instruktion in Deiner Steuerung noch nicht) WriteStrBin com1, "H"; Set DO10_14; ! Wird benoetigt um den String von der Kamera zu senden stDaten:=ReadStrBin(com1,20\Time:=5); ! 123456A123456B12345C 20 Zeichen Close com1; Reset DO10_14; ERROR IF ERRNO=ERR_DEV_MAXTIME THEN !Timeout fehler behandeln Reset DO10_14; ... ENDIF IF ERRNO=ERR_FILEACC THEN !Zugriffsgehler behandeln ... ENDIF ENDPROC
Prinzipiell gibt es bei der seriellen Kommunikation die folgenden möglichen Fehler:
1. Das Kabel ist nicht gekreuzt (Nullmodemkabel)
2. Die Kommunikationsparameter sind an beiden Steuerungen nicht identisch (also Baudrate, Stopbit, Parität, Anzahl der Bits)
3. Es fehlen Steuerzeichen bei der Übertragung der Daten (z.B. "\0D" für Carriage Return)
4. Die Anzahl der zu übertragenden Zeichen stimmt nicht mit der erwarteten Anzahl überein.Anmerkung:
Die Bezeichnung der Signale (z.B. DO10_14) solltest Du vielleicht nochmal überdenken, den die Verwendung der physikalischen Adresse im Signalnamen bedeutet, dass der gesamte Programmcode angepasst werden muss, wenn das Signal auf eine andere Karte bzw. anderen Kanal gelegt wird. Desweiteren ist für einen Aussenstehenden die Verwendung des Signals nicht klar, hier würde eher eine Signalbezeichnung helfen, die die Funktion des Signals beschreibt.
Gruß
Micky
-
Hi,
bei der Signaldeklaration von Eingängen gibt es die Möglichkeit einen Aktiv- und einen Passivfilter zu definieren, d.h. Du gibst die Zeit in ms vor, die das Signal mindestens auf high (aktiv) oder auf low (passiv) sein muss, bevor die Steuerung dieses verarbeitet.
Hierdurch kannst Du dem Flackern des Signals entgegenwirken und der Interrupt wird nicht ständig ausgelöst.
Gruß
Micky
-
Hallo Buschmann,
die Fehlermeldung bezieht sich auf deine Load Instruktion in der Zeile 101 der main routine.
Zitat
Load "HOME:/4-Punkt-Greifer/4-Punkt-Greifer.mod";
%"4-Punkt-Greifer:main"%;Versuche mal Deine Module und Routinen so umnzubenennen, dass diese nicht mit einer Zahl sondern mit einem Buchstaben beginnen.
Außerdem sind Bindestriche in Modul- und Routinennamen nicht erlaubt.z.B.
Weiterhin solltest Du darauf achten, dass die Main-Routine in dem Modul das Du lädst als lokal deklariert ist, da diese sonst zweimal vorhanden ist oder Du verwendest einen anderen Namen als main.
Gruß
Micky -
Hallo mischwarz,
die Verwendung eines Interrupts, so wie Du ihn einsetzt, ist für Dein Problem eher ungeeignet, da die momentane Abarbeitung kurz unterbrochen wird und nach beendigen des Interrupts genau dort wieder fortgesetzt wird. Wird eine Bewegung nicht mit Stopmove angehalten, so fährt der Roboter in jedem Fall bis zum programmierten Endpunkt.
Wird die Bahn mit Clearpath verworfen und Du setzt das Programm fort ohne eine neue Bewegungsinstruktion aufzurufen, bleibt der Roboter stehen, da keine berechnete Bahn mehr vorhanden ist.
Die generelle Lösung für das Problem ist eigentlich der Einsatz der SearchL-Instruktion.
Du könntest Dir aber eine eigene Suchinstruktion in Verbindung mit dem Interrupt schreiben, die Bewegung muss aber auf jedem Fall mit einem finepunkt enden (wegen Rechnervorlauf !!).
Du verlässt Deine Interruptroutine mittels Fehlerbehandlung und Longjump und gelangst so in die Fehlerbehandlung deiner Suchinstruktion und kannst von dort Dein Programm fortsetzen.
Deine Suchinstruktion könnte in der Grundstruktur zum Beispiel wie folgt aussehen:
Code
Alles anzeigenCONST errnum ERR_MySearch:=10; PROC MyTest() MoveL pA,... MySearch pB,... MoveL pC,... ENDPROC PROC MySearchL(robtarget ToPoint....) CONNECT ... WITH ...ISearch ISIGNALDI....; MoveL ToPoint,...,fine....; IDELETE... ERROR (ERR_MySearch) IF ERRNO=ERR_MySearch THEN ... RETURN; ENDIF ENDPROC TRAP ISearch IDELETE... STOPMOVE; CLEARPATH; RAISE ERR_MySearch; ERROR RAISE; ENDPRIOC
Gruß
Micky -
Hallo Free,
Du könntest z.B. deine Positionswerte als Analogeingang übertragen, denn dann bist Du in der Lage die Werte zu skalieren.
Alternativ könntest Du deine Positionswerte auch als 1/10 mm übertragen, indem Du an der SPS die Positionen mit dem Faktor 10 multiplizierst und am Roboter die empfangenden Werte wieder durch 10 teilst.
PackRawbytes kann nur bei serieller Datenüberatragung oder by Socket Messaging verwendet werden, da hier eine Byte Array übertragen wird.