Roboterforum Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?
18. Mai 2012, 11:03:25
Ü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  |  ABB Roboter (Moderatoren: burlibua, Sven Weyer, rmac)  |  Thema: eingangsname auslesen 0 Mitglieder und 1 Gast betrachten dieses Thema. « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: eingangsname auslesen  (Gelesen 1458 mal)
roboprog
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 257



WWW
« am: 30. Oktober 2008, 08:27:32 »

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

Gespeichert

Die dümmsten Programmierer haben die dicksten Programme
Solid
Member
***
Offline Offline

Geschlecht: Männlich
Beiträge: 52



« Antworten #1 am: 30. Oktober 2008, 09:12:24 »

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
Gespeichert

Wer später bremst, fährt länger schnell !!!
roboprog
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 257



WWW
« Antworten #2 am: 30. Oktober 2008, 09:18:52 »

wow das ist ein ganzer batzen
ich werde mich mal durcharbeiten

vielen dank für die info !
Gespeichert

Die dümmsten Programmierer haben die dicksten Programme
roboprog
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 257



WWW
« Antworten #3 am: 30. Oktober 2008, 09:42:28 »

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


Gespeichert

Die dümmsten Programmierer haben die dicksten Programme
Thilbi
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 216



« Antworten #4 am: 30. Oktober 2008, 10:34:39 »

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
Gespeichert
roboprog
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 257



WWW
« Antworten #5 am: 30. Oktober 2008, 10:55:02 »



vielen dank für die antwort ich werde es testen!

gruß roboprog
Gespeichert

Die dümmsten Programmierer haben die dicksten Programme
roboprog
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 257



WWW
« Antworten #6 am: 30. Oktober 2008, 11:53:47 »

@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
Gespeichert

Die dümmsten Programmierer haben die dicksten Programme
Thilbi
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 216



« Antworten #7 am: 30. Oktober 2008, 13:28:30 »

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
Gespeichert
Robcheck01_MJ
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 269



« Antworten #8 am: 30. Oktober 2008, 14:01:31 »

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

Gespeichert

„Herr, lass mich ein guter Mensch sein. Aber bitte nicht sofort.“
Micky
Junior Member
****
Offline Offline

Beiträge: 133



« Antworten #9 am: 30. Oktober 2008, 14:06:16 »

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

 Denken

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

Gespeichert
roboprog
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 257



WWW
« Antworten #10 am: 30. Oktober 2008, 14:20:23 »

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
Gespeichert

Die dümmsten Programmierer haben die dicksten Programme
Robcheck01_MJ
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 269



« Antworten #11 am: 30. Oktober 2008, 14:31:10 »

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

„Herr, lass mich ein guter Mensch sein. Aber bitte nicht sofort.“
Seiten: [1] Nach oben Drucken 
Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  ABB Roboter (Moderatoren: burlibua, Sven Weyer, rmac)  |  Thema: eingangsname auslesen « 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