Weitere Probleme
Hallo,
war ein paar Tage unterwegs, und hatte keine Zeit weiter zu probieren...
Nun bin ich wieder bei meinem Projekt. Meinen ursprünglichen Fehler hatte ich gefunden, es lag daran das ich ein MW doppelt genutzt habe.
Jetzt gibt es ein neues Problem (aber nur in REALITÄT, auf meiner Simulation ist alles i.O.)
Also:
Ich habe eine FC geschrieben die als Eingangsarametern die EIN- und die AUS Zeiten eines Takters enthalten. Da ich keine Zähler verwenden wollte habe ich zusätzlich einen Taktmerker der CPU als Eingangsparameter verwendet. Nun ist es es so das ich mittels zählen die Werte abfrage und entsprechend schalte. Zu Begin der Freigabe gibt es noch eine einstellbare Wartezeit bevor die Taktung beginnt. (Soll in einer großen Anlage als Multi- Takter eingesetzt werden, und es hängen große Lasten daran die nicht alle gleichzeitig anlaufen sollen.)
Naja.....
Es gibt erst Probleme wenn der Baustein mehrfach aufgerufen wird, und das obwohl ich in der FC nur mit Pointern arbeite. Die MW die genutzt werden sollen sind ebenfalls in den Übergabeparametern angeführt:
Eingang:
Imp_10tel_Sekunde - Bool (Taktmerker 10tel- Sekunde -> x.0)
Zwei_DW_ab_DW - INT (zB. 80 für MW 80 bis MW 86)
EIN - Bool (Freigabeschalter)
Restart_IMP - Bool (Neustart)
Time_Anl_Delay_10tel_Sek - INT (Anlaufsperre in 10tel Sek)
Time_1_10tel_Sek - INT (EIN- Zeit in 10tel Sek)
Time_2_10tel_Sek - INT (AUS- Zeit in 10tel Sek)
Ausgang:
OUT_1 - Bool (Ausgang)
Programm:
**********
// Übergabeparameter auf 2 DW teilen
// Zu Rücksetzzwecken
L #Zwei_DW_ab_DW
L 8
*D
T #ZW_MD_1
L #Zwei_DW_ab_DW
L 4
+D
L 8
*D
T #ZW_MD_2
// Adressregister Laden
// IN AR1
L #ZW_MD_1
LAR1
// Veränderungen an der Zeit erfassen --> Neustart
// des Zyklus einschl. Anlaufdelay
L #Time_1_10tel_Sek
L #Time_2_10tel_Sek
+I
L MW [AR1,P#6.0]
<>I
= M [AR1,P#0.2] // Zwischmerker Neustart
L #Time_1_10tel_Sek
L #Time_2_10tel_Sek
+I
T MW [AR1,P#6.0] // Zwischenwert Zeit
// Rücksetzen wenn keine Bearbeitung
// Start = 0
U #EIN
SPB SP_1
L L#0
T MD [#ZW_MD_1]
T MD [#ZW_MD_2]
SET
R #OUT_1
S M [AR1,P#0.0] // Hilfsmerker Anlauf
BEB
SP_1: NOP 0
// Rücksetzen wenn Eingang RESTART oder Zeitenänderung
U #Restart_IMP
FP M [AR1,P#0.3]
O(
U M [AR1,P#0.2]
FP M [AR1,P#0.5]
)
SPBN SP_3
L L#0
T MD [#ZW_MD_1]
T MD [#ZW_MD_2]
SET
R #OUT_1
S M [AR1,P#0.0] // Hilfsmerker Anlauf
= M [AR1,P#0.3] // Flankenmerker
= M [AR1,P#0.5] // Flankenmerker
BEB
SP_3: NOP 0
// Anlaufverzögerung
U #Imp_10tel_Sekunde
FP M [AR1,P#0.1]
U M [AR1,P#0.0]
SPBN SP_2
L MW [AR1,P#2.0]
L 1
+I
T MW [AR1,P#2.0] // Zähler Anlaufzeit
SP_2: NOP 0
L MW [AR1,P#2.0]
L #Time_Anl_Delay_10tel_Sek
>=I
R M [AR1,P#0.0]
U M [AR1,P#0.0]
BEB
// Abfrage auf EINZEIT = 0
// (Dauer AUS)
L #Time_1_10tel_Sek
L 0
==I
SPBN SPE0
L L#0
T MD [#ZW_MD_1]
T MD [#ZW_MD_2]
SET
R #OUT_1
S M [AR1,P#0.0] // Hilfsmerker Anlauf
BEB
SPE0: NOP 0
// Abfrage auf EINZEIT > 0
// und AUSZEIT = 0
// (Dauer EIN)
L #Time_1_10tel_Sek
L 0
>I
= #ZW_001
L #Time_2_10tel_Sek
L 0
==I
= #ZW_002
U #ZW_001
U #ZW_002
SPBN SPE1
L L#0
T MD [#ZW_MD_1]
T MD [#ZW_MD_2]
SET
S #OUT_1
S M [AR1,P#0.0] // Hilfsmerker Anlauf
= M [AR1,P#0.3] // Flankenmerker
= M [AR1,P#0.5] // Flankenmerker
BEB
SPE1: NOP 0
// Zählen
U #Imp_10tel_Sekunde
FP M [AR1,P#0.4]
SPBN SP_4
L MW [AR1,P#4.0]
L 1
+I
T MW [AR1,P#4.0]
SP_4: NOP 0
// Vergleichen
L MW [AR1,P#4.0] // Aktuellen Zählwert laden
L #Time_1_10tel_Sek
<=I
= #OUT_1
L #Time_1_10tel_Sek
L #Time_2_10tel_Sek
+I
L MW [AR1,P#4.0] // Aktuellen Zählwert laden
<I
SPBN SP_5
U M [AR1,P#0.3] // Zwischenspeicher Flanke
= #ZW_003
L L#0
T MD [#ZW_MD_1]
T MD [#ZW_MD_2]
U #ZW_003 // Rücksichern Flanke
= M [AR1,P#0.3] // Flankenmerker
= M [AR1,P#0.5] // Flankenmerker
L #Time_1_10tel_Sek
L #Time_2_10tel_Sek
+I
T MW [AR1,P#6.0]
SP_5: NOP 0
Warum kann ich diese FC nicht mehrfach aufrufen ohne Probleme zu bekommen.
Mfg Matthias