Forum: Mikrocontroller und Digitale Elektronik Bascom: Word mit Single vergleichen


von Vergleicher (Gast)


Lesenswert?

Hallo,

Ich bin Laie und stehe vor einem kleine Problem.
Ich berechne einen Single-Wert und möchte den gern gegen Word-Werte 
vergleichen.

Dazu meldet Bascom den Fehler "Single expected" bei der 
Vergleichsoperation.
Wie führt man derartige Vergleiche durch?

Dim A As Single : A = 25
Dim B As Word : B = 30

If A > B Then
   A = B
End If

Meine Idee wären entweder ein zusätzlicher Cast der Single-Variable auf 
eine Word Variable und dann beide Word-Variablen vergleichen, oder den 
Vergleichswert gleich auf eine Single-Variable legen, obwohl dieser nur 
ganzzahlig ist.

Beides führt in meinen Augen zu Ressourcen oder Zeitverschwendung.

Wie wirds richtig gemacht?

von avrGerd (Gast)


Lesenswert?

Hallo,

bist Du sicher, dass Du SINGLE wirklich brauchst?

Aus der Hilfe:
Single. Singles are stored as signed 32 bit binary numbers. Ranging in 
value from 1.5 x 10^–45 to 3.4 x 10^38

In welchem Bereich bewegen sich Deine Werte denn wirklich?
Ein Casting auf WORD macht ja nur begrenzt Sinn, wenn Du den Zahlenraum 
ausnutzt.

Am effektivsten ist es manchmal mit ganzzahligen vielfachen x*100 oder 
x*1000 zu rechnen, um dann im WORD oder LONG Bereich bleiben zu können.


Gruss, avrGerd

von Volker S. (volkerschulz)


Lesenswert?

Es macht generell wenig Sinn 32-Bit mit 16-Bit zu vergleichen, oder? Was 
genau hast Du denn vor?

Volker

von Vergleicher (Gast)


Lesenswert?

Hallo,

Es geht um einen PID-Regler - dessen Berechnungen aktuell mit 
Singlezahlen durchgeführt werden. Das "Umstricken" auf 
Festkommarithmetik habe ich ganz nach hinten geschoben, weil ich da noch 
keinerlei Erfahrungen habe.

Daher ersteinmal der Weg über Fließkommaberechnungen um ersteinmal 
Erfolge zu haben :-).

Nun habe ich die Auswahl zwischen 2 Stellgliedern, wobei der 
Maximalausgang des Reglers für Stellglied.1 bis 255 sein darf und für 
Stellglied.2 bis 10000.

Und um diese Eingrenzung des Reglerausgangswertes geht es.
Die Maximalgrenze ist ganzzahlig und wird vorher ausgewählt.

Hierbei hat mich dann verblüfft, dass so ein Vergleich nicht ohne 
weiteres funktioniert - die Interpretation der Zahlen lässt ja keinen 
Spielraum, ein Cast einer Singlezahl auf eine Word-Zahl ist ebenfalls 
eindeutig.

von avrGerd (Gast)


Lesenswert?

Zeig doch mal ein bisschen Code.

Wie sieht die Hardware aus?

Welchen PID Algorithmus hast Du implementiert?


avrGerd

von Vergleicher (Gast)


Lesenswert?

Hallo,

hier ein Codeauszug, welcher den Regler betrifft - der im Timerinterrupt 
aufgerufen wird, und die dazugehörige Variablendeklaration.
Die letzte Zeile moniert Bascom - aktuell umgehe ich das, indem ich 
Ausgang auf eine Hilfs-Word-Variable lege und dann diese 
Hilfs-Word-Variable gegen Ausgang_max vergleiche.

Hardware ist ein ATMega16


Dim Solltemperatur As Single , Isttemperatur As Single
Dim Fehler As Single , Fehler_integral As Single , Fehler_delta As 
Single , Fehler_alt As Single
Dim Ausgang As Single , Ausgang_p As Single , Ausgang_i As Single , 
Ausgang_d As Single
Dim Ausgang_max As Word


Regler_ausfuehren:
   Fehler = Solltemperatur - Isttemperatur

   If Ausgang >= Ausgang_max And Fehler > 0 Then 
'Anti-Wind-Up
         Ausgang = Ausgang_max
   Elseif Ausgang <= 0 And Fehler < 0 Then
         Ausgang = 0
      Else
         Fehler_integral = Fehler_integral + Fehler         'Integration
   End If

   Fehler_delta = Fehler - Fehler_alt 
'Differenzbildung
   Fehler_alt = Fehler

   Ausgang_p = Regler_p * Fehler
   Ausgang_i = Regler_i * Fehler_integral                '* Ta steckt in 
Ki
   Ausgang_d = Regler_d * Fehler_delta                   '/ Ta steckt in 
Kd

   Ausgang = Ausgang_p + Ausgang_i
   Ausgang = Ausgang + Ausgang_d

   If Ausgang < 0 Then Ausgang = 0
   If Ausgang > Ausgang_max Then Ausgang = Ausgang_max
Return

von Volker S. (volkerschulz)


Lesenswert?

Vergleicher schrieb:
> [...]
> Hierbei hat mich dann verblüfft, dass so ein Vergleich nicht ohne
> weiteres funktioniert - die Interpretation der Zahlen lässt ja keinen
> Spielraum, ein Cast einer Singlezahl auf eine Word-Zahl ist ebenfalls
> eindeutig.

Genau da liegt der Hund doch begraben! Wie wuerdest Du denn die 
Single-Werte -3,4 oder 65536 auf ein Word casten?

Volker

von Vergleicher (Gast)


Lesenswert?

ok, gut

zu 50% muss ich dir recht geben und die anderen 50% rede ich mich 
heraus.

Die negativen Single-Werte werden eine Zeile vorher abgefangen und 
nullgesetzt.
Die positiven Single-Werte werden in einer Höhe über dem Word-Bereich 
nicht erwartet: Ausgang_max soll maximal bei 10000 liegen.

Jetzt kann abhängig der Reglerparameter und des Fehlers theoretisch 
immernoch der 2-Byte-Wertebereich überschritten werden, aber so hohe 
Werte liegen nicht im Erwartungsbereich.

Gruß

von Volker S. (volkerschulz)


Lesenswert?

Vergleicher schrieb:
> [...]
> Jetzt kann abhängig der Reglerparameter und des Fehlers theoretisch
> immernoch der 2-Byte-Wertebereich überschritten werden, aber so hohe
> Werte liegen nicht im Erwartungsbereich.

Das alles kann aber ja der Compiler nicht wissen. ;)

Du musst also entweder den Vergleichwert in Single casten oder aus den 
unteren zwei Bytes des Absolutwerts des Singles ein Word bauen... Ich 
wuerde erstere Variante bevorzugen (zumal das "Davorstellen" von 16 
0-Bits nur fuer den Vergleich nicht so CPU-aufwaendig sein sollte).

Volker

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.