Beiträge von chr2012

    Hallo alle zusammen,


    hat sich schon jemals wer mit UIMsgBox oder UIMessageBox beschäftigt? Wenn ja, ich hätte einige Fragen.


    Wir haben einen Roboter mit RW 6.10, wo ich gerne von TPWrite auf UIMsgBox umsteigen möchte. Jetzt sind mir aber einige Sachen aufgefallen.


    UIMsgBox und UIMessageBox sind zwei verschiedene Sachen. Wie kann ich UIMessageBox auf unserem Roboter benutzen? Unsere haben nämlich nur UIMsgBox.


    Bei UIMessageBox kann man ein Buttonarray erstellen und verschiedene Buttons definieren. Bei UIMsgBox muss man definierte Buttondata verwenden. Kann man buttondata auch selbst definieren? Wenn ja, wie? Ich würd z.B. einen Button mit "Links", "Mitte", "Rechts" brauchen, bringe es aber nicht zusammen diese zu definieren und in der Hilfe steht (was ich so gesehen habe) auch nicht recht viel.



    Danke schon mal im Vorhinein

    Hallo alle miteinander,


    ich hab ein Problem mit einem Modul, welches eine Variable beinhaltet, die Global erreichbar ist und von einem anderen Modul verwendet wird. Dieses Modul ist im Home Verzeichnis gespeichert, da wir es für jeden Teiletypen brauchen und es relativ große Datenmengen hat. Dieses Modul soll dann mit Load/Unload in die Steuerung rein- bzw. rausgeladen werden. Da aber ein anderes Modul auf dieses Modul zugreift, schreit die Steuerung, dass ein Fehler im RAPID Code mit der Referenzierung der Variable vorhanden ist.


    Hat jemand eine Idee wie ich das Problem lösen könnte? Mein Ansatz wäre gewesen, dass ich das Modul im Hintergrundtask rein lade und mit einer Variable im Haupttask abfrage -> Alles i.O, aber das Modul ist anscheinen zu groß für den Hintergrundtask, sodass die Steuerung manchmal einen Systemfehler ausgibt, wenn der Hintergrundtask gestoppt wird.

    Damit das Programm beim Wechsel von T1 auf EXT automatisch umgeschalten werden soll, brauchst du folgende Zeilen in deinem SUB. Dabei darf aber kein Programm angewählt sein.


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

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

    ENDIF


    Wenn du das alles über eine SPS machst musst du das EXT Signal abfragen und dann die Startreihenfolge beachten.


    Die Reihenfolge für den Start lautet folgend:

    DRIVES_ON setzen

    auf PERI_RDY = TRUE warten

    DRIVES_ON zurücksetzen

    CONF_MESS setzen

    auf STOP_MESS = FALSE warten

    CONF_MESS zurücksetzen

    EXT_Start setzen

    auf PRO_ACT = TRUE warten

    EXT_Start zurücksetzen



    Ich würde dir auch empfehlen alles was mit der P00.src zu tun hat, aus dem CELL Programm rauszuschmeißen und die Programme im CELL Programm direkt aufzurufen mit einem SWTICH Case. P00.src macht alles nur unnötig kompliziert und ist nicht wirklich notwendig.

    Du könntest TigerVNC auf den Steuerungen installieren. Wäre zwar ein großer Aufwand, wenn du nur ein mal ein Programm übertragen musst, aber in Zukunft wirst du dir dafür danken. Ist auch für Störungssuche und Störungsbehebung praktisch.


    Die Steuerungen müssen trotzdem auf T1 sein, da kommst du meines wissen nicht darüber hinweg.

    Das wars, ich habe immer den gesamten Pfad angegeben, obwohl das anscheinen so nicht funktioniert.

    Danke für die Antwort!

    Ich ziehe es vor zu prüfen, ob im EXT-Modus das richtige Programm angewählt ist. Ist dies nicht der Fall, Programm wird deselektiert durch Submit und das richtige wird angewählt. Auf diese Weise ist es mir egal, welcher Modus oder welches Programm verwendet wird, wann oder ob ein Neustart durchgeführt wurde und welche Art von Start verwendet wurde. Der Benutzer kann immer noch zu T1 wechseln und ein beliebiges Programm testen. und wenn sie vergessen, es abzuwählen, kümmert sich Submit darum, sobald der Modus wieder auf EXT geändert wird.

    Aber wie kann man das richte Programm wieder mit dem Submit selektieren? Ich habe es nur geschafft, wenn sich das Programm direkt in /R1/ befindet. Wenn das Programm aber in einem Unterordner ist, geht das nicht, zumindest hab ich es nicht geschafft.

    Was mir gerade einfällt, was wesentlich leichter wäre:


    Du vergibst jedem Programm eine Programmnummer im INIT, rufst jedes mal bei EXT das CELL Programm auf und machst dann einfach ein SWITCH CASE mit der Programmnummer. Somit wird zwar CELL immer wieder aufgerufen, aber dann gleich weiter geschliffen in das eigentliche Programm. So funktioniert das normalerweise bei Anlagen mit mehreren Programmen.

    Leider ist das nicht so leicht bei KUKA (zumindest soweit ich weiß). Ich hab jetzt einiges getestet, bin aber immer auf ein Problem gekommen: Die Programme, welche aufgerufen werden sollen, müssen sich in R1 befinden, ansonsten geht der Programmaufruf nicht. Ich weiß aber nicht ob das so gewollt ist, oder ob ich einfach zu unfähig dafür bin.


    Wenn du das aber so willst, brauchst du:


    1. In der $config.dat folgende Variablen


    INT iTemp=0

    BOOL bTemp=FALSE

    CHAR chStartprogramm[80]

    chStartprogramm[]=" "

    CHAR chAktuelles_Programm[80]

    chAktuelles_Programm[]=" "


    2. In dem SPS.sub im AUTOEXT INI FOLD:


    bTemp = STRCLEAR(chStartprogramm[])

    iTemp = STRADD(chStartprogramm[], "RUN /R1/")

    iTemp = STRADD(chStartprogramm[], chAktuelles_Programm[])

    iTemp = STRADD(chStartprogramm[], "()")

    IF $MODE_OP==#EX THEN

    CWRITE($CMD,STAT,MODE,chStartprogramm[])

    ENDIF


    3. In jedem Programm, was aufgerufen werden soll, irgendwo in der INIT:


    bTemp = STRCLEAR(chAktuelles_Programm[])

    chAktuelles_Programm[]=$PRO_NAME[]


    Das mit STRADD könnte man mit SWRITE auch machen, aber bei mir hat das immer Leerzeichen reingegeben, somit hab ich das mit STRADD gemacht. Ansonsten, wie gesagt, geht es nur vom /R1/ Ordner aus. Vielleicht schaffst du es ja, wenn du dich noch ein wenig spielst. Schreib dann ein Update rein wenn du es geschafft hast, würde mich auch interessieren

    LG

    Hallo,


    danke für eure Antworten.


    Hi

    Ich habe am Ende von lokalen unterprogrammen vor END ein continue stehen.

    Da ich mit unterprogramm Technik arbeite ist es bei mir Standard.


    Das dient nur für die programmstruktur wenn im Nachhinein Anweisungen stehen die für den Vorlauf bestimmt sind oder nicht.

    Ich arbeite auch mit Unterprogrammen, aber ich sehe den Sinn dahinter noch immer nicht ganz. Überhaupt wenn es so wie bei uns ist, dass die continues bei zufälligen Unterprogrammen vorhanden sind und bei anderen nicht.

    Hallo zusammen,


    ich habe es schon öfters bei unseren extern programmierten Programmen gesehen, dass ein CONTINUE am Ende vom Programm steht (also vor dem END). Jetzt wollte ich wissen, ob sich das überhaupt was bringt, da eigentlich kein VL Stopp durch das Programmende entstehen sollte, oder?

    Ich wäre euch für ein wenig Aufklärung sehr dankbar.

    LG

    Wobei ich Dein Bemühen nach dem letzten Beitrag noch weniger verstehe. Machst in Deine AUTO_HOME() einfach rein IF $IN_HOME THEN return ENDIF und gut.

    Ich versteh nicht was du meinst mit dem RETURN, da das ja nicht wirklich das Problem ist.

    Aber meine neuste Überlegung wäre CELL -> In alten Ablauf reinhüpfen und Auto_Home durchführen -> Gleich Danach "IF iAktuelles_Programm <> giProgrammnummer" checken und wenn TRUE raus aus dem Programm, wenn FALSE Ablauf starten.

    Wäre glaub ich einfacher, aber die Programmnummer dürfe ich dann erst am ende vom CELL Programm abfragen und nicht am Anfang.

    Warum müsste ich dafür den Interpreter stoppen? Könnte ich das nicht einfach ins CELL Programm reinschmeißen, wenn der Roboter nicht in HOME ist, und dann im Auto_Home Unterprogramm am Ende wieder RUN CELL machen?

    Aber wenn ich mir das so überlege ist das echt keine elegante Lösung...

    Bei KUKA sind erst einmal alle Programme im Speicher.

    Du kannst mit dem Schlüsselwort GLOBAL Routinen für alle Programme zugänglich machen (GLOBAL DEF auto_home() ....), solltest dann aber vermeiden, mehrere Routinen dieses Namens im System zu haben.

    (Ausser Du hast sehr altes Zeug. Bei KRC1 und frühen KRC2 musst Du Bindungen explizit angeben, aber auch da wäre es möglich.)


    Aufrufhierarchien sind bei KUKA ziemlich lässig gehandelt, man kann Programme sogar rekursiv aufrufen und taskübergreifend, was man natürlich vermeiden sollte.

    Das mit GLOBAL hab ich schon gekannt, aber wie du sagst, wenn Auto_Home mehrmals verwendet wird, was es ja wird, dann gibt es Probleme. GLOBAL deklarieren fällt für mich deshalb weg. Das gleiche gibt es bei ABB auch, aber wenn man eben solche Probleme hat wie hier mit dem Auto_Home, konnte man aus einem Programm direkt Unterprogramme aufrufen, ohne sie global zu deklarieren.


    Da wir auf manchen Maschinen mehr als 15 Programme haben, würde ich mir gerne ein SWITCH CASE für die Auto_Home ersparen. Ich will die Zuweisung mit Variablen machen, weil dann muss ich nur eine Variable pflegen und alles rennt automatisch ab. Deshalb will ich die Auto_Home Routine nicht umbenennen, da ich das bei jedem Teiletypen dann ändern müsste.


    Gibt es sowas wie CWRITE($CMD,STAT,MODE,"RUN /R1/Teil_1:Auto_Home()") ? Den RUN Teil könnte ich mit einer CHAR Variable hinterlegen und das wäre die perfekte Lösung.

    Hallo zusammen,


    gibt es eine Möglichkeit ein Unterprogramm von einem anderen Programm aufzurufen?

    Beispiel: Aktuelles Programm ist cell, da will ich das Auto_Home Unterprogramm von "Teil_1" aufrufen und dann wieder zurück ins cell Programm.


    Bei ABB gibt es nämlich sowas in folgender Form: %Teil_1:Auto_Home%;. Nur weiß ich nicht wie ich das bei KUKA am saubersten realisieren soll bzw. ob das überhaupt möglich ist.


    Ich freue mich über jede Idee und jeden Input.

    LG