Analogausgang ansteuern mit 2 Tastern

Detto

Level-2
Beiträge
189
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich stehe etwas auf dem Schlauch und könnte Hilfe von Fachleuten gebrauchen.
Ich hoffe, dass ich alle relevanten Angaben sofort richtig eingestellt habe.
Also als neuer S7-User habe ich folgende „Herausforderung:“

Ich möchte Analoge Ausgänge mit Tastern im Tippbetrieb ansteuern. (keine Regelung)
Also einen Taster für – am Ende der Nahrungskette – Ventil etwas mehr auf und der andere Taster für Ventil etwas mehr zu.
Das Ganze dann 3 mal – aber um es nicht zu verkomplizieren erst einmal einfache Variante,
ich möchte das „verstehen“ nicht die Lösung.

Ich habe auch schon einige hilfreiche Tipps auf der Siemens Seite gefunden.
In diesem Fall S7-200 Tip009a.

Mein Grundgedanke ist, mit dem einen Taster zähle ich einen Merker um Betrag X hoch und
mit dem anderen Taster zähle ich den Merker um Betrag X runter.
Den Wert des Merkers übergebe ich an den analogen Ausgang und der steuert mein Ventil (4-20mA).
Das ich das Ganze dann nachher im Zahlenbereich noch begrenzen muss und Sicherheiten einbauen muss ist alles klar.
Es geht erst einmal um das GRUNDSÄTZLICHE….

Sytem:
S7-200
CPU 224XP
Software S7-Micro/WIN

Allerdings habe ich ein (wahrscheinlich syntax) Problem.
Hier mal der Quellcode, wobei ich anmerken möchte, dass das alles erst mal auf meinem Schreibtisch als Testversion liegt,
um überhaupt mal ein Gefühl für S7 zu bekommen.
Ich weiß, dass man das später mit Unterprogrammen programmieren soll usw.
Ich habe jetzt damit begonnen, den Tip009a für mich umzubauen, da ich nur positive Flanken nutzen möchte.
Soweit ist alles klar.

Code:
  Netzwerk 1 (alle Merker auf Null setzen einmalig 
mit Sondermerker SM0.1 um defineirte Zustände zu erhalten)
   
  LD     Erst_Zykl_ein:SM0.1         // SM0.1 laden.
  MOVW   +0, Steigende_Flanke:MW1
  MOVW   +0, Fallende_Flanke:MW3
  MOVW   +0, Summe:MW5
   
  Netzwerk 2
  LD     E0.6                        // E0.6 laden.
  EU                                 // Bei einer steigenden
                                     // Flanke an E0.6,
  +I     +1000, Steigende_Flanke:MW1 // MW1 um 1000 erhöhen.
  MOVW   Summe:MW5, Steigende_Flanke:MW1
Mit LD E0.7 kann ich dann den Merker runterzählen. Usw.

Wenn ich mir nun die dazugehörige „Programmstatus Tabelle“ anschaue, dann sehe ich, wie LD E0.6 beim Tippen umspringt ABER
in der Zeile „+I“ – also dort wo ich eigentlich zählen möchte zeigt die Tabelle OP1 = 1000 (was ja meiner Konstanten entspricht) und OP2 bleibt beharrlich auf 0 …..
Das gleiche eine Zeile tiefer beim Übergeben an den Merker MW5
(war mal so ein Gedanke, dass ich das Ergebnis erst einem neuen Merker müsste.
Wobei die ONLINE HILFE ja sagt, dass bei „ +I IN1+OUT=OUT wäre…..)

Fragen:
1. Wo ist mein Gedankenfehler?
2. Welche Größe sollte der Merker haben? Sollte er schon in der Testphase in WORD-Breite sein oder reicht da byte?

3. Noch ne andere Baustelle:
Was bedeuten die „#“ Zeichen z.B. in folgender Zeile (Tipp 38 Übergabe an Analog OUT)

z.B.
MOVR #OSH:LD6, #Ausgang:LD14 // Berechneten Ausgangswert in Ausgang
// übertragen


So ich hoffe, ich habe mich verständlich ausgedrückt bei meinem kleinen Problem.

Danke für die Hilfe
Detto

Nachtrag hab das ganze mal mit Code "verschönert"
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So ungefähr,

Code:
NETWORK 1
LD     E0.6
EU
+I     +1000, MW1


Hallo Verpolt,
das steht da ja so....
Nur ist halt steigende_Flanke dem Merker MW1 in der symbolisierten Sprache zugeordnet.

So hatte ich mir das ja eigentlich gedacht. die positive Flanke (EU = WAHR)
sagt: zähle MW1 um 1.000 hoch.

Nur wird das nciht ind er Tabelle angezeigt.
 
Hallo,

so ich bin einen Schritt weiter:
(versuche das mal ordentlich mit "CODE" hinzubekommen....
Code:
LD     E0.6                        // E0.0 laden.
EU                                 // Bei einer steigenden
                                   // Flanke an E0.0,
+I     +3200, Steigende_Flanke:MW1 // MW1 um 1 erhöhen.
MOVW   Steigende_Flanke:MW1, AAW6

LD     E0.7                        // E0.1 laden.
EU                                 // Bei einer steigenden 
                                   // Flanke an E0.7,
+I     -3200, Steigende_Flanke:MW1 // MW1 um 1 erhöhen.
MOVW   Steigende_Flanke:MW1, AAW6
Bitte die Kommentare ignorieren....

Was ich nicht verstehe ist, ich arbeite nur im OB1, d.h. doch ich habe nur globale Variablen oder?

Wenn ich jetzt LD E0.6 (für höher) und LD E0.7 (für niedriger) in zwei verschiedenen Netzwerken programmiere dann klappt das nicht.

WIESO???
Denn nach meinem Verständnis müsste doch der Wert von MW1 in beiden Netzwerken (im OB1) vorhanden sein oder...????:???:


STOP - vergesst das vorher geschriebene:
Ich habe das jetzt mal in ein "sauberes" neues Projekt kopiert und siehe da, es geht.
Zwischen rauf und runter gibt es noch eine Berechnung mit LDW - da liegt wohl der Fehler....




Der Wert 3200 ist nur so groß, damit ich beim testen was sehe. Jetzt komm ich zum nächsten Problem - der elfte Taster da springt mein Wert ja um auf -10V ....


Ich würde das jetzt als Unterprogramm anlegen - oder?
Etwa so:
LD E0.6 (TASTER) ruft Unterprogramm auf
Das zählt den Wert hoch
überprüft diesen und begrenzt Ihn bzw. nachher die Skalierung auch für 4 - 20mA usw.
Schickt den Wert an den analogen Ausgang
und springt zurück in den OB1

Das gleiche dann als eigenständiges Unterprogramm für taster ZU

Wären dann 6 Unterprogramme für 3 Ventile

Ist das so ordentlich programmiert??

Detto
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
benutzt du noch andere MW´s neben MW1?
Vielleicht noch MW0,MW2,MW3,MW4,MW5,...usw.?
du solltest dir mal die Speicherbelegung ansehen.
MW0, MW1, MW2...usw überschneiden sich
verwende MW0,MW2,MW4,MW6...usw.

mach dir ein unterprogramm das die funktion erfüllt inkl. Parameterübergabe über die Schnittstelle (IN, OUT, IN/OUT).
ruf es für jedes ventil mit anderen parametern auf.
Falls deine cpu den parametrierten unterprogrammaufruf nicht unterstützt
musst du drei unterprogramme verwenden. (CPU224 müsste aber gehen)
diese drei unterprogramme sind identisch bis auf die "ein- und ausgangsvariablen"
- sprich für jedes unterprogramm andere tastereingänge und MW´s
 
Guten morgen,

@ Winnmann
natürlcih springt beim überschreiten der Wert von +10V auf -10V ...
Die Begrenzung ist ja die nächste Aufgabe....

@ Sieben
Die oben aufgeführten Merker sind noch Altlasten und werden in dem Testprogramm nicht benutzt.
Wie Du am Ende meines Beitrages lesen kannst, habe ich ja schon geschrieben, dass ich 6 Unterprogramme schreiben werde.
Ist im Prinzip ja nur einmal schreiben udn dann 5 mal mit den passenden Variablen kopieren.....

@ ALL

Ich habe jetzt den Tastereingang UND mäßig mit einem Taktmerker, so dass es man den Taster nur betätigen muss und der Ausgang "langsam" Ansteigt....

Jetzt muss ich nur noch die Begrenzung und den "lebenden Nullpunkt" der 4 - 20mA umsetzen. Weil Regelungstechnikewr ja nciht mit 0-10V arbeiten .... (igitt)

Grüße
Detto
 
Hallo zusammen,

ich bin jetzt etwas weiter…

Damit keine Fragen aufkommen:
- S7 – 200
- CPU 224 XP

Ich fasse den jetzigen Stand der Dinge noch mal kurz zusammen

Ich möchte diverse Stellglieder mit 4..20mA ansteuern.
Diese sollen über Taster angesteuert werden. Sowohl in positiver als auch negativer Richtung.
Damit man nicht 200 mal auf den Taster drücken muss, habe ich den Taster mit einem Taktgeber verknüpft.
Vielen Dank nochmal an "Junior" der Taktgeber ist "coool"
So sollte der Analogausgang kontinuierlich verändert werden können.
Also Anlagen-Fahrer drückt und hält den „AUF“ Taster und das Stellglied fährt solange bis der Taster nicht mehr gedrückt wird.

Bitte keine Diskussionen über den Taktgeber, die Schrittweite usw. Auch das ich unterschiedliche Timer und Merker benutzen muss ist klar.
Das kommt alles später beim Finetuning, da es sich auch um unterschiedliche Stellglieder handelt. Ich habe mit der Begrenzung ein Verständnisproblem und habe mal den Code beigefügt.
Darauf ziehlt auch meine Frage:

Code:
LD     E1.4
LDN    T37
U      E0.0
TON    T37, 8
UW>    T37, 4
=      M5.1
U      E1.4
U      M5.1
+I     +10, MW11
UW>    MW11, 32000
MOVW   32000, MW11
MOVW   MW11, AAW0

Am Anfang frage ich diverse Taster ab und starte den Timer
Dann zähle ich den Merker (in diesem Fall MW11) hoch bzw. runter bei MINUS - Danke nochmal für den Tipp mit dem überschneiden der Merker!
Wobei ich nicht weiß wie man sich den Speicherbereich anschaut
icon8.gif

und jetzt kommt es!!!
icon5.gif



Dann möchte nein MUSS ich das Wort auf den Bereich 6.400 und 32.000 begrenzen.
Dazu frage ich bei Plus ab ob es größer 32.000 ist und falls JA – also wenn VKE „true“ ist soll der Wert 32.000 in den Merker MW11 übergeben werden (und später in AAW0).

Falls nicht, also wenn MW11 kleiner 32.000 ist soll er ganz einfach den Wert an den analogen Ausgang AAW0 geben.


Ich weiß, dass man das sauberer mit einem Aufruf programmieren kann, aber es ist ein sehr
überschaubares Projekt bis jetzt und es ist auch meine erste S7 Programmierung, von daher erstmal langsam laufen lernen. Das ist ja nicht in STEIN gemeißelt….

Da die S7 jetzt im Labor ist und ich den restlichen kram im Büro programmiere, also nur auf Papier und aus Büchern frage ich lieber mal, die die sich mit so was auskennen.

Ich hatte das bis zur +I Zeile schon mal programmiert und auch getestet (siehe OBEN), also das „zählen klappt. Es geht mir um die Begrenzung.

Besten Dank für alle konstruktiven Tipps und Erklärungen.

Detto
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Zuerst noch ein paar Tipps:

1. Versuche möglichst, symbolisch zu programmieren. Die absoluten Adressen machen den Code schlecht lesbar. (Dazu in der Variablentabelle aussagekräftige Symbol(-Namen) zuweisen
2. Merkerwörter sollten nach Möglichkeit IMMER "gerade Adressen" sein. (MW2, MW4, ...) Das verhindert versehentliche Überschneidungen, was ein häufiger Anfängerfehler ist und oft zu kangen Fehlersuchen führt.
3. Die Begrenzung würde ich schon "vorher" machen:

Vergleichen ob MW11 <= 31990, dann +10, sonst nicht mehr erhöhen.
 
Zuletzt bearbeitet:
Zuerst noch ein paar Tipps:

1. Versuche möglichst, symbolisch zu programmieren. Die absoluten Adressen machen den Code schlecht lesbar. (Dazu in der Variablentabelle aussagekräftige Symbol(-Namen) zuweisen
2. Merkerwörter sollten nach Möglichkeit IMMER "gerade Adressen" sein. (MW2, MW4, ...) Das verhindert versehentliche Überschneidungen, was ein häufiger Anfängerfehler ist und oft zu kangen Fehlersuchen führt.
3. Die Begrenzung würde ich schon "vorher" machen:

Vergleichen ob MW11 <= 31990, dann +10, sonst nicht mehr erhöhen.

Hallo Tigerente,

vielen Dank für die Hinweise.
zu 1. Ja werde ich machen, jetzt komme ich damit aber noch klar
zu 2. Das mit den MW wurde vorher schon mal angemerkt und wird
demnächst von mir beachtet werden. Also MW 10 MW 12 usw....
zu 3. Das mit dem VORHER Vergleichen ist ein guter Tip. Und wie erwähnt, muss da auch nicht bis auf 32.000 ausgereizt werden....

Meine Frage ging aber dahin, ob das wirklich so einfach geht, wie ich es im Code ab "+I" geschrieben habe. Ich meine das mit der Begrenzung ...

Code:
UW<=    MW11, 31990 
+I     +10, MW11 
MOVW   MW11, AAW0

Detto
 
Zuletzt bearbeitet:
Die 200-er Steuerung habe ich erst 2-mal nehmen "müssen". Der Grundgedanke ist schon mal nicht verkehrt.

Bei der 300-er Steuerung muss eine Lade-/Transferoperation ggf. übersprungen werden, weil diese nicht vom VKE abhängig gemacht werden kann. (Operation wird unabhängig vom VKE durchgeführt). Möglicherweise macht die 200-er das genauso.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

so ich bin mit meinem Problem einen Schritt weiter (zum Abgrund)
Der Vollständigkeit halber
S7-200 CPU 224XP und EM232 als Analog OUT.

Hier der Quellcode:

Code:
LD     E2.0                        // Taster Stellung PLUS
LDN    T39                         // Taktgeber
U      E0.0
TON    T39, 4
UW>    T39, 3
=      M3.4
U      M3.4
U      E2.0
+I     +100, MW12                  // Merkerwort RK Haupt-Pfad V111
UW<=   MW12, 32000
MOVW   MW12, AAW4                  // AAW4 Analogausgang

LD     E2.1                        // Taster Stellung MINUS
LDN    T40
U      E0.0
TON    T40, 4
UW>    T40, 3
=      M3.5
U      M3.5
U      E2.1
+I     -100, MW12                  // Merkerwort RK Haupt-Pfad V111
UW>=   MW12, 6400
MOVW   MW12, AAW4
Kurze Erklärung:
Ich frage ein paar Signale ab und wenn der Taster gedrückt wird zählt ein Taktgeber (Code hier aus dem Forum - besten Dank dafür, klappt toll)
icon10.gif

hoch und das Merkerwort zählt wunderbar, der Ausgang gibt die mA in einer
sehr schönen Stufung heraus soweit alles klar.

JETZT KOMMT DAS PROBLEM (IMMER NOCH):
icon8.gif

Eigentlich sollte der Befehl UW<= ja verhindern,
dass das MW12 über 32.000 zählt. tut es aber nicht.

Wenn ich mir die Werte via Programmstatustabelle anschaue, dann passiert im Bereich 32.000 folgendes:
Der Operationswert OP1 in der Tabelle zählt weiter und OP2 bleibt bei 32.000 stehen.
Sobald der Wert über die magische Zahl von 32.700 "zählt" kippt der Analogausgang immer noch.... grrrrrr

Also im Bereich 32.000 bis 32.700 passiert nichts am analogen Ausgang und sobald ich die 32.700 (klar hat was mit dem Wertebereich zu tun usw) überschreite PAFF!!!!!

Wo ist der DENKFEHLER???
WAS mache ich falsch?
WIE kann ich wirklich begrenzen??

Für die konstruktiven Ideen bedanke ich mcih im voraus.

Detto
 
Jetzt erhöhst Du ja doch! -> Dein MW12 zählt weiter hoch, und weil der Wert dann über 32.000 geht, sorgt die Begrenzung "nur" dafür, dass kein Wert auf den AAW4 übertragen wird.

meinst Du das eher so??? (Reihenfolge der Befehle ändern?)

Code:
U      M3.4 
U      E2.0 
UW<=   MW12, 32000 
+I     +100, MW12                       // Merkerwort RK Haupt-Pfad V111 
MOVW   MW12, AAW4
Also erst wenn 3x "wahr" dann zähle hoch???
Probiere ich gleich mal aus...

Nur das mit der Begrenzung stimmt nicht.
Das MW12 wird trotzdem an AAW4 übergeben und bei 32.700+100 -> Paff im Ventil
icon8.gif


Danke aber für den Hinweis. Wenn ich Dich mal motivieren soll, dann sag mir bitte WO ich mit welchem COCKTAIL über welche Wiese laufen soll.
Wenn Du meinst, dass Dich dieser Anblick motiviert... bitte....
icon10.gif
icon10.gif
icon10.gif


Detto
 
Sieht schon besser aus :)

Ich bin motiviert von Deiner Motivation :rolleyes:

Ggf. muss der Befehl

Code:
MOVW MW12,AAW4

aber auch übersprungen werden. Kenne die 200er Steuerung ja nicht so gut.
Bei der 300er müsste man ja auch springen, weil der Transferbefehl unabhängig vom VKE durchgeführt wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Tigerente 1974,

sag mir wo die WIESE ist, ich mach mich nackich!!!!!!

Genial, darf ich Dich GOTT nennen???:ROFLMAO:ROFLMAO:ROFLMAO:ROFLMAO:ROFLMAO:

Es klappt wie SAU!!!!!!

Ich hatte halt noch den ZEILENDREHER von früher drin.

Besten Dank für die Hilfe....

Detto

PS Was darf es denn für ein Cocktail sein??? *ROFL*
 
Hallo Detto,
ich kann jetzt nicht erkennen ob Du die Begrenzung schon hinbekommen hast.
Hier ein Vorschlag von mir.

LD E2.0
LDN T39
U E0.0
TON T39, 4
UW>= T39, 3
= M3.4
U M3.4
U E2.0
+I +100, MW12
LD E2.1
LDN T40
U E0.0
TON T40, 4
UW> T40, 3
= M3.5
U M3.5
U E2.1
+I -100, MW12
UW>= MW12, 32000
MOVW 32000, MW12
UW<= MW12, 6400
MOVW 6400, MW12
MOVW MW12, AAW4

Das MW12 braucht nur einmal am Ende begrenzt werden und dann an den Ausgang
übergeben werden.

Viele Grüße aus Korea.
 
Zurück
Oben