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)
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.
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.
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.
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.
Indem du exakt das gleiche machst, was in dem Python Programm abläuft.
Sende zwei Bytefolgen und nicht nur eine.
@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.
Hallo T-Virus,
vielen Dank für die Antwort. Ich werde statt der Umwandlung der Bytes in Strings deine Vaiante versuchen 😃