Position Frames in .dat schreiben sporadisch nicht ausgeführt

  • Hallo,


    ich hab schon längere Zeit ein etwas nerviges Problem, das aber sporadisch relativ selten vorkommt, ich bekomm diese Situation aber an der Anlage bzw. in Office Lite nicht simuliert und tue mir so etwas schwer eine Lösung zu suchen.


    Code zu posten wird etwas schwer aber ich versuch die Problematik zu beschreiben.

    Ich hab diverse Unterprogramme z.B für Paletten, Maschinen usw., in diesen .dat`s (sind nicht global) sind für die Base Daten und die Endpunkte Soll-Frames angelegt die aus SimPro kommen und Korrektur-Frames die mit diesen verrechnet werden (wird immer Base 1 verwendet und die Daten je nach aktivem Unterprogramm überschrieben).


    Ich hab für das Teachen der Base`s und Endpunkte halbautomatische Routinen gemacht (keine Inline Forms). Grob umrissen wird aus dem Unterprogramm ein Teachprogramm aufgerufen in das die aktuelle Korrektur übergeben wird (.dat global) dieses startet ein Submit der Dialog gesteuert die aktuelle Position mit der alten Korrektur verrechnet und die neue Korrektur in ein anderes Frame (global) im Teachprogramm schreibt. Aus dem Teachprogramm wird wieder in das Unterprogramm zurück gesprungen und das neue globale Korrektur Frame sollte in das lokale geschrieben werden.

    Danach werden die lokal neu geteachten Daten noch mal aktiviert und zur Prüfung die neue End-Position angefahren, und bis hier her funktioniert es auch immer.


    In sehr seltenen Fällen hatte sich aber an dem lokalen Korrektur Frame nichts geändert, als ich das festgestellt hatte und das Unterprogramm erneut angewählt hab (ohne zu starten) um mir die aktuellen Werte des Korrektur Frames anzuschauen waren komischerweise noch die neu geteachten Daten drin, obwohl das Programm abgewählt war, aber ins .dat wurden sie halt nicht geschrieben.

    Und so muss ich jetzt halt immer kontrollieren ob die Daten wirklich geschrieben wurden, was halt einfach nervt, der Fehler lässt sich auch nicht auf ein bestimmtes Unterprogramm eingrenzen, trat schon in verschiedenen auf.


    Vielleicht hatte jemand schonmal ein ähnliches Problem oder eine Idee was ich probieren kann.


    Danke schon mal

    Gruß Mathias

  • Schritt für Schritt zum Roboterprofi!
  • nd das Unterprogramm erneut angewählt hab (ohne zu starten) um mir die aktuellen Werte des Korrektur Frames anzuschauen waren komischerweise noch die neu geteachten Daten drin, obwohl das Programm abgewählt war, aber ins .dat wurden sie halt nicht geschrieben.

    Ersteres ist erklärbar: da wird der Submit-Interpreter die globalen Daten noch gebunden haben. Den Submit wirst Du ja wohl nicht abgewählt haben...


    Auch für das "nicht-schreiben-Problem" vermute ich mal einen Zusammenhang mit dem Hintergrundtask. Welcher Teil der Routine holt sich wann die Daten... unterschätze bitte nicht die taskübergreifende Programmierung beim KUKA. Keiner der Tasks wartet von selbst, bis irgendwas anderes fertig ist, das musst Du alles händisch selbst tun (Flags als Semaphore setzen und auslesen etc.). Insbesondere, wenn Du auf dieselben Daten lesend und schreibend zugreifst, kann alles Mögliche passieren (arbeite lieber mit Kopien der Daten und halte Lesen und Schreiben getrennt).

    Für den Programmierer mag der Ablauf manchmal logisch schlüssig aussehen, die Taskumschaltung erwischt dann aber trotzdem manchmal gerade den Moment, den man am wenigsten gebrauchen kann.


    Vorsicht auch vor Selbstbetrug: manchmal geht der Fehler "fast" weg, wenn man dann eine Wartezeit in den SPS-Task einbaut, einfach deshalb, weil der Taskswitch dann "meistens" innerhalb der Wartezeit passiert. Aber eben nur meistens und nicht garantiert....

  • Grob umrissen kann man sagen, dass es keine gute Idee ist irgendwelche Dinge im Submit zu erledigen, die man genau so gut im Hauptprogramm erledigen kann. Von der etwas vagen Beschreibung her sollte das halbwegs problemlos machbar sein. Ansonsten kann man da ohne den echten Code keine vernünftige Aussage dazu abgeben. Einfach keine parallelen Tasks verwenden, ohne sich im Klaren darüber zu sein was das denn jetzt genau bedeutet.

    Im Programm geschriebene Werten werden immer auch im Dat file gespeichert, hab' das noch nie anders gesehen. Wie Programmiersklave das schon geschrieben hat, könnte es sein, dass die Daten noch nicht auf der Festplatte gelandet sind, das ist aber nur ein Problem, wenn man von Windows aus, oder über das Netzwerk auf die Datei zugreift. Beim Öffnen auf der HMI selber wird das immer abgeglichen, auch wenn die Programme noch angewählt sind.

  • Guten Morgen,


    also ich muss doch etwas Code zeigen, ist teilweise etwas unschön, weil ich gedacht hab ob vielleicht der Vorlaufzeiger was damit zu tun hat.

    Ich starte den Submit im Teachprogramm und bleib dort drin bis er wieder abgewählt wurde und danach wird erst wieder eine SAK Fahrt gemacht, darum glaub ich weniger an an zeitliches Problem.


    Ich mach das ganze über den Submit weil ich ein Dialog anzeige (wenn Zustimmtaster gedrückt wieder lösche) in dem ich die Abweichung zur Soll Position Anzeige und wenn die Abweichung zu groß ist gar nicht zulasse das geteacht wird.

    Und fürs Base brauche ich drei Punkte, im Hauptprogramm würde immer wieder eine SAK Fahrt gemacht werden.



    Unterprogramm mit An/Abfahrt und Aufruf zum Teachprogramm:

    Unterprogramm .dat

    Code
    CONST FRAME baseData={X 877.819,Y -2524.93896,Z 924.000,A -70.0000,B 0.0,C 0.0}
    FRAME baseKorr={X 4.01829338,Y -68.3535,Z -22.9292736,A -1.41691315,B 0.0170311499,C -0.214197621}
    
    CONST E6AXIS startAxTeachBase={A1 75.0000,A2 -110.000,A3 118.000,A4 -15.0000,A5 20.0000,A6 15.0000,E1 0.0,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0}
    
    CONST FRAME p1TeachBase={X 0.0,Y 0.0,Z 0.0,A 180.000,B 0.0,C 180.000}
    CONST FRAME p2TeachBase={X 100.000}
    CONST FRAME p3TeachBase={X 100.000,Y 100.000}


    Base_Teachen.src

    Base_Teachen.dat


    Submit

  • Okay...

    ich muss gestehen, so sehr mich diese Lösung auch fasziniert, aber ich bin noch nie auf die Idee gekommen, einen Hintergrund-Task bedarfsweise an- und abzuwählen, und habe auch nicht die geringste Idee, wie sich das auswirkt.


    Jedoch:

    wenn ich Dich richtig verstehe, wird Zeile 19 in Deinem ersten Code scheinbar nicht ausgeführt, und BaseKorr bleibt auf dem vorigen Wert.... was ich nur sehe: Du übergibst an Base_Teachen den Frame "BaseKorr" als Parameter. Es ist meist eine schlechte Idee, globale Variablen als Parameter zu übergeben. Entweder sie ist global, oder sie ist ein Parameter. Hier ist sie beides, das könnte das Problem sein.


    Edit: ach quark, ist ja lokal im aufrufenden Programm. Hm.

  • Mich erinnert's trotzdem an die Schwierigkeiten beim Einbinden des DIrLoaders. -


    Der zeitweilig laufende Submit-Task bindet Daten in Base_Teachen.dat, und das aufrufende Unterprogramm greift zügig, nachdem der Submit-Task gekillt wird, auf diese *.dat zu.


    Ich stelle mir halt vor, dass das System manchmal noch dabei ist, die Daten zu sichern, je nachdem, wo es den Submit-Interpreter gerade erwischt hat, und dabei dann Inkonsistenz erzeugt. Da er ja nicht mehr läuft, versagen vielleicht auch die internen Mechanismen, die normalerweise die Konsistenz der Daten überwachen... oder so. Ich würde mal nach dem Warten auf #P_FREE mindestens 'ne Zehntelsekunde Wartezeit einfügen. Aber wie gesagt, ist nur geraten.... ist schon ein recht ungewöhnlicher Ansatz.

  • Die eigentliche Korrektur wird erst in Base_Teachen berechnet und geschrieben, der Submit schreibt nur die 3 Punkte Koordinaten.

    Ich bin mir halt sicher das die neue Korrektur im Unterprogramm ankommt weil ich in dem Abschnitt das Base mit den neuen Daten überschreibe und noch mal eine Position anfahre, die bisher auch immer korrekt war.


    Wenn ich gewusst hätte das es so ein Problem geben könnte hätte ich es vielleicht anders gemacht. Sind halt jetzt drei unterschiedliche Anlagen beim Kunden, aber mit derselben Programm Struktur, die knapp ein Jahr laufen. Aber diese werden über die nächsten Jahre immer wieder dupliziert, darum wollte ich das Problem jetzt gelöst haben.

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