Step 7 Siemens-Eigenleben

Larry Laffer

Super-Moderator , User des Jahres 2008-2009
Teammitglied
Beiträge
14.426
Reaktionspunkte
3.282
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hatte nun mal eine "unheimliche Begegnung" :
Es betrifft eine unserer Anlagen. Dort habe ich 2 identische Prüfstationen. Was liegt also näher, als einen FB zu schreiben und ihn 2 mal unterschiedlich zu instanzieren.
In dem FB gibt es eine Zählvariable, die mit jedem Arbeitstakt der Station um eins erhöht wird. Der Vorgang des Erhöhens selbst ist Bestandteil der Schrittkette der Station und wird definitiv bei jedem Arbeitstakt der Station durchlaufen.
Nun kommts : Das hat wochenlang (vielleicht sogar monatelang) funktioniert. Vor 2 Wochen dann hat sich die Anlage entschlossen, nur noch in der 1. Instanz des genannten FB zu zählen - in der 2. nicht mehr ... ???
Die Zählvariable wurde aber nun nicht gelöscht - ich weiß nicht, was damit passiert und wie das möglich ist. Durch Steuern konnte ich den Inhalt davon ändern und der blieb dann auch erhalten.
Ich habe dann so Einiges ausprobiert um den "Fehler" zu finden - ich habe es nicht hinbekommen. So nebenher : in dem Baustein wird nicht herum-gepointert und es sind keine mir bekannten Programmier-Schnitzer da drin.
Die 2. Instanz wollte nicht mehr Zählen.
Seit Gestern nachmittag tut sie es nun wieder - es hat aber keiner das Programm angefasst ... 8) ... wirklich nicht.

Ich weiß im Moment nicht, was ich davon halten soll - mal schauen, was noch so kommt ...

Gruß
Larry
 
Zuletzt bearbeitet:
Ha, das kenne ich... nur leider habe ich auch nicht den geringsten Ansatz einer Lösung. Wir haben Niveauauswertungsbausteine, die wochenlang funktionieren und dann auf einmal nicht mehr. Ich habe schon Stunden damit zu gebracht Fehler zu suchen, nenne es inzwischen Bithopserei... Und irgendwann geht es wieder, ohne dass am Baustein oder Programm Änderungen gemacht wurden.

Gruß Heiko
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
mit Vipa wär das nicht passiert:ROFLMAO:. Nee, aber mal im Ernst, es ist jetzt sicherlich sehr schwer, da es ein sporadisches Problem ist, aber mal ne ganz andere CPU? Verarbeitest Du ein Datum und oder Stückzahl mit, eventuell diesen Baustein der ms genau Datum usw. liefert? Das ist sicher eine doofe Frage von mir, hast Du sicher schon geprüft, aber das sind so meine Gedanken beim Lesen.

Gruß
Mario
 
Tja ...
Es ist eine 317 PN/DP - ca. 1 Jahr alt (Firmwarestand weiß ich gerade nicht).
Das Programm hat einen Zeit-OB, der alle 2 ms aufgerufen wird - ich sehe da aber gerade den Zusammenhang nicht.
Als Visu habe ich eine Flex 2008-RT - die zeigt den Zähler natürlich an, mehr aber auch nicht ...
Der Zählerstand kann durchaus so ca. 2000 erreichen. Der Datentyp ist DINT und bei Netz-Aus bleibt der Inhalt erhalten.
Die Variable dient nur Anzeigezwecken und hat keine "wirkliche" Bedeutung. Ich frage mich halt nur : wie ist das zu erklären ... Und ... was geht noch so Alles ...?

Ich gestehe, das ich auch schon mit dem FW-Gedanken gespielt habe - vor Allem bei dem, was Siemens in letzter Zeit immer so "raushaut" (hier aber F-Technik).

Gruß
Larry
 
Ach ja ... noch etwas.

Ich habe natürlich auch mal die I-DB-Zuordnung getauscht. Der Fehler bleibt bei dem Aufruf (also dem 2.) - nicht bei dem I-DB ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi!

Mit welchem Ereignis wird denn hochgezählt?

Das hast du bestimmt auch schon geprüft, aber evlt. gibt es zeitliche Zusammenhänge die eben das Hochzählen verhindern.


Gruß,

Ottmar
 
... Und ... was geht noch so Alles ...?
Genau!
Ich glaub das ist selbstprogammiert.
Ich weiss nicht wie Deine Hochzählfunktion aussieht, aber ich nehme an in der Form

U Bedingung
FP
SPBN
L Zähler
L 1
+D
T Zähler

und wenn das nicht klappt, dann ginge sehr viel nicht mehr, auch mit der Firmware und der CPU.

Natürlich ist auch klar, dass Du ein Profi bist, und daher die üblichen Dummheiten auszuschliessen sind.

Gibts Fehlereinträge in der CPU?
2ms OB, hmmm... na entweder sollte das Teil auf Stop gehen wenns da ein Problem gibt, oder richtig zählen.
 
Was ich mal probieren würde:
Gib deinem FB einen 2.Zähler als InOut-Parameter mit. Ergänze:

U Bedingung
FP
SPBN sonstwohin
L Zähler
L 1
+D
T Zähler

L #ZwZähler
L 1
+D
T #ZwZähler

sonstwohin: NOP 0

oder poste den FB
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es geht etwas von der Wirklichkeit weg - so (in etwa) sieht es aus :
Code:
U #Schritt_7
U #RM_Zaehler_erhoeht
S #Schritt_8
R #Schritt_7

und irgendwann viel weiter unten im Code :

U #Schritt_7
UN #RM_Zaehler_erhoeht
SPBN nInc

L #Zaehler
L 1
+D
T #Zaehler

nInc: U #Schritt_7
= #RM_Zaehler_erhoeht
... selbstverständlich sind alle Variablen statisch (also STAT).

Ich habe auch den Flankenmerker #RM_Zaehler_erhoeht schon dazwischen weg genommen (beim inkrementieren) - dann zählt er unkontrolliert hoch. Aber der Flankenmerker wird wirklich nur da benutzt wo gezeigt ...
Und ... wie schon geschrieben - im Augenblick funktioniert es (einfach so) wieder ...

Gruß
Larry
 
Ein kleines Ding ist mir aufgefalen: +D braucht zwie DINTs.
Wenn nur "1" geladen wird und nicht "L#1" funktioniert es vielleicht trotzdem, aber besser ist es sauber überall mit DINTs zu programieren.

Also
L #Zaehler
L L#1
+D
T #Zaehler
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was passiert denn wenn Du den FB nicht zwei mal instanzierst,
sondern duplizierst und unter anderem Namen aufrufst (nur beim zweiten Aufruf)?

Wenn es funzt ist das Rätsel zwar damit nicht gelöst,
aber ruhiger schlafen könntest du trotzdem ;)
 
@Jesper:
Natürlich wird in anderen Bausteinen herum-gepointert - da sind ja eine ganze Menge SCL-Scripte mit drin und so bald du irgend etwas mit Array's oder Strukturen in SCL machst wird daraus ja sofort ein Pointer-Salat. Aber ... meine Bausteine beziehen sich nie auf andere (außer Multi-Instanz). Für die Kommunikation zwischen den FB's (soweit nötig) gibt es ja die Schnittstelle.
Das mit dem "L L#1" kann man natürlich machen - ich glaube aber nicht, dass es daran liegt. Der Akku wird ja nicht nur im "vorderen" Wort beschrieben sondern immer komplett.
Der Code ist, soweit er den Zähler betrifft so weit vollständig. Es gibt aus der "#RM_Zaehler_erhoeht" keinen zusätzlichen Flankenmerker - wozu auch ...? Flanke von Flanke ?

@Paul:
Das habe ich nicht ausprobiert. Das wäre auch darüber hinaus keine Lösung, da das, was ich da gemacht habe ja der Sinn eines FB ist ...
Und ... schlecht schlafen tue ich deswegen noch nicht ... 8)
 
Der Code ist, soweit er den Zähler betrifft so weit vollständig. Es gibt aus der "#RM_Zaehler_erhoeht" keinen zusätzlichen Flankenmerker - wozu auch ...? Flanke von Flanke ?
Um eine Flanke zu erkennen muss man ein Speicher von den Zustand haben.

Beispiel:
U #IrgendeinderZustand
FP #Flankenspeicher // Ich meine diese Variabel.
= #RM_Zaehler_erhoeht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ging mir eigentlich darum, einen weiteren Zähler laufen zu lassen, um zu sehen, ob der weiterzählt, wenn der eigentliche Zähler steht.
Ich hatte aber dem 1. Post nicht entnommen, dass der Zähler ja in den STAT-Daten ist und dann - wie in_out über die DI-Nummer angesprochen wird.

Hier noch ein Vorschlag, einen zweiten Zähler und einige weitere Kontrollen in den FB einzubringen. Damit beide Instanzen mit unterschiedlichen Daten arbeiten können, habe ich den in-Parameter DBNr eingefügt, der einen Global-DB bezeichnet.

Code:
// ganz am Anfang:
      AUF   #DBNr
      L     DINO
      T     DBD    0  // festhalten, mit welchem DI gearbeitet wird.

      U     #schritt_7
      U     #RM_Zaehler_erhoeht
      S     #schritt_8
      R     #schritt_7

//und irgendwann viel weiter unten im Code :

      U     #schritt_7
      UN    #RM_Zaehler_erhoeht
      SPBN  nInc

      AUF   #DBNr
      L     DINO
      T     DBD    4   // festhalten, ob sich die DI-Nummer geändert hat.


      L     #Zaehler  // Zählerstand festhalten
      T     DBD    8  

      L     1
      +D    
      T     #Zaehler
      T     DBD   12  // Zählerstand nach Hiochzählen festhalten

      L     DBD   16  // unabhängigen Zähler (könnte aufdecken, falls #Zaehler woanders genau im selben Takt heruntergezählt wird)
      L     1
      +D    
      T     DBD   16



nInc: U     #schritt_7
      =     #RM_Zaehler_erhoeht

      AUF   #DBNr
      L     DINO
      T     DBD   20  // festhalten, ob sich die DI-Nummer geändert hat.
 
@Jesper:
Nein ... muss man nicht. Schau dir bitte noch einmal meinen geposteten Code-Schnipsel (Beitrag #12) an.

@Zottel:
Die Idee mit dem DINO ist nicht schlecht. Es ist aber so, dass der Baustein ja auch noch eine Menge andere Dinge macht, die ja korrekt arbeiten (unabhängig von der 1. Instanz und aber auch quasi zeitgleich).
Wenn der DINO verstellt ist dann würde sich das auch auf den Rest auswirken.

Das Problem ist auch nicht das Aufaddieren - es findet ja statt, wenn man (das hatte ich auch schon geschrieben) den vorgeschalteten Merker "#RM_Zaehler_erhoeht" wegläßt. Es muss etwas mit dem "Merker" passieren - wenn ich allerdings einen anderen genommen habe dann GING es auch nicht ...
Wie schon geschrieben - seit Gestern Nachmittag funktioniert alles wieder super ... ohne irgendein Zutun ...

Gruß
Larry
 
...
@Zottel:
Die Idee mit dem DINO ist nicht schlecht. Es ist aber so, dass der Baustein ja auch noch eine Menge andere Dinge macht, die ja korrekt arbeiten (unabhängig von der 1. Instanz und aber auch quasi zeitgleich).
Wenn der DINO verstellt ist dann würde sich das auch auf den Rest auswirken.
Natürlich, aber da ich den Rest nicht sehe, kann ich nicht wissen, 1) was da passieren könnte, und 2) ob es so offensichtlich wäre, wie ein stehender Zähler.
Das Problem ist auch nicht das Aufaddieren - es findet ja statt, wenn man (das hatte ich auch schon geschrieben) den vorgeschalteten Merker "#RM_Zaehler_erhoeht" wegläßt. Es muss etwas mit dem "Merker" passieren - wenn ich allerdings
einen anderen genommen habe dann GING es auch nicht ...
Um das herauszufinden, kannst du natürlich auch den Merker zu verschiedenen Zeiten in den Global-DB kopieren.
Wenn du dem FB keinen Parameter hinzufügen möchtest, geht es auch so:
Nimm dir einen freien globalen Merker, z.B. M123.4

Jetzt setzt du vor den 1. Aufruf:
U M123.4
R M123.4
call fbxx, dbxx

Und vor den 2. Aufruf:
UN M123.4
S M123.4
call fbxx, dbyy

Im FB öffnest du den einen oder den anderen Global-DB in Abhängigkeit von M123.4

So brauchst du keine neuen Instanz-DBs für die geänderte Schnittstelle des FB zu erzeugen.
 
Zurück
Oben