Schalten von 20 Ausgängen mit Timer und Ausschlüsse?

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe noch folgendes schweres Problem in AWL und S5.

Ich möchte einen Ausgang, wenn ein Ereignis am Eingang anliegt, nur für 2 Sekunden schalten und wenn das Ereignis am Eingang nicht mehr anliegt wieder einen Ausgang für 2 Sekunden schalten. Das ist kein Problem, ich verwende einfach einen Timer mit Impuls. Funktioniert auch richtig gut.

Mein Problem ist das ich 20 Ausgänge habe die nur geschalten werden dürfen wenn kein anderer der 20 Ausgänge aktiv ist. Also wenn der erste Ausgang aktiv ist, darf der zweite erst angehen wenn der erste aus ist. Das muss nun mit allen 20 Ausgängen geschehen. Ich habe alles mögliche probiert, aber scheitere an meinem Wissen wie es geht.

Versucht habe ich schon über eine UND-Verknüpfung die Ausgänge zu überwachen, aber entweder werden die anderen Ausgänge gar nicht erst geschalten oder blinken.

Achja,
wenn der Ausgang geschalten wird, wenn das Ereignis nicht mehr anliegt, liegt vor dem Timer noch ein Ausschaltverzögerungstimer um zu verhindern wenn das Ereignis am Eingang nur kurz unterbrochen wird nicht wieder der Impulstimer angesprochen wird..

Ich bin etwas verzweifelt, da entweder nichts passiert oder die Ausgänge schalten und schalten.

Ich hoffe ich habe das Problem etwas erklären können.
Kann mir jemend dabei helfen?

Vielen, vielen Dank
Ronny
 
Habe gerade das andere Posting gelesen und hier noch ein paar angaben dazu:

1. CPU TYP
S95U

2. Verwendete Softwareversion des Projektierungssystems
S5 für Windows Version 4.x

Vielen Dank
Ronny
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann es denn vorkommen, dass ein Eingang mehrmals hintereinander ein Ereignis auslösen soll? Dann müsste man zählen und die Anlage würde noch Stunden nach dem Abschalten Signale senden.

Ansonsten musst du dir den Flankenwechsel in ein RS Glied speichern und warten, bis kein Ausgang mehr gesetzt ist. Dein Problem das manche gar nicht kommen bzw. blinken, liegt wahrscheinlich daran, dass die Verknüpfungen oberhalb nicht richtig verriegelt worden sind.

Wenn du es sauber machen möchtest, gehst du schrittweise die RS-Glieder durch und bearbeitest diese. Gesetzt werden müssen diese natürlich zyklisch.

pt
 
Starte einfach mit dem ersten Eingang einen weiteren Timer, der abläuft, wenn ein anderer Eingang ein neues Ereignis auslösen darf. Den zusätzlichen Timer verknüpfst Du mit einer UN-Bedingung.

Ich würde das persöhnlich aber mit einem Taktkeber mit Sekundentakten machen.
Dazu vom auslösenden Eingang den Takter starten, nach der gewünschten Taktzahl jeweils den entsprechenden Ausgang freigeben oder wieder sperren, und erst nach erreichen des letzten Taktes den Takter resetten und erst danach auf einen neuen Eingang reagieren.

Wie sich Dein Programm verhalten soll, falls inzwischen mehrere Eingänge Signal haben, hast Du nicht erwähnt.

Limbo
 
Hallo,

habe es wahrscheinlich falsch erklärt, deshalb versuche ich es nochmal :p.

Jedem Eingang sind zwei Ausgänge zugeordnet. Wenn an einem Eingang ein Signal ansteht soll der dazugehörige Ausgang (einer von den zweien) für ca. 0,4 Sekunden aktiv sein. Ist an dem Eingang kein Signal mehr, soll der zweite Ausgang für ca. 0,4 Sekunden aktiv sein, habe mich im vorherigem Posting verschrieben.

Nun habe ich 10 Eingänge und 20 Ausgänge. Die Ausgänge dürfen jedoch NIE gemeinsam angehen sondern immer nur hintereinander. Wenn ein Eingang ein Signalwechsel meldet, dann darf er den Ausgang erst aktiv setzen, wenn kein anderer Ausgang aktiv ist. Sollte ein Ausgang bereits aktiv sein, sollte es warten und erst danach den Ausgang aktiv schalten.

Ich poste hier mal den Quellcode:
Code:
FB 1

Netzwerk 1:
; Einfaches Einschalten mit Rückmeldekontakt
NAME:	FU_TER  		; Timer 0,4 s
BEZ :	TOUT	AW	; Timerwert Output (IST-Wert)
BEZ :	TST 	EBI	; Start-Timer als Bit
BEZ :	TQ  	ABI	; Ausgang Timer als Bit
BEZ :	TUN 	EBI	; Eingang Rückmeldung
BEZ :	TB  	T	; TimerBaustein

	***

Netzwerk 2:
;

	A	DB 2	; Datenbaustein für globale Zeit Ein

	***

Netzwerk 3:
;

	U(
	U	=TST 	; Timer-Start
	UN	=TUN 
	)
	L	DW 0	; Timer SOLL-Wert
	SI	=TB  	; Timer Ausschaltverzögert
	NOP	0
	L	=TB  
	NOP	0
	U	=TB  
	T	=TOUT	; IST-Wert Ausgabe
	=	=TQ  	; Timer Ausgangsbit

	BE

Code:
FB5

Netzwerk 1:
; Auschalten mit Zeitverzögerung mit Rückmeldekontakt
NAME:	FU_TAVR 		; Timer 0,4 s
BEZ :	TOUT	AW	; Timerwert Output (IST-Wert)
BEZ :	TST 	EBI	; Start-Timer als Bit
BEZ :	TQ  	ABI	; Ausgang Timer als Bit
BEZ :	TU  	EBI	;  Rückmeldekontakt
BEZ :	TBV 	T	; TimerBaustein für Zeitverzögerung
BEZ :	TBA 	T	; TImerBaustein für Ausgang
BEZ :	ZMBI	EBI	; Zwischen Merker Bit

	***

Netzwerk 2:
;

	A	DB 2	; Datenbaustein für globale Zeit Aus

	***

Netzwerk 3:
; Ausschaltverzögerung

	U(
	UN	=TST 
	U	=TU  
	)
	L	DW 4
	SAR	=TBV 
	L	=TBV 
	T	DW 5
	NOP	0
	NOP	0
	U	=TBV 
	=	=ZMBI

	***

Netzwerk 4:
; Ausschalten

	UN	=ZMBI	; Timer-Start
	L	DW 2	; Timer SOLL-Wert
	SI	=TBA 	; Timer Ausschaltverzögert
	L	=TBA 
	NOP	0
	L	=TBA 
	NOP	0
	U	=TBA 	; IST-Wert Ausgabe
	=	=TQ  	; Timer Ausgangsbit

	BE


Hier nun mein Programmbaustein.
Code:
PB10

Netzwerk 1:
;Ausgang 1 / 2 mit Zeitverzögerung

	A	DB 10
	L	DW 0
	T	MW 10

	***

Netzwerk 2:
;
	U	M  10.0
	U(
	U	M  10.1
	U	E  32.0
	O	M  10.2
	)
	=	M  18.0
	***

Netzwerk 3:
;
	U	M  18.0
	UN	A  32.1
	UN	A  32.2
	UN	A  32.3
	UN	A  32.4
	UN	A  32.5
	UN	A  32.6
	UN	A  32.7
	UN	A  33.1
	UN	A  33.2
	UN	A  33.3
	UN	A  33.4
	UN	A  33.5
	UN	A  33.6
	UN	A  33.7
	=	M  18.1
	***

Netzwerk 4:
;
	SPA	FB 1
NAME:	FU_TER  
TOUT:	DW 8
TST :	M 18.1
TQ  :	A 32.0
TUN :	E 33.0
TB  :	T 10
	***

Netzwerk 5:
;
	UN	M  18.0
	UN	A  32.1
	UN	A  32.2
	UN	A  32.3
	UN	A  32.4
	UN	A  32.5
	UN	A  32.6
	UN	A  32.7
	UN	A  33.1
	UN	A  33.2
	UN	A  33.3
	UN	A  33.4
	UN	A  33.5
	UN	A  33.6
	UN	A  33.7
	=	M  18.2
	***

Netzwerk 6:
;
	SPA	FB 5
NAME:	FU_TAVR 
TOUT:	DW 9
TST :	M 18.2
TQ  :	A 33.0
TU  :	E 33.0
TBV :	T 11
TBA :	T 12
ZMBI:	M 18.7
	***

Netzwerk 7:
;
	U	E  32.0
	=	M  19.0

	U	E  33.0
	=	M  19.1

	A	DB 10
	L	MW 19
	T	DW 1

	BE


Im DB 10 stehen im DW 0 ein paar Bits die gesetzt sein müssen um auf die Eingänge zu reagieren.

Im PB 10 Netzwerk 3 und 5 habe ich versucht abzufangen, ob schon ein Ausgang aktiv ist, aber es funktioniert nicht richtig. Es gibt insgesamt 10 dieser Programmbausteine. Ich komme einfach nicht weiter. Habe mich bishierher fast alleine durchgeschlagen, aber bin nun ratlos.

Das Netzwerk 4 im PB 10 schaltet den Ausgang 32.0 und das Netzwerk 6 den Ausgang 33.0.

Wie ich schon erwähnte, jeder Ausgang darf pro Signaländerung nur einmal aktiv sein und jeder Ausgang muß auf den Signalzustand reagieren.

Wenn ihr mir helfen könntet wäre ich sehr dankbar.

Vielen Dank
Ronny
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallöchen

ich hoffe ich hab dich richtig verstanden was du machen willst
du hast 10 eingange wobei du bei der pos bzw negativen einen Ausgang mit 0,4 sek ansteuern musst es dürfen nie mehr als ein Ausgan kommen

ich hab dir das ganze mal als s7 code zusammengestellt wobei eigentlich alles so gehen sollte bis auf die positive und negative flanke die must du dir noch erzeugen ( ich hoffe du weist wie sonst schick ich dir denn code fetzen )

das einzige was bei der lösung nicht ganz schön ist wenn dein eingang kürzer als die 0,4 sek 1 ist kommen beide ausgänge

übrigens ändere die 4 sek auf deine 0,4 sek sonst ist schwer mit testen

ich hoffe ich hab dir damit geholfen

[/code]
 

Anhänge

  • test_impuls.jpg
    test_impuls.jpg
    39,5 KB · Aufrufe: 110
Hallo,

danke erst einmal für die Antwort. Leider habe ich den Code nicht finden können. Kannst du ihn bitte noch einmal posten?

Wenn du mir bitte auch noch den code fetzen für die positive und negative flanke posten könntest? Bin relativ neu in der Programmierung AWL und habe noch nicht den richtigen Durchblick.

Vielen Dank
Ronny
 
@ronny
er hat den code als datei angehängt, die können nur von registrierten usern gesehen weerden...
 
hallöchen

positive flanke negative Flanke

Code:
u e0.0                   un e0.0              // eingang der geprüft werden sollte
un m30.0              un m30.2            // Hilfsmerker für Flanke
=m30.1                 =m30.3              // Flankenmerker = 1 Zyklus ein

u e0.0                    un e0.0              // eingang der geprüft wird
=m30.0                  =m30.2             // Hilfsmerker

ich hoffe der code von meinen beispiel ist selbsterklärend
 
Vielen Dank ersteinmal.

Werde es nachher gleich ausprobieren und wenn ich Fragen haben sollte würde ich mich hier noch einmal melden.

Danke
Ronny
 
Hallo,

kann ich dir erst am Wochenende sagen. War beruflich verhindert, so daß ich es nicht geschafft habe. Werde aber auf jeden Fall mein Ergebnis hier posten.

Danke
Ronny
 
Zurück
Oben