Verbinden von EAs mit BOOL Variablen

  • Hallo Community,
    Ich suche die Möglichkeit ein Eingang (bzw. Ausgang) eine BOOLIsche Variable Dynamisch zuzuweisen.
    Hier ein Teil aus mein Aktuellen Programm:


    SWITCH gripper_name
    CASE Grp1
    WAIT FOR (diGrp1_closed==TRUE)
    CASE Grp2
    WAIT FOR (diGrp2_closed==TRUE)
    ENDSWITCH


    Was ich brauche ist eine "CONNECT...TO..." Funktion:


    DECL BOOL bGrp_closed


    SWITCH gripper_name
    CASE Grp1
    CONNECT bGrp_closed TO diGrp1_closed
    CASE Grp2
    CONNECT bGrp_closed TO diGrp2_closed
    ENDSWITCH
    ...
    WAIT FOR (bGrp_closed==TRUE)


    Ich weis nicht ob es sowas gibt, aber wenn jemand mir da weiter helfen könnte, wäre ich dankbar.


    Gruß, Ramo

    Mein Bereich:<br />KUKA, ABB, STÄUBLI, FANUC<br />Kommunikation mit s7

  • Schritt für Schritt zum Roboterprofi!
  • mach nen bool array


    Deklaration
    bool bGrp_Closed[2]


    SPS.SUB
    bGrp_Closed[1]=diGrp1_Closed
    bGrp_Closed[2]=diGrp1_Closed


    und beschreib diese im sps sub eine connect to funktion könnte man schon schreiben aber dies wäre einfacher


    und für ausgänge genauso nur andersrum

  • Moin, du könntest den Eingang / Ausgang im Submit (z.B. SPS.sub) der Variable zuweisen.
    In dieser Weise:




    Das wird dann im Takt von 12 ms aktualisiert. Kann auch höher sein, je nach Auslastung des Roboterinterpreters.


    Gruß Jan


    Ah da war jemand schneller... 8)

  • Erstmals danke für die Schnellen Antworten.
    Das mit dem Submit hatte ich mir auch schon überlegt, leider passt es nicht ganz zu meinem Wunsch.
    Ich möchte nur 1 bGrp_Closed haben, egal wieviel Greifer ich habe. Deswegen hatte ich den "SWITCH,CASE".


    Mein ziel ist es, in ein "Bewegungs-" Programm ein unterprogram "Gripper(IN:#Grp1,IN:#check,IN:#Close,OUT:bSensorON)" aufzurufen. Mit der Info "#Grp1" und "#Close" soll dann auf dem entsprechendem Eingang zugegriffen werden, und den "bSensorON" auf TRUE setzten wenn der Eingang TRUE ist.


    Genauso soll es für Gripper(#Grp2,#control,#Open,bSensorON), oder andere Konstellationen funktionieren.


    Aktuell habe ich schon ein Gripper(...) Programm, aber da wird direkt auf EAs zugegriffen, und bei jedem neuen Roboter muss ich dieses komplett überarbeiten. Ich würde halt gerne nur dem Part "Zuweizung" anpassen.


    Gruß, Ramo

    Mein Bereich:<br />KUKA, ABB, STÄUBLI, FANUC<br />Kommunikation mit s7

  • Das Problem mit dem Submit ist das ich dann nicht sicher bin ob ich auf den Richtigen Eingang schaue. Es könnte ja sein das der Submit noch nicht umgeschaltet hat, und mein Gripper(...) schon auf bGripper_Closed schaut.


    Gruß, Ramo

    Mein Bereich:<br />KUKA, ABB, STÄUBLI, FANUC<br />Kommunikation mit s7

  • Deklaration
    bool biGrp_Closed[2]
    bool biGrp_Open[2]


    bool boGrp_Close[2]
    bool boGrp_Open[2]


    SPS.SUB
    biGrp_Closed[1]=diGrp1_Closed
    biGrp_Closed[2]=diGrp2_Closed
    biGrp_Open[1]=diGrp1_Open
    biGrp_Open[2]=diGrp2_Open


    oGrp1_Close=boGrp_Close[1]
    oGrp2_Close=boGrp_Close[2]
    oGrp1_Open=boGrp_Open[1]
    oGrp2_Open=boGrp_Open[2]


    greifer programm
    Gripper(num GrpNo


    im programm bleibt alles einfach


    switch State
    case #OPEN
    boGrp_Close[nGrpNo] = False
    boGrp_Open[nGrpNo] = TRUE
    case #CLOSE
    boGrp_Open[nGrpNo] = False
    boGrp_Close[nGrpNo] = TRUE
    ENDSWITCH


    brauchst das programm selber nicht mehr anpacken nur im sub und das array erweitern und schaust immer auf das richtige signal

    Einmal editiert, zuletzt von Loipe ()

  • Ja, jetzt verstehe ich in welche Richtung ich gehen muss.
    Noch eine Frage, kann man das auch 2 Dimensional aufbauen:


    Deklaration
    bool biGrp[2,2] ;Die erste Dimension für GrpNr, die 2. für Direction (close=1/open=2)



    bool boGrp[2,2] ;Die erste Dimension für GrpNr, die 2. für Direction (close=1/open=2)


    SPS.SUB
    biGrp[1,1]=diGrp1_Closed
    biGrp[1,1]=diGrp2_Closed
    biGrp[1,2]=diGrp1_Open
    biGrp[2,2]=diGrp2_Open


    oGrp1_Close=boGrp[1,1]
    oGrp2_Close=boGrp[2,1]
    oGrp1_Open=boGrp[1,2]
    oGrp2_Open=boGrp[2,2]


    greifer programm
    Gripper(num GrpNo, num nDir)


    DECL INT nDirInv


    IF nDir==1 THEN
    nDirInv=2
    ELSEIF nDir==2 THEN
    nDirInv=1
    ELSE
    ;ERROR!!!
    ENDIF



    boGrp[nGrpNo,nDirInv] = FALSE
    boGrp[nGrpNo,nDir] = TRUE

    Mein Bereich:<br />KUKA, ABB, STÄUBLI, FANUC<br />Kommunikation mit s7

  • sicher kannst du das


    kannst auch ne struc machen


    decl struc sGripper bool boOpen,boClose,biOpen,biClose,bSensorON, num State etc...


    decl sGripper Grp[2]



    dann hast alles in einer variable was den greifer angeht und kannst dir den status in variablen anzeige schön anzeigen lassen (eingänge ausgänge alles in einem)



    grp[1].boOpen
    grp[1].boClose
    grp[1].biOpen
    grp[1].biClose
    grp[1].bSensorON
    grp[1].nState



    elseif gibts beim kuka net.


    switch case ist dein freund bei num variable


  • Warum nicht einfach:

    Code
    SWITCH gripper_name
       CASE Grp1
          bGrp_closed = diGrp1_closed
       CASE Grp2
          bGrp_closed = diGrp2_closed
    ENDSWITCH
    
    
    WAIT FOR (bGrp_closed==TRUE)

    Gruß Roland


    Wie poste ich falsch?

    Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.

    Konrad Adenauer

  • @ Roland


    Warum nicht einfach:


    Weil bGrp_closed sich nicht mehr ändert.


    Zyklisch beschreiben geht nur im Sub oder auch mit Zyklischen Flags (s.u.).


    Code
    SWITCH gripper_name
       CASE Grp1
          $Cycflag[1] = diGrp1_closed
       CASE Grp2
          $Cycflag[1] = diGrp2_closed
    ENDSWITCH
    
    
    WAIT FOR ($Cycflag[1]==TRUE)


    Edith: 3 Dollar spendiert

    Einmal editiert, zuletzt von zteve ()

  • Ups.... Klar.
    Schande über mich :???:

    Gruß Roland


    Wie poste ich falsch?

    Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.

    Konrad Adenauer

  • Hallo,
    schließlich habe ich es so programmiert:


    Config.dat:
    ;FOLD Gripper signals
    ;Array[number of grippers,Number of sensors/Actors]
    BOOL biGrp[3,2] ;3 Grippers, 2 Sensors (1:closed;2:open)
    BOOL boGrp[3,2] ;3 Grippers, 2 Actors (1:closing;2:opening)
    BOOL bPart_in_grp[3] ;3 Grippers
    BOOL biClosed_with_part_Grp[3] ;3 Grippers
    BOOL bPart_NIO_in_Grp[3] ;3 Grippers
    ;ENDFOLD


    Submit:
    ;*** Gripper signals connection ***
    ;FOLD Gripper signals connection
    biGrp[1,1]=diGrp1_Closed
    biGrp[1,1]=diGrp2_Closed
    biGrp[1,2]=diGrp1_Opened
    biGrp[2,2]=diGrp2_Opened


    doGrp1_Closing=boGrp[1,1]
    doGrp2_Closing=boGrp[2,1]
    doGrp1_Opening=boGrp[1,2]
    doGrp2_Opening=boGrp[2,2]


    ; Gripper settings
    biClosed_with_part_Grp[1]=TRUE
    biClosed_with_part_Grp[2]=TRUE
    biClosed_with_part_Grp[3]=TRUE


    ;ENDFOLD (Gripper signals connection)


    gripper_control(gripper_name :IN,action1:IN,action2:IN)
    DECL TYP_GRIPPER gripper_name
    DECL TYP_GRP_ACTION1 action1
    DECL TYP_GRP_ACTION2 action2
    INT nGrp_nr,nAction_nr,nAction_nr_inv

    [color=blue];FOLD Initialisation
    ;*************************************************************************
    SWITCH gripper_name
    CASE #gripper1,#Grp1
    nGrp_nr=1
    CASE #gripper2,#Grp2
    nGrp_nr=2
    CASE #gripper3,#Grp3
    nGrp_nr=3
    DEFAULT
    ;xxxxx no valid gripper name xxxxx
    REPEAT
    HALT
    ;******************************
    ;*** no valid gripper name ***
    ;******************************
    WAIT FOR (FALSE)
    UNTIL (FALSE)
    ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    ENDSWITCH


    SWITCH action1
    CASE #control,#check,#control_check,#gripper_test
    ;OK
    DEFAULT
    ;xxxxx no valid action1 name xxxxx
    REPEAT
    HALT
    ;******************************
    ;*** no valid action1 name ***
    ;******************************
    WAIT FOR (FALSE)
    UNTIL (FALSE)
    ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    ENDSWITCH


    SWITCH action2
    CASE #clamp,#suck,#outputs_off
    nAction_nr=1
    nAction_nr_inv=2
    CASE #declamp,#blow
    nAction_nr=2
    nAction_nr_inv=1
    DEFAULT
    ;xxxxx no valid action2 name xxxxx
    REPEAT
    HALT
    ;******************************
    ;*** no valid action2 name ***
    ;******************************
    WAIT FOR (FALSE)
    UNTIL (FALSE)
    ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    ENDSWITCH
    SWITCH action1
    CASE #control
    ;FOLD Control (during movement by trigger)
    SWITCH action2
    CASE #clamp,#declamp,#suck
    TRIGGER WHEN DISTANCE=0 DELAY=0 DO boGrp[nGrp_nr,nAction_nr_inv]=FALSE
    TRIGGER WHEN DISTANCE=0 DELAY=0 DO boGrp[nGrp_nr,nAction_nr]=TRUE
    CASE #blow
    TRIGGER WHEN DISTANCE=0 DELAY=0 DO boGrp[nGrp_nr,nAction_nr_inv]=FALSE
    TRIGGER WHEN DISTANCE=0 DELAY=0 DO PULSE (boGrp[nGrp_nr,nAction_nr], TRUE, 0.5)
    CASE #outputs_off
    TRIGGER WHEN DISTANCE=0 DELAY=0 DO boGrp[nGrp_nr,nAction_nr_inv]=FALSE
    TRIGGER WHEN DISTANCE=0 DELAY=0 DO boGrp[nGrp_nr,nAction_nr]=FALSE
    ENDSWITCH
    ;ENDFOLD (Control)



    ... usw.


    Programm ist vorbereitet. muss nur noch getestet werden. das kann aber ein paar Wochen dauern, da ich momentan kein Robi zur Verfügung habe.


    Noch ein großes Dankeschön an alle Teilnehmer dieser Diskussion,


    Grüße, Ramo

    Mein Bereich:<br />KUKA, ABB, STÄUBLI, FANUC<br />Kommunikation mit s7

  • Hallo an alle Interessierte,
    Leide habe ich eine schlechte Nachricht bezüglich die Funktion (ein Kollege hat sie getestet):
    Dadurch das im Submit die Ausgänge immer wieder mit dem Array überschrieben wird, funktionniert die GRIPPERTECH nichtmehr!
    Da wir die Grippertech immer einsetzen, ist das Programmchen leider für die Mülltonne...:(

    Mein Bereich:<br />KUKA, ABB, STÄUBLI, FANUC<br />Kommunikation mit s7

  • Hallo


    Wenn das alles ist?


    Du schaltest mit dem grippertech nur einen ausgang der im unbenutzten bereich liegt zb 4000 und 4001
    Im submit hast du

    Code
    IF $OUT[4000] THEN
      GRIPPER 1, 1
      $OUT[4000] = FALSE
    ENDIF
    IF $OUT[4001] THEN
      GRIPPER 1, 2
      $OUT[4001] = FALSE
    ENDIF


    Solltest du den status vom grippertech noch passend schreiben im greifer programm.
    Hat noch andere vorteile
    - kannst überprüfen ob der greifer wirklich geöffnet werden soll/darf (schwere teile sonst was)
    - komplizierte greifer mit spannfolgen
    - usw.


    Nichts ist für die tonne


    Gruß Loipe

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