# komplexe Rechenoperationen



## stift (11 Februar 2008)

hallo
ich stehe wieder einmal vor einen problem
wie kann ich denn in s7 komplexe rechenoperationen durchführen. 
muss ich für jede rechnung (Wert A*Wert B) ein Netzwerk erstellen und das Ergebnis dann auf einen Merker legen oder geht das über AWL irgendwie einfacher, dass ich teile in Klammern setzen kann usw. 

mfg
Stift


----------



## marlob (11 Februar 2008)

Wenn du das Optionspaket SCL dein eigen nennst, dann kannst durt sehr schön komplexe Berechnungen mit machen


----------



## vierlagig (11 Februar 2008)

komplex ist relativ, also mit AWL und bißchen zerlegungsarbeit kannste das auch in einem netzwerk berechnen


----------



## marlob (11 Februar 2008)

wenn es AWL sein soll, hilft der Befehl TAK auch immer um Variablen zu sparen


----------



## stift (11 Februar 2008)

und das heißt?...
wie könnte ich z.B. (E124.1*E124.2)/M20.1 in AWL errechnen?


----------



## marlob (11 Februar 2008)

stift schrieb:


> und das heißt?...
> wie könnte ich z.B. (E124.1*E124.2)/M20.1 in AWL errechnen?


Was soll das geben, warum willst du mit binären Eingängen multiplizieren usw.?


----------



## vierlagig (11 Februar 2008)

marlob schrieb:


> Was soll das geben, warum willst du mit binären Eingängen multiplizieren usw.?



is doch klar: (1 x 1) = 1 ... 1/0 = ... damn  ... nee, irgendwas haste da durcheinander geschmissen stift


----------



## stift (11 Februar 2008)

ok war ein blödes beispiel
sagen wir (2*PI)/MD20


----------



## vierlagig (11 Februar 2008)

stift schrieb:


> ok war ein blödes beispiel
> sagen wir (2*PI)/MD20



wollen wir der KOMPLEXEN rechnung mal zu leibe rücken


```
L 2.00e+00
L 3.141593e+00
*R
L MD20
/R
T MD24
```

wobei du 2π auch schon als REAL eingeben könntest


----------



## marlob (11 Februar 2008)

allgemeine Hinweise findest du in in diesem Dokument
Analogwertverarbeitung


----------



## stift (11 Februar 2008)

alles klar. danke schön. 
aber meine rechnungen werden schon noch KOMPLEXER.


----------



## marlob (11 Februar 2008)

vierlagig schrieb:


> ...wobei du *2π* auch schon als REAL eingeben könntest


vierlagig meinte wahrscheinlich 2*PI, also wenn du 2 Konstanten multiplizierst, dann kannst du die auf jeden Fall vorher ausrechnen und als 1 Konstante eingeben. Das spart Rechenzeit



> L 6,283185e+00
> L MD20
> /R
> T MD24


----------



## stift (11 Februar 2008)

alles klar. danke
beachtet der mir eigentlich die punkt-vor-strich regel?
wie kann ich denn klammern setzen?


----------



## vierlagig (11 Februar 2008)

marlob schrieb:


> vierlagig meinte wahrscheinlich 2*PI, also wenn du 2 Konstanten multiplizierst, dann kannst du die auf jeden Fall vorher ausrechnen und als 1 Konstante eingeben. Das spart Rechenzeit



hab ich aus der zeichentabelle kopiert *grummel* ...  2π


----------



## vierlagig (11 Februar 2008)

stift schrieb:


> alles klar. danke
> beachtet der mir eigentlich die punkt-vor-strich regel?
> wie kann ich denn klammern setzen?



die steuerung rechnet linear durch, so wie du es eingibst


----------



## kiestumpe (11 Februar 2008)

Musst also jede Menge Zwischenergebnisse ablegen, z.B. TEMP-Variablen.
Für ein Zwischenergebnis kann dann wieder ein jeweiliges Netzwerk Sinn machen 
(Ist aber nicht zwingend notwendig).
Klammern gibt's m.W. nur bei Bitoperationen.

Aber warum schafft ihr euch nicht die Prof.Version an, wenn ihr komlpexere Sachen macht?


----------



## stift (11 Februar 2008)

Ist nur ne einmalige sache


----------



## Steve81 (11 Februar 2008)

Was willst du denn berechnen?


----------



## AUDSUPERUSER (11 Februar 2008)

Hallo Stift

Wenn Du wirklich komplexe Berechungen in AWL machst, ist es hilfreich wenn Du die einzelnen Zeilen mit Kommentaren versiehst, damit später auch ein anderer nachvollziehen kann, was Du Dir dabei gedacht hast.

Beispiel:
L MW10
L 10       // Geteilt durch 10 weil ....
/I
T MW12

Ich habe hier in meiner Firma ein Programm, bei dem der Programmierer das nicht gemacht hat. Das bringt Freude.
Gruss AUDSUPERUSER


----------



## stift (11 Februar 2008)

es geht um die ermittlung der maximalen geschwindigkeit eines schlittens der über eine pleuelstange an einer kurbelwelle hängt. 

Also um die umsetzung der formel r*w*cos(w*t)+((r²/2a)*w*sin(2w*t) in abhängigkeit von t welches ich mittels ob35 für die dauer einer umdrehung mit einem abstand von 25ms hochrechnen will. 

Siehe hier: 

http://www.sps-forum.de/showthread.php?t=18030


----------



## vierlagig (11 Februar 2008)

stift schrieb:


> es geht um die ermittlung der maximalen geschwindigkeit eines schlittens der über eine pleuelstange an einer kurbelwelle hängt.
> 
> Also um die umsetzung der formel r*w*cos(w*t)+((r²/2a)*w*sin(2w*t) in abhängigkeit von t welches ich mittels ob35 für die dauer einer umdrehung mit einem abstand von 25ms hochrechnen will.



r = const. a = const. d.h. r²/2a -> const. ... schon is wieder ein stück einfacher

cosinus und sinus macht die CPU

also erst ω*t, dann cos davon, dann mal r und ω ... für den zweiten summanden äquivalent

würd die beiden multiplikationen zwischenspeichern und am ende addieren


----------



## stift (11 Februar 2008)

und wie würdest du die beiden werte zwischenspeichern?
auch mit diesen TEMP-Variablen?
Wie muss ich die denn adressieren?
Ich kenn die nicht. 
Ist ja auch mein erstes SPS-Projekt.


----------



## vierlagig (11 Februar 2008)

stift schrieb:


> und wie würdest du die beiden werte zwischenspeichern?
> auch mit diesen TEMP-Variablen?
> Wie muss ich die denn adressieren?
> Ich kenn die nicht.
> Ist ja auch mein erstes SPS-Projekt.



z.b. als temp variablen, dazu bietet dir der KOP/FUP/AWL-Editor oben dran ein deklarationsfenster für den jeweiligen baustein, wenn er nicht sichtbar ist einfach mal mit der maus ganz nach oben im bausteinfenster bis ein doppelpfeil erscheint und runterziehen ... dann in temp zwei eindeutige variablennamen vergeben, format REAL und ansprechen dann über #eindeutiger_name_1 und #eindeutiger_name_2 ... der editor macht dir das # automatisch davor ... kannst aber auch in nem DBD oder nem MD zwischenspeichern, wobei IMHO DBD schneller ist als MD und lokal schneller als DBD ...


----------



## stift (11 Februar 2008)

Ok, dann werd ich morgen mal mein Glück versuchen!


----------



## kiestumpe (12 Februar 2008)

*Ableitung*

Also, wenn ich mir die Winkelgeschwindigkeit und die Abtastzeiten ansehe, würde ich das Maximum über die Ableitung nach t berechnen (Beschleunigung).
(Gemeint ist die Ableitung der Geschwindigkeit: v(t)= r*w*cos(w*t)+((r²/2a)*w*sin(2w*t) )
Empirisch bekommst du wahrscheinlich in jedem Zyklus einen anderen Wert, je nachdem wo t gerade liegt.
Wozu brauchst du eigentlich die maximale Geschwindigkeit?
Sie wird auf jeden Fall irgendwie zur Mittleren Geschwindigkeit proportional sein, solange sich der Antrieb gleichmäßig dreht.


----------



## stift (12 Februar 2008)

ja aber meine drehzahl ist doch normalerweise konstant, da sich die last ja nicht verändert. 
und über die drehzahl kann ich ja errechnen wie groß die winkelgeschwindigkeit ist da ja gilt w=(2*PI)/T und T ist die Zeit für eine Umdrehung was ich ja über die drehzahl errechnen kann. 
Das Mittel der Geschwindigkeit muss ich zum Führen einer Statistik im Messreihen angeben. Und die maximale Geschwindigkeit würde ich gern so als "special effect" anzeigen. 
Nur die Durchschnittsgeschwindigkeit ist recht einfach. Damit kann ich meinen Prüfungsausschuss nicht beeindrucken  
Außerdem finde ich, dass man bei so einem Vorhaben unglaublich viel lernt. 
Ich habe in den letzten Tagen durch ausprobieren und mit Hilfe dieses Forums in S7 echt riesige Fortschritte gemacht.


----------

