Analog-Ein und Ausgabewerte an S7/200

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bräuchte mal etwas Hilfe. Ich habe seither immer an S7/300 programmiert und soll nun für einen Kunden eine vorhandene S7/200 umprogrammieren, weil das darauf vorhandene Programm dort nicht korrekt läuft.
Nun habe ich einige Probleme mit analogen Ein- und Ausgabewerten, da die Siemens-Handbücher sich etwas spärlich mit dem Thema befassen:
1. wie normalisiere ich einen Eingabewert ? Ich bekomme ein Signal 4 - 20 mA und soll dies in ein Signal 0 - 200 (Integer) umsetzen.
2. Das Handbuch besagt, dass analoge Ein- und Ausgabebaugrupen nicht automatisch von der CPU gelesen werden. Wie kann ich sicherstellen, dass das von der CPU gemacht wird ?
2. wie setze ich ein Ausgangssignal um ? Ich habe als Ausgabewerte Integer-Zahlen von 0 - 3000, die einem Ausgangssignal 4 - 20 mA entsprechen sollen.

Hat mir da vielleicht jemand ein Beispielprogramm ?

Vielen Dank schon mal im Voraus.
Volker
 
hi volker,
zunächst mal kannst du meines wissens nach die analogeingänge hardwareseitig mit dip-schaltern konfigurieren (die 4-20mA).
danach nutzt du den sm0.0 ( immer ein)zum laden des analogeingangs.
der rest ist einfacher dreisatz das wort geht bei s7 200 bis 32512 .

also zum eingang:
32512 dividiert durch 200 = 162,56
analogeingang dividiert durch 162,56=dein normierter wert

zum ausgang:
32512 dividiert durch 3000=10,83
integersollwert mal 10,83
transfer nach analogausgang

aber vorsicht ich glaube die analogausgänge bei der 200 können nur 0-20 mA.

netzwerk1
LD SM0.0
MOVW +32512, #zwischenergebnis
/I +200, #zwischenergebnis

netzwerk2
LD SM0.0
MOVW AEW0, #normierterwert
/I #zwischenergebnis, #normierterwert

netzwerk3

LD SM0.0
MOVW +32512, #zwischenergebnis2
/I +3000, #zwischenergebnis2

netzwerk4
LD SM0.0
MOVW #zwischenergebnis2, #zwischenergebnis3
*I MW2, #zwischenergebnis3

netzwerk5
LD SM0.0
MOVW #zwischenergebnis3, AAW0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
thomas schrieb:
hi volker,

also zum eingang:
32512 dividiert durch 200 = 162,56
analogeingang dividiert durch 162,56=dein normierter wert

zum ausgang:
32512 dividiert durch 3000=10,83
integersollwert mal 10,83
transfer nach analogausgang
Da muß man sich dann bei Integerarithmetik zwischen 10 oder 11 als Näherungswert entscheiden.
11 wäre näher dran, aber der Bereich wird überschritten.

Die 22x können auch floating point:
LD SM0.0
MOVW AEW0, LW0
ITD LW0,LD2
DTR LD2,LD6
*R 162.56,LD6

LD SM0.0
MOVW +32512, #zwischenergebnis2
/I +3000, #zwischenergebnis2
Das Berechnen von Konstanten im Programm kostet unnötige Zeit. Hier übersieht man zudem leicht, daß das Ergebnis immer 10 ist, also recht weit weg vom genauen Wert 10.83.

Wenn deine CPU nur Integer kann, läßt sich die Genauigkeit verbessern, indem man die Zahlen mit geigneten Faktoren multipliziert:
10.83*4=43.32, 43/4=10.75, Fehler 0.08 statt 0.83.
Wenn du nur mit 16-Bit Worten arbeiten willst/kannst rechnest Du:
integersollwert/4 (mit rechtsschieben)
integersollwert*43. Du verlierst hier 2 Bit Genauigkeit.
Oder du kopierst den integersollwert zunächst in ein DWORD, multiplizierst mit 43 und teilst dann durch 4, wieder mit schieben.
 
Vielen Dank für Eure schnelle Hilfe

Hi Thomas, hi Zottel,

vielen Dank für Eure schnellen Antworten. Ihr habt mir beide sehr geholfen ! Das Programm funktioniert.

Vielleicht kann ich Euch ja auch mal bei was helfen.

Viele Grüße
Volker
 
Zurück
Oben