Step 7 Ausgang kurz setzten

Ninja2602

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

ich habe gerade folgende Herausforderung.
Ich habe für ein Alarmwählgerät Störungsgruppen generiert, da an dieses Gerät nur sechs Meldekontakte angeschlossen werden können.
Das bedeutet Störung 0-10 setzten Ausgang 1/Meldekontakt1,
Störung 11-20 setzten Ausgang2/Meldekontakt2 usw.
Die Störungen die durch das Alarmwählgerät rausgeschickt werden, an ein Telefon, müssen über das Telefon quittiert werden.
Ist der Anruf quittiert kommt für diese Störung, solange sie anliegt, keine Meldung mehr raus.

Nun habe ich z.B. in der ersten Störungsgruppe das so programmiert das der Ausgang der SPS gesetzt wird wenn,

O DB20.DBX0.0
O DB20.DBX0.1
O DB20.DBX0.2
= A9.3

In diesem Fall wird die Störungsmeldung einmal ausgelöst. Für den Fall das eine Störung (z.B. ausgelöster Motorschutzschalter) länger anliegt, da an dem Motor gearbeitet wird, und auch quittiert wurde besteht bei meiner aktuellen Lösung nicht die Möglichkeit das eine neue Störung der Störungsgruppe einen erneuten Anruf auslöst, da der Ausgang noch immer gesetzt ist.
Ich habe jetzt vieles ausprobiert, z.B.

X(
O DB20.DBX0.0
O DB20.DBX0.1
FP #Flankenmerker
)
X A9.5
=A9.5

Aber hierbei wird der Ausgang (habe mit PLCSim getestet) ständig gesetzt und wieder rückgesetzt.

Ich möchte das eine Störung den Ausgang kurz schaltet und der Ausgang dann wieder zurückgesetzt wird, damit im Falle eine erneuten Störung, innerhalb der Gruppe, ein erneuter Anruf generiert werden kann.

Hat jmd. einen Tipp wo mein Denkfehler liegt.
 
Versuch doch mal deine Störmeldungen zu flanken und den Ausgang dann über einen ZEitimpuls anzusteuern.

U DB20.DBX0.0
FP M 10.0
= M 10.1

U DB20.DBX0.1
FP M 10.2
= M 10.3

O M 10.1
O M 10.3
L S5T#1s
SV T1

U T1
= A 9.3
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So eine ähnliche Idee hatte ich auch schon,

ich habe versucht:

O DB20.DBX0.0
O Db20.DBX0.1
S M10.0

U M10.0
FR T24
L S5T#1s
SE T24
U T24
R M10.0

NOP 0

Aber bei beiden Bsp. wird der Ausgang zwar nach der Zeit zurückgesetzt, aber wenn dann die zweite Störung eintritt nicht erneut gesetzt.
 
Hatte bei deinem Beispiel eine kleine Änderung, hatte den Merker der durch die positive Flanke gesetzt wird durch eine temp Variable ersetzt und damit scheint es nicht zu funktionieren.
Mit dem Merker geht es.
Aber warum geht das denn nicht mit einer temp Variablen?
 
Hmmm,
bei mir funktioniert es auch, wenn ich temp Variablen benutze.
Die werden bei meiner Test-CPU momentan natürlich nur von diesem Beispiel benutzt.
Vielleicht sind sie bei dir noch von einem vorherigen Programmteil beschrieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine weitere Möglichkeit wäre dein Störmeldebyte oder Wort, je nachdem wie genau du es brauchst, auf eine Wertänderung zu überprüfen.
Liegt eine Änderung vor, löst du den Zeit impuls aus.
Damit sparst Du dir das "Geflanke".
 
Eine weitere Möglichkeit wäre dein Störmeldebyte oder Wort, je nachdem wie genau du es brauchst, auf eine Wertänderung zu überprüfen.
Liegt eine Änderung vor, löst du den Zeit impuls aus.

Wenn aber im selben Byte eine weitere Störung auftaucht, wird der Merker nicht nochmal gesetzt.

Ich würde es mit zwei DB's lösen. Ein DB für Störung kommend und ein DB für Störung speichernd. Sämtliche kommende Störungen werden nach dem quittieren in den speichernden DB übertragen. Eine Vergleicherbaustein überprüft die Bits und Bytes der beiden DB's miteinander und setzt bei ungleichheit einen Ausgang, der nach dem quittieren wieder auf 0 geht und für einen weiteren Störfall bereit steht.

mfg Kapo
 
Das mit dem Störmeldebyte oder Wort wird bei mir nicht den oben gewünschten Effekt haben. Ich muss bei jeder Störung eine Meldung rausschicken.
@LarsVader: Hast du alle Merker durch eine Temp-Variable ersetzt? Bei mir funktioniert es nur, wenn ich bei der Flanke einen Merker habe und dadurch eine Temp-Variable setzte (oder halt beides ein Merker).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe gerade meine Störungsauswertungen erweitert.
Und schon wieder funktioniert es nicht. Der Timer setzt sich nach Ablauf der Zeit nicht zurück, wenn noch eine Störung anliegt, dadurch kann keine weitere Störung den Ausgang setzten.
Dann noch eine weitere Frage, mein NW ist jetzt schon ziemlich lang, kann ich meine aktuelle Lösung eventuell durch einen Pointer verbessern? Bin bei Pointern nicht so gut.

Anhang anzeigen FC17.pdf
 
Die MErker die ich benutzt habe werden anscheinend schon an anderer Stelle benutzt. Ich habe gerade die Merker geändert z.B. M40.0 auf M100.0 und jetzt funktioniert es wieder.
 
Hatte bei deinem Beispiel eine kleine Änderung, hatte den Merker der durch die positive Flanke gesetzt wird durch eine temp Variable ersetzt und damit scheint es nicht zu funktionieren.
Mit dem Merker geht es.
Aber warum geht das denn nicht mit einer temp Variablen?

Für eine Flanke benötigst du einen statischen Speicher!
FP #tempVar
funktioniert deshalb nicht weil der Wert der temporären Variable nicht Zyklus-übergreifend gültig ist.
Also temporäre Variablen verlieren ihre Gültigkeit nachdem der Baustein abgearbeitet ist. => Deshalb der Name Temporär!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...weil der Wert der temporären Variable nicht Zyklus-übergreifend gültig ist.
Also temporäre Variablen verlieren ihre Gültigkeit nachdem der Baustein abgearbeitet ist. => Deshalb der Name Temporär![/QUOTE]

Stimmt, da war so was!
 
Zurück
Oben