Beiträge von stgo

    Hallo,
    hier sind mal die für die TCP/IP-Kommunikation wichtigen Befehle:


    sioLink()
    Eine im Programm definierte SIO-Variable dem Socket zuweisen. Nicht zwingend nötig aber für bessere Wartbarkeit/Lesbarkeit des Programms hilfreich.


    clearBuffer()
    Leert den Lesepuffer und trennt die Socketverbindung.


    sioGet()
    Zeichen über die Ethernet-Schnittstelle empfangen. Sollte noch keine Verbindung durch einen Client bestehen, wird zuerst darauf gewartet (maximal die beim Erstellen des Sockets angegebene Timeoutzeit).


    sioSet()
    Zeichen über die Ethernet-Schnittstelle senden. Sollte noch keine Verbindung durch einen Client bestehen, wird zuerst darauf gewartet (maximal die beim Erstellen des Sockets angegebene Timeoutzeit).


    Beispiel:


    Code
    sioLink(SIO_MyServer,io:srv)
    clearBuffer(SIO_MyServer)
    sioSet(SIO_MyServer,str_request)
    sioGet(SIO_MyServer,str_reply)

    Hallo,


    so direkt kommt man lt. Schaltplan an den Totmanntaster nicht ran. Wir haben das im entsprechenden Fall mal so gelöst, dass wir die beiden Signale "USERPS1" und "USERPS2" vom Stecker J109 genommen haben (2-kanalig). Dies geht dann aber nur, wenn der Bediener den Taster hält und dann die Armleistung einschaltet, dann sind diese beiden Kontakte geschlossen.

    Hallo,


    Zitat

    Jetzt habe ich gehört, dass es ab SW 7 einen Befehl "cartesian" gibt. Was bewirkt dieser Befehl? Wäre er die Lösung des Problems?


    Habe hier mal eine kurze Beschreibung gefunden:


    Zitat

    A joint blending is like a movej between the leave and reach points, the Cartesian blending is like a movec between these points. Joint blending is usually faster than Cartesian blending; but joint blending may lead to a strange path when there is complex orientation change or for pure rotation moves. The speed & accel control is more accurate with the Cartesian blending.


    Ich hoffe, das hilft schon mal weiter.

    Jetzt hab ich es auch wieder in meiner "alten" Dokumentation gefunden. Als Info möchte ich noch anfügen, was Stäubli darin zur Pufferzeit schreibt:

    Zitat

    The Sram is persistent during 3 days garantied (usually one week)

    Hallo,


    also ich kenne auch nur diese beiden Möglichkeiten:


    a) bei den globalen Variablen kann im Deklarationsfenster ein fester Initialisierungswert angegeben werden. Dann wird die Variable automatisch beim Hochlauf immer mit diesem Wert beschrieben.


    b) Benötigte Variablen in eine Bibliothek auslagern und dann mit dem Befehl "libSave()" auf Anforderung (z. B. im stop-Programmteil) wegschreiben. Es wird dann eben der Wert im Moment des Beendens geschrieben (sollte nicht zu oft gemacht werden, da immer ein Zugriff auf den Flash-Speicher erfolgt).


    Für Zähler etc., die z. B. bei Stromausfall gesichert werden sollen, gibt's keine Möglichkeit. Wir schreiben diese über einen Feldbus auf eine Steuerung mit remanentem Speicher.


    Gruss,
    Stefan

    Hallo,
    ich kann dir momentan auch nur soviel sagen: wir verwenden diese beiden potentialfreien Kontakte (2 Schließer/2 Öffner für Kanal 1 und 2) um anzuzeigen, ob im Handbetrieb der Totmanntaster gedrückt und die Antriebe eingeschalten sind.

    Zitat

    Gibt es zu compose ein Synonym das nicht die Koordinaten des Frames verschiebt/dreht sondern die des Tools?


    Das wäre dann

    Code
    point appro(point Position, trsf Transformation)


    Der Fehler

    Code
    VAL3 Laufzeitfehler. Punkt basiert nicht auf einem Frame.

    kommt dann, wenn der Punkt z. B. kein Teachpunkt ist, sondern eine im Programm angelegte Variable. Man kann einem berechneten Punkt mit dem Befehl

    Code
    trsf position(point Position, frame Koordinatensystem)

    ein KS zuweisen. Also die Drehung um 45° sollte wie beschrieben mit dem * Operator oder auch so gehen:

    Code
    movej(appro(pPickPos,{0,0,0,0,0,45}),ToolGripper,mdHighSpeed)

    Der Punkt pPickPos muss natürlich einen Frame besitzen (Teachpunkt oder zuweisen im Programm). Der movej-Befehl erwartet nicht den Frame, sondern das Greifertool.

    Hallo,


    sioLink() weist eigentlich zuerst einmal nur dem Eingang io:srv einen anderen Namen zu - man kann auch ohne sioLink() arbeiten. Wenn der Syntax-Check nicht funktioniert, dann z. B., weil es den Eingang srv überhaupt nicht gibt. Diesen muss man zuerst am Handbediengerät (bzw. wenn du offline arbeitest) am Emulator im Menü Systemsteuerung/Ein- und Ausgänge/Socket mit der Taste F8 anlegen. Hier kann man dann auch Client oder Server einstellen und den Namen (hier eben z. B. "srv") vergeben. Dann kann, wie schon beschrieben, mit sioGet und sioSet gelesen und geschrieben werden, also z. B. sioSet(io:srv,n_Request). Hinweis: ist der Roboter-Socket auf "Server" eingestellt, kann die Gegenseite erst die Verbindung aufbauen, wenn die Applikation bei einer der beiden Anweisungen angekommen ist.


    Gruss,
    Stefan

    Hallo


    Zitat

    In meinem Handbuch steht, das ich das Ventil einfach über die Schnellauswahltasten oder über die Systemsteuerung ansteuern kann.


    Wahrscheinlich sind die Schnellauswahltasten noch nicht mit dem benötigten Ausgang verknüpft worden. Handbuch Stäubli hierzu:


    Zitat

    Die Zuordnung der Tasten zu einem digitalen Ausgang erfolgt über die Ein- und Ausgangsanzeigen am Bediengerät. Wenn Sie einer Taste einen digitalen Ausgang zuordnen möchten, wählen Sie den Ausgang aus der Liste der Ein- und Ausgänge am Bediengerät aus, und betätigen Sie dann gleichzeitig die "Shift"-Taste und
    die Taste "1", "2" oder "3". Dieser Vorgang kann je nach Benutzerprofil inaktiv sein.


    Die Ausgänge für die Ventile werden (beim RS60) intern über den CAN-Bus geführt. Am Bediengerät sollte es daher unter "Systemsteuerung/Ein- und Ausgänge" den Eintrag CanIO geben. Hier finden sich die beiden Ausgänge unter dem Eintrag "cDout0" und "cDout1". Auf diese beiden kann dann auch die Verknüpfung mit den Tasten gelegt werden.


    Gruß
    Stefan

    Hallo,


    also bei der CS8C-Steuerung können nicht mehr als 2 BIO-Karten gesteckt werden (= 32 Ein-/Ausgänge, wie erwähnt).
    Die Steuerung arbeitet als ModbusTCP-Server, daher müsste eine (Wago-)Klemme Client sein und von sich aus die Verbindung aufbauen, gibt's so etwas? Die Konfiguration des Modbus würde über das SRS (Stäubli Robotics Studio) gehen:


    Zitat


    Der Steuerschrank CS8C kann so konfiguriert werden, dass ein Austausch der Ein- und Ausgänge über Ethernet gemäß dem Protokoll Modbus Tcp möglich ist. Der Steuerschrank CS8C gilt in jedem Fall als ein Modbus-Server. Die Konfiguration des CS8C-Steuerschranks für Modbus Tcp wird über die auf der CD-ROM CS8C gelieferte Software PC SRS vorgenommen (Tools > Modbus IO Config). Mit diesem Tool kann eine modbus.xml-Datei erstellt werden, die im Verzeichnis /usr/applicom/modbus des CS8C-Emulators gespeichert werden muss. Anschließend muss diese Datei über das SRS-Transfer-Tool auf den CS8C-Controller übertragen werden (Emulator > I/O > Modbus). Wenn diese Datei beim Start gefunden wird, werden die entsprechenden Modbus Tcp Ein- und Ausgänge am Handbediengerät angezeigt und sind direkt über eine Anwendung in VAL3 zugänglich.


    Gruss
    Stefan

    Also Zeichenketten (Strings) zusammensetzen das geht mit dem + Zeichen, z. B. str1 = str2 + str3. Aber zum Ausführen als Befehl hab' ich bislang nichts gefunden.
    Gruss
    Stefan

    Hallo Hans,


    um mit diesen beiden Befehlen quasi eigene Logdateien anzulegen, muss man im VAL3-Studio ein neues Projekt anlegen. In diesem Projekt befindet sich dann z. B. ein Array von Strings der Größe 50 (anlegen unter "globale Variablen"). Dieses Array muss als "public" deklariert werden.
    Nun im eigentlichen Programm (von dem aus die Fehler mitgeschrieben werden sollen) unter den Bibliotheken einen Aliasnamen (für späteren Zugriff) sowie den Namen der soeben angelegten, neuen Bib. eintragen. Wird die Option "autoload" aktiviert, so kann man sich das Kommando "libLoad" sparen, ansonsten Bib. laden mit Aliasname:libLoad("Projektname"). Die Fehlertexte etc. können ebenso mit Aliasname:strLog[0] = "Fehlertext" geschrieben werden. Speichern analog Aliasname:libSave(). Eventuell muss der Laufzeitspeicher im Programm erhöht werden, damit alle Strings geladen werden.
    Alternativ wäre auch denkbar, mit dem Kommando logMsg("Text") zu arbeiten. Dann spart man sich das alles - aber der Roboter schreibt's eben nur in die errorLog.txt


    Gruss
    Stefan

    Hallo,


    TCP ist sicherlich eine Lösung. Es natürlich auch davon abhängig, welche Schnittstelle der Visualisierungs-PC zur Verfügung stellt bzw. welche Visualisierungssoftware verwendet wird. Bei TCP kann man auf Stäubli-Seite einen Client oder Server einrichten - die gewünschten Daten müssen selbst in ein definiertes Format/Telegramm etc. gebracht und dann mittels des sioSet()-Kommandos abgesendet werden (evtl. auch zyklisch etc.). Weitere Alternativen von Stäubli sind:


    > serielle Schnittstelle RS232/RS422
    > Modbus (Visualisierungssoftware muss Modbus-Client sein)
    > Profibus
    > CANOpen
    --> siehe auch: http://www.staubli.com/de/robo…robot-controller-cs8/cs8c


    Es gab lt. Auskunft von Stäubli mal ein ActiveX-Control, welches über OPC auf die Steuerung zugreifen und Daten lesen konnte - mometan aber leider nicht mehr Info - müsste man bei Stäubli nachfragen.


    Gruss
    Stefan

    Hallo Hans,


    du kannst den Befehl nicht in der VAL3-Hilfe finden, da er nicht zum "offiziellen" Befehlssatz gehört. Stäubli bietet diverse "Add-On's" an, die diesen mit hilfreichen Zusatzfunktionen (ich glaube gegen Aufpreis?) erweitern. Dein Befehl findet sich im sogenannten "protect-Add-On". Hier die gewünschte Erläuterung dazu:


    Zitat


    void $getJntForce(num &nJntForce)
    Diese Anweisung liest das Drehmoment, welches jede Achse gerade anwendet. Sie hat ein Array von 6 num-Variablen als Argument. Das Array wird per Referenz übergeben. Benutzen Sie einfach den Variablen-Namen ohne die Klammer oder einen Index. Das aktuelle Drehmoment für Achse 1 finden Sie dann in nJntForce[0] usw. bis zur Achse 6 in nJntForce[5]. Die Werte werden alle 4 Millisekunden aktualisiert.


    Ein Beispiel im Programm (nJntForce ist als Array von 6 num angelegt):


    Code
    begin
      do
        $getJntForce(nJntForce)
        nTorqueJ1 = nJntForce[0]
        delay(0)
      until (bFinish)
    end


    Gruss
    Stefan

    Hallo Hans,


    also in der Hilfe steht ja folgendes:



    Im Programm schreibe ich also z. B.
    m_Success = pointToJoint(T_Gripper,J_Similar,P_FromBib,j_Result)


    Der Merker "m_Success" gibt an, ob die Konversion erfolgreich war.
    T_Gripper = Tool, mit dem die Position bestimmt werden soll
    J_Similar = eine Hilfsposition in der Nähe von P_FromBib, damit der Roboter weiß, mit welcher Armkonfiguration er den Punkt dann anfahren soll
    P_FromBib = Punkt aus deiner Bibliothek, der konvertiert werden soll
    j_Result = die umgewandelte Position P_FromBib in Achskoordinaten (joint)


    Gruss
    Stefan

    Hallo Hans,


    Folgendes habe ich in der Betriebsanleitung zum Debugger gefunden:


    > Im Task-Manager eine Task auswählen und im Kontextmenü DBG drücken.
    > Task wird sofort unterbrochen und es erscheint eine Anzeigeseite am MCP.
    > Der Taskzeiger zeigt auf den nächsten Befehl, der ausgeführt wird.
    > In einem Fenster kann über das Menü BPTS ein Haltepunkt mit einem Befehl verknüpft oder ein bereits bestehender Haltepunkt gelöscht werden. Der Haltepunkt wird durch das Symbol * gekennzeichnet.
    > Über das Menü ; kann der ausgewählte Befehl in Kommentar gesetzt werden.
    > Über das Menü DATA haben Sie Zugriff auf die Variablen des ausgewählten Befehls.
    > Über das Menü ->* können Sie den Taskzeiger bewegen. Diese Aktion löst keinen Befehl aus.
    > Das Menü ()* aktiviert den schnellen schrittweisen Modus. In diesem Modus wird das Programm so ausgeführt, wie es auf der Anzeige erscheint (nach Anzeigezeilen).
    > Das Menü (*) aktiviert den detaillierten schrittweisen Modus. In diesem Modus entspricht ein Schritt einem VAL3-Befehl, und die Befehlsblöcke (if, while ....) sind detailliert dargestellt.
    > Über das Menü RSM/SUS können Sie die Ausführung einer Aufgabe unterbrechen oder fortsetzen ohne das Testprogramm zu verlassen.
    > Mit dem Menü SAVE können Sie die Anwendung speichern.
    > Zum Verlassen der Testseite ESC drücken.


    Ich hoffe, das reicht aus.
    Gruss
    Stefan

    Hallo,


    bei Stäubli steht in VAL3 der * für zweierlei Operationen:


    > angewendet auf zwei "num"-Typen bedeutet er Multiplikation von zwei Zahlen
    > angewendet auf zwei "trsf"-Typen (Positionsvektor) bedeutet er Vektoraddition


    Gruss
    Stefan