Variablen als Flankenmerker

Wenn Du #fptemp im TEMP Lakoalvariablenbereich dekalriert hast, dann folgender Auszug aus der Hilfe:

Daten, temporär
Temporäre Daten sind Lokaldaten eines Bausteins, die während der Bearbeitung eines Bausteins im Lokaldatenstack (L-Stack) abgelegt werden
und nach der Bearbeitung nicht mehr verfügbar sind.

Gruss nairolf
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nu klar kannste das. Deine Variable muss aber eine INOUT sein.
Warum?
Der S7-Baustein wird zur Bearbeitung in den Arbeitsspeicher geladen. Ein Speicherbereich wird dabei für die Variablen freigehalten. Bevor der Baustein bearbeitet wird, werden die Variablen von IN und INOUT zugewiesen. Deine Flanke ist dann wahr, wenn das VKE 1 und die Variable selbst Null ist und durch das VKE wahr wird. Kannst Du selbst ausprobieren.
Dein Eingang 1.0 bleibt wahr und Du toggelst nur den Merker 1.0 auf Null. Schon wird wieder A1.0 wahr.
Dein Vorgängerbaustein hat den Speicher, Deiner tmp Variable auf Null gesetzt: A1.0 wird wahr. Der Speicher wahr 1: A1.0 bleibt Null.
Ich habe mal einen FC gehabt der das Signalhorn ansprechen sollte, falls ein Fehler erkannt wird. Das ging etwa so:

AUF #alt_DB
L DBW [AR1,P#0.0]

AUF #neu_DB
L DBW [AR1,P#0.0]
T #tmp_word
XOW
L #tmp_word
UW
L 0
>I
S #horn

Also Zwei DBs wurden verglichen falls ein Bit im neu_DB gesetzt war wurde auch horn gesetzt und beim quittieren rückgesetzt. Nur fing das horn machmal zu tuten an ohne das ein Fehler vor lag. Einfach weil der Speicherbereich der Out-Variable horn zufällig gesetzt war.
 
Nur fing das horn machmal zu tuten an ohne das ein Fehler vor lag. Einfach weil der Speicherbereich der Out-Variable horn zufällig gesetzt war.

Das spricht für sich ;) und sollte so ja nicht sein!


Andere Möglichkeit beim FB nicht TEMP sondern STAT verwenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
so wirds gemacht:
Code:
u e1.0
fp #fptemp
u #fptemp
= a1.0
Eventuell musst du eine statische Variable benutzen, um dir den Zustand über einen ganzen Zyklus zu merken.
 
Und so wird es nicht gemacht:

Code:
[LEFT]u e1.0
[LEFT]fp #fptemp
u #fptemp
= a1.0[/LEFT]
Weil:
1.) Der Flankenmerker MUSS statisch sein, da eine temporäre Variable im nächsten SPS-Zyklus 0 bzw. undefiniert ist.
2.) Die Abfrage "u #fptemp" funkioniert nicht, da der Status der Variablen = e1.0 ist. (Grundlagen)

Sondern so:
Code:
U   E1.0
FP  #fpstat   // statische Variable
=   A1.0

[/LEFT]
 
Zurück
Oben