Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Datentypkonvertierung SCL

  1. #11
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Django:
    Nachzulesen wüßte ich da auch nichts. Einige der Cast-Befehle von SCL bewirken auch nicht unbedingt ein AWL-Pendant - u.U. sagen sie nur dem Compiler, wie er mit dem Variablentyp verfahren soll.

    Im Falle des AND / DIV :
    "AND 255" oder auch "AND w#16#FF" bewirkt nichts anderes, als das in der Folge nur noch der Inhalt der niederwertigen 8 Bit des WORD verwendet werden - also die des Low-Byte. Will ich dass dann aber auch in einem Byte verwenden (also dem tatsächlichen Datentyp) dann muss ich es noch casten ...

    "DIV 256" entspricht dem "nach Rechts schieben um 8 Bit" des WORD-Inhaltes. Es bewirkt, dass die höherwertigen 8 Bit des Wortes in das Low-Byte rutschen.

    Im Falle von INT_to_Byte bewirkt es aber wahrscheinlich auch nichts anderes als mein oben schon genanntes maskieren mit AND. In AWL wäre das ggf. "L MW10 und T MB200". Beim Programmieren habe ich mir aber angewöhnt, dass auch als Code darzustellen, was ich bewirken möchte und nicht die Interpretations-Fähigkeit des Lesenden vorauszusetzen.

    Die AT-Geschichte funktioniert natürlich nicht bei Verwendung von im Grunde unbekannten Daten (also etwas, dass sich außerhalb der Deklaration des SCL-Bausteins befindet).

    Gruß
    Larry

  2. #12
    Registriert seit
    14.05.2012
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi Larry,

    danke für die Hilfreiche Antwort.

    Das mit AND / DIV "ausmaskieren" für High und Low byte hab ich mir schon so gedacht.

    Muss aber mal probieren, (hab grad kein PG zur Hand), was dann Int_To_Byte genau macht. Wie du schon schreibst, wahrscheinlich das gleiche wie AND 255, also auf das Low_Byte "zuzugreifen". Ist aber dann nicht wirklich 100% nützlich der Befehl, wenn ich immer nur das Low_Byte damit ansprechen kann.
    Wie gesagt, finde die AT Lösung am besten, vorausgesetzt natürlich die Daten sind bekannt (bei mir ja ).

    Gruß & Dank

    Django

  3. #13
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.709 Danke für 1.240 Beiträge

    Standard

    Die Umsetzung mit der AT-Sicht ist aber von der Funktion her nicht unbedingt identisch zu INT_TO_BYTE().

    Wenn die Übersetzungsoption SetOKFlag gesetzt ist, wird bei INT_TO_BYTE() geprüft ob der Integerwert überhaupt in ein Byte hineinpasst. Ist das nicht der Fall wird das OK-Flag zurückgesetzt, und man kann dieses Bit im folgenden Programm abfragen und entsprechend darauf reagieren.
    Wenn SetOKFlag nicht gesetzt ist macht INT_TO_BYTE() nur eine Ausmaskierung mit UW 16#FF.

    Das ist oft auch der Grund warum Leute meinen dass vom SCL Übersetzer generierter Code total aufgebläht ist, denn wenn die Option gesetzt ist (wahrscheinlich Voreinstellung) wird das bei jeder Typkonvertierung geprüft.

  4. #14
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Die Umsetzung mit der AT-Sicht ist aber von der Funktion her nicht unbedingt identisch zu INT_TO_BYTE().
    Aber auf jeden Fall (nach meiner Meinung) die "sauberste" Variante, das Byte-isolieren zu realisieren ...

  5. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Django2012 (13.10.2012)

  6. #15
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.709 Danke für 1.240 Beiträge

    Standard

    Das kommt darauf an.
    Mit der AT-Sicht muss ich die Prozessorarchitektur (Endianess) kennen, damit ich weiß an welcher Position im Speicher das nieder- und höherwertigste Byte einer Integer-Zahl steht.
    INT_TO_BYTE() maskiert per Definition die 8 niederwertigsten Bits aus. Wobei das imho in der IEC-Norm nichtmal genau so festgelegt ist, aber die Siemens SCL-Doku gibt es so an.

    Wenn man vor hat Code zu schreiben der auch auf möglichst vielen anderen ST Implementierungen funktioniert, sollte man die AT-Sicht (Siemens spezifisch) oder Pointer (Codesys spezifisch) möglichst nicht verwenden.

  7. #16
    qpec_hagen ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    21.07.2010
    Ort
    Dortmund
    Beiträge
    105
    Danke
    37
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke erstmal für die hilfreichen Tipps. Hab es zwar noch nicht ausprobiert aber das Ausmaskieren wäre wohl das schnellste.
    Wie erwähnt stand ich wohl voll auf dem Schlauch. Die Lösung sieht ganz einfach aus: ich habe einen Int im DB und wollte ja das High bzw Lowbyte getrennt haben:
    LowByte: DB1.DBB0;
    HighByte: DB1.DBB1;

    einfach byteweise nutzen die Variable

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 23.01.2012, 17:06
  2. SCL: FB Aufruf unter SCL mit Variablen DB
    Von ThorstenK im Forum Programmierstrategien
    Antworten: 32
    Letzter Beitrag: 10.02.2011, 19:15
  3. Antworten: 4
    Letzter Beitrag: 10.03.2008, 10:02
  4. Antworten: 4
    Letzter Beitrag: 07.10.2006, 00:34
  5. Brauche Hilfe bei SCL.SFC Aufrufen in SCL
    Von Gerold im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 06.10.2005, 10:47

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •