26. März 2019, 15:40:16
Roboterforum.de - Die Industrieroboter- Anwender und Experten Community

[gelöst] Daten änderung überwachen


hot_post Autor Thema: [gelöst] Daten änderung überwachen  (Gelesen 3482 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

16. Juli 2018, 16:17:31
Gelesen 3482 mal
Offline

padostms


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
« Letzte Änderung: 20. Juli 2018, 08:32:20 von padostms »

Heute um 15:40:16
Antwort #1

Werbung

Gast

16. Juli 2018, 17:59:26
Antwort #1
Offline

ManipulatorManipulierer


Verstehe zwar nicht ganz was du meinst, aber PERS Daten kannst du mit einem Interrupt überwachen.
  • gefällt mir    Danke
Programmierung
Schulung
Wartung

17. Juli 2018, 07:37:38
Antwort #2
Offline

Z750


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
  • gefällt mir    Danke

17. Juli 2018, 08:04:38
Antwort #3
Offline

padostms


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;



17. Juli 2018, 13:56:37
Antwort #4
Offline

Micky


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.

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)

Heute um 15:40:16
Antwort #5

Werbung

Gast

17. Juli 2018, 16:38:16
Antwort #5
Offline

padostms


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

18. Juli 2018, 09:13:15
Antwort #6
Offline

Programmiersklave


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?
   FUNC bool datenSindIdentisch(num aktuelleDaten{*},num alteDaten{*})
        VAR num i;
        VAR num c;
        VAR bool result;
        c:=dim(aktuelleDaten,1);
        result:=TRUE;
        FOR i FROM 1 TO c DO
            result:=result AND (aktuelleDaten{i}=alteDaten{i});
        ENDFOR
        RETURN result;
    ENDFUNC

(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

18. Juli 2018, 10:00:33
Antwort #7
Offline

padostms


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

18. Juli 2018, 11:39:58
Antwort #8
Offline

Programmiersklave


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
warteschleife:=TRUE;
while warteschleife do
  if datenSindIdentisch(FBAkt,FBAlt) then
      ! mach nix .... oder warte einen Augenblick
      !waittime 0.05;
    else
      ! hol die neuen Daten rein...
       ...
    endif
    warteschleife:=(di_Startsignal=0);
endwhile

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

Heute um 15:40:16
Antwort #9

Werbung

Gast

18. Juli 2018, 16:46:25
Antwort #9
Offline

padostms


Aha!
Das ist so sehr gut!Nur wenn ich im num Daten des ändere geht es nicht mit der überprüfung.
Wenn ich ändere (Bild)muss vorher schpeichern sonst werden die daten immer gleichsein.

18. Juli 2018, 17:22:10
Antwort #10
Offline

Micky


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:
var intnum irDataChanged{2};
task pers bool bDataChanged:=TRUE;
task PERS num nData1:=8;
task PERS num nData2:=4;

PROC main()
  !Datenzuweisung programmgesteuert
  DisableMonitoring;
  nData1:=2;
  nData2:=3;
  bDataChanged:=FALSE;
  EnableMonitoring;

ENDPROC

TRAP T_DataChanged
  Tpwrite "Daten wurden geändert";
  bDataChanged:=TRUE;
  EnableMonitoring;
ENDTRAP

PROC EnableMonitoring()
  FOR i FROM 1 TO dim(irDataChanged,1) DO
     idelete irDataChanged{i};
     CONNECT irDataChanged{i} WITH T_DataChanged;
  endfor   

  Ipers\SingleSafe,nData1,irDataChanged{1};
  Ipers\SingleSafe,nData2,irDataChanged{2};

ENDPROC

PROC DisableMonitoring()
  FOR i FROM 1 TO dim(irDataChanged,1) DO
     idelete irDataChanged{i};
  endfor   
ENDPROC

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

19. Juli 2018, 08:11:34
Antwort #11
Offline

padostms


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

« Letzte Änderung: 20. Juli 2018, 07:55:01 von padostms »

19. Juli 2018, 08:58:13
Antwort #12
Offline

Programmiersklave


@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

Heute um 15:40:16
Antwort #13

Werbung

Gast

19. Juli 2018, 09:11:26
Antwort #13
Offline

padostms


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.

19. Juli 2018, 09:51:34
Antwort #14
Offline

Programmiersklave


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


Teile per facebook Teile per linkedin Teile per pinterest Teile per reddit Teile per twitter
 

über das Roboterforum

Nutzungsbedingungen Impressum Datenschutzerklärung

Sponsoren des Roboterforums

ROBTEC GmbH