Beiträge von Zizou

    Hallo Urmel,
    wie ist das denn bei anderen Roboterherstellern mit der Ethernetkommunikation?
    Ist es üblich, dass ASCII-Zeichen + "CR" (bzw. "CR"+ "LF") zur Übertragung verwendet werden?
    Oder gibt es auch Hersteller die den Ethernet-Datenframe direkt mit Binärdaten füllen?


    Soweit ich herausgefunden habe, werden bei Mitsubishi und Denso die Daten im ASCII-Format übertragen.

    Hallo,
    mein Hilfeschrei war wohl zu früh ... ich habe meinen Fehler gefunden bzw. die Fehlerbeschreibung verstanden.


    Es liegt daran, das ich in der IF ... ENDIF Anweisung über GOSUB in mein Unterprog *senden springe und dort in meiner FOR Schleife in ein weiteres Unterprog springe das eine If Anweisung besitzt. Diese Unterprog wird 16 mal aufgerufen!


    Trotzdem Danke für die wieder einmal schnelle Antwort / Hilfe.

    Hallo,
    ich bin wieder einen Schritt weiter.
    Das Problem lagt darin, dass ich wie oben im Code, Programm 2 zu sehen ist, den Kom-Int. erst in dem Unterprogramm gestoppt und vor der RETURN Anweisung wieder gestartet habe.
    Deshalb wurde immer ein GOSUB aufgerufen aber es wurde nie mit RETURN zurück gesprungen, da der Kom-Int kam.


    Ich hab jetzt mein *Main Teil in Programm 2 umgeschrieben und bekomme jetzt nach ein paar durchläufen folgenden Fehler:
    Fehler 3253: Zu viele Programmverschachtelungen (IF, ENDIF); Die Anzahl der Programmebenen übersteigt 8.


    Code
    1240 *Main
    1250 IF M_05=1 THEN 
    1260 	COM(1) STOP			'Kom-Interrupt stoppen
    1270 	GOSUB *senden		'Daten senden
    1280 	COM(1) ON 			'Kom-Interrupt wieder starten
    1290 ENDIF
    1300 GOTO *Main


    Das Programm bleib auf Zeile 1250 stehen.


    Aber warum bekomme ich diesen Fehler???
    Wo in meinem Programm gibt es so viele Verschachtelungen?

    Ich werd's gleich mal beim Support probieren.


    Der folgende Code zeigt die relevanten Zeilen meines Programms.
    Vielleicht sieht jemand einen Fehler, den ich bis jetzt übersehen habe.


    Programm 1:



    Programm 2:

    Liegt das Problem vielleicht darin:


    Nachdem der Kom-Interrupt ausgelöst wird und Task/Prog 2 in das entsprechende Unterprogramm springt, stoppe ich den Interrupt mit dem Befehl "COM(1) STOP" und starte ihn nach der Empfangs-Datenverarbeitung (am Ende des Unterprogramms) mit "COM(1) ON" wieder.


    Mal blöd gefragt:
    Ist es möglich, dass die Daten von der Kommunikationsleitung verschwunden sind, bis ich den Kom-Int. wieder starte?
    oder
    Ist es möglich, das der Kom-Int. durch das stoppen und starten durcheinander kommt und anstatt der Empfangsleitung, die Sendeleitung abhört?

    Hallo,
    ich verwende zwei Programme, eines für das Senden und Empfangen und das andere für die Roboterbewegungen.


    Jetzt kommt es alledings vor, dass der Kommunikationsinterrupt ausgelöst wird und mein Task 2 (Send&Rcv) auf der Input Zeile stehen bleibt und keine Daten einliest.
    Hat von euch schon einmal ein ähnliches Problem gehabt und kann mir hiebei weiterhelfen?

    Hallo,
    ich habe folgende Zeile bei der ein Fehler auftritt.

    Code
    1360 	MVS,-35 WTHIF M_99 > 3,SKIP             '35mm von der aktuellen Position nach oben fahren


    Die folgende Zeile funktioniert, aber ich benötige den oberen Code-Teil.

    Code
    1360 	MVS P1,-35 WTHIF M_99 > 3,SKIP             '35mm über die Position 1 fahren


    Was mach ich im ersten Code-Ausschnitt falsch? Hab es auch schon mit Klammern probiert.


    Also richtig gutes Programmdesign ist das ja nicht.


    Aber für mein erstes Roboterprog, nicht schlecht 8)


    Möchte ja nur verhindern, dass weitere Fahrbefehle ausgeführt werden. Aber das kann ich jetzt ja alles mit ...

    Code
    100 MOV P1 WTHIF M_01 = 1,SKIP


    ... machen.



    Die Variablen mit dem Unterstrich sind vordefiniert und dienen dem Datenaustausch zwischen den Tasks.


    Diese Variablen sind doch globale Variablen.
    Ich kann doch auch meine selbst definierten globalen Variablen nehmen, oder?

    Code
    DEF INTE i_Mode


    ich muß nur aufpassen, dass diese im anderen Task vor der DEF noch nicht verwendet werden.

    Dadurch ist jetzt eine weiteres Problem entstanden.


    Kann ich denn einen Fahrbefehl abbrechen?
    z.B.:
    Prog in Task 1:
    MOV P1 'Roboterfahrt zu Position 1


    Wie kann ich jetzt die laufende Bewegung stoppen?
    SERVO OFF möchte ich nur ungern verwenden.


    Anschließend soll Programm 1 auf eine andere Zeile springen. Ist das aus dem zweiten Programm möglich, oder kann ich das Programm nur zurücksetzen (XRST)?

    Hallo Urmel,
    du hattest mal wieder recht.
    Bei Multitasking mit dem Kommunikations-Interrupt in Task 2 wird die Roboterbewegung (Task 1) nicht gestoppt.
    (Das steht auch in der Anleitung, aber an einer ganz anderen Stelle und wird nur kurz in einem Satz erwähnt)


    Ich hab es ausprobiert und es funktioniert tatsächlich.


    Somit bedanke ich mich für deine super Idee, ohne die ich so etwas nie ausprobiert hätte.


    Gruß Zizou


    Auch wenn der Interrupt in Task 2 stattfindet ?


    "Bei anliegendem Interrupt wird die Roboterbewegung gestoppt."
    So steht es im Handbuch und in der Hilfe.


    Diese Aussage hat ja nichts mit Multitasking zu tun und ist deshalb vermutlich egal in welchem task es steht.


    Aber jetzt mal Allgemein:
    Ist so ein Befehl wie der INPUT auch bei anderen Herstellern üblich, oder wird da so etwas besser gelöst?

    Das ist schon klar. Es soll aber auch nur ein TCP-Port verwendet werden.


    Was ist, wenn ich drei Tasks verwende:
    1. Roboterbewegung
    2. Datenempfang
    3. Daten senden


    Wenn sich jetzt der Roboter bewegt und Task 2 auf INPUT steht, könnte ich ja wie du vorhin erwähnt hast, den Task 2 stoppen, wenn keine Daten anliegen und weiter zum senden (Task 3) gehen.
    Somit habe ich den Input-Befehl abgebrochen.
    Könnte es dabei zu einem Programmabbruch durch eine Fehlermeldung oder zu Performance Problemen kommen?
    Ist diese Möglichkeit ratsam?

    Hallo,
    Voraussetzung ist leider eine Ethernet Verbindung.


    Das mit der Interruptbehandlungsroutine hört sich gut an.
    Was für schlechte Erfahrungen hast du da gemacht? Datenverlust? Zeitproblem?


    Was allerdings ein Problem bei dem Befehl ON_COM ist, dass bei einer Interruptauslösung die Roboterbewegung gestoppt wird.
    Kann man das umgehen? z.B. über zwei Tasks (in einem Interrupt mit senden und empfangen, und im zweiten mit Robi-Bewegungen)
    ... und der Befehl COM_STOP bringt mich da ja auch nicht weiter, da ich somit die Empfangsdaten nicht einlese.


    Hintergrung: Mein Robi soll nur dann stehen bleiben, wenn ein bestimmter Wert in der Empfangsdatenstruktur sich ändert.

    Hallo,
    ist es möglich nur eine gewisse Zeit auf einen Datenempfang zu warten?


    Mein Problem ist, dass ich von der SPS nur Daten sende, wenn diese sich ändern.
    Genau das gleich möchte ich auf der Robi-Seite. Es wird zur SPS gesendet, wenn sich bestimmte Daten ändern; ansonsten wird empfangen.
    (d.h. es wird zyklisch die Leitung abgehört, ob Daten anliegen, wenn nicht geht's im Prog weiter)
    Die Bearbeitung (Roboterbewegung, usw.) soll in einem zweiten Task laufen.
    Wie kann ich das realisieren bzw. ist dies überhaupt möglich?

    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,
    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"?

    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?

    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")

    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ß