Danke euch beiden!
Habe übersehen, dass das eine eine Funktion und das andere eine Instruktion ist...
Jetzt funktioniert alles
Danke euch beiden!
Habe übersehen, dass das eine eine Funktion und das andere eine Instruktion ist...
Jetzt funktioniert alles
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
Also im Modul ist ein Array mit 1000 Positionen, welches bei jedem Teil anders ist, deshalb kann es nicht ständig geladen sein und muss beim Typenwechsel raus und reingeladen werden.
Und kann man Variablen in einem Systemmodul neue Werte zuweisen?
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.
Das gibt es schon heißt ConfigMon.ini. Such mal hier und im englischen Forum danach.
Leider ist diese auf 25 Signale pro Reiter beschränkt, was ich auch nicht ganz nachvollziehen kann
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.
Alles anzeigenWahrsheinlich du hast versucht den Pfad eingeben. das ist falsh... soll immer "RUN /R1/HAUPT_PROG()" sein egal ob Pfad ist
KRC:\R1\HAUPT_PROG.SRC
oder
KRC:\R1\Program\HAUPT_PROG.SRC
oder
KRC:\R1\Program\Mein_Verzeichnis\HAUPT_PROG.SRC
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
Das ist normal so weit ich weiß und ist im SPS.sub hinterlegt.
Mit dieser Zeile wird immer CELL angewählt wenn die Steuerung hochfährt und der Roboter auf EXT ist,. Da könntest du natürlich jedes andere Programm reinschreiben
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
Am besten direkt bei KUKA anfragen. Bei VW (glaube ich) haben die auch ein Zweitaster Tippbetrieb für ihren Roboter in Verwendung anstatt die Zustimmtaster. Möglich ist es, aber wahrscheinlich nur mit Absprache mit KUKA, wenn du nicht die volle Haftung dafür tragen willst.
Ah, jetzt sehe ich, worauf Du hinauswillst.
Du hast 'nen Produktwechsel, bist aber nicht in Home _gewesen_ und willst nun die Begradigungsroutine des _vorherigen_ Artikels noch ein letztes Mal aufrufen.
Hättste ja auch gleich so erzählen können.
Ja genau, hätte ich vielleicht doch dazu schreiben sollen.
Naja, dann hat sich das erledigt, danke für eure Ideen!
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.
Alles anzeigenFunktioniert nur bedingt......
du müsstest dann automatisch erst mal den interpreter stoppen...danach CELL abwählen und dann im Kommando CWRITE($CMD,STAT,MODE,"RUN /R1/Teil_1:Auto_Home()" das Programm zum laufen bringen....
Im umkehrschluss dann wieder die selbe Prozedur wieder anlaufen lassen mit CELL....
glaub kaum dass das jemand so macht...
Aber wenn du als option den Multisubmit hast, könnte man den als Hintergrundprozess ablaufen lassen...starten ...stoppen ....wie man lustig ist
abgesehen davon weiss man nicht mal was Auto_Home eigentlich für ne Funktion hat.
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.
Alles anzeigenDEF CELL()
;Hauptprogramm
Auto_Home_Teil_1() ; Up Aufruf
;Hier gehts dann weiter
END
_____________________
DEF Auto_Home_Teil_1()
;Lokales Unterprogramm
;Bla Bla
END
oder das Gleiche Global wie mein vorredner schon sagte....
GLOBAL DEF Auto_Home_Teil_1()
;Lokales Unterprogramm
;Bla Bla
END
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