Beiträge von bf

    Hallo!


    Ich möchte gerne ein Signal via ProfiNet senden, allerdings erst wenn p4 wirklich erreicht ist, und nicht durch den Vorlauf

    Hallo!

    Mein Konfiguration für den Channel "fs" sieht wiefolgt aus


    Daten sehen z.B wiefolgt aus

    Code
    <robot>
       <custompoint mode="6" komponenten="32" verschleifen="true" pause="false">
          <pos X="0" Y="0" Z="500" A="0" B="0" C="0" tool="-2" base="-2" velCP="0.2" velOri1="180" velOri2="180" />
       </custompoint>
    </robot>

    dies funktioniert auch, wenn ich nun z.B 20 "custompoint" in einem XML sende funktioniert es auch noch, wenn ich aber 40 sende bleibt mein code bei

    Code
    WAIT FOR $FLAG[900]

    stehen.


    Es wird keine Fehlermeldung angezeigt und im Diagnosemonitor sehe ich das die Verbindung bestehen bleibt und sich der Wert in "Verbrauchter Speicher" ändert.


    Ich habe Buffering bzw Buffersize beides auf das Maximale Limit gesetzt um auszuschließen das es ein Speicherproblem wäre(da sollte aber auch eine Fehlermeldung kommen)


    Irgendeine Idee was hier noch falsch laufen kann?


    Verbindungs code sieht momentan in etwa so aus


    Code
    RET=EKI_Init("fs")
    RET=EKI_Open("fs")
    ; wait until server is conntected
    wait for $FLAG[1]
    ; wait for data
    wait for $FLAG[900]

    Hallo!

    Die Verbindung zwischen SimPro und Office Lite steht.

    Ich habe in SimPro eine einfache Positionierung "geteacht". Wenn ich mich nun mit office lite verbinde und auf "Job generieren und laden" klicke, startet er das Programm und in der Ist Positionsanzeige im Office Lite sehe ich auch das sich der Roboter bewegen sollte, in SimPro bleibt der Roboter aber stehen.


    Irgendeine Idee an was das liegen könnte?


    Danke

    Danke! Aber normalerweise gewinnt doch auch immer die Einstellungen im geteachten Punkt(z.B Geschwindigkeit)?


    wenn ich dies nun ändern will kann ich einfach in der LDAT-Struktur GEAR_JERK überschreiben?

    Bin da eher vorsichtig geteachte punkte manuell abzuändern

    Hallo!

    in den geteachten punkte finde ich ja das attribut "GEAR_JERK" dieser ist überall standardmäßig auf 100.

    Kann ich dieses irgendwie Global überschreiben?

    falls nein, wie passe ich den jerk an? im inline-formular finde ich keine option dazu.


    Code
    DECL LDAT LCPDAT5={VEL 0.500000,ACC 100.000,APO_DIST 500.000,APO_FAC 50.0000,AXIS_VEL 100.000,AXIS_ACC 100.000,ORI_TYP #VAR,CIRC_TYP #BASE,JERK_FAC 50.0000,GEAR_JERK 100.000,EXAX_IGN 0}

    Danke!

    Ich übergebe jetzt via profinet noch bits welche mir sagen welche komponenten überhaupt angesteuert werden sollen.


    dann mach ich im prinzip

    Code
    IF X_Komponente THEN
        pos = {X 0} ;Dadurch steht nurmehr die X Komponente im E6Pos
    ENDIF

    anschließend überschreibe ich die einfach mit IN_PositionsvorgabeX,...

    Code
    0
    
    1    position.Z = -2000
    
    2    SLIN position
    
    3    position.X = -300
    
    4    SLIN position

    In zeile 0 Steht in der variable position {E6POS:}

    In zeile 1 Steht in der variable position {E6POS: Z -2000}

    In zeile 3 Steht in der variable position {E6POS: X-300, Z -2000}


    kann ich die variable "position" irgendwie neu initialisieren damit nichtsmehr drinnensteht? (wie in zeile 0?)

    Hallo!


    ich beschreibe via ProfiNet eine E6Pos


    Direkt programmiert kann ich ja einfach schreiben

    Code
    SLIN { X 1200}

    aber wenn ich folgendes schreibe sind ja alle anderen komponenten Y,Z,A,B,C gleich 0 und er fährt ganz anders als gewünscht

    Code
    pos.X=IN_PositionsvorgabeX
    SLIN pos


    Gibt es eine Möglichkeit das zu umgehen?


    Ich hätte auch überlegt

    Code
    pos.Y = $POS_ACT.Y
    pos.Z = $POS_ACT.Z

    etc zu schreiben, allerdings hab ich beim überschleifen das problem das in $POS_ACT noch nicht die richtige position steht da der vorlauf ja schon abfragt wenn die endposition noch gar nicht erreicht wurde.


    Danke

    Danke! das probier ich dann gleich aus!


    was mir gerade aufgefallen ist:


    sagen wir ich führe folgendes Programm aus:


    Code
    PTP p1
    PTP p2
    PTP p3


    wenn ich das Programm gestartet habe, und während der Roboter p1 anfährt das sampling starte, bekomme ich erfolgreich die Ist Position zurück, wenn p1 erreicht ist steht der Roboter und ich bekomme weiterhin die Ist Position gesendet, wenn ich dann kurz das sampling stoppe, setzt der Roboter seine Bewegung zu p2 fort.



    Gibt es irgendein Flag das ich abfragen kann welches mir sagt "Roboter ist in Bewegung?", dann könnte ich versuchen die Interrupt Routine an das zu knüpfen?
    Oder gibt es eine andere Möglichkeit das zu lösen?

    Hallo!
    Ich hab nun die bewegungen (die in call() implementiert sind - einfache PTP/LIN Bewegungen ) aus der Interuptroutine herausgegeben.
    Allerdings fällt mir hier jetzt auf wenn ich set_state(1) set_state(0) schreibe, tut er das ganz schnell hintereinander und wartet nicht bis call() fertig ist, wenn ich das ganze in eine Interrupt Routine gebe funktioniert es schon!


    Ich will damit meinem Programm signalisieren 1=jetzt läuft ein programm 0=roboter steht und ist bereit


    Wie könnte ich jetzt bewerkstelligen das ich separat in einer interruptroutine die istposition sende? oder geht das wirklich nur über die sps.sub?



    Nochmals zusammengefasst:


    1. Möchte ich über eine ProgrammID einfache Programme starten, während ein Programm läuft soll STATE=1 sein.
    2. Während ein Programm läuft möchte ich zyklisch die Ist Position senden.

    Hallo!


    Ich habe fixe Bewegungsprogramme hinterlegt die via Ethernet KRL gestartet werden können. Das funktioniert auch so weit. Nun hätte ich gerne das während der Bewegung alle ~200 ms die aktuelle Ist Position über Ethernet KRL gesendet wird.
    Ich hätte nun die Bewegung an sich und das zyklische abfragen und senden der Ist-Position in zwei separate Interrupt Routinen gegeben. Durch einen kurzen Test hat sich ergeben das die 2 Interrupts nicht parallel laufen, sobald ich den einen stoppe wird erst der andere ausgeführt.


    Gibt des da eine Lösung das ich Während einer Bewegung des Roboters zyklische die Ist-Position abfragen kann?

    Ich steuere den Roboter ausschließlich über EthernetKRL.


    Nehmen wir an ich hab eine Methode A welche eine Bewegung ausführt, dann läuft diese Methode auch in einem Interrupt.
    Jetzt würde ich in der Methode A einen weiteren Interrupt Deffinieren fürs Abbrechen.


    Ich habe eine weitere Methode B welche zyklisch über EthernetKRL die IstPosition sendet, diese Interruptroutine ist also quasi in einer Endlosschleife.


    Mir ist nun wichtig das ich die Interruptroutine A abbrechen kann aber B weiterläuft.


    Ich hätte mir das dann eben so vorgestellt
    da ja RESUME alle Interruptroutinen in der selben Ebene abbricht, hab ich den STOP Interrupt eben eine Ebene tiefer deklariert.



    Sinn dahinter: Roboter soll auf eine Palette auffahren und Wenn der Sensor auf dem Werkzeug schaltet wird ein Befehl über Ethernet KRL gesendet welches dann die STOP-Funktion aufrufen soll.


    Ich weiß - man kann Sensoren auch direkt an den Roboter anhängen, wir wollen das aber mal über eine Zentrale SPS regeln.


    würde in diesem Fall mit RESUME auch B() abgebrochen werden falls diese Interruptroutine gerade läuft?
    Ich will nämlich wirklich nur gezielt A() abbrechen lassen

    Hallo!
    Ist es möglich, mit dem Werkzeug in Stoßrichtung zu fahren bis ein Flag auf TRUE Gesetzt wird?
    Also z.B.:

    Code
    LIN_REL {Z -100}


    Die Idee dahinter ist das auf dem Werkzeug ein Sensor ist, und wenn dieser anschlägt soll die Bewegung abgebrochen werden.
    Ich hätte mal an sowas gedacht, wüsste aber gerne ob es da eine andere(bessere) Möglichkeit gibt?

    Code
    WHILE FLAG[100]==FALSE
       LIN_REL {Z -1}
    ENDWHILE