Roboterforum Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?
08. Februar 2012, 23:38:18
Übersicht Hilfe Suche Kalender Einloggen Registrieren
News: English and international Robotsupport now on Robot Forum. Also Supported by the Moderators of the roboterforum.de

Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  KUKA Roboter (Moderatoren: Werner Hampel, stefanM, IrrerPolterer)  |  Thema: Hinweismeldung aus Unterprogramm heraus 0 Mitglieder und 1 Gast betrachten dieses Thema. « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Hinweismeldung aus Unterprogramm heraus  (Gelesen 936 mal)
LarsH
Stammgast
**
Offline Offline

Beiträge: 30


« am: 04. März 2010, 16:18:51 »

Guten Tag,

ersteinmal vielen Dank für die vielen hilfreichen Einträge, die mir schon oft weitergeholfen haben.
Jetzt eine Frage zur Ausgabe von Hinweismeldungen.

Habe versucht die ganze Meldungsaugabe in ein Unterprogramm zu packen. Dieses möchte ich aus verschiedenen Hauptprogrammen aufrufen und nur 2 Variablen (Text + Zahl) übergeben.

Hier mal mein Code, der leider nicht ganz funktioniert:

&ACCESS RVO1
&REL 54
&PARAM TEMPLATE = C:\KRC\Roboter\Template\ExpertVorgabe
&PARAM EDITMASK = *
DEF msg_hinweis(TEXT[],ANSWER)

DECL INT ANSWER
DECL INT OFFSET
DECL CHAR TEXT[]

DECL STATE_T STATE
DECL MSG_T EMPTY_MSG

OFFSET=0
EMPTY_MSG={MSG_T: VALID FALSE,RELEASE FALSE,TYP #NOTIFY,MODUL[] " ",KEY[] " ",PARAM_TYP #VALUE,PARAM[] " ",DLG_FORMAT[] " ",ANSWER 0}

;------------------HINWEISMELDUNG------------------

$MSG_T=EMPTY_MSG
$MSG_T.MODUL[]="Info"

;$MSG_T.KEY[]=TEXT[]
;$MSG_T.KEY[]="Zahl = %1"
$MSG_T.KEY[]=StrAdd(TEXT[], " %1")


SWRITE($MSG_T.PARAM[],STATE,OFFSET,"%1d",ANSWER)
$MSG_T.PARAM_TYP=#VALUE
$MSG_T.VALID=TRUE

END

Probleme sind:
 - die Textvariable mit dem Platzhalter (%1) zu verknüpfen
   $MSG_T.KEY[]=" Textvariable %1"
- Der Robi fährt in einer For-Next-Schleife verschiedene Punkte an. In der Schleife soll die aktuelle Punktnummer ausgegeben werden. Doch dann werden die Punkte nicht mehr überschliffen. bzw. die Meldung nicht angezeigt.

...
FOR Lage=1 TO nLagen
     p04.Y=p04.Y+1
     p04.E1=p04.E1-360
     LIN p04 C_DIS
     msg_hinweis(TEXT[],Lage)
ENDFOR


Bin sehr dankbar für eure Hilfe.

Gruss Lars




Gespeichert
Hermann
Elite Member
*******
Offline Offline

Beiträge: 778


« Antworten #1 am: 04. März 2010, 21:25:33 »

Hallo,
zum ersten Problem kann ich nix sagen, denn:

das zweite Problem wirst Du vermutlich nicht in den Griff bekommen:
1. Funktioniert das Meldungszeug sowieso nicht 100%ig zuverlässig.
2. Benötigt der Meldungsvorgang an der Variablen $MSG_T.VALID eine
  Flanke von False nach True, sonst wird nix gemeldet. Ergo sollte man
  nach dem Setzen des Flags auf true warten, bis es false wird (nur dann
  kann man sicher sein, dass die Meldung auch abgesetzt wurde).
  Die Zeit, bis es false wird ist nicht immer gleich lang.
  Also ist das mit dem Überschleifen schon mal Essig.

Versuch's doch mal mit der Variablen $loop_msg[].

Hermann
Gespeichert
LarsH
Stammgast
**
Offline Offline

Beiträge: 30


« Antworten #2 am: 05. März 2010, 12:03:20 »

Hallo,

vielen Dank für die Infos.

Habe das mit der $LOOP_MSG[] mal ausprobiert. Das klappt auch mit einer Zeichenfolge super. Nur würde ich gerne eine INT Variable ausgeben.
Habe es geschafft mit SWRITE die Variable zu wandeln, doch leider fürt dieser Befehl zu einem Vorlaufstop.-> kein Überschleifen möglich.... Sad
Gibt es dazu weitere Lösungsmöglichkeiten?

Weiter habe ich versucht die Variable über Ansicht ->Variable -> Übersicht anzuzeigen. Dieser Wert wird leider auch nicht ständig aktualisiert.
(auch durch änderung der configmon.ini -> 1=>an ; 0=>aus)
Ideen?

Mit diesem MSG_T habe ich erstmal nichts weiter versucht....


Gruss Lars
 
Gespeichert
Stethi
Elite Member
*******
Offline Offline

Geschlecht: Männlich
Beiträge: 855



« Antworten #3 am: 05. März 2010, 12:10:33 »

Hallo.

Hast du deine Variable, die du anzeigen willst, global in der Config.dat deklariert?  Wenn nicht, kann es sein, dass sie unter Anzeige nicht aktualisiert wird.
Gespeichert

Stethi
Elite Member
*******
Offline Offline

Geschlecht: Männlich
Beiträge: 855



« Antworten #4 am: 05. März 2010, 12:14:11 »

Hast du mal versucht, deine Meldungsausgabe in ein SUB-Modul zu legen? Musst den Code dann aber so schreiben, dass keine Wartebedingungen drin sind.
Aber dann dürfte dein Hauptprogramm keinen Vorlaufstopp auslösen und Überschleifen möglich sein.
Gespeichert

LarsH
Stammgast
**
Offline Offline

Beiträge: 30


« Antworten #5 am: 08. März 2010, 07:39:06 »

Guten morgen,

1. habe jatzt mal die Variaben in der config.dat deklariert. Siehe da... es klappt. Aber... die Variable wird vom Vorlaufzeiger aktualisiert. Somit sehe ich immer 2-5 Werte im vorraus. Kann auch den Vorlaufzeiger nicht auf 1 setzen -> kein Überschleifen.
"Variable - Vorlaufzeiger" ist auch keine schöne Lösung. Am Ende des Programms wird 3 Zyklen der selbe Wert angezeigt.
Gibt es da noch eine "schöne" Lösung?


2. Wie soll ich den SWrite Befehl in einem SUB benutzen, ohne einen Vorlaufstop auszulösen? Bahnbezogener Unterprogrammaufruf? Im Submit?

Vielen Dank, Gruß Lars
Gespeichert
Hermann
Elite Member
*******
Offline Offline

Beiträge: 778


« Antworten #6 am: 08. März 2010, 08:00:23 »

Hallo,

- Befehle im SPS.SUB lösen soweit ich weiss generell keinen Vorlaufstop aus.
- Die angezeigte Variable mit einem Trigger vor dem Fahrbefehl setzen:

Code:
trigger when distance=1 delay=0 Lage_Anzeige=Lage

Hermann
Gespeichert
LarsH
Stammgast
**
Offline Offline

Beiträge: 30


« Antworten #7 am: 09. März 2010, 15:52:09 »

Hallo,

habe zwichendurch mal etwas rumprobiert und bin immer noch nicht auf eine gute Lösung gekommen.

Ich kann keine Lauzeitvariablen an ein Unterprogramm übergeben. d.h.

trigger when distance=1 delay=0 dspl_lage=lage
trigger when distance=1 delay=0 dspl(lage) prio=-1

gehen leider nicht.
Fehlermeldung: Verwendung von Laufzeitvariablen nicht zulässig

Somit kann ich wohl auch diese Variablen nicht an das SPS.Sub übergeben. (Mit SPS.Sub habe ich bisher keine Erfahrungen)

Gruss Lars
Gespeichert
Roland Keller
Administrator
Deluxe Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 479



« Antworten #8 am: 09. März 2010, 16:28:35 »

Wusste gar nicht daß das so geht  Shocked
Ich setze im TRIGGER immer ein DO mit und setze dabei einen Ausgang oder rufe ein Unterprogramm auf. Anders kenne ich das bisher nicht.
Code:
TRIGGER WHEN DISTANCE=1 DELAY=0 DO dspl_lage() PRIO=-1
Gespeichert

-------------
Gruß
Roland


Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.
Konrad Adenauer
Hermann
Elite Member
*******
Offline Offline

Beiträge: 778


« Antworten #9 am: 09. März 2010, 21:21:15 »

Hallo,
sorry, ich hab das DO vergessen.

Aber einfach nur eine Variable setzen geht auf alle Fälle. Ausgänge sind im Grunde auch nix anderes als spezielle Variable.

Code:
trigger when distance=1 delay=0 DO Lage_Anzeige=Lage

Die Variable Lage_Anzeige muss global (in der $config.dat) deklariert sein.

im SPS.SUB dann sowas wie:
Code:
lage_neu=lage_anzeige
if lage_neu <> lage_alt then
 ; hier den Code für die Anzeige reinbauen
 ; Anzeige der Variablen lage_neu !!!
 ; Zuweisung von $loop_msg[] über swrite :icon_rofl:
endif
lage_alt=lage_neu


Hermann
Gespeichert
LarsH
Stammgast
**
Offline Offline

Beiträge: 30


« Antworten #10 am: 10. März 2010, 09:36:50 »

Hallo,

... ich habe das DO auch nur hier im Forum vergessen. Im Robi stimmts.

Also das mit dem Trigger-Befehl klappt bei mir nicht. Habe das mal mit verschiedenen Variablen durchprobiert. Immer kommt die Fehlermeldung:

Laufzeitdaten bei Trigger in UP unzulässig

- In einem Unterprogramm wird ein Trigger definiert, der evtl. erst im Hauptprogramm schaltet.
- Werden bei der Zuweisung des Triggers Laufzeitdaten verwendet, sind diese zum Schaltzeitpunkt ungültig.

Hier mal der Programmauszug:


....
FOR Lage=1 TO nLagen
   p04.y=p04.y+dBand
   p04.E1=p04.E1-360

   LIN p04 C_DIS
   TRIGGER WHEN DISTANCE=1 DELAY=0 DO dspl_Lage=Lage

ENDFOR
....


dspl_Lage ist in der config.dat deklariert.

selbst bei

   a=2
   .....
   LIN p04 C_DIS
   TRIGGER WHEN DISTANCE=1 DELAY=0 DO b=a
   ....


gibt es diese Fehlermeldung.

Gruss Lars
Gespeichert
titan72
Global Moderator
Elite Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 869



« Antworten #11 am: 10. März 2010, 10:44:51 »

... ist die Zuweisende Variable (Lage) eine Laufzeitvariable???
Gespeichert

‘Go To Statement Considered Harmful’

„Seit Jahren bin ich nun mit der Beobachtung vertraut, dass die Qualität von Programmierern eine abnehmende Funktion der Dichte von GOTO Anweisungen in ihren Programmen ist.“
Edsger W. Dijkstra

Dem haben wir nichts hinzuzufügen!
LarsH
Stammgast
**
Offline Offline

Beiträge: 30


« Antworten #12 am: 10. März 2010, 12:52:57 »

... diese Variable (Lage) ist in der FOR-Schleife vorhanden.

der 2. Versuch: b=a wird nirgens sonst verwendet.

Was bedeutet genau: Laufzeitvariable?

Gruss Lars
Gespeichert
titan72
Global Moderator
Elite Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 869



« Antworten #13 am: 10. März 2010, 14:59:58 »

...das die Variable nur zur Laufzeit des Programmes gültig ist in dem sie deklariert wurde, mal in der $config.dat deklarieren!!!
Gespeichert

‘Go To Statement Considered Harmful’

„Seit Jahren bin ich nun mit der Beobachtung vertraut, dass die Qualität von Programmierern eine abnehmende Funktion der Dichte von GOTO Anweisungen in ihren Programmen ist.“
Edsger W. Dijkstra

Dem haben wir nichts hinzuzufügen!
Seiten: [1] Nach oben Drucken 
Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  KUKA Roboter (Moderatoren: Werner Hampel, stefanM, IrrerPolterer)  |  Thema: Hinweismeldung aus Unterprogramm heraus « vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS