Hinweismeldung aus Unterprogramm heraus

  • 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

  • Schritt für Schritt zum Roboterprofi!
  • 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

  • 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.... :(
    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

  • 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.

  • 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

  • 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

  • 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

  • Wusste gar nicht daß das so geht :shock:
    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

    Gruß Roland


    Wie poste ich falsch?

    Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.

    Konrad Adenauer

  • 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

  • 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

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

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


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


    Was bedeutet genau: Laufzeitvariable?


    Gruss Lars

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account
Sign up for a new account in our community. It's easy!
Register a new account
Sign in
Already have an account? Sign in here.
Sign in Now