Temp Flankenmerker

baalrok

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

weiß jemand, warum ich in einem FB keine TEMP Variable als Flankenmerker nutzen kann? Flankenmerkerbit bleibt gesetzt. In PLCSIM funktioniert das ohne weiteres. Zielsystem ist eine S7315-2DP. Bei einem OB 35 kann ich es noch nachvollziehen. .Wurde hier auch schon einmal behandelt

Gruß und Danke.
 
Hallo,

Temp-Variable sind nur für einen Zyklus da.
Nimm eine statische Variable, dann sollte es gehen.

Gruß Jan
 
Bitte. Ich habe keine Ahnung, warum es da geht, evt. verhalten sich da die temporären Variablen anders. Vieleicht kann DIr da einer der Profis eine Antwort drauf geben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Tempvariable liegt auf dem lokalen Stack. Wenn du nur einen Baustein laufen hast, wird das evtl. gehen, das Bit wird ja von keinem anderen Baustein überschrieben. Wenn aber viele Bausteine in der SPS sind, nutzt jeder den lokalen Stack.

Start Baustein 1
Baustein 1 packt 10 Byte auf den lokalen Stack
...
Baustein 1 nimmt 10 Byte auf den lokalen Stack (natürlich bleiben Stackbyte Stackbyte, aber der Zeiger auf das Ende des Stack wandert wieder nach unten!)
Ende Baustein 1

Start Baustein 2
Baustein 2 packt 8 Byte auf den lokalen Stack
...
Baustein 2 nimmt 8 Byte auf den lokalen Stack
Ende Baustein 2

Wenn jetzt wieder Baustein 1 an der Reihe ist, wird und den Stack benutzt (Temp-Var!), dann wurden die ersten 8 Byte verändert, da die ja von Baustein 2 auch genutzt wurden. Byte 9 und 10 sind noch im alten Zustand und "könnten" als Flankenmerker noch funktionieren.

PS: PLSSIM simuliert eine SPS, intern macht es sicher nicht komplett alles genauso, wie eine reale SPS.
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort. Aber warum geht es im PLCSIM?

Das ist Zufall.
Es kann unter best. Umständen auch auf einer CPU "zufällig" funktionieren.
Und zwar genau dann wenn der von Dir verwendete Bereich auf dem L-Stack
nicht vom Rest des Programms überschrieben wird.

Für jeden Baustein wird auf dem L-Stack ein Bereich reserviert, der nach
Abarbeitung des Bausteins wieder freigegeben wird.
Dieser Bereich wird aber nicht "genullt", sondern bleibt im gleichen Zustand, bis anderer Baustein den Bereich belegt und Lokaldaten zuweist.

Hoffe es ist einigermassen verständlich.

Nimm es einfach als gegeben hin:
TEMP-Variablen (=Lokaldaten auf dem L-Stack) müssen bevor sie gelesen werden können, im gleichen Bausteinaufruf erst zugewiesen werden.

Übrigens hat jeder OB (=Prioritätsklasse) einen eigenen L-Stack.
=> d.h. falls du im OB35 nur einen FC genau einmal aufrufst hättest du den
Sonderfall das die Flankenauswertung im OB35 "zufällig" funktionieren würde, da diese Lokaldaten vom OB35 L-Stack nur von diesem FC beschrieben werden.
 
Und warum funktionieren Flanken mit Temp- Varaiblen in einem FC hier auf der Steuerung???

Ich sitze als Inbetriebnehmer vor einer Sinumerik 840D mit einer S7-319 Steuerung. Diese hat m.E. über 9000 MByte. Trotzdem verwendet der Hersteller zum Resourcensparen fast nur Lokalvariablen (es wird nur 300 MByte verwendet....). Es gibt 50-100 FC (und 50FB) und in den FC wird oft eine Flanke mit Temp- Variablen gebildet oder die Temp- Flanke setzt eine SR- Box mit Temp- Variablen (Die nach meinem Verständnis im nächsten Zyklus wahrscheinlich wieder 0 sein muss) .

Eigentlich eine Todsünde, hier TEMP- Variablen zu verwenden, aber es funktioniert an 20 baugleichen Werkzeugmaschinen. Ist hier eine Einstellung geändert oder warum klappt das hier?

Danke schon mal für Auskunft!
 
Das haben m.E. Ralle und Sarek sehr gut beschrieben. Dann hast du halt einfach bislang Glück gehabt ... das sollte dich aber nicht davon abhalten, es vernünftig zu machen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man muß das noch ein wenig differenzieren:

Code:
U E0.0
FP #Flankenmerker
= #Flanke

Hierbei kann #Flanke eine Tempvar sein, #Flankenmerker muß zwingend eine Variable sein, die in einem DB, IDB oder Merker liegt.
Nun gibt es Programmierer, die am Anfang eines FC aus einem "Speicherword", Daten in ein "Tempword" umkopieren, um dann z.Bsp. mit den zugeordneten Bits symbolisch weiterzuarbeiten und am Ende des Bausteins alles wieder in das "Speicherword" zurückzuschreiben. Das nutze ich bei FC auch mitunter, um den Code besser verstehbar zu halten. Wie das bei dir gemacht ist, kann man aus deinem Text nicht erkennen. Fakt ist, wenn #Flankenmerker nur eine Temp ist und nirgends zwischengespeichert wird, dann ist dein ganzes Programm eine Lottomaschine und das kann ich irgendwie nicht glauben, denn bei der Anzahl an FC muß das zwangsläufig irgendwo schief gehen.
 
Aha- jetzt fällt es mir wie Schuppen von den Haaren ;)

Ich sehe jetzt erst, das das LD0 am Beginn geladen wird und dann wieder gespeichert:

NW1
L DB982.DBD 96
T LD 0
NOP 0

NW 30:
L LD 0
T DB982.DBD 96
NOP 0

Ojeoje, geht es noch umständlicher..... tja, leider darf ich an der SPS nix ohne Zustimmung ändern... dann quäle ich mich halt weiter damit rum.....

Und jetzt darf man mitdenken, das bis L3.7 alles gesichert wird und darüber hinaus nix mehr.... Quatsch- Programmierung, aber Hauptsache keine Merker verwendet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Merker sind nach nem Tag der Programmierung halt aufgebraucht. Merker sind einfach out^^. Und durch das Lokal-Kopiere ist es dir möglich in allen Funktionen Variablen gleich zu benennen. Da wirst du dich in größeren Projekten durchaus drüber freuen.
Das man den Varialbenzugriff hätte schöner gestalten können, sei mal dahingestellt.
 
Zurück
Oben