Daten änderung überwachen

  • Hallo Jungs!
    Weiss das es wieder sehr unverständlich sein wird aber brauche wieder eure Hilfe. Versuche einfach zu formulieren.
    Möchte bei mir beim Daten Änderung eine boolesche wert oder eine Interrupt aktivieren (Möchte kein PZMain machen immer wieder).
    Programm funktioniert so mittlerweile das ich im Daten meine werte zusammengefasst habe und wird von der aktuellem Produkt geladen.
    Also was ich will wenn ich beim Daten etwas ändere soll er zur eine bestimmte Zeile springen und dann weiter Fahren.
    Bin für jede Vorschläge offen, hoffe das es machbar ist.Die Test funktion ist nicht schlecht nur sind es 10 verschiedene daten wo die wert von 1-480 haben kann.


    Danke

    Einmal editiert, zuletzt von padostms ()

  • ANZEIGE
  • Verstehe zwar nicht ganz was du meinst, aber PERS Daten kannst du mit einem Interrupt überwachen.

    Programmierung<br />Schulung<br />Wartung

  • Hi,
    falls du deine Daten über einen Gruppeneingang bekommst, geht es am einfachsten mit Interrupt (ISignalGI).
    Verwende ich auch gerne so um z.B. zu reagieren ob ich einen Fehlercode von der SPS bekomme.
    Gruß Z

  • Hallo!
    Ich kriege meine Daten nicht durch Gruppen Eingang sondern wähle mein Produkt aus von eine Auswahlmenü.
    Dort wird das eingegebene typ getestet ob es vorhanden ist dann kommt Lagerdaten zuweisen.Hier werden die richtige Daten zugewiesen.


    PERS num FB307{9}:=[62,58,35,35,4.85,3,1,1,1];
    PERS num FB6308{9}:=[90,23,6,4,15.1,3,4,4,4];
    PERS num FB1011{9}:=[90,23,6,4,15.1,3,4,4,4];


    PROC Lagerdaten_zuweisen(num FBAkt{*})
    nLagerdurchmesser:=FBAkt{1};
    nLagerbreite:=FBAkt{2};
    nLagerhoehe_oben:=FBAkt{3};
    nLagerhoehe_unten:=FBAkt{4};
    nGeschwindigkeit:=FBAkt{5};
    nDeckelhoehe:=FBAkt{6};
    nAnz_Seite:=FBAkt{7};
    nAnz_Oben:=FBAkt{8};
    nAnz_Unten:=FBAkt{9};
    !Ende
    ENDPROC


    Hier sind die Daten was ich ändern muss. Diese möchte ich überwachen weil wenn zu eine Änderung kommt ändert Sicht bissl das Ablauf. Hoffe so ist bissl besser zu verstehen.



    PERS AktLagerdaten nLagerdurchmesser;
    PERS AktLagerdaten nLagerbreite;
    PERS AktLagerdaten nLagerhoehe_oben;
    PERS AktLagerdaten nLagerhoehe_unten;
    PERS AktLagerdaten nDrehgeschwindigkeit;
    PERS AktLagerdaten nGeschwindigkeit;
    PERS AktLagerdaten nDeckelhoehe;
    PERS AktLagerdaten nAnz_Seite;
    PERS AktLagerdaten nAnz_Oben;
    PERS AktLagerdaten nAnz_Unten;

  • Hallo,
    du könnntest Dir in der Routine für die Zuweisung der Daten ein boolesches Flag setzen, dass später für die eine Änderung abgefragt wird.
    Oder Du erzeugst für eine oder alle Persistenten einen Interrupt, der bei Änderung der Daten aufgerufen wird,
    Z.B.


    Code
    CONNECT intno1 WITH T_DatenGeandert;[/font][/size]
    IPERS nLagerdurchmesserm,  intno1;[/font][/size]

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

  • Hallo!


    Also zb
    PROC Lagerdaten_zuweisen()
    nLagerdurchmesser:=AktFB{1};bolagerdurchm:=TRUE;
    nLagerbreite:=AktFB{2};boLagerBreite=TRUE;
    nLagerhoehe_oben:=AktFB{3};boLagerhOben:=TRUE;
    nLagerhoehe_unten:=AktFB{4};boLagerhUnten:=TRUE;
    nGeschwindigkeit:=AktFB{5};boGeschw:=TRUE;
    nDeckelhoehe:=AktFB{6};boDeckelhoehe=TRUE;
    nAnz_Seite:=AktFB{7};boAnz_Seite:=TRUE;
    nAnz_Oben:=AktFB{8};boAnz_Oben:=TRUE;
    nAnz_Unten:=AktFB{9};boAnzUnten:=TRUE;
    ENDPROC


    Soweit ist klar nur muss ich diese werte überwachen für änderung .Wie mache ich das?Das ist glaube ich was länger dauert.
    Diese werte kann ich im num Daten ändern.Deswegen muss ich überwachen weil wenn es geändert wurde muss eine Info message
    ablaufer mit dem neuen Daten (TPwrite).


    Danke

  • Mal abstrahiert: wenn Du irgendeine Variable (oder ein ganzes Array oder einen Record) hast, die mit "Akt..." beginnt, dann ist es meistens ebenso möglich, dieselben Daten in etwas zu speichern, was mit "Alt..." oder "Neu..." beginnt.
    Wenn dann eines von beiden geändert wird, merkt man das, wenn man beide vergleicht. Warum also keine Funktion an der nötigen Stelle aufrufen, welche das Vergleichsergebnis zurückliefert?


    (Bei ABB sollte das gehen, soweit ich weiß kann man hier num unfallfrei auf Gleichheit prüfen. )


    Und dann fragst Du halt irgendwo im Programm, wo es sinnvoll ist (oder auch an mehreren Stellen)
    if datenSindIdentisch(FBAkt,FBAlt) then ....
    else ....
    endif



    Grüße,
    Michael

  • Hi!
    Des schaut richtig gut aus ist machbar nur der stelle wo ich es so abfragen kann brauche ich dafür multitasking.
    Also Roboter wartet auf eine Signal zu Freigabe.In diesem zeitraum kann ich es abfragen.Muss ich es mit Interrupt lösen?
    Habe mal gedacht wenn ich eine Signal setzen könnte bei dem Daten änderung dann sollte es so auch Funktionieren?
    Zu kompliziert möche is es nicht haben (RW5.15).
    Danke nochmals!
    Tamas

  • Nee, du musst ja nicht unbedingt mit wait.. auf das Signal warten. Du kannst den Programmzeiger an der Stelle ja auch in eine Schleife schicken, aus der er nur wieder rauskommt, wenn das Signal da ist. Damit er den anderen Code unbedingt vorher macht, dies dann mit einer Hilfsvariablen (weil ABB kein REPEAT...UNTIL kennt)
    Also nach dem Motto


    Setzt natürlich voraus, dass das Startsignal mindestens so lange ansteht, wie die Schleife im schlimmsten Fall für die Abarbeitung braucht. Ansonsten muss man dann doch mal einen Interrupt verwenden, aber nur, um sich das "gewesene" Startsignal zu merken.


    Grüße,
    Michael

  • Hallo,
    wenn Du die Datenänderung der Pesistenten per SingleSafe-Interrupt überwachst kannst Du sogar eine Änderung bei gestoppten Programm erkennen.
    Der Ablauf bei Deiner Datenzuweisung sieht wie folgt aus:
    1. Interrupts ablöschen
    2. Daten zuweisen
    3. Überwachungsflag "bDataChanged" auf False setzen
    4. Interrupts aktivieren.
    In deinem Programm musst Du dann nur noch prüfen, ob das Überwachungsflag "bDataChanged" immer noch den Wert FALSE hat. Sollte es TRUE sein, haben sich die Daten geändert.
    Hier ein Beispiel:

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

  • Hi Micky!
    Die idee ist super nur Tauchen immer wieder witere Fragen auf.
    Hier ist mein PZ man.Versuche bissl besser presentieren.


    PROC main()
    Initialisieren;
    Produktion;
    ENDPROC


    Es ist sehr einfach.Wie du es siehst erstmal Initialisieren mache ich dann kommt die Produktion.


    PROC Initialisieren
    ......



    PROC Auswahl
    ....



    Erstmahl beim Auswahlmenü wird das richtige typ ausgewählt.Dann werden Die Interrupts und die Daten alle zugewiesen.
    Dann springt als letztes im Bewegung.Und startet die Produktion.


    PROC Bewegung()
    Rechnen;
    Produktion;


    So schaut bei mir momentan aus.Sind einige ünnötige sachen drinnen die muss ich noch rausnehmen.
    Habe im Daten 9 verschiedene werte was ich überwachen muss.Manche können ein wert bis zu 480 haben oder 50.
    Würde es mit >< funktionieren beim vergleichen und ich möchte kein PZmain fahren habe schon mit Daten Retourschreiben experimentiert nur kann keine weg finden wie ich es lösen kann Ohne PZmain.


    Danke

    Einmal editiert, zuletzt von padostms ()

  • Micky: Respekt, muss ich mal ehrlich sagen. Ich lerne bei jedem Deiner Beiträge was dazu.


    padostms:
    Du hast Recht. Ich verstehe allerdings den ganzen Aufwand nicht. Die Programmstruktur ist ja darauf ausgelegt, dass zu Beginn jemand in einer programmierten Maske irgendwas eingibt, und die Produktion dann entsprechend läuft.
    Nebenbei aber, wenn ich Dich richtig verstehe, soll auch über die Datenansicht zwischendurch mal was eingegeben werden können. (Deine IF-ELSEIF-Spaghetti ziehe ich gerade mal nicht auseinander, da habe ich keine Lust drauf.)


    Ich gehe mal davon aus, dass der aktuelle Zyklus sowieso mit den aktuellen Daten zu Ende gefahren wird. Oder soll der Roboter mitten im Lauf abbrechen und was völlig anderes machen?


    Wenn man will, dass ein neuer Zyklus mit neuen Daten gefahren wird, dann liest man die Daten einfach vor jedem Zyklus neu ein. Warum sollte man dann noch wissen wollen, ob sich was geändert hat? Es wäre ja dann egal. Gegessen wird, was auf den Tisch kommt. In Deinem Fall stört aber eine inkonsistente Bedienung: wenn, dann würde ich entweder IMMER über die Dateneingabe gehen oder IMMER über die Eingabemaske. Den Rücksprung zur Eingabemaske auf Anforderung kriegt man ja leicht hin, ich lege mir dann oft einen virtuellen Ausgang auf eine der vier Tasten am Panel, dann kann der Bediener das Menü anfordern.


    Das geht über Interrupt ja dann auch, wenn man tatsächlich den aktuellen Zyklus abbrechen will. Und wenn man dann in der Eingabemaske ist, dann hat das Programm ja die Kontrolle, und Du weißt sowieso, ob was geändert wurde oder nicht.


    Deine Fragestellung zieht ja nur bei folgenden Bedingungen:
    * du willst über die Datenansicht Variablen ändern UND
    * du willst, dass das Programm unmittelbar während der Abarbeitung quasi rückblickend darauf reagiert.
    NUR wenn der letzte Punkt zutrifft, wenn also das Programm sich während der Bearbeitung fragen soll: "äh, was mache ich hier gerade eigentlich?!", dann ist Deine Fragestellung überhaupt relevant. Das kommt auch schon mal vor....


    Das sieht mir, mit Verlaub, aber momentan eher nicht danach aus, sondern es scheint schon so zu sein, dass irgendwer oder irgendetwas vor Beginn des Zyklus' weiß, was zu tun ist. (Wobei ich mit "Zyklus" die Stelle meine, ab der etwas Produktives passiert, und nicht die Programmstruktur.)


    Grüße,
    Michael

  • Hallo Programmiersklave!
    Fühle mich auch so mit dir wie du mit Micky :)
    Hast auch recht.Ich fahre die Zyklus fertig egal was passiert.Wenn die Teile nicht passen (Schcihtsärke)muss der Bediener eingreifen.Deswegen muss er warten bis der ablauf fertig ist.Bei jeder zyklusende wartet das Roboter auf Freigabe.In diesen zeitraum hat der bediener zeit etwas zur ändern.Wenn er etwas geändert hat muss ich beim Info Menü die geänderte parameter mit der Bediener Teilen.Es muss vor Start passieren weil dann sieht er gleich ob die Daten passen.


    Darum gehts die ganze geschichte.

  • Ah ja, ich verstehe. Solange der Roboter auf die nächste Freigabe wartet, sollen die Daten überprüft / angezeigt / geändert werden können.
    In dem Falle geht aber mein Vorschlag von weiter oben, dass das Warten auf die Freigabe (die drei Eingänge, nehme ich an) in einer Schleife abgearbeitet wird, in welcher auch der Entscheidungsbaum zum Prüfen und Anzeigen der Daten abgearbeitet wird. Denn die Prüfung Deiner Daten ist ja auch so etwas wie eine Freigabe.


    Im Moment blockierst Du Dich vielleicht (gedanklich) selbst dadurch, dass Du "Warten" als "waitDI" verstehst, welches als eigenständige Instruktion unersetzbar direkt vor der Produktion steht. Aber intern ist das für den ABB ja auch eine Schleife:
    1.) gucken, ob Eingang an
    2.) wenn nicht, dann gehe zurück zu 1.), ansonsten weiter.
    Was anderes macht WaitDI ja nicht. Du müsstest Dir jetzt selbst eine Warteanweisung an die gleiche Stelle bauen, nach diesem Schema:
    1.) gucken, ob Daten ok, und Daten anzeigen.
    2.) wenn nicht, Daten ändern anfordern, ändern, und zurück zu 1.), ansonsten weiter
    3.) Gucken, ob Startfreigabe. Wenn nicht, dann zurück zu 1.), ansonsten weiter
    4.) Gucken, ob Tisch in Pos. Wenn nicht, zurück zu 1.), ansonsten weiter
    5.) Gucken, ob Strahlfreigabe. Wenn nicht, dann zurück zu 1.), ansonsten weiter.
    6.) ....


    Unter 1.) wird nun der Bildschirm flackern, deswegen wäre es schön, das erneute Anzeigen zu unterdrücken, wenn sich nichts geändert hat. Das war jetzt ein Teil Deiner Ausgangsfrage: "wie stelle ich sicher fest, ob sich was geändert hat".
    Und da bekamst Du dann zwei Vorschläge: erster Vorschlag: mit IPers (falls das Deine RW-Version schon hergibt), zweiter Vorschlag: mit einem 1 : 1 Vergleich.


    Ich glaub, jetzt habe ich Dich verstanden :)


    Grüße,
    Michael

  • Hallo!
    Danke wirklich für die Hilfe.Des wird funktionieren mit IPERS, muss nur alle Daten dazu aufnehmen und mit eigene interrupt verbinden.Wichtig ist das es machbar ist.
    Danke nochmals

  • Hallo!
    Schaut es so aus!Funktionier auch.Also wenn ich eine von diesen Daten ändere kommt das Info menü mit dem geändertem daten vor.Sehr viel geholfen!


    Danke



    PROC Initialisieren()

    ! Interruptsignale verbinden!


    IF boAbstrahlen_AR_Drehtisch=TRUE OR boAbstrahlen_Aussenring=TRUE OR boDrehtisch_Aussenring=TRUE OR boNachstrahlen_Aussenring=TRUE THEN
    CONNECT persndurchm WITH DatachangeAR;
    CONNECT persnBreite WITH DatachangeAR;
    CONNECT persnOben WITH DatachangeAR;
    CONNECT persnUnten WITH DatachangeAR;
    CONNECT persnSeite WITH DatachangeAR;
    CONNECT persnLagerho WITH DatachangeAR;
    CONNECT persnLagerhu WITH DatachangeAR;
    CONNECT persnDeckelh WITH DatachangeAR;
    CONNECT persnUeberstnd WITH DatachangeAR;
    ELSE
    CONNECT persndurchm WITH DatachangeIR;
    CONNECT persnBreite WITH DatachangeIR;
    CONNECT persnOben WITH DatachangeIR;
    CONNECT persnUnten WITH DatachangeIR;
    CONNECT persnSeite WITH DatachangeIR;
    CONNECT persnLagerho WITH DatachangeIR;
    CONNECT persnLagerhu WITH DatachangeIR;
    CONNECT persnDeckelh WITH DatachangeIR;
    CONNECT persnUeberstnd WITH DatachangeIR;
    ENDIF
    IPers nlagerdurchmesser, persnDurchm;
    IPers nlagerbreite, persnBreite;
    IPers nAnz_Oben,persnOben;
    IPers nAnz_Seite,persnSeite;
    IPers nAnz_Unten,persnUnten;
    IPers nDeckelhoehe,persnDeckelh;
    IPers nUeberstand,persnUeberstnd;
    IDelete intnum_FPTaste1;
    IDelete IStoerungDreht;
    CONNECT IStoerungDreht WITH IStoerung;
    ISignalDI DI10_StoerDrehTi,high,IStoerungDreht;
    IF boNachstrahlen_IR_Bohrung=TRUE OR boDrehtisch_IRB_Radius=TRUE OR boNachstrahlen_Aussenring=TRUE THEN
    CONNECT intnum_FPTaste1 WITH IUgkorrekturIR;
    ELSEIF boAbstrahlen_Aussenring=TRUE THEN
    CONNECT intnum_FPTaste1 WITH IUgkorrektur;
    ELSEIF boNachstrahlen_IR_Seite=TRUE THEN
    CONNECT intnum_FPTaste1 WITH IUgkorrekturIRS;
    ENDIF
    TPErase;

    Einmal editiert, zuletzt von padostms ()

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