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.
-
-
Hallo
Beschreib doch bitte, was genau Du machen willst.
Tschüß Frank
-
Hi!
Warum übergibst du keine Programmnummer
und wertest die dann über eine
'Switch-case' aus?Es gibt auch von Kuka noch die Automatik-Extern-Schnittstelle!
-
Du kannst die Programmnamen für die switch-case-Struktur auch in eine ENUM-Konstante stecken, dann bleibt es lesbar.
-
Wobei man dann einen Enum wieder irgendwie binaer kodieren muesste, damit die SPS ein Programm anwaehlen kann.
Programmnummer und kommentar muss wohl Reichen. -
Wieso? Wenn Du ein ENUM im $config.dat definierst, dann geht doch so was:
SWITCH programm
CASE programm1
programm1()CASE programm2
programm2() -
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
-
Mal ne weiter idee:
Wurde denn folgendes funktionieren?
SIGNAL ProgNR $IN[1] to $IN[8]
und dann mit
Programm[ProgNR] ( )
die Routine aufrufen?
Hab leider keinen Robbi mehr um es mal auszuprobieren
-
ein grosser Autohersteller kocht auch seine eigene "SPS-Suppe".
Kann mir aber nicht vorstellen, das sich der Aufwand bezahlt macht.
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
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