SWITCH ... CASE ... ENDSWITCH mit IF Anweisung verknüpfen

  • Hallo liebe Experten,


    ich habe das Forum bereits durchsucht und noch keine Antwort auf meine Frage gefunden.


    Das Problem:
    Ich habe ein Roboterportal mit 3 Bearbeitungsmaschinen und 2 hängend auf zusatzachse montierten Robotern. Diese bestücken die Maschinen in 2 Spannungen. Es gibt hier also jede Menge Unterprogramme.
    Ich muss jetzt dafür sorgen das nicht nur ein Typ sondern 2 Typen über die Linie gefahren werden sollen. Die Greifer müssen hierfür umgebaut werden und die Greifposition ist anders.


    Ich hänge gerade bei der Frage fest wie ich die Umschaltung zwischen den Typen realisiere.


    Das Programm (cell):


    &ACCESS RVP
    &REL 79
    &COMMENT HANDLER on external automatic
    DEF cell( )
    BOOL Roboter_ausrichten
    ;FOLD INIT
    ; EXT up2_rt_an_ma_vorr1 (INT:IN)
    ; EXT up3_ft1_an_ma_zwst (INT:IN)
    ; EXT up4_ft1_an_ma_vorr2 (INT:IN)
    ; EXT up5_ft2_an_io_nio_band (INT:IN,INT:IN)
    ; EXT up6_ft1_an_nio_band (INT:IN)
    ; EXT up7_rt_wdh_an_ma_vorr1 (INT:IN)
    ; EXT up8_ft1_wdh_an_ma_vorr2 (INT:IN)


    DECL CHAR DMY[3]
    DMY[]="---"
    ;ENDFOLD (INIT)
    ;FOLD BASISTECH INI
    GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
    INTERRUPT ON 3
    BAS (#INITMOV,0 )
    ;ENDFOLD (BASISTECH INI)


    ;PTP HOME ist auskommentiert


    ;FOLD CHECK HOME
    ;$H_POS=XHOME
    ;IF CHECK_HOME==TRUE THEN
    ; P00 (#CHK_HOME,#PGNO_GET,DMY[],0 ) ;Testing Home-Position
    ;ENDIF
    ;ENDFOLD (CHECK HOME)
    ;FOLD PTP HOME Vel= 100 % DEFAULT;%{PE}%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:100, 7:DEFAULT
    ;$H_POS=XHOME
    ;PDAT_ACT=PDEFAULT
    ;BAS (#PTP_DAT )
    ;FDAT_ACT=FHOME
    ;BAS (#FRAMES )
    ;BAS (#VEL_PTP,100 )
    ;PTP XHOME
    ;ENDFOLD


    ;FOLD AUTOEXT INI
    P00 (#INIT_EXT,#PGNO_GET,DMY[],0 ) ; Initialize extern mode
    ;ENDFOLD (AUTOEXT INI)



    ;Unterprogramm beendet und andere Signale sicherheitshalber
    ;loeschen



    FOR Schleife=59 TO 64 STEP 1
    $OUT[Schleife]=FALSE
    ENDFOR



    FOR Schleife=81 TO 94 STEP 1
    $OUT[Schleife]=FALSE
    ENDFOR


    FOR Schleife=98 TO 112 STEP 1
    $OUT[Schleife]=FALSE
    ENDFOR


    FOR Schleife=121 TO 137 STEP 1
    $OUT[Schleife]=FALSE
    ENDFOR


    FOR Schleife=140 TO 149 STEP 1
    $OUT[Schleife]=FALSE
    ENDFOR


    FOR Schleife=153 TO 160 STEP 1
    $OUT[Schleife]=FALSE
    ENDFOR


    ;Satzvorlauf (Max=5)
    $ADVANCE=3



    LOOP


    P00 (#EXT_PGNO,#PGNO_GET,DMY[],0 )
    SWITCH PGNO ; Select with Programnumber


    CASE 1
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request

    ;Unterprogramm Aufruf fahre zur Grundstellung
    ;ACHTUNG!! Roboter_ausrichten=TRUE bedeutet:GRST-Fahrt wird zugelassen!!
    Roboter_ausrichten=FALSE
    up1_grundstellung (Roboter_ausrichten)


    CASE 2
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up2_rt_an_ma_vorr1 (IN_Akt_Maschinen_Nummer); up2_Rohteil an Maschine 1-3 Vorrichtung 1


    CASE 3
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up3_ft1_an_ma_zwst (IN_Akt_Maschinen_Nummer); up3_Fertigteil 1 an Maschine 1-3 Zwischenstation


    CASE 4
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up4_ft1_an_ma_vorr2 (IN_Akt_Maschinen_Nummer); up4_Fertigteil 1 an Maschine 1-3 Vorrichtung 2


    CASE 5
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up5_ft2_an_io_nio_band (IN_Akt_Maschinen_Nummer,IN_Akt_Teilekennung); up5_Fertigteil 2 an (i.O./ n.i.O.) Band


    CASE 6
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up6_ft1_an_nio_band (IN_Akt_Maschinen_Nummer); up6_Fertigteil 1 an n.i.O. Band


    CASE 7
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up7_rt_wdh_an_ma_vorr1 (IN_Akt_Maschinen_Nummer)


    CASE 8
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up8_ft1_wdh_an_ma_vorr2 (IN_Akt_Maschinen_Nummer)


    DEFAULT
    P00 (#EXT_PGNO,#PGNO_FAULT,DMY[],0 )
    OUT_UP_niO_beendet=TRUE
    ;Unbekannter Auftrag, daher erfolgt Fehlerausgabe
    WAIT FOR $IN[1026]
    ;Eingang ist systemseitig FALSE -> Roboter bleibt bei falschem Zustand der Variablen hier stehen!
    ENDSWITCH


    ENDLOOP



    END


    Ich würde das jetzt so lösen, das ich in die Loop Funktion eine IF Anwesiung integriere und über einen Eingang von der SPS den Typ wähle. Also z.B. LOOP IF $IN[99] THEN Typ1, SWITCH, CASE 1 ...n, ENDSWITCH ELSE Typ2, SWITCH, CASE 1 ...n, ENDSWITCH ENDIF. Die Unterprogrammstruktur würde ich dann duplizieren und umbenennen.


    Meine Frage an euch: Ist das programmtechnisch möglich und sauber oder sollte man das anders lösen.


    MfG lesard

    Einmal editiert, zuletzt von lesard ()

  • Schritt für Schritt zum Roboterprofi!
  • Also sauber ist das meiner Meinung nach schon, ob es geht? Welche Software Version benutzt Du? Teste es einfach, wenn der Compiler nicht mekert, dann läuft es auch, denn die Logik stimmt.

  • "LOOP" ist ja nix als ne Endlosschleife... was man drinnen anstellt, ist egal.
    Besonders schön finde ich es nicht, ich würde die Zusatzbedingung mit in den Switch nehmen, indem ich nicht mehr auf PGNO teste, sondern auf eine eigene Variable, die ich zusammensetze aus PGNO und der Greifernummer oder was auch immer...


    if $IN[94] then
    greifernummer=100
    else
    greifernummer=200
    endif


    meinewahl=greifernummer+PGNO


    switch meinewahl
    case 101
    ;blabala
    case 102
    ...
    case 201
    ;blabla
    case 202
    ...
    default
    ;kein passendes Programm
    endswitch


    Man muss die Cases nicht unbedingt lückenlos durchzählen und sie noch nicht einmal in der "natürlichen" Reihenfolge haben, da der Interpreter alles durchprobiert. Man kann auch mehrere Cases in eine Zeile nehmen (ohne Spaces nach den Komma):
    case 101,102,103


    Nachteil ist obige Eigenschaft: sollte man SEHR viele cases haben und wenig Zeit, ist eine verschachtelte IF-Then-Lösung u. U. besser, weil schneller.

  • Ich persönlich halte nichts davon wenn man schon eine PGNO bekommt sie nicht abzufragen, wenn müsstest du ein 2. Main machen mit einer anderen PGNO für den 2. Typ. Das wäre die "Sauberste" Lösung. Deine Lösung ist zwar elegant, aber wird für jeden dritten der dazu kommt und sich das anschaut unübersichtlich...

    Einmal editiert, zuletzt von Fui ()

  • if $IN[94] then
    greifernummer=100
    else
    greifernummer=200
    endif


    Diese Möglichkeit halte ich für Gefährlich, weil sie eine Crash-Gefahr beinhaltet !
    Was passiert z.B. bei einem Signalverlust duch Endschalterdefekt, kabelbruch etc ... , wenn der Greifer 100 angebaut ist? :kopfkratz: Der Robi nimmt dann das Programm für den 200er Greifer ! Ob das dann so gesund für den Greifer und/oder die Anlage ist, bwzeifele ich.


    Besser:
    if $IN[94] then
    greifernummer=100
    if $IN[95] then
    greifernummer=200


    Dann kann man noch eine Abfrage einbauen ( Beide Eingänge bzw. kein Eingang) und eine Meldung ausgeben :meld::hilfe: Greifer Endschalter NIO, Bitte Prüfen :hilfe:


    Ich spreche da aus Erfahrung ..


    Mfg
    Mfg

  • Hallo zusammen. Vielen dank für die konstruktiven Beiträge. Ich werde vermutlich den Weg über die Cases gehen. Meine Schleife würde dann so aussehen:



    LOOP


    IF $IN[80] THEN
    greifer=100
    ENDIF


    IF $IN[81] THEN
    greifer=200
    ENDIF


    IF NOT $IN[81] AND NOT $IN[80] THEN
    HALT ; Fehlertext ausgeben ...
    ENDIF


    IF $IN[81] AND $IN[80] THEN
    HALT ; Fehlertext ausgeben ...
    ENDIF


    Typ=greifer+PGNO


    P00 (#EXT_PGNO,#PGNO_GET,DMY[],0 )
    SWITCH Typ ; Select with Programnumber


    CASE 101
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request

    ;Unterprogramm Aufruf fahre zur Grundstellung
    ;ACHTUNG!! Roboter_ausrichten=TRUE bedeutet:GRST-Fahrt wird zugelassen!!
    Roboter_ausrichten=FALSE
    up1_grundstellung (Roboter_ausrichten)


    CASE 102
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up2_rt_an_ma_vorr1 (IN_Akt_Maschinen_Nummer); up2_Rohteil an Maschine 1-3 Vorrichtung 1


    CASE 103
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up3_ft1_an_ma_zwst (IN_Akt_Maschinen_Nummer); up3_Fertigteil 1 an Maschine 1-3 Zwischenstation


    CASE 104
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up4_ft1_an_ma_vorr2 (IN_Akt_Maschinen_Nummer); up4_Fertigteil 1 an Maschine 1-3 Vorrichtung 2


    CASE 105
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up5_ft2_an_io_nio_band (IN_Akt_Maschinen_Nummer,IN_Akt_Teilekennung); up5_Fertigteil 2 an (i.O./ n.i.O.) Band


    CASE 106
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up6_ft1_an_nio_band (IN_Akt_Maschinen_Nummer); up6_Fertigteil 1 an n.i.O. Band


    CASE 107
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up7_rt_wdh_an_ma_vorr1 (IN_Akt_Maschinen_Nummer)


    CASE 108
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up8_ft1_wdh_an_ma_vorr2 (IN_Akt_Maschinen_Nummer)


    ;_____________________________________________________________________
    NEUER GREIFER
    ;_____________________________________________________________________


    CASE 201
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request

    ;Unterprogramm Aufruf fahre zur Grundstellung
    ;ACHTUNG!! Roboter_ausrichten=TRUE bedeutet:GRST-Fahrt wird zugelassen!!
    Roboter_ausrichten=FALSE
    up1_grundstellung (Roboter_ausrichten)


    CASE 202
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up2_rt_an_ma_vorr1 (IN_Akt_Maschinen_Nummer); up2_Rohteil an Maschine 1-3 Vorrichtung 1


    CASE 203
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up3_ft1_an_ma_zwst (IN_Akt_Maschinen_Nummer); up3_Fertigteil 1 an Maschine 1-3 Zwischenstation


    CASE 204
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up4_ft1_an_ma_vorr2 (IN_Akt_Maschinen_Nummer); up4_Fertigteil 1 an Maschine 1-3 Vorrichtung 2


    CASE 205
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up5_ft2_an_io_nio_band (IN_Akt_Maschinen_Nummer,IN_Akt_Teilekennung); up5_Fertigteil 2 an (i.O./ n.i.O.) Band


    CASE 206
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up6_ft1_an_nio_band (IN_Akt_Maschinen_Nummer); up6_Fertigteil 1 an n.i.O. Band


    CASE 207
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up7_rt_wdh_an_ma_vorr1 (IN_Akt_Maschinen_Nummer)


    CASE 208
    P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
    up8_ft1_wdh_an_ma_vorr2 (IN_Akt_Maschinen_Nummer)


    ;_______________________________________________________________________


    DEFAULT
    P00 (#EXT_PGNO,#PGNO_FAULT,DMY[],0 )
    OUT_UP_niO_beendet=TRUE
    ;Unbekannter Auftrag, daher erfolgt Fehlerausgabe
    WAIT FOR $IN[1026]
    ;Eingang ist systemseitig FALSE -> Roboter bleibt bei falschem Zustand der Variablen hier stehen!
    ENDSWITCH


    Typ=0


    ENDLOOP


    Könntet Ihr mal drüber schauen ob das von der Logik her stimmt!?


    MfG lesard

    Einmal editiert, zuletzt von lesard ()

  • Von der Logik her stimmt das aber ich würde an Deiner Stelle deine Variable TYP initialisieren, also mit 0 oder so vorbelegen. Damit es nicht zu ungewolltne Programmauufen kommen kann! Die Variable wird außerdem ja gespeichert (wenn sie global ist in der $config.dat) ansonsten im .dat File. Also bedenke das.


    Gruß Fui

  • Hallo zusammen,


    wollte mal ein kurzes Feedback geben.


    Habe das Ganze wie in meinem letzten Beitrag beschrieben umgesetzt. Die Roboter laufen seit ca. einer Woche im 4-Schichtigen Produktivbetrieb und es gab keine Probleme. :applaus:


    Danke für die Hilfe!! :danke:


    MfG lesard

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