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?
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
Es macht generell wenig Sinn 32-Bit mit 16-Bit zu vergleichen, oder? Was genau hast Du denn vor? Volker
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.
Zeig doch mal ein bisschen Code. Wie sieht die Hardware aus? Welchen PID Algorithmus hast Du implementiert? avrGerd
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
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
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.