Sub Interpreter MODE STAT problem

  • Hallo Kollegen,

    auch auf die Gefahr hin das es Ähnliches gibt hier.
    Kuka nutzt folgendes Bsp. fuer den Programmstart mit CWRITE:


    ;Select and Run program

    ;so that the behavior is independent of operating modes

    IF ($MODE_OP==#[EX]) AND ($PRO_STATE1==#[P_FREE]) THEN

    CWRITE($CMD,STAT,MODE,"RUN/R1/CELL/EXAMPLE()")

    ;is required so that the program is not startet automatically at #EXT

    CWRITE($CMD,STAT,MODE,"STOP 1")

    ENDIF



    Ich habe also nun ein Bearbeitung und hier möchte ich eine Pegel simulieren ab einer bestimmten stelle:


    LIN {X -1550, Y 495.0, Z -500.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL



    ; Funktionsgenerator ausschalten


    IF ($MODE_OP==#T2) or ($MODE_OP==#T1)THEN


    ;CWRITE($CMD,STAT,MODE,"RUN/R1/TP/TEST_SUB/TEST()")


    CWRITE ($CMD, STAT, MODE, "RUN/R1/TP/..../TEST() > 3") ; Programm sollte also mit 3 mittels Subinterpreter EXT1 geladen werden und im Hintergrund laufen.


    ENDIF


    LIN {X -500, Y 495.0, Z -500.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL


    Dann würde ich das Prg gerne beenden mit:


    CWRITE($CMD,STAT,MODE,"STOP/R1/TP/..../TEST() > 3")

    BZW

    CWRITE($CMD,STAT,MOD, STOP 3)




    Das Suprogramm ist relativ simpel:


    DEF TEST1( )

    DECL STATE_T STAT ; Wie im Beispiel

    DECL MODUS_T MODE

    MODE=#SYNC

    SchleifeSubLoop =0

    While SchleifeSubLoop<>1 ; Gewollte endlosschleife bis Abwahl des Programms


            TESTLOOP()

    ENDWHILE

    ;FOLD ;%{H};


       END

    .



    Einmal editiert, zuletzt von SuS ()

  • Schritt für Schritt zum Roboterprofi!
  • Weiss gar nicht warum sich so viele Leute immer mit dem cwrite rumärgern um irgendwelche Submitprogramme zu starten und beenden. Ich steuere das normalerweise mit einer globalen Variablen. Im Submit wird diese Variable verwendet um einen bestimmten Teil durchzuführen oder eben auch nicht, im Hauptprogramm gesetzt/zurückgesetzt. Da kann man dann auch Trigger verwenden. Ganz einfach, übersichtlich und zeitoptimal, bin skeptisch was die Laufzeit dieses cwrite Befehls angeht.

  • Wenn etwas nicht deklariert ist, dann muss man es deklarieren….

    Alle variablen muss man deklarieren

    Ja das war mir so schon klar, dass man es deklarieren muss,


    aber im Beispiel steht eigentlich ja dass man es im Sub deklarieren soll.

    Dann wurde das Ganze auch nochmal im Kopf des Hauptprogramms deklariert


    Erst als ich gestern noch eine Funktion zum Aufrufen des CWRITE machte, in der nochmals STAT und MODE deklariert waren, waren die Einträge nicht mehr rot


    Daher hätte ich gerne gewusst, wie sich Kuka das Ganze denn gemäßes Beispiel vorstellt.

    Weiss gar nicht warum sich so viele Leute immer mit dem cwrite rumärgern um irgendwelche Submitprogramme zu starten und beenden. Ich steuere das normalerweise mit einer globalen Variablen. Im Submit wird diese Variable verwendet um einen bestimmten Teil durchzuführen oder eben auch nicht, im Hauptprogramm gesetzt/zurückgesetzt. Da kann man dann auch Trigger verwenden. Ganz einfach, übersichtlich und zeitoptimal, bin skeptisch was die Laufzeit dieses cwrite Befehls angeht.

    Weiss nicht, ob ich das richtig verstehe denn ich konnte diesen Auszug finden:


    Die Bewegungsanweisungen für Zusatzachsen in diesem Beispiel können in

    einem SBB-Programm verwendet werden, sofern dieses dem System-Submit

    zugeordnet wird und nicht einem Extended Submit.

    Die Zusatzachsen E2 und E3 werden in Abhängigkeit von bestimmten Eingängen.

    gen verfahren.

    WAIT-Anweisungen oder Warteschleifen wurden hier nicht verwendet, da sie

    den Zyklus aufhalten.


    Andere Programme sind ja dann den externen Interpretern zugeordnet und die haben ajs die EX1, EX2, EX3.... und dann ist 1 Roboterinterpreter, 2 Systemsub-Interpreter und 3 Ext1 , 4 EXT2

    Und die werden auch laut Programmierhandbuch mit CWRITE gestartet.

    Also müsstest du im Programm des SYS Registers circa Folgendes machen.



    Sys.sub


    Init

    Ablauf

    If globale_Variable==True THEN

    SUB_Rutine()

    ENDIF


    Ablauf


    End


    Verstehe ich das so richtig?

    Einmal editiert, zuletzt von SuS ()

  • aber im Beispiel steht eigentlich ja dass man es im Sub deklarieren soll.

    Klar kannst du machen .....

    wenn du ein anderen Sub anlegst dann musst du auch da Deklarieren....weil es da nicht bekannt ist....


    Es sei denn du machst es Global verfügbar ..dann musst nichts mehr Lokal Deklarieren

  • Klar kannst du machen .....

    wenn du ein anderen Sub anlegst dann musst du auch da Deklarieren....weil es da nicht bekannt ist....


    Es sei denn du machst es Global verfügbar ..dann musst nichts mehr Lokal Deklarieren

    Könntest du dies bitte einmal Beispielhaft als Code für mich darlegen?

  • Könntest du dies bitte einmal Beispielhaft als Code für mich darlegen?

  • Oh weisste... wenn da gestanden haette das ich in die Config schreiben muss/sollte .
    Naja danke, wobei dann isr es letztlich ja auch global


    Auch wenn's Pille-Palle ist, jedes Programm hat ja in der Variable $Interpreter quasi eigene Stati-Variablen.

    Es ist aber nicht erforderlich Pille1 Palle1 , Pille2 Palle2 je EXT-Interpreter zu deklarieren, denn das war so auch nicht im Handbuch,

  • Keine Ahnung, was du mit diesem 'Auszug' sagen willst, aber im Prinzip ist der Ansatz am Ende korrekt.

    Das kann im Standard Submit SPS.SUB oder in einem der anderen parallelen Submits so programmiert werden. Aber es laufen immer alle benötigten Submits.

    Um den Anfangspost zu verwenden:


    Code
    DEF TEST1( )
    
    While TRUE ; Gewollte endlosschleife bis Abwahl des Programms
     if globale_variable then
      TESTLOOP()
     endif
    ENDWHILE
    
    END


    Zwecks des häufigen Hinweises auf das Handbuch:

    Bin mir sicher, dass im Handbuch die verschiedenen Gültigkeitsbereiche deklarierter Variablen beschrieben wird.

    Es gibt Variable:

    - die im ganzen System bekannt sind, am einfachsten schreibt man die in die $config.dat, es gibt aber auch noch mindestens eine andere Möglichkeit.

    - die innerhalb einer Quelldatei bekannt sind, also allen Prozeduren und Funktionen innerhalb einer Quelldatei, diese stehen in der zugehörigen .DAT Datei.

    - die nur innerhalb einer Prozedur / Funktion bekannt sind, die stehen direkt nach der DEF - Zeile im Quellcode.


    Edit: wo man was deklariert ist hochgradig davon abhängig was man damit erreichen will. Diese Variablen STAT und MODE zum Beispiel:

    Es gibt diese ganz verwegenen Programmierer, die innerhalb des Hauptprogramms und innerhalb eines Submits diverse Submits stoppen und starten.

    Ganz abgesehen davon dass ich das für kompletten Quatsch halte, den wohl kaum irgend jemand jemals noch überblickt, wäre da die Verwendung dieser Variablen als globale Variable absolut falsch, da sie dann zugleich in verschiedenen Prozessen verwendet werden, das führt früher oder später zu Problemen. Da ist es absolut zwingend entweder verschiedene globale Variable, oder besser lokale Variable zu verwenden.


    Das sind die die absoluten Basics der Programmierung, egal welche Programmiersprache, ob Roboter, PC oder sonstwas. ;)

  • Merci Hermann, diese Probleme hätte ich mit Sicherheit erlebt, weils noch nicht funktioniert hat und hier wären die drei Alternativen zum tragen gekommen bis es Funktioniert hätte:

    Ich habe auch zu Dingen andere Meinungen....aber man könnte halt auch einfach richtige Beispiel ins Material schreiben.

    Ich bin mir aber sicher das es Anwendungen gibt wo durch aus parallel Prozesse und damit auch Sub zum Einsatz kommen, nur starten die ggf. direkt mit dem Hochfahren bei jemanden der es schon länger macht.

    Und ich habe jetzt alle varianten ausprobiert aber der SYS.Sub is es egal ob ich das Ding Pille, Palle,

    Stat Modu eingeben


    CWRITE ($CMD,PILLE,PALLE,"STOP 2")

    WAIT FOR ($PROG_INFO[2].P_STATE == #P_Stop)



    CWRITE ($CMD,PILLE,PALLE,"Run 2")

    WAIT FOR ($PROG_INFO[2].P_STATE == #P_ACTIVE)



    Und genau da wo ich die spezifischen Variablen nutze, funktioniert es eben nicht, egal ob global oder lokal...

    Es gibt als anscheinend auch verwegene Hersteller, mir geht sowas eigentlich ziemlich auf die Nüsse

  • Ja, warte Anweisung okay... was den Pfad angeht, habe ich beide probiert und wie gesagt, in der Sys passt und im Unterprogramm nicht, sowas wundert mich...

    Es ist auch so, dass beim Sys die Deklaration identisch ist, nur dass halt noch Abfragen vorhanden sind, die z.B. Bitbreite für den Automatikbetrieb suchen und dann spiegeln oder eine Zeilenabwahl machen.

    Ich gehe halt davon aus:

    ;select program A6()

    ;to start the program the START-button or

    ;an external start-signal is needed - Da es mit Start gehen soll, kanns ja auch nicht am EXT ´-Sig liegen

    IF $FLAG[1]==TRUE THEN

    CWRITE($CMD,STAT,MODE,"RUN/R1/A6()")

    $FLAG[1]=FALSE

    2 Mal editiert, zuletzt von SuS ()

  • Der Status des Programms, aber selbst wenn der Staut nicht übergeben würde, müsste man bei der Anwahl auf dem S eine "grüne LED" sehen, die zeigt, dass der Interpreter läuft und das folgt eben nicht.

  • Mir ist wirlich nicht klar, was du denn jetzt wirklich machen möchtest, und was du schon probiert hast.

    Im ersten Beitrag sieht es aus, als ob du im normalen Vordergrundprogramm einen Submit starten möchtest. Auch da ist schon mal ein ganz einfacher Fehler drin:

    CWRITE($CMD,STAT,MODE,"STOP/R1/TP/..../TEST() > 3")

    Was machen da die vielen Punkte? "/.../", die gehören da nicht hin. Siehe Beispiel von Woodys, aber selbst da vermute ich, dass das "/TP" zu viel ist. Der Run Befehl im CWrite braucht IIRC nicht den ganzen Pfad, sondern nur das "/R1/".

    DEF TEST1( )

    DECL STATE_T STAT ; Wie im Beispiel

    DECL ....

    Im CWrite steht "TEST()", das Programm heisst "TEST1()".

    Das kann nicht funktionieren, egal was da sonst noch drumrumsteht. :(

    Und ich habe jetzt alle varianten ausprobiert aber der SYS.Sub ...

    Was meinst mit SYS.Sub?


    Statt nur einzelne extrem kurze Fragemente des Codes hier reinzuschreiben wäre es sinniger, mal das ganze Paket an Programmen, notfalls gekürzt um unwichtige Dinge wie Bewegungen u.Ä. darzustellen.


    Kann sein ich verstehe einfach nicht wirklich um was es hier geht, und bin dann raus. Und wie schon mal gesagt: würde einen dauernd laufenden SUBMIT Prozess hernehmen und den Aufruf der Funktion über eine Variable steuern. Keine Ahnung warum man sich das Programmiererleben schwerer machen muss als es eh schon ist. 8)

  • Mit Sys.sub meine ich die SPS.sub


    Das Test prg ist nichts dramatisches...


    FOR SChleife Anfang to Ende


    LIN {X -1550, Y 495.0, Z -520.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL


    ;zum anwählen muss ein Programm gestoppt sein


    CWRITE ($CMD,STAT1,MODE1,"STOP 3")


    WAIT FOR ($PROG_INFO[3].P_STATE == #P_STOP)



    ;Alternativ Programm zurücksetzen


    ;CWRITE ($CMD,PILLE,PALLE,"RESET 3")


    ;WAIT FOR ($PROG_INFO[3].P_STATE == #P_RESET)



    ;Programm anwählen


    IF Schleife <= 1 THEN ; Der Interpreter soll einmal aufgerufen werden und durchlaufen bis abwahl
    CWRITE ($CMD, STAT1,MODE1, "RUN/R1/.../.../TEST1() > 3")

    WAIT FOR ($PROG_INFO[3].P_STATE == #P_ACTIVE)

    ENDIF


    ; Funktionsgenerator ausschalten


    LIN {X -1550, Y 495.0, Z -500.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL


    ; Funktionsgenerator ausschalten


    LIN {X -1550, Y 295.0, Z -500.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL

    LIN {X -1550, Y 295.0, Z -520.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL



    ; Funktionsgenerator einschalten


    ;Aufruf()


    LIN {X -1550, Y 295.0, Z -1180.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL


    ; Funktionsgenerator ausschalten


    LIN {X -1550, Y 295.0, Z -1200.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL


    ;Aufruf()

    ; Funktionsgenerator ausschalten


    LIN {X -1550, Y 495.0, Z -1200.0, A 90.21, B -0.05, C -88.90, S 2, T 3} C_VEL


    ; --- SCHLEIFEN CIRC PUNKT 2 ---

    CWRITE ($CMD,STAT1,MODE1,"STOP 3")

    ;WAIT FOR ($PROG_INFO[3].P_STATE == #P_STOP)


    Das Programm soll dann in die Sub-Springen;


    &ACCESS RVP


    &COMMENT TEST_SUB


    DEF TEST1( )

    DECL STATE_T STAT1

    DECL MODUS_T MODE1

    MODE1=#SYNC

    SchleifeSubLoop=0
      While SchleifeSubLoop<>1

    TESTLOOP()

    ENDWHILE

    ;FOLD ;%{H};

    END

    ;ENDFOLD
    Und in TESTLOOP() ; das hier kann man ggf. in die Schleife oben packen aber generell soll dann die abfrage laufen


    DEF  TESTLOOP ( )

    IF Messtaster==FALSE THEN

    Test_Datalink (3, 3, 10000 )

    ENDIF

    END

    Vielleicht kann man es auch übern Interrupt machen.

    Einmal editiert, zuletzt von SuS ()

  • Stimme da Hermann zu....


    Alles andere macht kein Sinn...


    Konkrete Aufgabenstellung wie wo was wäre schon Hilfreich...Angaben zu Steuerungsversionen sind auch unbekannt ob mit Multisub oder nicht.....


    Meistens braucht man gar keine Submits, insofern man keine Komplexe ,Zeitkritische Prozesse zu bewältigen hat......Vielleicht ist die Lösung ja ganz Simpel

    Aber bei so viel wirrwar verliert man schnell den überblick

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