TIA Mathematische Berechnungen in SCL... stehe auf dem Schlauch

KeinPlan

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Leute!
Irgendwie stehe ich auf dem Schlauch. Ich möchte eine manuelle Skalierung und eine Offseteinstellung durchführen.
Also aus dem EW 252 den Wert auslesen, umwandeln, umrechnen, runden und anzeigen lassen.

#DWord_Weg := WORD_TO_DWORD("Wegmesssystem");
#Real_Weg := DWORD_TO_REAL(#DWord_Weg);
#Real_Ergebnis_Weg := (#Real_Weg-13040)*0.046977;
"Wegmesssystem Skaliert" := CEIL(#Real_Ergebnis_Weg);

(#Variablen als TEMP)

Komischerweise bekomme ich in Zeile 3 immer den gleichen völlig falschen Wert heraus.
Beim beobachten ist mir aufgefallen, dass die Variable "#Real_Weg" nicht verrechnet wird.
Ich schreibe z.B. eine 20000 in meine Variable "Wegmesssystem", dennoch wird in Zeile 3 die Variable "#Real_Weg" als 0 gewertet.
In Zeile 2 wird jedoch erfolgreich die 20000 umgewandelt und ins "#Real_Weg" geschrieben.
Ich kann mir nicht erklären warum. Ich muss dazu sagen, dass ich noch nicht viel in SCL programmiert habe. Trotzdem müsste die Vorgehensweise stimmen.

Kann mir einer weiterhelfen?

Liebe Grüße
 
Probiere mal folgendes:

#DWord_Weg := WORD_TO_DWORD("Wegmesssystem");
#Real_Weg := DWORD_TO_REAL(#DWord_Weg);
#Real_Ergebnis_Weg := (#Real_Weg-13040.0)*0.046977;
"Wegmesssystem Skaliert" := CEIL(#Real_Ergebnis_Weg);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In Zeile 2 wird jedoch erfolgreich die 20000 umgewandelt und ins "#Real_Weg" geschrieben.
Das glaube ich nicht - sieh' ganz genau hin!
Hast Du Dir mal die Hilfe zu DWORD_TO_REAL angesehen? DWORD_TO-Anweisungen konvertieren nicht, sie übernehmen das Bitmuster des DWORD in eine Variable anderen Datentyps.

Außerdem ist xWORD kein numerischer Datentyp zum Rechnen.

Versuche mal so:
Code:
#DInt_Weg := INT_TO_DINT("Wegmesssystem");  //INT_TO_DINT kann man wahrscheinlich weglassen
#Real_Weg := DINT_TO_REAL(#DInt_Weg);
#Real_Ergebnis_Weg := (#Real_Weg - 13040.0)*0.046977;
"Wegmesssystem Skaliert" := CEIL(#Real_Ergebnis_Weg);

//oder auch kurz
"Wegmesssystem Skaliert" := CEIL((INT_TO_REAL("Wegmesssystem") - 13040.0)*0.046977);

Daß CEIL immer aufrundet ist Dir klar?

Harald
 
Hey KeinPlan :D

dieses Problem hatte ich auch schon. Tia interpretiert die Angaben anders als wir Sie verstehen. Du wirst glücklich wenn du einfach alles deine Operationen in mehrere Zeilen aufteilst.
z.b. folgende Lösung (Namen sollteste natürlich andere verwenden.)

Code:
#DInt_Weg := INT_TO_DINT("Wegmesssystem");  //INT_TO_DINT kann man wahrscheinlich weglassen
#Real_Weg := DINT_TO_REAL(#DInt_Weg);
#Real_speicher1 := #Real_Weg - 13040;
#Real_speicher2 := #Real_speicher1 * 0.046977;
#Real_Ergebnis_Weg := CEIL#Real_speicher2);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich vermute mal, der TE hat sein Problem mittlerweile gelöst. Er hat sich schon seit mehr als 24 Stunden nicht mehr beschwert, daß irgendwas nicht funktioniert...

Harald
 
Sooo ich melde mich dann auch nochmal zu Wort.
Also vielen Dank PN/DP! Hat wunderbar funktioniert! :)
Ich muss mich jetzt nochmal informieren, was genau der unterschied zwischen Word und INT und DWord und DInt ist. Scheint auf dem ersten Blick ja gleich zu sein... verstehe ich noch nicht.
Sorry für die späte Antwort, die Uni hatte mich voll im Griff ;)

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der wichtigste Unterschied:
- INT, DINT sind Datentypen
- WORD, DWORD sind Speichergrößen (Datenbreite), ohne bestimmten Datentyp, einfach eine Ansammlung von Bits

z.B. ein DWORD belegt 4 Bytes = 32 Bits
Den Inhalt eines DWORD kann man als DINT interpretieren, oder als UDINT, oder als REAL, oder als TIME, oder ...

Deshalb konvertiert in SCL eine WORD_TO_x oder x_TO_WORD-Anweisung nichts, sondern übernimmt unverändert den Inhalt (Bitmuster) des WORDs.

In Codesys ST wird WORD als Synonym zu unsigned-INT gebraucht (was ich als Design-Schwäche ansehe). Daher muß man sehr vorsichtig sein, wenn man ST-Programme in SCL übernimmt. Die OSCAT-Bibliothek in der Step7-Variante würfelt das auch gern durcheinander.

Harald
 
In Codesys ST wird WORD als Synonym zu unsigned-INT gebraucht (was ich als Design-Schwäche ansehe). Daher muß man sehr vorsichtig sein, wenn man ST-Programme in SCL übernimmt. Die OSCAT-Bibliothek in der Step7-Variante würfelt das auch gern durcheinander.

Harald

In den meinsten Hochsprachen gibt es keine Unterscheidung mehr zw. Bit-Strings und Nummer-Typen. Im SPS Bereich kann ich mir auch nur vorstellen das man da eine Trennung vollzogen hat um die Datentypen intern anders zu behandeln (effizientere Bit-Operationen bei Bit-Strings?).
Da dies heut zu tage nicht mehr notwendig ist, sind bei einigen (vielen?) Herstellern BYTE -> USINT, WORD -> UINT und DWORD -> UDINT gleichgestellt und austauschbar.
Es mag zwar etwas sauberer anmuten wenn man Bit-Operationen nur auf Bit-Strings beschränkt, diese dafür aber von nummerischen Operationen ausschließt. Andererseits spart man sich einige Konvertierungsschritte und etliche Verwirrungen wenn beides gleich behandelt wird.
 
Zurück
Oben