Pointer auf Flankenmerker

MEMO - Matthias

Level-1
Beiträge
44
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr Schlauen,

ich habe ein kleines Prog. geschrieben. Darin nutze ich für einen Flankenmerker:

LAR1 #MerkerDW

u m 100.7 (Taktmerker)
FP M [AR1,P#0.0]
SPBN SP_1
xxx
xxx
SP_1: nop 0

Warum (zumindest in meinem SIMULATOR PLCSIM) durchläuft er die Stelle mit den xxx immer so lange wie der Taktmerker HIGH liefert ???
Eigentlich unerklärlich.
Wenn ich mir den Merker ansehe ist er trotz allem nur immer 1Zyklus EIN.

Gibt es dafür eine Erklärung?

Gruß Matthias

PS: Ich möchte einen Taktbaustein schreiben der ohne Timer und Zähler usw. auskommt. Lediglich ein zu belegender Merkerbereich soll übergeben werden. (Für die notwendigen Flankenmerker, Zwischenwerte etc) Am eingang soll ein Starteingang, die EIN- Zeit, die AUS- Zeit und ein Merkerbereich übergeben werden.
 
Frage mich nicht warum, aber ich habe auch schon die Erfahrung machen
müssen das Flanken-Sprünge nur als SPB funktionieren, und nicht mit SPBN.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin vielleicht koservativ, aber ich schreibe alle Flankenauswertungen als:
U Signal
UN Hilfsmerker
= wasAuchImmer

...


// und am Programmende:
U Signal
= Hilfsmerker

Das hat für mich 2 große Vorteile:
1. Es funktioniert auf jeder SPS, die ich kennengelernt habe.
2. Ich kann die Bedingung
U Signal
UN Hilfsmerker
problemlos mehrfach benutzen.
 
[quote="
LAR1 #MerkerDW
[/quote]

also bei mir funktioniert das.

allerdings so
L #merkerdw
LAR1
 
@MEMO - Matthias

Also wenn ich das richtig verstanden habe, lädt der Befehl
"LAR1" Adreßregister AR1 mit dem Inhalt von AKKU 1.

Somit wird mit
Code:
LAR1 #MerkerDW
zusätzlich zu dem Inhalt des AKKU 1 noch der Inhalt des #MerkerDW addiert.
War das so gewollt?

Gruß
raika
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ponterprobleme

Hall,

vielen Dank für eure Antworten. Werde es heute noch probieren.
Zum einen meinen Fehler mit dem laden des AR1, zum anderen der Hinweiß mit den bestehenden Prob. bei Flankensprüngen SPBN.
Naja - würde mich freuen wenn's klappt.

Mfg

Matthias
 
spbn funktioniert ganz sicher. ich mache alles damit, seit Jahren.

LAR1 #MerkerDW Ist eigentlich OK es wird direkt in Register geladen, aber ich mache es eigentlich auch immer über den Akku.

Ich vermute, dass das MerkerDW irgendwo nicht beschrieben wird.

Ich würde auch einen FB vorschlagen, da hat man statische Variablen und bracht nicht mit den Merkern rumspielen wie zu S5 Zeiten.

Gruß, pt

edit: Aussage über MerkerDW geändert
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welches Problem ?

Hallo,

ich glaub ich habs nicht richtig verstanden........ :?

Welches Problem bekommst du wenn du den Baustein mehrfach aufrufst?

Grüßle
 
Hallo Matthias,

ich sichere den Inhalt vom AR1 bei solche Aktionen am Anfang des Bausteins, und restauriere es am Ende wieder.


Code:
//*** AR1 sichern
      TAR1  #TEMP_AR1
      SET   
      SAVE  

//*** Programm
...

//*** AR1-Register wiederherstellen
      LAR1  #TEMP_AR1
      BE


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Roy,

sorry, das Initialisieren des Bi-Bits ist natürlich nicht notwendig und hat mit dem Problem von Matthias auch nichts zu tun. Ich habe es nur versehentlich mit kopiert (musste schnell gehen, in der Mittagspause).


Gruss, Onkel
 
Hallo Onkel,

sorry, das Initialisieren des Bi-Bits ist natürlich nicht notwendig und hat mit dem Problem von Matthias auch nichts zu tun. Ich habe es nur versehentlich mit kopiert (musste schnell gehen, in der Mittagspause).

Schade eigentlich, ich dachte ich konnte schöne neue Tricks kennenlernen! :D Dass mit dem SAVE habe ich nämlich immer noch nicht so 100% richtig begriffen!

Grüß

Roy
 
Hallo Roy,

das BIE-Bit hat für mich eigentlich keine große Bedeutung. Soweit ich weiß, versorgt es aber den ENO-Ausgang von Bausteinen - vorwiegend für KOP/FUP interessant. Daher initialisiere ich es meist auf "high". Tritt im Baustein ein Bearbeitungsfehler auf, so kann man es auf "low" setzen und den Baustein verlassen. Systemfunktionen arbeiten wohl auch so. D.h. sie setzen das BIE-Bit auf "low" wenn ein Fehler auftrat. Über den EN/ENO-Mechanismus kann die Bearbeitung des weiteren Programms (Bausteinaufrufe) beeinflusst werden.

Vielleicht erklärt das noch mal jemand etwas genauer.
Siehe auch online-Hilfe zu SAVE und BIE.

Gruss, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Onkel,

Siehe auch online-Hilfe zu SAVE und BIE.

Die Theorie kenne ich eigentlich, nur ich bin nie auf irgendwas gestoßen, wo ich das Gefühl hatte, dass ich es irgendwie sinnvoll einsetzen konnte (oder müsste).

Ich habe bislang Projekte gehabt wo allzu viel Fehlerüberwachung nicht nötig war.

Vielleicht ändert sich das irgendwann. Es hat lange genug gedauert bevor ich es endlich begriffen hatte, wie man Lokalvariablen sinnvoll einsetzt!:D

Gruß

Roy
 
Problembeschreibung

Hallo Maddin,

das Prob. ist, dass die "Timer" nicht mehr korrekt arbeiten, sobald der Baustein/ die FC mehr als einmal aufgerufen wird. Nur warum ?


Matthias
 
Indem er die Timer als "IN" Parameter übergibt, dann soll es egal sein wie oft er die FC aufruft (vorausgestzt er gibt unterschiedliche Timer für jeden Aufruf vor).
 
Zurück
Oben