Zyklisches ausführen einer Funktion im Interpolationstakt

  • Hallo zusammen,


    ich knoble gerade an einem Problem und bräuchte Hilfe beim Denken:


    Ich habe einen Roboter (KRC4, KSS 8.6), der über Profinet an eine SPS angeschlossen ist. Hier wird nun zyklisch über die SPS.SUB eine Funktion aufgerufen, die einen Int-Wert aktualisiert und auf die entsprechenden Ausgänge legt.


    Nun zum Kern des Problems: die SPS.sub ruft diese Funktion mit unregelmäßigen Verzögerungen auf ( was auch zu erwarten war).

    Für eine genaue Überwachung des Wertes wäre es jedoch erheblich besser, wenn dieser in äquidistanten Zeitabständen übertragen würde.

    Aktuell war die Überlegung, den Wert auf einen Analog-Output zu legen, da dieser im Interpolationstakt aktualisiert wird. Dummerweise hat die angeschlossene SPS keine Analog-Klemme.

    Habt ihr vielleicht eine Idee wie man das intelligenter lösen könnte?

  • Schritt für Schritt zum Roboterprofi!
  • Der Multisubmit dürfte da keine signifikante Verbesserung bringen. Der Submitinterpreter hat einen gewissen Jitter, liegt am Verfahren wie das Multitasking realisiert ist.


    Man sollte einfach z.Bsp. 16 Bit auf dem Profinet zur SPS als Analogausgang deklarieren können, die müssen dann halt in der SPS als Integer eingelesen werden. Da brauchts keine analogen Klemmen.

  • Damit würde ich den virtuellen Analogen Ausgang nur als Puffer bzw. für das Übermitteln der Daten verwenden. Das klingt spannend. Ich werde das ausprobieren und berichten.


    Vielen Dank.

  • Mach dir 2 Interrupts die auf eine Boolsche variable reagieren. der eine True der ander False

    verküpfe das selber Programm mit denen und schreib in diesem Programm bVar=NOT bVar dann hast 12ms sicher.


  • Vielen Dank,


    ich habe verschiedene Optionen implementiert, und diese mit einem Testprogramm untersucht. Die direkte Verschaltung von AOUT auf den BUS steht noch aus. Hier gab es noch Probleme, die wir versuchen mit Kuka zu klären.


    Trotzdem hier kurz meine Ergebnisse:

    MultiSubmit: Ausführung alle 30ms mit einem Jitter von ca. +10ms

    IRQ: Ausführung stabil alle 4ms


    Die Werte vom IRQ-Test haben mich etwas überrascht. Ich habe eine Ausführung alle 12ms erwartet. Im Handbuch steht dann dazu allerdings nur, daß das aktivieren des IRQs 12ms benötigt.

  • Nein, auf dem Roboter ist kein RSI installiert. War auch noch nicht installiert, da der Computer des Roboters für den Test neu aufgesetzt wurde.


    An die Möglichkeit habe ich am Anfang auch gedacht, da mir die 4ms sehr verdächtig vorkamen. Installiert sind lediglich Pakete die eigentlich keinen Einfluss auf die Taktzeit haben sollten (Profinet, SafeOperation und Usertech).

  • also 4ms ist möglich auch möglich ohne rsi wenn man es einstellt.


    Hab vergessen wo.


    Aber schneller sollte ja kein proplem sein wenn es stabil läuft


    Ich mach gern noch nen timer mit rein der bei jedem zyklus auf -15 gesetzt wird (in deinem fall wohl -7) dann kannst du noch nen interrupt auf das timer flag machen als watchdog und dort noch mal bVar = not bVar falls er nochmal sthen bleibt.


    Machs in den sps sup dann laüft es auch unabhängig vom roboterintepreter


    Gruß loipe

  • Mach dir 2 Interrupts die auf eine Boolsche variable reagieren. der eine True der ander False

    verküpfe das selber Programm mit denen und schreib in diesem Programm bVar=NOT bVar dann hast 12ms sicher.


    Hallo Loipe,


    ich belebe mal wieder diesen Tread, denn ich stehe gerade ebenfalls vor dem Problem, dass ich eine Berechnung zyklisch durchführen muss.


    Die Berechnung soll deterministisch in einem bestimmten Takt (z.B. 12ms) durchgeführt werden.


    Ich habe soeben versucht das Programm mit den zwei Interrupts zu implementieren, aber habe den Befehl bVar NOT bVar nicht genau verstanden.

    Die Interrupt-Routine wird bei jedem Signalwechsel von bVar ausgeführt oder?


    Muss meine Berechnung in die Interrupt-Routine?


    Vielen Dank


    Grüße

  • und bVar = NOT bVar ist zum toggeln der Variable also das ausführen des interrupts löst den anderen aus. musst nur den initialen wechsel am anfang einmal selber machen damit ein Interrupt einen positiven wechsel der Bedingung hat zum auslösen. danach läuft er automatisch.

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