doppelter Programmaufruf

Else
2009-05-27
2009-07-22
  • Else - 2009-05-27

    Moin zusammen,

    meine Frage: Gibt es eine Möglichkeit, außer im Aufrufbaum zu Fuß, nach doppelten Programmaufrufen zu suchen? Auch die Querverweisliste hilft mir nicht weiter, es sind einfach zu viele Bausteine als das ich sowas mit der Hand machen könnte. Vielleicht eine CMD Zeile? Irgendwas in der Art, mit der ich mir ein Macro zusammenstricken könnte. Aus dem ENI bekomme ich ja schon die Bausteinliste aller im Projekt enthaltener Bausteine.

    Besten Dank.

     
  • Else - 2009-07-07

    mal nach oben schieben...

     
  • Erik Böhm - 2009-07-07

    Mahlzeit

    Ich mach mir in solchen Fällen eine InputVariable in den Baustein und gebe bei jedem Aufruf eine eindeutige CallerId mit.

    Dann kannst du im Baustein jederzeit sehen von wo er aufgerufen wurde.

    Musst natürlich mit Breakpoints arbeiten.

    Also z.B.:

    Program(iCallerId := 1);

    Program(iCallerId := 2);

    Program(iCallerId := 3);

    Eine Methode das zu automatisieren kenne ich nicht. Doppelte Programmaufrufe sind ja generell erlaubt (meistens auch erwünscht).

    Ich hoffe ich hab deine Problematik richtig erkannt...

    Gruß

    Erik

     
  • SPSstudent - 2009-07-08

    Das ist zwar auch nicht automatisiert, aber meiner Meinung nach recht schnell:

    Global suchen -> Name des aufgerufenen Programms eingeben -> auf den Button Meldungsfenster klicken.

    Im Meldungsfenster (falls nicht vorhanden/aktiv mit Shift+Esc anzeigen) sind die Ergebnisse sortiert nach Bausteinen, in denen der gesuchte Begriff enthalten ist. Da erkennt man dann eigentlich recht schnell, wenn in einem Baustein dein Programm mehrmals aufgerufen wird.

     
  • Else - 2009-07-09

    @SPSstudent:

    Die Variante kenn ich bereits, trotzdem danke. Mein Projekt umfasst bummelig 2000 Bausteine, da hast Du keine Chance sowas zufuss zu finden.

    @Erik:

    Klar gibt es absichtliche doppelte Aufrufe, das ist auch gut so. Aber mein Programm läuft im 10ms Takt und es werden aus einem Masterbaustein (PLC_PRG) mehrere Control Bausteine aufgerufen, die die verschiedenen Bereiche des Projekts abarbeiten. Das zu vertiefen würde den Rahmen hier sprengen. Es wird auch für ungefähre Trendabschätzungen die Tasklaufzeit zur Berechnung der Trends herangezogen. Wird ein solches Programm doppelt aufgerufen, sind natürlich die ermittelten Zeiten auch halb so lang.

    Hoffe das war verständlich...

     
  • Erik Böhm - 2009-07-09

    Mahlzeit

    Wenn du nur doppelte Aufrufe verhindern willst und nicht den eigentlichen Fehler suchst, könnte das durch einen einfachen Task-Zyklus-Zähler gemacht werden.

    Den Zähler an das Unterprogramm übergeben und auf Änderung abfragen.

    Keine Änderung gegenüber dem ketzten Aufruf -> RETURN;

    Gruß

    Erik

     
  • Else - 2009-07-15

    Hallo Erik,

    das hab ich nicht so ganz gerallt. Magst mir das mal mit einem Beispiel erklären, bitte?

     
  • Erik Böhm - 2009-07-15

    Moin Moin

    z.B. im PLC_PRG einen Zykluszähler erstellen.

    Also diCycleCount := diCycleCount + 1;

    Diesen Wert an das Unterprogramm übergeben.

    Im Unterprogramm diesen Wert merken und beim nächsten Aufruf auf Änderung prüfen.

    if diCycleCountOld := diCycleCount then ( Keine Änderung -> Fehler )

    ( Hier Fehlerbehandlung )

    return;

    else

    diCycleCount = diCycleCountOld;

    end_if

    Die Wahrscheinlichkeit, dass der Baustein nicht im gleichen Zyklus aufgerufen wurde, aber der Zählerstand trotzdem gleich ist, liegt bei 1: 4294967295...

    Gruß

    Erik

     
  • Else - 2009-07-22

    Ok das hab ich verstanden, danke. Das "geht" natürlich auch, ist aber ähnlich mühsam wie von Hand zählen. Ich dachte es gibt sowas wie "Such mir mal alle mehrfachen PRG-Aufrufe und gib mir die zugehörigen Bausteinnamen in einer Liste ins Meldefenster..." aber das wär ja auch n büschen viel verlangt...

     

Log in to post a comment.