B-Stack auslesen ohne CPU-Stop?

shotar

Level-1
Beiträge
28
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe einen FB der im Programm mehrere Male (aus anderen FBs & FCs) aufgerufen wird und ich möchte rausfinden, von wem der FB aufgerufen wurde. Eine Möglichkeit wäre die SPS in Stop zu setzen und dann den B-Stack anzugucken. Ist es aber evtl. möglich den aufrufenden Baustein mit einem Befehl (z.B. SZL) zu erfahren?

Der Befehl DINO würde mir den Instanz-DB anzeigen, aber für den aufgerufenen FB gibt es keinen Befehl?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
geht nicht bzw. es bringt mir nichts, denn in dem Programm sind jede Menge indirekte Aufrufe von FBs und FCs und ich vermute irgendwo dort den Fehler...

Also kann man sich im laufendem Programm den B-Stack irgendwie auslesen? Ich dachte da an SZLs, habe aber nichts gefunden...
 
Weiss nicht ob ichs ganz verstanden habe.
Es gibt mehrere Stellen von dem aus FB's indirekt aufgerufen werden.
Diese sind aber bekannt oder? Jedes mal mit der gleichen Instanz nehme ich an....

Na dann schreib vor jedem dieser indirekten Aufrufe einen Wert in ein Merkerwort, und lies das Merkerwort im FB auf. Dann sollte klar sein vorher der Aufruf kommt.
Du kannst auch im FB mittels:

L MW x
L 1
==I
S Bit

herausfinden ob er mehrmals aufgerufen wird, das ist ja auch möglich.
Komisch, indirekte FB Aufrufe.
Wie sagte mal ein Kunde zu mir: "Speicherplatz ist egal, auf trickreiche Programmierung wird kein Wert gelegt".

Gruß
Karl
 
Dafür hat man PLCSIM.
Dann kanst du die Fehler-OBs löschen und dadurch ein CPU Stop auslösen wenn der Fehler auftritt.
Und dann hast du den gewünschte Information in der B-Stack info.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
eure Lösungen gehen auch nicht, mein Programm ist viel zu groß (also sehr viele indirekte Aufrufe) dafür und der Fehler tritt nur in "Live"-Betrieb auf... dann muss ich wohl den doch den SFC46 aufrufen und die CPU stopppen...
 
Abhängig von deiner CPU kannst du auch die Daten des Fehler OB (in deinem Fall wohl der OB121) auswerten. Der liefert bei einer 300er aber nicht alle Informationen.

Wenn du einen ungefähren Verdacht hast in welchem Baustein das wohl sein könnte, kannst du am Anfang jedes dieser Bausteine die Bausteinnummer und den gerade geöffneten DB/DI in einen Merker oder Datenbaustein wegschreiben. Im Fehler OB programmierst du dann eine Auswertung welche diese Informationen an anderer Stelle wegspeichert, wenn notwendig in einem Ringspeicher mit Zeitstempel.

Über eine SZL-Abfrage kommt man an den B-Stack nicht heran. Wenn du über den Simatic Manager diese Funktion auslöst, werden die Informationen auch nicht über eine SZL abgefragt, sondern über eine andere Funktion. Dann wird es wohl auch keine undokumentierte Spezial-SZL geben.
 
eure Lösungen gehen auch nicht, mein Programm ist viel zu groß (also sehr viele indirekte Aufrufe) dafür und der Fehler tritt nur in "Live"-Betrieb auf...
Warum eigentlich ?
PLCSIM hat kein Problem mit grosse Programme.
Eine gute Simulations-Modus ist nicht einfach zu programmieren, aber ist den Einsatz wert. Z.B für genau solche Fälle wie diese.

dann muss ich wohl den doch den SFC46 aufrufen und die CPU stopppen...
SFC46 STP wird dich nichts erzählen. Nur ein stop verursacht durch den Fehler gibt die Informatione in den B-Stack.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum eigentlich ?
PLCSIM hat kein Problem mit grosse Programme.
Eine gute Simulations-Modus ist nicht einfach zu programmieren, aber ist den Einsatz wert. Z.B für genau solche Fälle wie diese.
Ich habe aber Kommunikationspartner über TCP/IP und PROFIBUS die evtl. etwas mit meinem Fehler zu tun haben.


SFC46 STP wird dich nichts erzählen. Nur ein stop verursacht durch den Fehler gibt die Informatione in den B-Stack.
OK, dann mach ich einfach eine Division durch 0

Mit dem OB121 kann ich aber auch nur feststellen, in welchem Baustein der Fehler auftrat, jedoch nicht den Baustein der den Fehler-Bausteil aufgerufen hat.
Ich könnte in dem Bausteil einen Pointer auf die Lokalvariablen des aufrufenden Bausteins machen, so könnte ich die OB Nummer auslesen. Aber eben nur wenn er aus einen OB direkt aufgerufen wird...

Die Bausteinnummer müssen ja in der SPS irgendwo vorhanden sein (eben wenn mann den B-Stack ausliest), gibt es keinen Hack wie man an die Infos drankommt? Also eine Art Quellcode vom OB121?! ;)
 
Zuletzt bearbeitet:
Über eine SZL-Abfrage kommt man an den B-Stack nicht heran. Wenn du über den Simatic Manager diese Funktion auslöst, werden die Informationen auch nicht über eine SZL abgefragt, sondern über eine andere Funktion. Dann wird es wohl auch keine undokumentierte Spezial-SZL geben.

Gibt es undokumentierte SZLs? Was denn zum Beispiel?
 
Gibt es undokumentierte SZLs? Was denn zum Beispiel?
Es gibt zumindest SZL die in den allerersten Siemens Handbüchern (und dort auch nur in den englischen) noch beschrieben waren, und in den aktuellen Beschreibungen aus welchen Gründen auch immer nicht mehr vorhanden sind. Ich habe das Gefühl, dass die Siemens Dokumentationen immer sparsamer werden. Zumindest wenn man es damit vergleicht wie viele Details in den S5 Dokumentationen noch vorhanden waren.
 
Zurück
Oben