Laden...

Befehl über Socket an Roboter UR10

Erstellt von Smile vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.923 Views
S
Smile Themenstarter:in
4 Beiträge seit 2017
vor 6 Jahren
Befehl über Socket an Roboter UR10

Hallo Zusammen,

ich möchte von meinem Rechner aus dem Industrieroboter UR10 einen Befehl über einen bestimmten Port schicken, sodass er dann das aufgerufene Roboterprogramm abfährt. Leider habe lediglich ein funktionierendes Programm für Python. Da ich im Rahmen meiner Projektarbeit den Roboter mit Gesten über die MS-Kinect steuere, habe ich das Programm in C# übertragen. Es läuft fehlerfrei durch, jedoch bewegt sich der Roboter nicht. Da keine Fehlermeldung erscheint, finde ich meinen Fehler leider nicht. Ich denke, dass es am Hexadezimalwert liegen könnte, jedoch weiß ich nicht wie es umschreiben sollte.

Ich würde mich riesig freuen, wenn mir jemand helfen kann 😃

Das hier ist mein geschriebenes Programm:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;


namespace Test_Verbindung
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
            clientSocket.Connect("10.136.90.154", 502);
            while (true)
            {
                string test = Console.ReadLine();
                NetworkStream serverStream = clientSocket.GetStream();
                byte[] outStream = System.Text.Encoding.ASCII.GetBytes("\x00\x01\x00\x00\x00\x06\x00\x06\x00\x83\x00\x01");
                serverStream.Write(outStream, 0, outStream.Length);
                serverStream.Flush();
                if (test == "stop")
                    break;
            }
        }
       
    }
}

Zum Vergleich ist hier der funktionierende Code aus Python:

#Deklarationen
import socket  
import time
import binascii
import sys


#Werte deklarieren
PORT_502 = 502 
Zaehler=0
print "Starting Program" 
UR10_2 = "10.136.90.154"
W_PR_131_0 = "\x00\x01\x00\x00\x00\x06\x00\x06\x00\x83\x00\x00" #131=0
W_PR_130_0 = "\x00\x01\x00\x00\x00\x06\x00\x06\x00\x82\x00\x00" #130=0
W_PR_131_1 = "\x00\x01\x00\x00\x00\x06\x00\x06\x00\x83\x00\x01" #131=1
W_PR_130_1 = "\x00\x01\x00\x00\x00\x06\x00\x06\x00\x82\x00\x01" #130=1
CLOSE_1 = "s.close"
CLOSE_0 = ""
R_PR_131_1 = "\x00\x04\x00\x00\x00\x06\x00\x03\x00\x83\x00\x01"
#Funktionen definieren
def Schreiben(x_host, x_hexa, x_close) : 
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 		
	s.settimeout(10)
	s.connect((x_host, PORT_502)) 				
	time.sleep(0.05)
	s.send (x_hexa)						
	time.sleep(0.05)
	x_close

while True:
		Schreiben(UR10_2,W_PR_131_0,CLOSE_0)
		Geste = raw_input("Geste?")
		if Geste == "1":
			print("1")
			Schreiben(UR10_2,W_PR_130_1,CLOSE_0)

		elif Geste == "2":	
		        print("2")
			Schreiben(UR10_2,W_PR_131_1,CLOSE_0)
D
985 Beiträge seit 2014
vor 6 Jahren

Nun ja, so richtig umgeschrieben hast du es nicht - eher so frei interpretiert.

Frei von jeglichem Wissen über Python oder diesen Roboter sehe ich aber, dass in dem Python Programm pro Geste jeweils zwei Bytefolgen gesendet werden.

Du sendest nur eine Bytefolge.

Schreibe das doch in C# exakt so, wie das in Python umgesetzt wurde, also eine Methode Schreiben definieren und auch die Variablen so deklarieren.

S
Smile Themenstarter:in
4 Beiträge seit 2017
vor 6 Jahren

Hallo Sir Rufo,

das ist korrekt, ich wollte über den einfachgehaltenen c# code zunächst prüfen, ob die Verbindung zu dem Roboter prinzipiell funktioniert. Erst wenn diese gegeben ist möchte ich diesen in meinem Programm zu der Gestenerkennung einbinden.

Leider hat die Verbindung nicht funktioniert, weshalb ich mich an dieses Forum gewendet habe.

D
985 Beiträge seit 2014
vor 6 Jahren

Woher weißt du das die Verbindung nicht funktioniert?

Nur weil sich der Roboter nicht bewegt, heißt das nicht zwangsläufig, dass die Verbindung nicht funktioniert.
Es kann auch bedeuten, dass der nicht weiß, was du von ihm willst.

Bei einem Auto muss man auch erst den Motor starten bevor der Tritt auf das Gaspedal eine nennenswerte Reaktion hervorruft.

S
Smile Themenstarter:in
4 Beiträge seit 2017
vor 6 Jahren

Ja, das könnte auch sein. Ich tendiere sogar zu dieser Vermutung, da das Programm ja fehlerfrei durchläuft. Wie finde ich heraus was der Roboter versteht? Daher das Beispiel aus Python.

D
985 Beiträge seit 2014
vor 6 Jahren

Indem du exakt das gleiche machst, was in dem Python Programm abläuft.

Sende zwei Bytefolgen und nicht nur eine.

T
2.224 Beiträge seit 2008
vor 6 Jahren

@Smile
Wenn du schon eine Vorlage hast, eben dein Python Programm, dann nutze diese auch.
Stelle nie Vermutungen an, dass bringt i.d.R. nichts.
Wenn du schon eine Vorlage hast, solltest du dich daran halten.

Du kannst sonst noch Wochenlang Vermutungen anstellen und kommst trotzdem nicht weiter.
Der Roboter wird, wie Sir Rufo schon schreibt, auf diese beiden Byte Folgen warten.
Dies wird auch als "Magical Bytes" bezeichnet, damit der Empfänger auch weiß, dass er nun einen Befehl bekommt und nicht weitere Teile eines Datenpakets.

Bitte entsprechend deinen Code nach dem Python Beispiel ausrichten und testen.
Dann sollte es klappen wie gewünscht, es sei den du hast noch irgendwas ausgelassen.

Nachtrag:
Die Umwandlung der Bytes Strings kannst du dir übrigens sparen.
Mach es lieber wie folgt.


byte[] outStream = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x83, 0x00, 0x01 };

Das macht das lesen um einiges leichter und spart auch sinnfreie Konvertierungen!

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
Smile Themenstarter:in
4 Beiträge seit 2017
vor 6 Jahren

Hallo T-Virus,

vielen Dank für die Antwort. Ich werde statt der Umwandlung der Bytes in Strings deine Vaiante versuchen 😃