TIA Realwert in Array of Byte kopieren

trabajador73

Level-2
Beiträge
136
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

verwendet wird eine TIA 1517 CPU.
Ein Realprozesswert soll in ein Array of Byte kopiert werden für eine Datentransfer an eine externe Steuerung.
Ansatz in SCL:
// Daten zur externen Steuerung // Daten von Real-Prozesswert
#sudtMaxymosOutput.CtrlData.arbData[0] := #ssProcessValues.srMaxTorqueValue.%B0;
#sudtMaxymosOutput.CtrlData.arbData[1] := #ssProcessValues.srMaxTorqueValue.%B1;
#sudtMaxymosOutput.CtrlData.arbData[2] := #ssProcessValues.srMaxTorqueValue.%B2;
#sudtMaxymosOutput.CtrlData.arbData[3] := #ssProcessValues.srMaxTorqueValue.%B3;
1638529235498.png

Diese Zuweisung wird aber leider als fehlerhaft angezeigt. Wie ist es möglich, eine korrekte SCL Anweisung eines Realwertes einem Array von Bytes zuzuweisen?
Danke für Eure Beiträge und damit Unterstützung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Hilfe schreibt für den Slice-Zugriff:

Die Variable muss vom Datentyp "Bitfolge" sein. Bei deaktivierter IEC-Prüfung ist auch der Zugriff auf Variablen des Datentyps "Ganzzahl" möglich.
Also REAL wird nicht gehn...

Also zuerst REAL_TO_DWORD und dann Slice drauf anwenden...
 
Zuletzt bearbeitet:
Slice geht nicht mit REAL, AT geht nicht in "optimiertem" Speicher, SCL kennt kein UNION... daher den REAL-Wert in eine DWORD-Variable (um)speichern - auf die funktioniert dann Slice:
Code:
#tempDWord := REAL_TO_DWORD(#MyReal);
#ByteArray[0] := #tempDWord.%B0;
#ByteArray[1] := #tempDWord.%B1;
#ByteArray[2] := #tempDWord.%B2;
#ByteArray[3] := #tempDWord.%B3;

Harald
 
... daher den REAL-Wert in eine DWORD-Variable (um)speichern ...
"Umspeichern" bedeutet vermutlich per TypeCast REAL_TO_DWORD? Das geht aber auch nicht immer, hast Du mal gesagt (glaube ich mich zu erinnern), Harald, weil REAL_TO_DWORD nicht in allen Sprachen "nur" ein TypeCast ist, sondern auch schon mal ernsthaft zu konvertieren versucht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"Umspeichern" muß sein, weil SCL den Slice-Zugriff nicht auf Ausdrücke sondern nur auf Bitstring-Variablen (im Speicher) unterstützt.

Das Problem bei REAL_TO_DWORD war, daß in Codesys/ST REAL_TO_DWORD nicht das Bitmuster kopiert, sondern den REAL-Wert in Ganzzahl konvertiert (weil da DWORD als Synonym für UDINT verwendet wird). In Codesys/ST muß deshalb ebenfalls umgespeichert werden, entweder in eine UNION oder es muß mit einem POINTER TO DWORD das Bitmuster der Real-Variable als DWORD gelesen werden.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Euch für die hilfreichen Beiträge.
Die Umwandlung zuerst nach DWord und dann Slide-Zuweisung hat funktioniert. Auch Eure Erklärungen dazu, super.
Frohes Schaffen und später angenehmes Wochenende.
 
Danke, Ducati, aber "Das Bitmuster des Quellwerts wird ohne Änderung rechtsbündig in den ZielTyp übertragen" ist doch ein TypeCast mit ohne TypKonvertierung, also weder eine implizite noch eine explizite Konvertierung!?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"Das Bitmuster des Quellwerts wird ohne Änderung rechtsbündig in den ZielTyp übertragen" ist doch ein TypeCast mit ohne TypKonvertierung, also weder eine implizite noch eine explizite Konvertierung!?
Im Universum von TIA ist das eine "explizite Konvertierung" ohne Konvertierung. Die Schreiber der TIA-Dokumentation/Hilfe sind doch überall so ungenau...

Harald
 
Danke, Ducati, aber "Das Bitmuster des Quellwerts wird ohne Änderung rechtsbündig in den ZielTyp übertragen" ist doch ein TypeCast mit ohne TypKonvertierung, also weder eine implizite noch eine explizite Konvertierung!?
Ich bin heutzutage schon froh, wenn jemand den Unterschied zw. INT und REAL kennt... Spätestens bei DWORD hört bei den meisten das Verständnis eh auf... Und dann kommt noch hex dez BCD und wasweisich dazu...

Wir hatten hier mal einen "Informatiker" der hat alle BOOL als LREAL Gleitpunktzahlen gespeichert...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir hatten hier mal einen "Informatiker" der hat alle BOOL als LREAL Gleitpunktzahlen gespeichert...
Ja! Genau das ist doch der aktuelle Trend!
1 Byte pro BOOL zu belegen - wie will man das heute noch rechtfertigen?
1 Wort pro BOOL, na ja, schon viel besser, aber das hinkt auch schon lange der technischen Entwicklung hinterher.
1 Doppelwort pro BOOL könnte aktuell noch so eben vertretbar sein.
Aber 1 Q-Wort oder 1 LREAL pro BOOL! Nein, ich verkneife mir, zu behaupten, das habe Zukunft. Daran sollten wir uns ganz einfach schnell gewöhnen! Und es auskosten, bevor das auch wieder Schnee von gestern ist. ;)
 
Zurück
Oben