Kleines Programm für eine S7-200 CPU 212

Tompson

Level-1
Beiträge
40
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe ein kleines Programm zu schreiben, kenn mich aber nur ein wenig mit einer S7-300 aus. Ich hatte gehofft, dass mein Wissen auch für eine S7-200 reicht, aber dem ist leider nicht so.

Ich habe eine CPU212 und brauche ein kleines Programm, dass immer abwechselnd einen Ausgang für 40s und einen anderen für 15s setzt. Sonst nichts. Keinen Einschalter oder so. Sobald die CPU an ist und hochgefahren ist sollen die Ausgänge abwechselt schalten.
Außerdem würde ich einfach alle 6 Ausgänge parallel schalten, also Q0.0, 0.1 und 0.2 sind von Sekunde 0 bis 40 aktiv und Q0.3, 0.4 und 0.5 sind danach von Sekunde 40 bis 55 aktiv. Und dann wieder von vorne.

Kann ich eigentlich an die Ausgänge direkt 2x 80W/230V hängen? Sollte doch eigentlich gehen, oder?

Vielen Dank für eure Hilfe.

Gruß
Tompson
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie weit bist du denn mit dem Programm??Wo hakt es genau?Du benötigst doch nur 2x TON um dir nen "Blinker" zu basteln.
Was für ne Bestellnummer ist es denn , dann kann man mal ne aussage über die schaltleistung treffen
 
Ich habe eine CPU 212 mit der Bestellnummer 6ES7 212-1BA01-0XB0. Laut Datenblatt kann ich da an die Relaisausgänge 230V mit einem Laststrom von 2A anschliessen. Sollte also passen. Oder?
Da ich gerade im Büro bin und meinen ersten Versuch zu Hause habe, kann ich gerade da nichts zu sagen. Außer ich fang noch mal von vorne an. :confused:
Aber viel habe ich noch nicht. Wie gesagt, ich habe Null Ahnung.
 
Hallo ,
was schaltest du denn mit dem Ausgang? Wenn es ohmsche Lasten sind, ist es OK.
Mal davon abgesehen, würde ich allerdings Koppelrelais dazwischen setzen, da wenn doch mal ein Ausgang defekt ist(ohne Koppelrelais), du gleich die ganze Steuerung tauschen müsstest.
Wie weit bist dud mit deinem Programm?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also an den Ausgängen hängt jeweils eine 80W Glühbirne. Sollte also klappen.

Ich hatte mir halt angeschaut, wie es für die S7-300 zu programieren wäre. Da hatte ich folgendes Programm:

Set
= M0.0

U M0.0
UN T2
L S5 T#40s
SI T1

UN T1
L S5 T#15s
SI T2

U T1
= A0.0
= A0.1
= A0.2

U T2
= A0.3
= A0.4
= A0.5

Als ich dann gesehen habe, das es gar keine Impulse in der S7-200 gibt, war ich ein wenig Ideenlos. Wie gesagt, Programieren war nicht eine Stärke und habe ich auch nie gerne gemacht.
 
Vergesse SI !!
-> Einschaltverzögerung TON !!!
dann gegenseitig einsetzen
Darauf achten welche Zeit du nimmst (F1). Ich glaube T6,T7 haben einZeitraster von 100ms (fest). d.h. Wert +10 am Eingang =1Sekunde
 
Bei der S7-200 bzw. beim MicroWin fangen die Netztwerke nie mit einer Verknüpfung sondern immer mit Laden LD an.
Negation kann man genau wie beim UND/ODER bei der S7-300 anhängen - z.B. LDN.

Was ich bei der S7-200 schön finde, es gibt Sondermerker. So z.B. der SM0.0 - der ist immer HIGH, so daß Du auf Dein erstes Netzwerk komplett verzichten kannst.

Die Timer in der S7-200 funktionieren etwas anders. Über die Nr. des Timers legst Du Funktion und Zeitbasis fest, der Zeitmultiplikator ist dann ein Integer-Wert:
MicroWin Hilfe schrieb:
NETWORK 1
// Die Zeit T37 mit einer Auflösung von 100 ms läuft nach (10)100 ms oder 1s ab
// E0.0 EIN = T37 aktiviert, E0.0 AUS = T37 deaktivieren und zurücksetzen
LD E0.0
TON T37, 10

NETWORK 2
// Das Bit T37 wird von der Zeit T37 gesteuert
LD T37
= A0.0

Das es kein Impuls gibt hast, Du ja schon bemerkt. In Deinem Fall würde ich wieder auf einen Sondermerker zurück greifen - den SM0.5. Das ist ein Sekundentakt. Mit dem würde ich einen Zähler vorwärtszählen lassen, in Deinem Fall bis 55, dann soll er sich über seinen Bitwert selbst zurücksetzen. Für die ersten Ausgänge vergleichst Du dann den Zählwert des Zählers auf kleiner 40 (bzw. größer gleich 40), für die anderen kannst Du auch vergleichen oder die ersten Ausgänge negieren.
EDIT: Sorry, "Kleiner als" gibt's bei der 212 (noch) nicht, also auf "Größer gleich" und dann mit NOT für die ersten Ausgänge vergleichen oder gleich die zweiten damit zuweisen und für die ersten dann negieren.


Wie immer, findest Du in der Hilfe weitergehende Infos zu den einzelnen Funktionen, am Besten über die Kontexts der Funktionen aufrufen.


Dann jetzt Dein Programm noch mal anpassen, hier posten und Dir wird weitergeholfen.;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also mit viel Quälerei habe ich jetzt folgendes Programm geschrieben. Leider kann ich es nicht testen, da ich an meinem Rechner keine COM-Schnittstelle und auch keinen USB auf Com Adapter habe. Daher muss ich das alles im Trockenen probieren und hoffe, wenn ich zu meinem Spezl mit dem Com Anschluss fahre, dass das Programm dann läuft. :)

Also folgendes habe ich bisher geschafft:

NETWORK 1
LD SM0.5 //Taktmerker für 1s
LD Z0 //Rücksetzen, wenn 55 erreicht ist
ZV Z0, +55

LDW<= MW2, +40 //wenn der Zählerwert größer als 40s ist, wird der Merker gesetzt
= M10.1

U M10.1 //Ausgang 1 für 15s gesetzt
= A0.0

UN M10.1 //Ausgang 1 für 40s gesetzt
= A0.1

Allerdings bin ich mir sicher, dass das so nicht klappt, da mir die Zuweisung vom Zählerausgang auf das Merkerwort MW2 noch fehlt. So kenne ich es zumindest aus der S/-300. Habe aber keine Tipps in der Hilfe gefunden.
Mit
LD Z0
= MW1
hat es nicht geklappt. :confused:

Ist das alles kompliziert!!

Muss ich eigentlich der CPU auch noch irgendetwas anderes sagen? Also z.B. das der SM0.5 1s haben soll?

Oder muss ich dann nur das Programm übertragen???

Danke schon mal.
 
Ich gebe Dir jetzt einen gut gemeinten Rat ohne dir irgendwas zu wollen.

Du hast selbst gesagt, Du hast "Null Ahnung". Ganz bei Null bist Du ja nicht. Das sind eigentlich ganz gute Voraussetzungen, um die Aufgabe mit etwas Selbststudium zu lösen.

Genau in diesem Punkt finde ich Deine Herangehensweise falsch. Auch wenn Du hier richtigerweise dazu ermutigt wurdest, einen Anfang zu machen um dann Hilfe zu bekommen... Warum verweigerst Du Dich denn dagegen mal eine halbe Stunde mit Lesen zu verbringen? In dem S7-200 Systemhandbuch auf das ich verlinkt habe, findest Du doch die Antwort auf Deine Frage, wie die Zähler behandelt werden. Nach nicht einmal 1 Minute mit gezielter Suche war ich auf Seite 139 des Dokuments. Das hättest du auch geschafft...
 
Also ich habe mich ja damit beschäftigt und gesucht. Und auch länger als eine halbe Stunde. Für diese paar Zeilen habe ich 90min gebraucht. Den Link von dir habe ich mir natürlich auch angeschaut, aber neben Zertifikaten nur das Systemhandbuch der S7-200 gefunden. Und das habe ich vor mir liegen. Und da habe ich weder im Inhaltsverzeichnis unter Zähler noch sonst wo etwas gefunden.
Es ist nun mal leider immer so, wenn man sich nicht damit auskennt, findet man die Dinge auch nicht so schnell. Und irgendwann verzweifelt man auch ein wenig.
Wenn ich die F1 Taste drücke, kommt übrigens auch keine Hilfe, die mir etwas gebracht hätte.
Aber egal.

Trotzdem bin ich noch nicht sicher, das das so geht.

LD SM0.5 //Sekundentakt
LD E0.1 //Immer 0, daher nie zurückzählen
LD Z48 //wenn der zweite Zähler bei 15 ist, wird er zurückgesetzt.
ZVR Z47, +40

LD SM0.5 //Sekundentakt
U Z47 //zählt nur, wenn der andere Zähler schon bei 40 war.
LD E0.1 //Immer 0, daher nie zurückzählen
LD Z47 /zurücksetzten bei 15
ZVR Z48, +15

U Z47 //Ausgang 1 für 40s gesetzt
= A0.0

U Z48 //Ausgang 1 für 15s gesetzt
= A0.1

Network
MEND

Klappt das so???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum benutzt Du Vorwärts/Rückwärtszähler?
Spielt zwar für die Zählfunktion keine Rolle, aber der richtige Zähler wäre eben ein reiner Vorwärtszähler.

Bei dem Wechselspiel der Zähler gibt es noch einen Fehler. Der Zähler Z48 wird nicht korrekt zurückgesetzt. Am besten verwendest Du "LDN Z47" als Rücksetzbefehl.
Was die korrekte Syntax für AWL in S7-200 angeht: Dazu kann ich jetzt nichts sagen. Die 200-er nutze ich normal nicht, und wenn doch dann nur mit KOP.

Weiter solltest Du die Zuweisungen für die Ausgänge noch einmal überdenken. Das funktioniert noch nicht wie gewünscht. Überleg mal, wann der Z47 bzw. Z48 an ist!?!
 
...
Also folgendes habe ich bisher geschafft:

Code:
NETWORK 1
LD SM0.5 //Taktmerker für 1s
LD Z0 //Rücksetzen, wenn 55 erreicht ist
ZV Z0, +55

NETWORK 2
LDW<= MW2, +40 //wenn der Zählerwert größer als 40s ist, wird der Merker gesetzt
= M10.1

NETWORK 3
U M10.1 //Ausgang 1 für 15s gesetzt
= A0.0

NETWORK 4
UN M10.1 //Ausgang 1 für 40s gesetzt
= A0.1

Allerdings bin ich mir sicher, dass das so nicht klappt, da mir die Zuweisung vom Zählerausgang auf das Merkerwort MW2 noch fehlt. So kenne ich es zumindest aus der S/-300. Habe aber keine Tipps in der Hilfe gefunden.
Mit
LD Z0
= MW1
hat es nicht geklappt. :confused:

Ist das alles kompliziert!!
...
Ich hab' mal die Netzwerke getrennt, zur besseren Erklärung, und außerdem in CODE eingebettet, zur besseren Lesbarkeit. Das solltest Du auch machen.

Nein, Dein Programm war hier in der ersten Stufe eigentlich fast fertig bis auf eine Stelle, wie Du festgestellt hast. Deswegen verstehe ich nicht, warum Du das wieder verworfen hast und jetzt mit 2 Zählern arbeiten möchtest, was es doch nur komplizierter macht.

Zähler haben bei der S7-200 drei Funktionen:
1. Der eigentliche Zähler, wie Du ihn im Netzwerk 1 benutzt.
2. Einen Bitwert, wie Du ihn ebenfalls im Netzwerk 1 zum Rücksetzen des Zählers benutzt und der durch Erreichen des Vorgabewertes gesetzt wird.
3. Einen Zählwert, der einer Integervariable entspricht.
Alle 3 werden durch Angabe der gleichen Zählernummer (Z0) benutzt und vom Programm durch die verwendete Funktion selbständig selektiert.

Das bedeutet, dass Du gar nicht den Umweg über ein Merkerwort gehen zu brauchst und im Netzwerk 2 direkt den Zähler vergleichen kannst.

Wenn Du das trotzdem machen willst, geschieht das genau wie bei der S7-300 über eine "Bewegung" ;).
Das wäre dann die zweite Stufe - am Beginn die 40s und 15s zwei Variablen zuweisen, daraus den PV-Wert des Zählers in eine dritte Variable berechnen und den Vergleich zwischen Zähler und einer der ersten Variablen durchführen.
Aber erst mal den ersten Schritt.



...
Muss ich eigentlich der CPU auch noch irgendetwas anderes sagen? Also z.B. das der SM0.5 1s haben soll?
Oder muss ich dann nur das Programm übertragen???
...
Die Sondermerker sind vorgegeben, da brauchst Du (erst mal) nichts einstellen.



PS: Mehr Ausgänge mußt Du übrigens auch noch wieder zuweisen:
...
Außerdem würde ich einfach alle 6 Ausgänge parallel schalten, also Q0.0, 0.1 und 0.2 sind von Sekunde 0 bis 40 aktiv und Q0.3, 0.4 und 0.5 sind danach von Sekunde 40 bis 55 aktiv.
...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@JoopB,

was lernt er daraus? Wenn er was anpassen muss, weiß er nicht, was er da geschrieben hat.
Wir hätten es uns auch leichter machen können, aber er ist doch auf einem guten Weg und hat's fast alleine geschafft.

Es gibt ein altes Sprichwort: „Gib einem Mann einen Fisch und er kann für einen Tag essen. Aber zeig' ihm wie man angelt und er kann jeden Tag essen.“
 
Zuletzt bearbeitet:
Kann man auch anders sehen. Ich z.B. lerne aus guten Programmbeispielen Anderer. Wenn ich da was finde was mir richtig gut gefällt dann versuche ich nicht mit aller Kraft was Eigenes zu erfinden sondern verwende das "Gelernte".
 
Den Vorwärts/Rückwärtstzähler habe ich nur genommen, weil in dem Systemhandbuch nur ein Vorwärts- und ein Vorwärts-/Rückwärtszähler beschrieben ist. Und da ich bei dem Projekt nie in Gefahr laufen werden, dass ich die CPU überlaste, war es mir egal. ;)

Wie sieht es denn so aus? Klappt das?

NETWORK 1
LD SM0.5 //Taktmerker für 1s
LD Z0 //Rücksetzen, wenn 55 erreicht ist
ZV Z0, +55

NETWORK 2
LDW<= MW2, +40 //wenn der Zählerwert größer als 40s ist, wird der Merker gesetzt
= M10.1

NETWORK 3
LD M10.1 //Ausgang 1 für 40s gesetzt
= A0.0

NETWORK 4
LDN M10.1 //Ausgang 1 für 15s gesetzt
= A0.1

Network
MEND

:roll:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Wie sieht es denn so aus? Klappt das?

Code:
NETWORK 1
LD     SM0.5                //Taktmerker für 1s
LD     Z0                //Rücksetzen, wenn 55 erreicht ist
ZV     Z0, +55

NETWORK 2
LDW<=  [COLOR=#800000]MW2[/COLOR], +40            //wenn der Zählerwert Z0 ([COLOR=#800000]nicht MW2!) [/COLOR]größer als 40s ist, wird der Merker gesetzt
=      M10.1

NETWORK 3
LD     M10.1                //Ausgang 1 für 40s gesetzt
=      A0.0

NETWORK 4
LDN    M10.1                //Ausgang 1 für 15s gesetzt
=      A0.1

[COLOR=#ff0000]Network 
MEND [/COLOR]//Hä?
...
Jetzt hast Du wieder Dein erstes Programm bis auf das hinzugefügte Netzwerk am Schluß, wofür auch immer Du Dir das gedacht hast.

Dein Problem mit dem Vergleich hast Du aber noch nicht gelöst. Du möchtest den Zähler Z0 mit 40 vergleichen und nicht das Merkerwort MW2!


Übrigens in der Symbolleiste zum Antworten gibt es einen Button mit 'ner Raute (#) drauf. Damit kann man Programmcode zur besseren Hervorhebung einbetten, oder man schreibt selber code bzw. /code in eckigen Klammern vor bzw. hinter das Programm.
 
Kann man auch anders sehen. Ich z.B. lerne aus guten Programmbeispielen Anderer. Wenn ich da was finde was mir richtig gut gefällt dann versuche ich nicht mit aller Kraft was Eigenes zu erfinden sondern verwende das "Gelernte".
Ja, aber du kannst schon angeln und willst dadurch Deine Techniken optimieren!

Er hat bis dato gerade mal 'ne Angel gesehen und ist froh, wenn er weiß, wo vorne und hinten ist.
 
Ja hatte ich übersehen.

Code:
NETWORK 1
 LD     SM0.5                //Taktmerker für 1s
 LD     Z0                //Rücksetzen, wenn 55 erreicht ist
 ZV     Z0, +55
 
 NETWORK 2
 LDW<=  Z0, +40            //wenn der Zählerwert größer als 40s ist, wird der Merker gesetzt
 =      M10.1
 
 NETWORK 3
 LD     M10.1                //Ausgang 1 für 40s gesetzt
 =      A0.0
 
 NETWORK 4
 LDN    M10.1                //Ausgang 1 für 15s gesetzt
 =      A0.1
 
 Network 
 MEND


Jetzt hast Du wieder Dein erstes Programm bis auf das hinzugefügte Netzwerk am Schluß, wofür auch immer Du Dir das gedacht hast.

In der 1-Stundenfibel. die bei der SPS dabei war, steht drin, dass man eine Programmendanweisung braucht. Und in AWL heißt die "MEND"! Daher schreib ich die. Brauche ich die nicht?
 
Zurück
Oben