Verhalten des Submit Interpreters

  • Ich hab in meiner sps.sub folgendes stehen (neben vielem anderen :mrgreen: )


    Code
    if ( (start == false) and (bedingung) ) then
      start = true
      machwas = true
    endif
    
    
    if ( (start) and (fehler) ) then
      fehler_nr = 13
      start = false
    endif


    (Code gekürzt...)
    Dabei sind fehler und bedingung digitale eingänge die über profibus reinkommen und start ist eine globale varibale (config.dat)


    Anfangsbedingung: start = true, bedingung = true, fehler = false
    Nun wurde fehler = true und es dauerte 1,7 sekunden bis machwas true wurde. (Trat nur einmal auf aber es gibt andere Fehler die auf ähnliche Fehler im sps.sub zurückzuführen sein könnten.)


    Nun ist mein sps.sub wie gesagt ziemlich vollgepackt. Zb eine etwas größere Berechnung in einem gebundenen Unterprogramm mit eigenen lokalen Unterprogrammen.


    Kann es da sein, dass sowas in der Art auftritt:
    fehler wird false, dadurch wird start false, er läuft im oberen if aber nur bis zur Anweisung start = true und "hüpft" dann wieder unten rein (weil fahler noch true ist) und setzt start wieder auf false usw...


    Vielleicht dadurch, dass der sps.sub, weil er zulange für den durchlauf braucht mehrfach aufgerufen wurde und quasi Altlasten abarbeitet in einer Form die sich mir nicht erschließt. :denk:



    Oder könnt ihr euch andere Effekte die ein solches Verhalten bewirken könnten. :hilfe:

    Einmal editiert, zuletzt von atw12az5 ()

  • Schritt für Schritt zum Roboterprofi!
  • wenn du den Sub so voll packst dauert der zyklus einfach länger.
    hatte bei aufwendigen sachen schon mal um die 2 sekunden.
    mehrfach wird nichts aufgerufen.


    du solltest gewissen sachen im sub nur machen wenn sie auch nötig sind z.B. die aufwendige Berechnung nur wenn sich etwas geändert hat



    Gruß Loipe

  • Hallo,


    langsame Zykluszeiten im SPS.SUB hatte ich auch schon - Sekunden hatte ich aber definitiv noch nie. Da ist was anderes faul.


    Ich vermute eher, das dein SRC in einer kurzen Schleife rumhuepft und sich die Bedingung darin andert.
    Dein Sps.sub hat eine langere Zykluszeit und die bedingung ist nur alle schaltjahr mal true.
    Sollte in deinem SRC nicht was wie

    Code
    Bedingung = TRUE
    while Bedingung
    endwhile


    programmiert sein, bin ich auch ueberfragt und stell mir die Frage, was ihr da alles in den sps.sub reinpackt.


    Gruss Stefan

  • Also die Zykluszeit des submit ist sicherlich nicht dauerhaft so hoch. Ich arbeite da vieles ab und der Großteil geht normal.


    Schleifen gibt es auch keine. Ein wait sec 0.1 hab ich drin, aber damit ists wohl auch nicht erklärt.



    Ich komm dem Fehler nicht auf die Spur... :kopfkratz:



    Bei einer if Abfrage im submit werden 4 digitale Aus- bzw. Eingänge abgefragt. Kann das eventuelle eine Verzögerung bewirken?
    (Macht nicht viel Sinn, denn diese Verzögerung wäre auch immer da)

  • versuch doch mal einen $timer mitlaufen zu lassen von loop bis endloop, ob wirklich sps.sub zyklus oder Afragebedingungen zum setzen der Variable so lange dauern!!!

  • Hallo,


    das mit dem Zugriff auf E/as hat keinen Einfluss.
    Die vermutung hatte ich auch mal.
    Hab dann alles in ein Prozessabilod kopiert und im Ablauf den Mist wieder aus Arrays rausklamuesert
    resultat -> noch viel langsamer.


    Hintergrund ist vermutlich, das Submit Interpreter und Roboter Interpreter Zeilenorientiert arbeiten.
    D.h. eine Anweisung je IPO-Takt. Zudem hat der Submitinterpreter eine niedrigere Prioritaet.


    Gruss Stefan

  • Hallo,


    habe mir jetzt mal einen SUB-Drehzahlmesser gebaut.
    Die SUB meines jetzigen Roboter läuft demnach ca. 70 U/Sekunde, im Standby. Und die ist schon ganz schön groß!


    Merkwürdiger Weise wird die SUB nicht langsamer, wenn ich in der Robotertask eine LOOP ENDLOOP Schleife laufen lasse.
    Auch wenn ich in dieser Loop Ausgänge setze hat es keine Auswirkung aus die SUB.
    Aber die BOF reagiert viel langsamer.



    Ciao, Andreas

    CONTINUOUS ALWAYS

    Einmal editiert, zuletzt von ah_robotics ()

  • In die SUB:
    U/s:


    Code
    $TIMER_STOP[3] = FALSE
      IF $TIMER[3] >= 1000 THEN
        DREHZAHL = q
        $TIMER[3] = 0
        q = 0
      ELSE
        q = q + 1
      ENDIF


    DREHZAHL und q dürfen natürlich keine Laufzeitvariablen sein

    CONTINUOUS ALWAYS

    Einmal editiert, zuletzt von ah_robotics ()

  • Hallo,


    niedrigste Prioritaet hat Windows. Es wird ein Interrupt ausgeleoesst, welcher das Windows wieder zum Zuge kommen laesst.
    Frueher war das ein NMI, der von einem Taktgeber auf der MFC ausgeloesst wurde, heute ist es vermutlich Software.


    Waere der Roboter zu 100% ausgelastet, bekaeme Windows gar keine Rechenzeit mehr.
    D.H. da wird zwischen Windows und VxWork geswitcht.


    Roboterinterpreter und Submit Interpreter werden von einem Taskscheduler, der unter VxWorx laeuft, verwaltet.


    Die Performance von SPS.Sub und Bof sind daher nicht vergleichbar.


    Gruss Stefan

  • Ich weiss nur, dass jede Zeile im SPS.sub (auch Leerzeilen) die Durchlaufszeit beeinflussen. So auch die Zeilen der Gebundenen Unterprogramme, sofern diese durchlaufen werden.
    Soviel ich weiss, kriegt der Submitinterpreter nur jeden zweiten IPO Takt Rechenzeit und dann (so glaube ich) noch weniger als der Roboterinterpreter. Doch 2sec Durchlaufzeit ist sehr gross... poste doch mal dein sps.sub plus alle gebundenen Unterprogramme. Dann kann ich dir genaueres sagen.

  • hallo


    danke für das angebot aber da gibts nichts zu posten ist erstens net auf meinem Mist gewachsen und meine sind schnell genug obwohl einiges drin ist aber halt optimiert.


    wollte nur sagen das wenn man den sub zu arg aufbläht sich net wundern muss das der zyklus länger dauert.


    schönes WE zusammen


    Loipe

  • Mein Minimalbeispiel war zu kurz... :)



    Falls fehler und bedingung beide true sind werden beide if bedingungen erfüllt. Damit wechselt machwas (=digitaler ausang) so schnell seinen Zustand, dass der Gegenpart die Änderung gar nicht bemerkt.


  • Ich weiss nur, dass jede Zeile im SPS.sub (auch Leerzeilen) die Durchlaufszeit beeinflussen. So auch die Zeilen der Gebundenen Unterprogramme, sofern diese durchlaufen werden.


    Hallo,


    habe ich mal 7000 Leerzeilen in meine SUB eingefügt und siehe da:
    Statt 70 Durchläufe pro Sekunde habe ich dann bloß noch 12-15!


    Allerdings habe ich fast 2000 Durchläufe, wenn ich die SUB ohne meinem User-Quellcode laufen lasse.
    Aber allein der Eintrag: WAIT FOR $IN[1025] drückt die SUB schon auf 1400 Durchläufe!




    Ciao, Andreas

    CONTINUOUS ALWAYS

    Einmal editiert, zuletzt von ah_robotics ()


  • hmm WAIT SEC und WAIT FOR gehören nicht in den Submit! PFUI! :aufsmaul:


    WAIT FOR $IN[1025] löst kein WAIT aus, weil $IN[1025] ja immer TRUE ist.
    Wollte nur testen, wieviel Zeit so eine (erfüllte) WAIT Anweisung benötigt.


    Ciao, Andreas

    CONTINUOUS ALWAYS

  • Zitat

    WAIT FOR $IN[1025] löst kein WAIT aus, weil $IN[1025] ja immer TRUE ist.
    Wollte nur testen, wieviel Zeit so eine (erfüllte) WAIT Anweisung benötigt.


    Ist eben nicht so, es wird trotzdem ein minimales Wait durchgeführt, wie du selber feststellen musstest.


    Zitat

    Allerdings habe ich fast 2000 Durchläufe, wenn ich die SUB ohne meinem User-Quellcode laufen lasse.
    Aber allein der Eintrag: WAIT FOR $IN[1025] drückt die SUB schon auf 1400 Durchläufe!


    Ich denke mal der Interpreter darf die folgenden Befehle nicht lesen/parsen, bis wirklich sichergestellt ist, dass die Wait For bedingung erfüllt ist. Erst dann darf eigelesen werden und dem Prozessor die weiteren Anweisungen gefüttert werden.


    Im übrigen meinte ich das mehr so, dass prinzipiell kein WAIT in den Submit gehört. :genau:


  • In die SUB:
    U/s:


    Code
    $TIMER_STOP[3] = FALSE
      IF $TIMER[3] >= 1000 THEN
        DREHZAHL = q
        $TIMER[3] = 0
        q = 0
      ELSE
        q = q + 1
      ENDIF


    DREHZAHL und q dürfen natürlich keine Laufzeitvariablen sein


    Was genau ist eine Laufzeitvariable?
    Ich wuerde den Drehzahlmesser auch gerne ausprobieren. Was muss noch deklariert werden damit dieser laeuft?


    Dankeschoen

    Einmal editiert, zuletzt von Jaxx ()

  • Hallo,
    Laufzeit Variablen sind lokal deklariert und nicht initialisiert, sind nur zur Laufzeit gültig, du deklarierst in der $config.dat


    INT DREHZAHL=0
    INT q=0


    und kopierst den anderen part in die sps.sub!

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