Laufvariable bei Positionen!?

  • Hallo!


    Ich bin neu hier in diesem Forum. Daher bitte ich um Verständnis falls das hier schonmal wo behandelt wurde.
    Mein Problem steht in Wien, es handelt sich um einen Mitsubishi RP-5AH-S63 mit einer MELFA Basic IV Steuerung.
    Abgesehen von der Syntax Prüfung funktioniert auch fast alles so wie es soll, aber: Ich beabsichtige gerade ein Programm zu schreiben, das mit einem perifär Gerät kommuniziert. Eigentlich kein Problem, die Verbindung klappt und die Programme unterhalten sich auch sehr anständig.
    ABER nun mein PROBLEM!: Ich kann .... noch nicht... dem Perifärprogramm sagen:
    schick mir den Koordinatenwert der Position 1, dann diesen in meiner Pos Liste unter POS1 speichern, danach sollte das Perifärprog, den Positionswert 2 schicken den ich dann in der POS Liste auf POS2 speichern möchte usw. das soll je nach Stück unterschiedlich oft wiederholt werden. Die notwendigen Informationen wie oft der POS einlese und Speichervorgang ablaufen soll die bekomme ich einwandfrei rüber, da dies ja Integer Infos sind und die nur in immer die selben Variablen übertragen werden.


    Ich hab mal meinen COM_Thread angehängt, das funkt alles bis auf den Part in Zeile 90 wo da steht ....ELSE INPUT #1, P[Zaeler]


    diese Formulierung [] ist auch nur jetzt so gewählt um zu zeigen was ich meine!


    BITTE SAGT MIR DAS DAS GEHT!!


    Ich hoffe das Ihr mir helfen könnt, wenn Ihr mehr Infos braucht sagt es mir einfach!


    Mit besten Grüßen!!!


    skoki

  • ANZEIGE
  • ich habs zwar net ganz kapiert, aber ich glaub es wäre besser, wenn Du nicht einzelne Positionen sondern immer komplette Positionslisten überträgst.
    Es können aber auch einzelne positionen übertragen werden :kopfkratz:


    Ich würd einfach mal Cosirop abhören, wie das die Werte dafür überträgt.


    Habe aber leider im Moment keine Möglichkeit, das für Dich zu machen.

    Menschen brauchen Roboter, aber auch Roboter brauchen Menschen.

    Roboter sichern die Arbeitsplätze und den Fortschritt der Industrieländer, da sie kostengünstig und qualitativ hochwertig produzieren.

    Ohne Automatisierung mit Robotern werden unsere Produkte in Billiglohnländern hergestellt.

    >> Abonniere meinen YouTube Roboterkanal <<

  • Hallo Werner!,


    anbei schick ich dir mal eine Version die ich geschrieben habe. sollte, wenn ich die neuesten Manuals richtig verstanden habe so funktionieren. Mein Problem ist, das mein Syntax prüf Instrument die Syntax einer IF..THEN..ELSE Anweisung nicht gelten läßt und mir eine Fehlermeldung ausgibt. Desshalb sind die IF..THEN..ELSE auch alle auskommentiert.


    ganze POS Datein zu übertragen wär mir natürlich lieber, hab nur leider keinen Tau wie!?


    Ich hab schon POS Daten über RS232 übertragen, das geht ganz einfach, hab diese Positionen auch problemlos anfahren können.


    Mein Problem ist nur das ich die Positionen zeitlich unabhängig vom Rest des Programmes lesen muß, da sonst die Taktzeit beim Teufel ist. Dabei entsteht also auch der Unterschied, ich muß also nicht wie bisher den eingelesenen Wert gleich anfahren also zum Beispiel:


    INPUT 1#, ZielPos
    MOV ZielPos


    sondern ich muß die eingelesenen Positionen abspeichern also:
    ein read Task mit:


    while (n< Punkteanzahl)
    INPUT 1#,ZielPos[n]..........(P_100[n] so hab ich´s jetzt mal probiert)
    next n


    und ein MOV Task mit


    while (i<Punkteanzahl)
    MOV Zielpos[i]
    next i


    Ich hoffe ich hab mich jetzt etwas klarer ausgedrückt.
    Falls mir wer sagen kann wie ich mein Syntaxprüfungsproblem in den Griff bekomme oder, wie man ganze POS Files die in geeigneter Form vorliegen übertragen kann dann bin ich IHM oder IHR auch sehr dankbar dafür!



    Vielen Dank nochmal und schöne Grüße!!



    skoki

  • ja schaut so aus, als hättest Du da ein altbekanntes Problem.


    Das ganze geht genau so wie Du es gemacht hast, kostet aber Taktzeit.
    Du kannst entweder fahren oder Daten lesen.


    Vielleicht ist das die Lösung:


    Lese die Positionen in einem 2. Slot ein (den Du im ersten Slot startest) und schreibe damit globale Positionen.
    Das sind Positionen ab 900.


    Die kannst Du dann im Slot 1 (hoffentlich) direkt anfahren.
    Könnte aber Probleme geben, wenn Du gerade eine Position anfährst, die Du überschreibst.
    Das muss unbedingt vermieden werden.

    Menschen brauchen Roboter, aber auch Roboter brauchen Menschen.

    Roboter sichern die Arbeitsplätze und den Fortschritt der Industrieländer, da sie kostengünstig und qualitativ hochwertig produzieren.

    Ohne Automatisierung mit Robotern werden unsere Produkte in Billiglohnländern hergestellt.

    >> Abonniere meinen YouTube Roboterkanal <<

  • Hallo und DANKE an alle!,


    ich hab´s glaub ich geschafft. Ich mach das jetzt so das ich im Slot Nr. 2 alle Positionen in ein Array Namens P_00() speicher. Dieses Array wird im Main Programm dann pro abzuarbeitender Position ausgelesen und angefahren. Ob und wie gut das jetzt genau funktioniert weiß ich noch nicht da ich das Datensharing Programm noch nicht fertig habe, aber es läuft wenigstens einmal und .... bei meinem ersten Versuch ist der Roboter genau an die Position gefahren, von der aus dann der Offset gemacht wird. (d.h. die eingelesenen Positionen werden eigentlich als Offsets behandelt)


    Wen´s interessiert dem geb ich gern den Source Code meines Programms.


    Grüße noch!!!


    skoki

  • Hallo skok,


    ich hab' zwar die Aufgabe noch nicht ganz durchschaut, aber zum upload von Pos-Daten gibt's noch einen anderen Weg. So macht es vermutlich auch Cosirop.


    Hiermit können Positionsdaten zeilenweise aus einer Datei als Text zum Programmier-Port des Controller gesndet werden. Das Programm, in diesem Beispiel CCI.MB4, muß, da hierbei dessen Posliste editiert wird, im Slot gestoppt sein. Dies steuere ich mit der Variablen M_CCIWAI=1, welche ich hiermit zur Runtime verändere. In meinen Konzept verwende ich sozusagen ein Task-Manager-Programm in einem weiteren Slot, welches beim setzen von M_CCIWAI=1 das Programm CCI.MB4 temporär stoppt.


    Beispiel
    1;1;OPEN=NARCUSR
    1;1;HOTSPS.MB4;M_CCIWAI=1
    1;1;LOAD=CCI.MB4
    1;1;EDATAPGO(1)=(-0.50,0.00,25.00,0.00,0.00,0.00,0.00,0.00)
    1;1;EDATAPGO(2)=(-0.50,0.00,28.00,0.00,0.00,0.00,0.00,0.00)
    ….
    ….
    1;1;SAVE
    1;1;HOTSPS.MB4;M_CCIWAI=0
    1;1;CLOSE



    Keine Ahnung, ob dieser Weg in deiner Anwendung sinnvoll ist, ist aber evtl. interessant auch diese Möglichkeit zu kennen. Ich nutzte diese Möglichkeit häufig, um die Maschine automatisch auf andere Artikel umzurüsten.



    gruß Ralf Geister

  • Hallo miteinander!


    Also:


    Ich hab euch den Quellcode noch immer nicht geschickt, weil er noch nicht fertig ist.


    Aber mal näher zur Anwendung und dem für mich dabei entstandenen Problem:
    Die im COM Task übertragenen Koordinaten werden in ein Array namens P_100() gespeichert.


    Ich verwende folgenden sorce der schon funktioniert.:


    MAIN:


    DEF POS ZIELPOS
    .
    .
    XRUN COM Task,"2" 'COM Task wird in den Slot 2 geladen
    .
    .
    M20=0 'gibt den COM Task frei
    .
    .
    WAIT M21=1 'Setzt das MAIN Programm fort sobald Punkte eingelesen wurden
    .
    FOR n=0 TO M1 STEP 1
    .
    .
    ZIELPOS=P_0+P_100(n)
    MOV ZIELPOS
    .
    .
    NEXT n
    .
    .
    .
    XSTP ,2
    .
    COM Task:
    .
    Wait M20=1
    .
    .
    Zaehler=0
    M1=1
    OPEN "COM1:"AS#1
    FOR Zaehler=0 TO M1 STEP 1
    PRINT #1,Zaehler
    IF Zaehler=0 THEN INPUT #1,M1,P_0
    IF Zaehler>0 THEN INPUT #1,P_100(Zaehler)
    IF Zaehler=1 THEN M21=1
    NEXT Zaehler
    CLOSE #1


    Das dazugehörige Data Sharing Programm stellt folgendes zur Verfügung:
    Wenn der Roboter eine "+0" über die Serielle schickt so schickt das Perifergerät einen String der so aussieht:" 82,(123.020,143.800,56.230,0.000,0.000,90.000)"
    82 ist die Anzahl der abzuarbeitenden Punkte,
    die Koordinaten stellen hierbei den neunen "0 Punkt " da
    Alle weiteren, vom Roboter geschickten Zahlen werden mit den jeweiligen KoordinatenOffsets der anzufahrenden Punkte quitiert. d.h. schickt der Roboter nach und nach Zahlen von 1 bis zur Zahl die die Anzahl der abzuarbeitenden Punkte angibt, so werden diese in das Array gespeichert.


    Mein Problem:
    Ich kann immer nur eine Position zu wenig auslesen, und aufgrund anderer technischer Schwirigkeiten hab ich die Kommunikatiion bis jetzt auch meistens mittels des Terminal Programms in Cosirop getestet. Es muß darauf geachtet werden das beideTasks auch wirklich in die jeweiligen slots geladen werden. Hierzu kann man im RCI Explorer bei den Parametern die Slots auf die jeweiligen Programme fixieren. Soll heißen , daß man den Slot durch anführen des Task Namens vor dem Beistrich (ich kanns nicht besser erklären; ich mach mal Screan Shots) reserviert.


    ich hoffe da das hilft vorab und, daß ich mich gut genug ausgedrückt habe.
    eine Herausgabe des Sorce Codes den ich verwende lohnt nicht, da ich so viele I/O´s und co ansteuere und darauf reagiere und sonstiges passiert das Ihr so wirklich nicht erahnen könnt, und vorallem das ganze ja noch nicht fertig ist.


    also viel Spaß damit!


    skoki

    Einmal editiert, zuletzt von skok ()

  • wie macht denn das Cosirop, wenn meherere Positionen ein/ausgelesen werden ?


    Da kann man doch auswählen, welche Positionen geladen werden sollen.


    Oder hab ich die Frage falsch verstanden?

    Menschen brauchen Roboter, aber auch Roboter brauchen Menschen.

    Roboter sichern die Arbeitsplätze und den Fortschritt der Industrieländer, da sie kostengünstig und qualitativ hochwertig produzieren.

    Ohne Automatisierung mit Robotern werden unsere Produkte in Billiglohnländern hergestellt.

    >> Abonniere meinen YouTube Roboterkanal <<

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