Variabler Unterprogrammaufruf

  • Hallo, wer kann mir helfen?
    Ich möchte von einem Programm aus ein Unterprogramm aufrufen (z. B. Prog_1), möchte dies aber variabel gestallten. Der Name des Unterprogramms soll über eine SPS an den Roboter übergeben werden.

  • Schritt für Schritt zum Roboterprofi!
  • Hallo Kai_n,


    eigentlich sollte es ja so aussehen:
    ;----------------------
    Case #Programm1
    ;----------------------


    die declaration ist dann z.B.
    ;--------------------------------------------------
    Enum ProgNo Programm1, Programm2...
    Decl ProgNo Programm.
    ;--------------------------------------------------


    Das was ich aber tatsaechlich meinte, wie bekommt mann einen Enum direkt von einer SPS uebertragen auf einer meist digitalen Schnittstelle?
    Und genau das will der AUI wohl - da waere dann ein Integer angebracht.
    Andere Moeglichkeit: Serielle Schnittstelle und Char[] - wies mit einem Array in eine Switch-Case Anweisung ausschaut, weis ich aber leider nicht.


    z.B:
    ;-----------------------
    switch Programmnr
    case "Programm1"
    ;-----------------------


    Vielleicht sogar sowas ueber Ethernet. Hab ich aber genausowenig vorher gemacht - nur so eine Idee.


    Gruss Stefan

  • ein grosser Autohersteller kocht auch seine eigene "SPS-Suppe".
    Kann mir aber nicht vorstellen, das sich der Aufwand bezahlt macht. :huh:
    Hier Auszüge als Denkanstoss.
    -$config.dat
    STRUC SPS_PROG_TYPE INT PROG_NR,CHAR PROG_NAME[12]
    ; Table for assign SPS program number to program name
    INT MAX_SPS_PROG=89
    DECL SPS_PROG_TYPE SPS_PROG[89]
    SPS_PROG[1]={PROG_NR 1,PROG_NAME[] "HP001() "}
    SPS_PROG[2]={PROG_NR 2,PROG_NAME[] "HP002() "}
    SPS_PROG[3]={PROG_NR 3,PROG_NAME[] "HP003() "}
    SPS_PROG[4]={PROG_NR 4,PROG_NAME[] "HP004() "}
    :
    -sps.sub
    :
    INDEX=FIND_INDEX(PGNO)
    IF (INDEX>0) THEN ;Prog-Nr in Tabelle gefunden
    OFFSET=0
    SWRITE(TMPNAME[],STAT,OFFSET,"RUN /R1/%s",SPS_PROG[INDEX].PROG_NAME[])
    CWRITE($CMD,STAT,MODE,TMPNAME[])
    WAIT SEC 0.2
    IF (($PRO_STATE1==#P_ACTIVE) AND (STAT.RET1==#CMD_OK)) THEN
    CALL_BY_SPS=TRUE
    ELSE
    ERROR_FLAG=FALSE
    P00_SUBM (#EXT_PGNO,#PGNO_FAULT )
    ENDIF
    :
    DEFFCT INT FIND_INDEX(PGNO :IN)
    INT PGNO,II
    FOR II=1 TO MAX_SPS_PROG
    IF SPS_PROG[II].PROG_NR==PGNO THEN
    RETURN II
    ENDIF
    ENDFOR
    RETURN 0
    ENDFCT

    Wer nach allen Seiten offen ist kann nicht ganz dicht sein

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