Ethernet-Kommunikation Mitsubishi RV-2AJ und SPS

  • Hallo,
    ich bin Student und absolviere gerade ein Praktikum, bei dem ich einen Roboter
    mit einer SPS verbinden bzw. miteinander kommunizieren lassen möchte.


    Der Roboter: Mitsubishi RV-2AJ mit dem Controller CR1+Ethernet-Karte
    SPS: Siemens CPU319+CP343


    Die Verbindung soll über Ethernet bewerkstelligt werden.


    Mein Problem ist nun, dass ich noch nie ein Roboterprogramm geschrieben habe und mich gerade
    erst mit der Software COSIROP (V2.1.2) und der Programmiersprache MELFA-BASIC IV einarbeite.


    Die Handbücher (RV2AJ, CR1 und Ethernet) finde ich nicht gerade sehr hilfreich.
    z.B. habe ich 16Byte die ich an den Robi bzw. den Robi-Controller senden möchte.
    Wie mache ich das und wie lese ich diese Daten?
    Geht das mit Input oder mit M_IN?
    Welcher Kommunikationskanal ist für Ethernet? Com2?
    Und wie funktioniert der Verbindungsaufbau?


    Würde mich freuen, wenn mir hier jemand helfen könnte.

  • ANZEIGE
  • Hallo,



    also für sowas ist eigentlich eine Profibus Verbindung besser geeignet.
    Da braucht man roboterseitig nur ein paar Konfigurationseinstellungen, danach synchronisiert das Betriebssystem des Roboters die Profibusdaten automatisch mit den globalen M_IN und M_OUT Variablen in Melfa Basic. Programmieren braucht man auf dem Roboter dann, was die reine Datenübertragung angeht, gar nichts.


    Zitat


    Geht das mit Input oder mit M_IN?


    M_IN würde nur bei Profibus oder CC-Link gehen.


    Vom Ethernet liest man mit Input. Allerdings ist das für textbasierte Datenübertragung mit Zeilenendzeichen ausgelegt, nicht für die Übertragung von Binärdaten fester Länge. Du musst also deine Bytes in lesbare ASCII-Zeichen umwandeln.


    Zitat


    Die Handbücher (RV2AJ, CR1 und Ethernet) finde ich nicht gerade sehr hilfreich.


    Das deutsche Ethernethandbuch kann man meiner Meinung nach in die Tonne treten. Der Übersetzer hatte nicht wirklich eine Ahnung von dem, was er da schreibt. Nimm lieber das englische, ist für Mitsubishi Verhältnisse ganz brauchbar.


    Zitat


    Welcher Kommunikationskanal ist für Ethernet? Com2?


    Das musst du festlegen. Com1 bis Com8 können beliebigen seriellen Schnittstellen oder TCP-Ports zugeordnet werden.


    Dazu gibt es den Parameter COMDEV. Der hat acht durch Kommas getrennte Einträge, die die Zuordnung von COM1 bis COM8 festlegen. Ein Eintrag kann sein RS232C (das ist die serielle Schnittstelle am Controller) oder OPTxy. Wobei x für die Erweiterungskarte und y für den Port steht. Die Ethernetkarte steckt immer auf Steckplatz 1 (oder ist bei neueren Steuerungen auf dem Motherboard), d.h. x = 1. y kann von 1 bis 9 gewählt werden, das sind die Einträge 2 bis 10 im Parameter NETPORT. Dort stehen in den korrespondierenden Einträgen die Nummern der TCP-Ports an die man die COMx dann wirklich bindet. (Eintrag 1 in NETPORT dient anderen Zwecken.)


    Du suchst dir also eine der Portnummern in NETPORT aus, die du für die Verbindung haben willst, oder stellst dort einen anderen Wert ein. Dabei solltest du nicht den Port verwenden, den du schon mit Cosirop verwendest.


    Zusätzlich solltest du noch den CPRCE1y Parameter (mit y entsprechend dem COMy das du gewählt hast) von 0 auf 2 setzen, damit die Daten von der SPS direkt beim Input im Roboterprogramm landen und nicht auf der Kommandozeile vom Roboter.


    Zitat


    Und wie funktioniert der Verbindungsaufbau?


    Den macht die SPS, der Roboter arbeitet standardmäßig als Server.


    Hoffe das hilft schonmal etwas.


    Urmel

    Einmal editiert, zuletzt von Urmel ()

  • Hallo,
    erstmal Danke für die Antwort.


    Da ich Ethernet verwenden soll, kann ich leider die einfachere Variante über Profibus nicht nutzen.


    Ich habe jetzt den Kommunikationskanal wie beschrieben eingestellt:
    10 COMDEV(3)=OPT13
    20 NETPORT(4)
    30 CPRCE13=2
    40 OPEN "COM3:" AS #1


    Hiermit bekomme ich aber einen Fehler in Zeile 3: Syntac Error
    Was habe ich hier falsch gemacht?
    Info: Wenn ich COMDEV, NETPORT oder CPRCE in die COSIROP-Hilfe eingebe, kann er diese Wörter nicht als Befehle finden.
    Ist das normal, oder liegt das an meiner COSIROP Version 2.1.2?



    Du suchst dir also eine der Portnummern in NETPORT aus, die du für die Verbindung haben willst, oder stellst dort einen anderen Wert ein. Dabei solltest du nicht den Port verwenden, den du schon mit Cosirop verwendest.


    Was meinst du mit Cosirop-Port? Den Port im RCI-Explorer->Verbindung->Eigenschaften->TCP/IP? dort steht 10001.


    Gruß

  • Du verstehst nicht den Unterschied zwischen Parametern und Programmbefehlen.
    Lies die Doku zum Roboter, sonst wird das mit deinem Programm nichts.


    COMDEV, NETPORT usw. sind keine Befehle die du in dein Roboterprogramm schreiben sollst.
    Parameter bei Mitsubishi Robotern sind sowas wie die Registry oder Ini-Dateien unter Windows.


    Man kann sie über die Teachbox ändern oder über einen entsprechenden Menupunkt in Cosirop.
    Danach muss man in der Regel den Roboter ausschalten, weil viele Parameter nur beim Booten ausgewertet werden.

  • Hallo,
    ich hätte noch ein paar Fragen.


    Meine Parameter habe ich jetzt eingestellt:
    COMDEV: RS232,OPT12,OPT13,,,,,
    NETPORT: 10000,10001,10002,10003, ...,10009
    NETMODE: 1,0,1,1,1,1,1,1,1 //d.h. COM2 als Client definiert
    CPRCE12 und 13: 2 usw.


    Ich lese in den Handbücher immer wieder "ab Software Version H7". Ist diese Version jetzt höher als meine V2.1.2 oder niedriger? Ich vermute meine V. ist höher, da ich ja auch den NETMODE auf Client schalten kann (was unter V. H7 nicht gehen soll)


    Ich verwende in meinem Programm die Variable M_OPEN. Allerdings bekomme ich da immer eine Fehlermeldung (Implizite Definition von M_OPEN nicht möglich)
    Warum?
    Codeausschnitt:
    20 OPEN "COM2:" AS #1
    30 IF M_OPEN(2) <>1 THEN GOTO 20


    Ich benötige diese doch, da die Robi-Steuerung der Client und meine SPS der Server ist.


    Dann hätte ich da noch eine Frage zum Debugger:
    Wenn ich hier mein Programm Schritt-für-Schritt durchgehe, bekomme ich ab dem Befehl "MOV P1" einen Fehler.
    Info: Schlüsselschalter ist auf AUTO(Ext.)
    Codeausschnitt:
    50 OVRD 10 //diese Zeile funktioniert noch im Debugger
    60 MOV P1
    70 HOPEN 1


    An was könnte das liegen?


    Es wäre super, wenn ihr mir hierbei weiterhelfen könntet.
    Gruß

  • Hallo,


    mit H7 ist die Betriebssystemversion des Roboters gemeint. Die wird auf der Teachbox angezeigt. Irgendwo vorne im Ethernethandbuch ist das beschrieben.


    Mitsubishi zählt die Versionen etwas ungewöhnlich. A1 ist 1.0, B3c wäre 2.2.3 usw..
    Die aktuelle Version ist wohl K8k oder schon etwas weiter.


    Kommt die Fehlermeldung zu dem M_OPEN von Cosirop oder vom Roboter ?
    Wenn der Roboter es nicht kennt, solltest du über ein Update nachdenken. (Service fragen)


    Zu Cosirop kann ich leider nichts sagen, das benutze ich nicht.

  • Hallo,
    ich hätte noch eine Frage bezüglich des Datenempfangs über den Befehl Input.
    Die Daten sind 16Byte lang.
    Ich hab mir gedacht, dass ich diese in eine Zeichenkette (z.B. C1$) einlese und dann aufsplitte.
    Das Problem ist, das es sein könnte, dass ein Byte innerhalb dieser 16Byte 0 ist und damit die Input-Anweisung beendet wird.
    Somit habe ich dann keine 16Byte sondern z.B. nur noch 4Byte eingelesen.
    :kopfkratz: Hoffe das was ich hier schreibe kapiert jemand :denk:


    Mir ist klar, dass ich über einen riesengroßen Programmier- und Abfrageaufwand (Überprüfung der Länge von C1$) dieses Problem lösen kann, aber ich wollte davor erst mal nachfragen, ob es dafür schon eine Lösung bzw. eine einfachere / komfortablere Variante gibt.


    Gruß

  • Was er mit einer Null im String macht, hab ich noch nie ausprobiert. Könnte in der Tat Ärger machen.
    Problematischer ist eine 13. Die interpretiert er als Zeilenumbruch und beendet die Eingabe.
    Man kann natürlich über Parameter ein anderes Zeilenende einstellen, aber das verschiebt das Problem nur auf eine andere Zahl.


    Am einfachsten ist es du schickst deine Bytes als Hexadezimalzahl. Das verdoppelt die Länge grade auf 32 Zeichen + CR.


    Wenn z.B. die Bytes die Werte von 1 bis 16 haben schickst du


    0102030405060708090A0B0C0D0F10


    Das erste Byte wandelt man dann so wieder in eine Zahl um


    INPUT #1,C1$
    CTMP$ = LEFT$(C1$,2)
    CTMP$ = "&H" + CTMP$
    M1 = VAL(CTMP$)

  • Ich schicke die Daten schon als Hex-Zahl.
    Das Problem ist, dass in meiner Datenstruktur unterschiedliche Datentypen vorhanden sind.
    z.B.
    Adresse | Datentyp | Beispielwert
    1 Byte 65hex
    2.0 Bool TRUE
    2.1 Bool FALSE (d.h. Adresse 2 hat den Wert 01hex)
    3 Int 1234hex (Int=2Byte; d.h. ist die Integer-Zahl <256 ist Adresse 3 = 00hex)
    5 Byte 90hex


    Wenn jetzt die Int-Zahl <256 ist, werden nur die ersten zwei Byte empfangen. (C1$="A^")
    Wenn beide Bool-Variablen FALSE sind, ist diese Byte auch 0 und es wird nur noch das erste Byte empfangen. (C1$="A")

  • Mich würde mal interessieren was der Unterschied der folgenden zwei Variablentypen ist?


    1. Benutzermanagemetvariable (user control variable) = Definiert durch Variablenname und gespeichertem Wert
    2. Benutzervariable (user variable) = Definiert durch Variablenname und den Verwendungszweck ???


    Was ist mit Verwendungszweck gemeint? Gelenk-,Position-,Numerisch und Zeichenkettenvariable?


    Wenn ich z.B. eine Integer-Variable benötige würde die doch wie folgt aussehen:
    1. Mtest%=123 (user control variable)
    2. DEF INTE Mtest=123 (user variable)
    Was ist hier der Unterschied und welche Variante ist besser / ratsam?

  • Naja, die Bezeichnungen der beiden Arten der Variablendeklaration sind wohl etwas Prosa aus dem Handbuch.


    Die Schreibweise mit den Endzeichen %,$ usw. ist wohl die ursprüngliche BASIC Variante.


    Ihr Vorteil ist, das man am Variablennamen sofort den Typ erkennen kann. Die Variablen werden implizit bei der ersten Benutzung definiert.


    Die explizite Variablendefinition mit DEF hat man wohl später eingeführt, um BASIC mehr an modernere Sprachen wie Pascal anzugleichen.


    Der Hauptvorteil ist die etwas strukturiertere Programmierung, wenn man die Variablendeklarationen z.B. im Programmkopf zusammenfasst. In Microsofts Visual Basic z.B. wird mit "Option Explicit" die zweite Variante erzwungen, man kann dann keine Variablen mehr durch einfache Benutzung anlegen, was hilft Schreibfehler zu verhindern.


    Hier noch was zur Geschichte von BASIC


    http://de.wikipedia.org/wiki/BASIC

  • Hallo,
    gibt es eine einfache und kurze Möglichkeit mit der Funktion BIN$ immer 8 Zeichen zu bekommen.
    Bsp.1:
    M1=2
    C1$=BIN$(M1) => C1$="10" und nicht wie gewünscht "00000010"


    Bsp.2:
    M1=128
    C1$=BIN$(M1) => C1$="10000000"


    Bis jetzt löse ich das Problem wie folgt:
    250 *pruefen1
    260 IF LEN(C1$) = 8 THEN GOTO *weiter1
    270 C1$= "0"+C1$
    280 GOTO *pruefen1
    290 *weiter1


    Das gleiche Problem habe ich auch mit HEX$. Hier benötige ich immer 4 Zeichen.
    Kennt jemand eine Lösung für mein "Problem"?

  • Hallo,
    ich möchte meinen Robi in einer sicheren Höhe bewegen.
    D.h. von der aktuellen Position soll zuerst auf eine sichere Höhe gefahren werden (nur der Z-Wert muss geändert werden).
    Ist die Höhe erreicht wird die neue Position angefahren, aber auch erst in der sicheren Höhe.
    Ist diese Position erreicht soll nach unten gefahren werden.


    Wie mach ich das?
    Mit P_CURR bekomme ich ja die aktuelle Position.
    Wenn ich diese Position in einer Variablen (z.B. P11) abspeichere, wie kann ich hier nur den Z-Wert auf einen bestimmten Wert festlegen?
    (Der Z-Wert soll nicht mit "P11,50" 50mm nach oben, sondern z.B. auf den Z-Wert "300" gestellt werden)

  • Hallo,


    du kannst für eine neue Frage auch gerne einen neuen Thread aufmachen. Wenn jemand mal das gleiche Problem hat, muss er dann nicht so viel suchen.


    Man kann auf die Elemente von Positionen wie auf Strukturen in anderen Programmiersprachen zugreifen.
    Also z.B. P11.Z = P_CURR.Z.


    Allerdings sollte man bei einer Zuweisung eines Wertes aus P_CURR aufpassen, da sich der Wert der Variablen während der Bewegung verändert.


    Man sollte also besser nicht so was versuchen:


    Code
    10 MOV P10
    20 P11.Z = P_CURR.Z    <---  Falsch ! Wird irgendwann auf der Fahrt zu P10 ausgewertet
    30 MOV P11


    sondern P_CURR auswerten, wenn der Roboter steht:


    Code
    10 MOV P10
    20 DLY 0.01             <--- Ganz kurz warten
    30 P11.Z = P_CURR.Z     <--- Jetzt wird die Zuweisung erst ausgeführt, wenn P10 erreicht ist
    40 MOV P11


    Zuweisungen wie P11.Z = P10.Z + 30 sind dagegen sicher, da sie nicht von der Bewegung des Roboters abhängen.


    Grüße


    Urmel

    Einmal editiert, zuletzt von Urmel ()

  • Dieser Thread kommt mir gerade recht,
    allerdings benuzte ich eine Mitusbishi FX3u SPS.


    Wie sendet man denn am besten an den Roboter?
    ASCII, oder wie hast du das vor?


    Ich versuche mich dappig, aber irgendwie will es einfach nicht. ;(

  • Ja man kann nur ASCII mit dem Roboter sprechen. Immer ganze Zeilen senden, die mit einem Carriage Return (ASCII 13) abgeschlossen sind.


    Wenn man Binärdaten zwischen FX und Roboter austauschen will, sollte man CC-Link oder Profibus nehmen.


    Ich habe allerdings noch nie Ethernet aus einem SPS-Programm heraus verwendet, obwohl alle SPSen die ich verbaue Ethernet haben. Ich verwende allerdings immer das MC-Protokoll um vom PC aus auf die SPS zuzugreifen, eine Notwendigkeit für die SPS selber aktiv etwas zu senden gibt es da normalerweise nicht.


    Um sich mit den Dingen vertraut zu machen, würde ich empfehlen erstmal eine Ethernetverbindung zwischen PC und Roboter zum Üben zu nehmen. Zu diesem Thema gibt es hier eine ganze Reihe Beiträge. Wenn das klappt, kannst du es mit der SPS versuchen.


    Grüße


    Urmel

    Einmal editiert, zuletzt von Urmel ()

  • Hi Urmel,


    ich denke, meine PLC-Robot-Verbindung steht.


    Wie kann ich das jetzt am besten ueberpruefen?
    Welche Einstellungen muss ich machen, um den RV-1a fernbedienen zu koennen?
    Sende ich dann quasi normalen code, wie: "MOV P1?"


    Danke

  • Hallo,


    schön zu hören, dass du voran kommst.



    Sende ich dann quasi normalen code, wie: "MOV P1?"


    Nein, die Befehle müssen noch in ein Protokoll verpackt werden. Siehe hier


    http://www.roboterforum.de/rob…oboter_rv3sb-t3878.0.html


    Diese Beschreibung bekommst du am besten dort, wo du auch den Roboter her hast.
    Es ist ausdrücklich nicht erwünscht, dass Handbücher, die nicht zum freien Download verfügbar sind, hier im Forum gepostet werden.

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden