Simatic Prozent 0-100%

Zuviel Werbung?
-> Hier kostenlos registrieren
Also so läuft es nun:

L DBD [AR1,P#4.0] // hole Ziel-Geschw.
L 100
/R
L #Override
*R
T #Geschwindigkeit // und zurückgeben

Wie vermutet ist ein Problem die Zahlenformatverwürfelung. L 100 lädt eine GANZZAHL in den Akku1, /R erwaretet Realzahlen in den Akkus. Das kann so nicht funktionieren! In welchen Format liegt denn [AR1,P#4.0] wirklich vor? In welchem Format liegt den #Override vor? Wenn beides Realzahlen sind, dann genügt die Änderung in L 100.0, damit es funktioniert. Ansonsten schlage ich folgende Vorgehensweise bei Vorliegen von DInts vor:
Code:
      L     20000000           // Hier gibt es sicher noch keinen Überlauf bei Multiplikation mit 100
      L     DBD [AR1,P#4.0]    // hole Ziel-Geschw. 
      >D
      SPB   MULT
      L     100                // Ziel-Geschw. noch in Akku1
      /D
      L     #Override
      *D    
      T     #Geschwindigkeit   // und zurückgeben
      SPA   Ende

MULT: L     #Override          // Ziel-Geschw. noch in Akku1
      *D    
      L     100
      /D
      T     #Geschwindigkeit   // und zurückgeben

ENDE: NOP 0

Diese Lösung kommt jetzt komplett ohne die Wandlung in Reals aus und berücksichtigt den Wertebereich einer DInt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei positiven Ganzzahlen bis 2^15 ist es egal, ob du sie als Int oder Dint lädst. Beim Laden von Int-Werten wird der Akku 1 links mit Nullen aufgefüllt.
 
Ich habe es so getestet:
Code:
      L     MD  1000
      L     100
      [COLOR=red]/R[/COLOR]    
      L     MD  1004
      [COLOR=red]*R[/COLOR]    
      T     MD  1008
Es funzt bis 17000000, aber ich verstehe nicht warum, weil Division und Multiplikation sind mit REAL befehle ausgeführt, obwohl die Daten sind DINTs ??
Ab ungefähr 17000000 gehts shief. Dann treten schwere Rundungsfehler auf.

Dies ist mehr "korrekt":
Code:
      L     MD  1012
      L     L#100
      [COLOR=blue]/D[/COLOR]    
      L     MD  1016
      [COLOR=blue]*D[/COLOR]    
      T     MD  1020
Es rechnet korrekt, auch bei grossen Zahlen.
 
Ich habe es so getestet:
Code:
      L     MD  1000
      L     100
      [COLOR=red]/R[/COLOR]    
      L     MD  1004
      [COLOR=red]*R[/COLOR]    
      T     MD  1008
Es funzt bis 17000000, aber ich verstehe nicht warum, weil Division und Multiplikation sind mit REAL befehle ausgeführt, obwohl die Daten sind DINTs ??
Ab ungefähr 17000000 gehts shief. Dann treten schwere Rundungsfehler auf.

Dies ist mehr "korrekt":
Code:
      L     MD  1012
      L     L#100
      [COLOR=blue]/D[/COLOR]    
      L     MD  1016
      [COLOR=blue]*D[/COLOR]    
      T     MD  1020
Es rechnet korrekt, auch bei grossen Zahlen.
Bei großen schon, aber nicht bei kleinen. Wenn der Wert z.B. 199 ist, kommen gravierende Rundungsproblem auf. Aus diesem Grund habe ich in meinem Beispiel eine Fallunterscheidung drin und behandle "große" und "kleine" Zahlen getrennt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei großen schon, aber nicht bei kleinen. Wenn der Wert z.B. 199 ist, kommen gravierende Rundungsproblem auf. Aus diesem Grund habe ich in meinem Beispiel eine Fallunterscheidung drin und behandle "große" und "kleine" Zahlen getrennt.
Ach so, das war der Grund. Klaro.
 
Zurück
Oben