1. Dashboard
    1. Dashboard
    2. Suche
  2. Forum
    1. Unresolved Threads
  3. Members
    1. Recent Activities
    2. Users Online
    3. Team
    4. Search Members
  4. Jobs
  5. Articles
  6. Calendar
    1. Upcoming Events
    2. Map
  7. Shop
    1. Orders
    2. Shipping Costs
  • Login or register
  • Search
Roboterprogrammierer finden
This Thread
  • Everywhere
  • This Thread
  • This Forum
  • Articles
  • Pages
  • Forum
  • Blog Articles
  • Events
  • Files
  • Products
  • More Options
  1. Roboterforum.de - die Industrieroboter und Cobot Community
  2. Forum
  3. Industrieroboter Support
  4. KUKA Roboter
Your browser does not support videos autonome mobile Roboter von KUKA
besuche unseren Hauptsponsor
Roboterprogrammierer
Robot Support Forum
Werbung schalten Roboter
Advertise in Robotics
Der Roboterkanal
Deutscher Robotikverband
Werben in Robotik
Werben für Robotik

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

  • lesard
  • December 14, 2009 at 3:26 PM
  • Thread is Resolved
  • lesard
    Points
    20
    Posts
    3
    About Me

    D’oh!

    Location
    Schmalkalden
    • December 14, 2009 at 3:26 PM
    • #1

    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

    Edited once, last by lesard (December 14, 2009 at 3:28 PM).

  • Schritt für Schritt zum Roboterprofi!
  • Fui
    Points
    40
    Posts
    7
    • December 14, 2009 at 3:31 PM
    • #2

    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.

  • Programmiersklave
    Reactions Received
    100
    Points
    6,450
    Posts
    1,198
    About Me

    neuerdings freigelassen

    Location
    märk. Sauerland
    Occupation
    Roboter- und SPS-Programmierer
    • December 14, 2009 at 4:41 PM
    • #3

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

    Automatisierung mit dem geflügelten Walross aus dem Sauerland

  • Fui
    Points
    40
    Posts
    7
    • December 14, 2009 at 6:19 PM
    • #4

    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...

    Edited once, last by Fui (December 14, 2009 at 6:21 PM).

  • magnus
    Points
    1,145
    Posts
    214
    Location
    nordhessen
    • December 14, 2009 at 6:38 PM
    • #5
    Quote from Programmiersklave

    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

  • lesard
    Points
    20
    Posts
    3
    About Me

    D’oh!

    Location
    Schmalkalden
    • December 15, 2009 at 8:29 AM
    • #6

    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

    Edited once, last by lesard (December 15, 2009 at 10:22 AM).

  • Fui
    Points
    40
    Posts
    7
    • December 21, 2009 at 10:35 AM
    • #7

    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

  • lesard
    Points
    20
    Posts
    3
    About Me

    D’oh!

    Location
    Schmalkalden
    • January 8, 2010 at 8:18 AM
    • #8

    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

Tags

  • 1
  • 33
  • 2
  • ABB
  • ABB Roboter
  • ABS
  • base
  • constant
  • CP_PARAMS
  • Dialog
  • EX
  • EXT
  • fanuc
  • Fehler
  • FRAMES
  • INIT
  • INITIALIZED
  • INITMOV
  • IRC5
  • joint
  • KRC2
  • KRC4
  • kuka
  • new
  • NONE
  • notify
  • PATH
  • PGNO_GET
  • profinet
  • PTP_DAT
  • PTP_PARAMS
  • P_ACTIVE
  • P_FREE
  • P_RESET
  • P_STOP
  • Quit
  • Roboter
  • RobotStudio
  • Schweißen
  • Sps
  • Sync
  • T1
  • t2
  • tcp
  • Tool
  • VALUE
  • VAR
  • vel_cp
  • vel_ptp
  • Yaskawa
AD
Your browser does not support videos autonome mobile Roboter von KUKA
Einloggen für weniger Werbung

gesponserte Artikel

  • Gebrauchtroboter kaufen - Was ist zu beachten. Die Checkliste zum kauf von gebrauchten Robotern

    August 11, 2019 at 7:02 PM
  • Was macht ein Roboterprogrammierer genau und was verdient er?

    August 21, 2019 at 8:17 AM
  • Vernetzen, referenzieren, kollaborieren: Das B2B Portal für die Produktionsautomatisierung

    June 2, 2021 at 11:29 AM

Job Offer

  • Sie wollen Ihr Stellenangebot im Roboterforum schalten? Ab 149€

    Werner Hampel June 17, 2021 at 9:52 AM
  • Werde Roboterprogrammierer bei ROBTEC GmbH in Mainburg / Bayern

    Werner Hampel April 5, 2023 at 7:13 PM
Werbung auf Roboterseite
Roboter programmieren lernen
Banner Robotik

Tags

  • vel_ptp
  • EXT_PGNO
  • PGNO_GET
  • PGNO_ACKN
  • PGNO_FAULT
  • INITMOV
  • PTP_DAT
  • FRAMES
  • INIT_EXT
  • CHK_HOME

Wieviele Mitglieder waren heute eingeloggt?

Logge Dich ein, um hier zu lesen wer in den letzten 24h Online war und um weniger Werbung zu sehen.

  1. Privacy Policy
  2. Legal Notice
Powered by WoltLab Suite™ 6.0.22
Roboterforum.de - die Industrieroboter und Cobot Community in the WSC-Connect App on Google Play
Roboterforum.de - die Industrieroboter und Cobot Community in the WSC-Connect App on the App Store
Download