Schieberegister mit S7-200

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte gerne ein Schieberegister mit unten aufgelisteten Eigenschaften programmieren, habe aber keine Idee, wie :( !

- Mit 2 Ausgängen (z.B.: A0.0 u A0.1) solle 4 Zustände dargestellt werden:
A1 A0
0 0
1 0
0 1
1 1

Für A0 soll also ein SR mit dem Wert 0011 und für A1 mit dem Wert 0101 programmiert werden.
Ich möchte diese beiden Werte auch rückwärts laufen lassen können. Ich verwende zum Programmieren Step7/Win32 Software und eine S7-200.
Kann mir jemand helfen ???

Besten Dank,
Christoph
 
Da die Ausgangskombinationen ja Binärzahlen sind, geht es
einfacher:
Code:
ADD zaehler,1
mov zaehler,mb0
ld m0.0
st a0.0
ld m0.1
st a0.1

(Hoffe, das ist so richtig, habe nicht oft mit der 200 zu tun)
Im prinzip wird also laufend der Zähler erhöht und die untersten bits auf die Ausgänge kopiert.
So passiert es einmal pro Zyklus.
Wenn Du das von einem Takt abhängig machen, wilst, nur bei einer Flanke des Takts aus führen.
Rückwärtslauf: statt 1 -1 addieren
Hier wir noch ausgenutzt ,das sich die unteen 2 bit immer wiederholen, egal wie hoch der Zaähler steht. Soll er nur 4 Zustände (0-3) durchlaufen, kannst Du auf 4 testen und wenn ja, dann auf 0 setzen.
Beliebige Muster (nach Art programmierbarer Lauflichter) lassen sich am einfachsten über eine Tabelle realisieren.
Prinzip:
der Zähler läuft durch.
Wenn er auf 3 steht, kopierst Du das Muster im 3. Eintrag der Tabelle in die Ausgänge usw.
Das ist flexibler als Schieberegister.[/code]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
"Zottel" hat recht (wie immer). Dein Ausgangsmuster ist weniger Schieberegister, sondern eher Zähler.
Schieben /Rotieren (in S7-200 "slang": SHL_B, SHR_B, ROR_B, ROL_B) besagt das der im Accu vorhandene Wert (Byte, Wort, DW) jeweils um x_Stellen bewegt wird - und beim Schieben "von hinten" mit NULLEN aufgefüllt wird. Beim Rotieren kommt hinten wieder rein was vorne rausfliegt :=> natürlich je nach Richtung.
Gesetzt den Fall du lädts Bitmuster 10110000 (dec_176, hex_0xB0) und rotierst links hättest du im Ausgangszustand A0.0 = 0, Danach A0.0 = 1, dann wieder 0, nächtesmal 1 etc. Und das müsstest du auf alle vier Bits programmieren. So'n Schieberegister ist mehr was fürn "Lauflicht", oder zum Multiplizieren /Dividieren. - Aber gehen würde das aUCH:
***)Dabei werden bei der S7-200 nur die physikalisch vorhandenen Ausgänge angesprochen ... das ist etwas komisch da das PAA eigentlich 128 Bit verwaltet. Wenn du also e.g. nur 4 Ausgänge an der CPU hast und schiebst /rotierst 8mal (ein Byte), biste 2 mal rum !!! ich hab' auch gestaunt. hier ist das bei 'ner 221 jedenfalls so ... (***

Einfacher gehts noch mit INC (inkrementieren). INC_B. Du lädts "0" und erhöhst jeweils (pro Zeitakt, oder Zählerstufe) um 1.



mfg
tobias
 
Vielen Dank für eure Mühe, aber das ist alles noch etwas schwierig für mich, da ich noch ein "Frischling" bin...
Also ich habe jetzt mal die Funktion "Byte links rotieren" ausprobiert und stoße nun auf folgendes Problem:

AWL:
LD E0.0 // den habe ich als "Taktgeber bei pos. Flanke" genutzt
MOVB 85, VB2 // lädt Byte85 (also: 0101 0101) in Speicher VB2
RLB VB2, 1 // soll das Byte um 1 nach links rotieren lassen.

Wenn ich das Programm reinlade, steht im Speicher VB2->0000 0000.
Betätige ich nun meinen Schalter an E0.0 steht 1010 1010im Speicher. Schön und gut bisher. Aber wenn ich jetzt meinen Schalter aus und dann wieder ein schalte, sollte doch nun eigentlich das Muster -> 0101 0101im Speicher stehen, da um "1" nach links rotiert wurde. Es tut sich aber nichts. Warum rotiert der Wert denn nur einmal. er sollte doch eigentlich bei jedem einschalten jeweils um "1" rotieren, oder?

Zweite Frage:
Wie kann ich den Wert z.B. des ersten Bits an A0.0 darstellen, also A0.0 =1 und dann wieder A0.0=0 usw....

Vielen Dank im Voraus
Christoph
 
christoph schrieb:
AWL:
LD E0.0 // den habe ich als "Taktgeber bei pos. Flanke" genutzt
Wie das ? Meiner Meinung nach gibt das solange true, wahr oder 1, wie der E0.0 eingeschaltet ist. Oder gibt es bei der 200 so etwas, dass man eine Flankenerkennung als Eigenschaft des Eingangs parametrieren kann?
Wenn nicht, würde ich sagen, das schreibt in jedem Zyklus wieder 85 rein und rotiert es um 1 solange der Eingang ansteht.
Das Ergebnis ist immer 2*85.
Wenn Du jetzt den Eingang wegnimmst, lädt es weder den Wert
noch rotiert es etwas und das Ergebnis des vorigen Zyklus bleibt im Speicher.
Was Du willst ist wahrscheilich folgendes:
1. Lade beim Start einen Anfangswert
Code:
LD SM0.1  // nur im 1. Zyklus 1 wenn ich mich recht erinnere
 // sonst Handbuch  
MOV 85,VB2
2. Rotiere bei positiver Flanke an E0.0
2a: Erkennen der Flanke:
Code:
LD E0.0
AN M0.0  // voriger Zustand von E0.0
ST M0.1  // nur 1 bei pos Flanke
LD E0.0
ST M0.0  // fürs nächste Mal merken
2b: bei Flanke rotieren:
Code:
LD M0.1
RLB VB2,1
Das muss nicht ganz exakt soo funktionieren, hatte selten mit der 200 zu tun. Daher weiß ich jetzt nich ob man im V-Bereich bits ansprechen kann. Wenn ja
Code:
LD VB2.0
ST A0.0
Wenn nicht über MB als Zwischenspeicher
Code:
MOV VB2.0, MB2.0 //oder was frei ist
LD M2.0 
ST A0.0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

>>LD E0.0 // den habe ich als "Taktgeber bei pos. Flanke" genutzt

Also 'ne positive Flanke muss anders ausgewertet werden. Aus KOP rausgekupfert sieht die (auf die Schnelle) so aus:

LD E0.0
EU
= A0.0
(so ergibts zwar keinen Sinn - aber EU _muss_ sein)
eU:= up (pos. Flanke)
eD:= down (neg. Flanke) // was "E" heisst weiss ich nicht mehr.

Mit dieser Flanke (Wischer für einen Zyklus) musst du eigentlich einen Zähler/ Zeit bedienen - um einen Taktgeber zu erzeugen; das geht aber in S7-200 auch direkt.
Wenn du's ohne EU versuchst schiebt/ rotiert die Mimik wohl auch - nur eben als Maschinengewehr und das wird dann wahrscheinlich nur am Oszilloskop sichtbar sein.

Ich bin mir aus dem Stand nicht sicher ob da noch was fehlt - aber "EU" ist richtig. (In KOP ist das "P" in der Kontaktauswahl).
mfg
tobias
 
Zu Zottel:

Ich habe deine AWL- Befehle eingegeben und teilweise geringfügig geändert. Wie Tobias schon mal sagte: Du hast Recht(wie immer)....
... es funktioniert einwandfrei. Dafür schonmal Danke. Den V-Bereich kann man auch ansprechen. Anstatt VB0= A0.0 muss man nur den Bitwert nehmen, also V0.0 bis V0.7 = A0.0, je nachdem welches Bit man haben möchte. Das nur so zur Info.

Zu Tobias:

LD E0.0
EU -------> Das meinte ich eigentlich mit pos. Flanke. Damit arbeite ich
auch die ganze Zeit. Mit deiner Beschreibung hast du vollkommen recht.


Ich werde jetzt mal weiter tüfteln, dabei treten bestimmt noch mehr Fragen auf. Werde sie dann wieder hier posten. Danke nochmal.

MfG

Christoph
 
Hallo
Fällt mir grad ein:
Habe hier 'ne (fast vergessene) 221 als Lichtschalter mitlaufen. Das entstand da ich sonntagsfrüh nur noch einen Taster in der Kiste fand - um damit jede GaragenLaterne einzeln zu schalten. Seit über zwei Jahren läuft das - weils kurz vor der Kirche "mal eben" entstand ists sicherlich nicht die hohe Programmierschule - zudem unkommentiert bekomme ich den gesamten Sinn einzelner Networks so auch nicht mehr zusammen.

Das macht folgendes mit 1 Taster:=
kurz drücken der ElTakko der Hauptlampe (Ein/Aus)
etwas festhalten zählt es alle (16 da 221 mit 4 Ausgängen) Möglichkeiten zeitgetaktet durch. Und wenn der Taster "ganz lange" gedrückt ist geht alles aus - weils bei 0000 0000 stehen bleibt bis der Taster losgelassen wird.

Ist vielleicht'n bischen lang um es hier zu verewigen - wenn du es haben willst (MicroWin 3.1 /Spk2 - CPU22x) musste es sagen.

Gruss
tobias
 
Zurück
Oben