Zahlenverarbeitung

the

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

gegeben ist ein ST-Code zur Füllstandserrechnung.

ein Auszug:
Code:
%MW0:=%EW0*%EW0*%EW0*9*7/10/6
mit Werten für EW0 von 0 bis 100

mehr oder weniger stupide in AWL übersetzt wäre das:
Code:
L     EW0    //100
L     EW0    //100
*I             //10000
L     10      
/I             //1000
L     9       
*I            //9000
L     6      
/I            //1500
L     EW0
*I           //150000  //oder *D ??
L     7
*I           //1050000 //oder *D ??
T     MW10
Allerdings treten dabei Werte auf die weit jenseits einer Wortbreite liegen. Vor Allem das Endergebnis passt größenmäßig nicht wirklich.

Meine Fragen:
Welche maximalen Werte dürfen während einer Rechnung auftreten, bzw. was kann der AKKU maximal?
Hängen die Werte die auftreten dürfen größenmäßig von den größen der Eingangs-/Ausgangsvariablen ab?
Ist die oben gegebene Berechnung in ST so eigentlich möglich (Stichwort: Bereichsüberschreitung)?

gruß
thomas
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
also so :
Code:
L     EW0    //100
itd
L     EW0    //100
itd
*D            //10000
L     10      
/I             //1000
L     9       
*D           //9000
L     6      
/D           //1500
L     EW0
*D           //150000 
L     7
*D           //1050000 
T     MD10
Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK. Danke. War meine Vermutung Doppelwörter nutzen zu müssen so weit richtig.
Trptzdem nochmal die Frage oder der gegebene Code in ST so funktiert, da hier ja nur Wortbreite genutzt wird (MW0)!?
 
Es ist durchaus möglich, dass ST intern (der Einfachheit halber) mit Doppelwörtern arbeitet ... Ist aber blosse Spekulation ...

Gruß
LL
 
Ich würde die Divisionen (wenn von der Größe der Variablen her möglich) auch an das Ende legen, da ja hier jeweils ein Rest bleibt, der dann unter den Tisch fällt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hätte da auch noch eine Idee:

Code:
L       EW0
ITD               //in DINT wandeln (Vorzeichen)
DTR               //in REAL wandeln 
PUSH              //AKKU1 in AKKU2 kopieren
*R                // EW0 * EW0
*R                // EW0^2 * EW0
L      9.0
*R
L      7.0
*R
L      10.0
/R
L      6.0
/R
RND              //REAL wieder auf DINT runden
T      MD10

Durch die Umwandlung auf Gleitpunkzahl (REAL) hast du während der Berechnung keine Rundungsfehler und einen genügend grossen Zahlenbereich.
Das Ergebnis ist aber auch hier DINT (32Bit-Festpunkzahl).

Gruss
 
Zurück
Oben