eingangsname auslesen

  • Hallo zusammen


    ich brauche mal wieder Hilfe :hilfe:


    ich möchte den Namen eines eingangs auslesen und als Fehlermeldung ins Logbuch schreiben


    gibt es dafür eine Lösung ??


    also mit einer Nummer geht das schon !


    ErrWrite\W,"Meldung aus Waiting", "Fehlernummer von Roboter an SPS : " \RL2:=stErrNUmber ;



    und jetzt brauche ich statt


    RL2:=stErrNUmber


    irgendwie so etwas RL2:=SignalDI


    aber das ist irgendwie nicht so einfach weil DI ist halt kein string


    wenn jemand helfen kann wäre ich sehr dankbar !! :merci:


    Gruß roboprog

    Die dümmsten Programmierer haben die dicksten Programme

  • ANZEIGE
  • Hi !


    Bin mir nicht sicher, aber vielleicht hilft dir das ja weiter.


    !**********************************************************
    !* Procedure WaitMsgDi() *
    !* Version 1.0 *
    !* Diese Prozedur wartet auf einen Eingang eine max. *
    !* Zeit. Nach Ablauf der Zeit erfolgt die Meldung *
    !* welches Signal fehlt. *
    !* *
    !* Input Parameter: signaldi diSignal *
    !* dionum iCondition *
    !* string stMSG *
    !* *
    !* Date: Version: Programmer: Reason: *
    !* 27.10.98 *
    !**********************************************************
    PROC WaitMsgDi(
    VAR signaldi diSignal,
    dionum iCondition,
    string stMSG{*})

    VAR bool bTimeout:=FALSE;

    bAbbruch:=FALSE;
    bTimeout:=FALSE;
    !Abbruchbedingung
    !Wenn keine Wartezeit übergeben wird, dann Standard WarteZeit
    WHILE NOT diSignal=iCondition DO
    IF bAbbruch=TRUE fmspeichern stMessage;
    bAbbruch:=FALSE;
    IF bBediener=TRUE AND stMSG=fmHolen bediener;
    WaitDI diSignal,iCondition\MaxTime:=ntTimeOut\TimeFlag:=bTimeout;
    !Ausgabe der FehlerMSGmedlung
    IF bTimeout THEN
    fehlerMSG stMSG;
    ENDIF
    IF bStop=TRUE AND diSignal<>iCondition fehlerMSG stMSG;
    ENDWHILE
    TPErase;
    Reset doProgFehler;
    ENDPROC





    !**********************************************************
    !* Procedure FehlerMSG() *
    !* *
    !* Diese Prozedur zeigt die aktuelle Fehlermeldung an und *
    !* entscheidet anhand der Prioritaet ueber den weiteren *
    !* Programmablauf. *
    !* *
    !* Prioritaeten: *
    !* 000: nur Ausgabe auf Teachpendant *
    !* 200: Ausgabe auf TP, Roboter in STOP *
    !* 200: Ausgabe auf TP, Programmende ueber EXIT *
    !* 300: Ausgabe auf TP, mit Auswahlmoeglichkeit *
    !* *
    !* Globale Variablen: string stLastError *
    !* Input Parameter: string stFMeldung *
    !* *
    !**********************************************************
    PROC fehlerMSG(
    string stFMeldung{*}
    \errnum erOK
    \errnum erAbbruch)

    VAR bool bOK:=FALSE;

    !Auslesen der Störungsnummer aus dem ersten Datenfeld
    bOK:=StrToVal(stFMeldung{1},nStoerungNr);
    stMessage{1}:=stFMeldung{1};
    stMessage{2}:=stFMeldung{2};
    stMessage{3}:=stFMeldung{3};
    stMessage{4}:=stFMeldung{4};
    stMessage{5}:=stFMeldung{5};
    stMessage{6}:=stFMeldung{6};
    bAbbruch:=FALSE;
    TPErase;
    IF nStoerungNr>0 AND nStoerungNr<100 THEN
    TPWrite " MELDUNG "+stFMeldung{1};
    TPWrite "========================================";
    ELSEIF nStoerungNr>100 AND nStoerungNr<200 THEN
    TPWrite " STOERUNG "+stFMeldung{1};
    TPWrite "========================================";
    ELSEIF nStoerungNr>200 AND nStoerungNr<300 THEN
    TPWrite " PROGRAMMABBRUCH "+stFMeldung{1};
    TPWrite "========================================";
    ELSEIF nStoerungNr>300 AND nStoerungNr<400 THEN
    TPWrite " AUSWAHL "+stFMeldung{1};
    TPWrite "========================================";
    ENDIF
    TPWrite stFMeldung{2};
    TPWrite stFMeldung{3};
    TPWrite stFMeldung{4};
    IF nStoerungNr<100 TPWrite stFMeldung{5};
    IF nStoerungNr<100 TPWrite stFMeldung{6};
    !Abfrage der festgelegten Prioritaet in der Fehlermeldung
    IF nStoerungNr>0 AND nStoerungNr<100 THEN
    WaitTime 1;
    ELSEIF nStoerungNr>100 AND nStoerungNr<200 THEN
    fmspeichern stMessage;
    Set doProgFehler;
    TPReadFK reg1,stFMeldung{5}+stFMeldung{6},"","","","","QUIT";
    ELSEIF nStoerungNr>200 AND nStoerungNr<300 THEN
    fmspeichern stMessage;
    Set doProgFehler;
    TPReadFK reg1,stFMeldung{5}+stFMeldung{6},"","","","","QUIT";
    ExitCycle;
    ELSEIF nStoerungNr>300 AND nStoerungNr<400 THEN
    fmspeichern stMessage;
    Set doProgFehler;
    TPReadFK reg1,stFMeldung{5}+stFMeldung{6},"OK","","","","ABBRUCH";
    TEST reg1
    CASE 1:
    IF Present(erOK) AND erOK<>0 RAISE erOK;
    TPErase;
    TPWrite "Vorgang geht weiter";
    WaitTime 2;
    bAbbruch:=FALSE;
    CASE 5:
    TPErase;
    IF Present(erAbbruch) AND erAbbruch<>0 RAISE erAbbruch;
    TPWrite "Vorgang wurde abgebrochen";
    WaitTime 2;
    bAbbruch:=TRUE;
    DEFAULT:
    ENDTEST
    ENDIF
    ERROR
    IF ERRNO=erOK OR ERRNO=erAbbruch RAISE;
    ENDPROC


    Naja dann schau´s dir mal an ob es dir hilft !


    CIAO

    Wer später bremst, fährt länger schnell !!!

  • hallo Solid


    ja das ist ja alles super aber da muß ich bei diesem Programm für jeden Eingang ein string deklarieren das ist nicht ganz das was ich brauche weil ich 400 E´s habe da werde ich ja in 10Jahren nicht fertig !


    was ich brauche ist eigentlich eine Möglichkeit den Namen von einem Eingang in eine Stringvariable zu laden


    was halt allgemeingültig ist !


    wo halt der Befehl anwendbar ist


    ErrWrite\W,"Meldung aus Waiting", "Fehlernummer von Roboter an SPS : " \RL2:=stErrNUmber
    \RL3:=stringVar ;



    Z.B. stringVar := Name signal DI


    oder so !?!


    aber trotzdem vielen dank für deine schnelle Antwort!


    Gruß roboprog

    Die dümmsten Programmierer haben die dicksten Programme

  • Hallo roboprog,


    eine Möglichkeit einen Signalnamen direkt auszulesen kenn ich nicht,
    aber schreib dir doch eine kleine Routine, z. B.


    PROC MyErrWrite (string stErrNumber, string stEingangsname)


    ErrWrite\W, "Meldung aus Waiting","Fehlernummer von Roboter an SPS: "\RL2:=stErrNumber\RL3:=stEingangsname;


    ENDPROC


    Jedes mal wenn du in deinem Programm auf einen Eingang wartest kannst Du dann die Routine aufrufen mit
    MyErrWrite (1, diFreigabe_XYZ);


    Damit musst du nicht jeden Eingang extra als string deklarieren.



    Gruß
    Thilbi

  • Thilbi


    also das mit dem Programm habe ich schon mal


    Waiting Eingang, Fehlernummer, zustand, timeout;


    die Fehlernummer ist eine num wobei in einer liste z.B. ZylinderAS:=157


    deklariert ist und ich den Namen abfrage


    das sieht dann so aus


    Waiting ZylinderAS, ZylinderAS, 0, 2;


    wenn ich das jetzt so mache wie du mir beschrieben hast dann muß ich das alles nochmal schreiben und dann sieht das ein wenig komisch aus


    Waiting Eingang, Fehlernummer, string, zustand, timeout;
    Waiting ZylinderAS , ZylinderAS , ZylinderAS, 0, 2;


    das sieht etwas doof aus


    deswegen wollte ich eine der ersten variablen auch für den fehlertext nutzen


    denn eigentlich habe ich den Text ja schon 2 mal (einmal den DI und einmal als num ) und will ihn nicht noch ein 3. mal (als string) im Programmaufruf schreiben müssen !


    gruß roboprog

    Die dümmsten Programmierer haben die dicksten Programme

  • Hallo roboprog,


    dann möchte ich dir mal folgenden Vorschlag unterbreiten:


    PROC Waiting (string Eingangsname, num Fehlernummer, signaldi ZustandSoll, num Timeout)


    num nZaehler:=0;
    signaldi ZustandIst


    GetDataVal Eingangsname,ZustandIst;
    while ZustandIst <> ZustandSoll and (Timeout*10)<nZaehler do
    Incr nZaehler;
    Waittime 0.1;
    GetDataVal Eingangsname,ZustandIst;
    endwhile


    IF (Timeout*10)>=nZaehler THEN
    !ErrWrite\W, "Meldung aus Waiting","Fehlernummer von Roboter an SPS: "\RL2:=Fehlernummer\RL3:=Eingangsname;
    ENDIF


    ENDPROC


    Ist nicht sauber ausprogrammiert und kommentiert, könnte aber funktionieren. Du solltest dir mal die Instruktion GetDataVal genauer anschauen.



    Gruß
    Thilbi

  • Netter Gedanke!! :zwink:


    Ich glaube Du musst nur noch aus SIGNALDI ->DIONUM machen.


    PROC Waiting (string Eingangsname, num Fehlernummer, dionum ZustandSoll, num Timeout)
    VAR num nZaehler:=0;
    VAR dionum ZustandIst;


    GetDataVal Eingangsname,ZustandIst;
    WHILE ZustandIst <> ZustandSoll and (Timeout*10)<nZaehler do
    Incr nZaehler;
    Waittime 0.1;
    GetDataVal Eingangsname,ZustandIst;
    ENDWHILE
    IF (Timeout*10)>=nZaehler ErrWrite\W, "Meldung aus Waiting","Fehlernummer von Roboter an SPS: "\RL2:=Fehlernummer\RL3:=Eingangsname;
    ENDPROC


    Kann mich aber auch täuschen.


    Grüsse...

  • Hallo,


    ich hätte auch noch einen Vorschlag.


    Wenn ihr das Signal bereits an eine Routine übergebt


    z.B.
    PROC Waiting (VAR signaldi Signal, dionum Value)


    dann kann man mit der Funktion ArgName() den Namen des Signals auslesen


    :denk:


    Beispiel:


    PROC Waiting (VAR signaldi Signal, dionum Value)
    Tpwrite "SignalName: "+ArgName(Signal);
    ENDPROC



    Beim Aufruf der Routine
    Waiting diStart,high;


    wird der folgende Text ausgegeben:


    SignalName: diStart


    Gruß
    Micky

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • Hallo miteinander ich glaube ich hab es geschaft ich lese den namen des eingangs mit ArgName aus !


    VAR string stDiName


    stDiName:=ArgName(signalx);


    stDiName kann ich dann darstellen


    das ganze sieht dann so aus


    Aufruf:


    Waiting DI ZylinderAS, NUM ZylinderAS, dionum 0, bool 2;




    Ausgabe:


    ErrWrite\W,"Meldung aus Waiting", "Fehlernummer an SPS : " \RL2:=stErrNUmber\RL3:=stDiName;



    getestet ist das ganze noch nicht weil meine mechaniker mir gerade mein roboter abbauen aber nächste woche werde ich ein feedback geben


    gruß und danke für die rege beteiligung
    roboprog


    Gruß Roboprog

    Die dümmsten Programmierer haben die dicksten Programme

  • Ja es gibt viele Wege nach Rom, aber dieser scheint der bessere zu sein.


    Kurze Überarbeietung aus alt und neu.


    PROC Waiting (VAR signaldi Signal, dionum Value, num MaxTime, num ErrNo)
    VAR bool bTimeout;


    WaitDi Signal,Value \MaxTime:=MaxTime\TimeFlag:=bTimeOut;
    IF bTimeOut ErrWrite\W, "Meldung Waiting Signal","Fehlernummer Roboter zu SPS: "\RL2:=ErrNo\RL3:="Signal"+ArgName(Signal);
    ENDPROC


    Kann sein das er das zusätzliche Argument ArgName bei ErrWrite nicht schluckt, wenn nicht noch in seperaten String übergeben. Einfach mal ausprobieren...


    Grüsse...

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

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