TIA SCL - dword als Real interprätieren

martin.wagner

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


vorab - ich habe rel. selten mit Siemessteuerungen zu tun, mein Hauptaufgabengebiet befindet sich eher im Bereich der Hochsprachenprogrammierung. Für einen Test benötige ich nun aber ein Programm in einer S7 1200, das Daten per S7 Kommunikation in einem DB annimmt, manipuliert und in einem anderen DB wieder zur Verfügung stellt.


Mein Eingangs- und Ausgangs DB wird mit 16 Bit Words befüllt. Ich muss nun jeweils 2 Words nehmen, einen Word Swap machen, das entstandene DWord als Float interprätieren, eine Berechnung durchführen, in einen Integer konvertieren und wieder in 2 Words ausgeben.
In "C" kann man das z.B. mit memcpy() oder einem Union lösen


union {
u16 low;
u16 high;
float f;
} reinterpret;


reinterpret.low = dw2;
reinterpret.high = dw0;
floatval = reinterpret.float;


Wie mache ich das in Siemens SCL?


Mit der Suche bin ich nicht wirklich weitergekommen. Einige Suchergebnisse beziehen sich auf Codesys ST, andere habe ich einfach nicht verstanden


Danke!
 
Union in C entspricht AT-Sicht in SCL, geht aber nicht in Speicher mit "optimiertem" Zugriff. Außerdem geht eine AT-Sicht auf Strukturen nur auf den Struktur-Anfang, aber nicht auf Struktur-Mitglieder:
Code:
  reinterpret : STRUCT
    low : WORD;
    high : WORD;
  END_STRUCT;

  f AT reinterpret : REAL;

//Zugreifen Beispiele
#reinterpret.low := #reinterpret.high;
#RealVar := #f;

Falls Du mit TIA programmierst, da mußt Du die AT-Sicht zusammenklicken oder aus einer SCL-Quelle importieren (ich weiß nicht wie das geht). Außerdem will das TIA-SCL ein # vor jedem Variablenname von lokalen Variablen.

Beispiele für AT-Sichten
Wie programmieren Sie in STEP 7 (TIA Portal) die Überlagerung von Variablen mit dem Schlüsselwort "AT"?
Wie kann in S7-SCL mit Hilfe der AT-Funktion ein ANY Pointer zusammengestellt werden?


2 Words zusammenfassen und als REAL interpretieren - diese Variante geht immer:
Code:
#RealVar := DWORD_TO_REAL( SHL(IN:=WORD_TO_DWORD(#H_Word), N:=16) OR WORD_TO_DWORD(#L_Word) );

Harald
 
Mein Ansatz wäre etwa so:

Code:
AUSGANGSREAL := INT_TO_REAL(SWAP(EINGANGSWORD));

ggf. noch
Code:
AUSGANGSREAL := INT_TO_REAL(WORD_TO_INT((SWAP(EINGANGSWORD)));

Grüße

Marcel
 
Danke für eure Antworten.

Mit den Funktionen DWORD_TO_REAL(), REAL_TO_DWORD() etc. funktionierts. Diese habe ich in der Doku zwar gesehen, aber nicht näher betrachtet da ich davon ausgegangen bin das diese eine Datentypkonvertierung machen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, bei Siemens-SCL übernimmt DWORD_TO_*/*_TO_DWORD rein das Bitmuster ohne Konvertierung. (wie ich es bei ANY_BIT-Datentypen auch erwarte)
Bei Codesys-ST wird WORD als Synonym zu "unsigned" vermixt und konvertiert da. Da darf man mit ANY_BIT-Datentypen auch rechnen. (halte ich für nicht korrekt)

Wie solche Konvertierungen funktionieren sollen ist in der IEC61131-3 leider nicht festgelegt, sie sind "implementation-dependent".
Die Siemens-Variante halte ich für die "richtige".

Harald
 
Zurück
Oben