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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Rechnen mit BYTE in SCL geht nicht ?

  1. #1
    Registriert seit
    02.08.2006
    Beiträge
    150
    Danke
    47
    Erhielt 5 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich versuch mit einer als BYTE definierte temp_var zu rechne und zwar folgendermaßen:

    Code:
     
    VAR_TEMP
      multidata_10 : BYTE;
    END_VAR
     
    // ...
     
    // db20.dbb17 = ARRAY of CHAR
    multidata_10 := db20.dbb17 - 48;  // - 48 geht nicht. Unzulässige Operandentypen
    
    // 57 geht auch nicht. Unzulässige Operandentypen.
    IF multidata_10 > 57 THEN multidata_10 := multidata_10 - 7; END_IF;
    Kann mir hier jemand helfen ?

    noeppkes ...
    Zitieren Zitieren Rechnen mit BYTE in SCL geht nicht ?  

  2. #2
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hallo noeppkes,

    ja geht ganz einfach mit BYTE_TO_INT(x) x steht für die Byte Variable.

    Bsp.
    Code:
    multidata_10 := INT_TO_BYTE(BYTE_TO_INT(db20.dbb17) - 48);
    MfG
    Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  3. #3
    noeppkes ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    150
    Danke
    47
    Erhielt 5 Danke für 2 Beiträge

    Standard

    Danke für deine Antwort.
    Das funktioniert auch.

    Aber ich wollte nicht in INT rechnen sondern in BYTE.

    Code:
      VAR_TEMP
        multidata_10 : INT;
        b_multidata_10 AT multidata_10 : ARRAY[0..15] OF BOOL;
      END_VAR
     
      // Das hier funktioniert über INT.
      multidata_10 := BYTE_TO_INT(db20.dbb17) - 48;
      IF multidata_10 > 9 THEN multidata_10 := multidata_10 - 7; END_IF;
     
      // Hier wollte ich die untersten Bits des DB20.DBB17 auswerten
      // warum 8 .. 11 und nicht 0 .. 3 ??????
      IF (b_multidata_10[8]) THEN ...
      IF (b_multidata_10[9]) THEN ...
      IF (b_multidata_10[10]) THEN ...
      IF (b_multidata_10[11]) THEN ...
    Aber eigentlich wollte aber gerne mit BYTE rechnen
    in etwa so:
    Code:
      VAR_TEMP
        multidata_10 : BYTE;
        b_multidata_10 AT multidata_10 : ARRAY[0..7] OF BOOL;
      END_VAR
     
     
      multidata_10 := CHAR_TO_BYTE(db20.dbb17) - 48;
      IF multidata_10 > 9 THEN multidata_10 := multidata_10 - 7; END_IF;
     
      // Hier wollte ich die untersten Bits des DB20.DBB17 auswerten
      // warum 8 .. 11 und nicht 0 .. 3 ??????
      IF (b_multidata_10[0]) THEN ...
      IF (b_multidata_10[1]) THEN ...
      IF (b_multidata_10[2]) THEN ...
      IF (b_multidata_10[3]) THEN ...
    Kann mir jemand zum Verständnis helfen ?

    noeppkes ...
    Zitieren Zitieren Mit BYTE in SCL rechnen  

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Ohne es getestet zu haben, übersetzen läßt es sich so:

    Code:
    VAR_TEMP
        multidata_10 : Byte;
        b_multidata_10 AT multidata_10 : ARRAY[0..7] OF BOOL;
        A: INT;
    END_VAR
    
      // Das hier funktioniert über Byte-Int-Int-Byte-Wandlung.
      multidata_10 := Int_To_Byte(BYTE_TO_INT(db20.dbb17) - 48);
      IF BYTE_TO_INT(multidata_10) > 9 THEN multidata_10 := INT_TO_BYTE(BYTE_TO_INT(multidata_10) - 7); END_IF;
     
      // Hier wollte ich die untersten Bits des DB20.DBB17 auswerten
      // warum 8 .. 11 und nicht 0 .. 3 ??????
      IF (b_multidata_10[0]) THEN A := 1; END_IF;
      IF (b_multidata_10[1]) THEN A := 2; END_IF;
      IF (b_multidata_10[2]) THEN A := 3; END_IF;
      IF (b_multidata_10[3]) THEN A := 4; END_IF;
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #5
    noeppkes ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    150
    Danke
    47
    Erhielt 5 Danke für 2 Beiträge

    Standard

    Hallo Ralle,

    danke für die Nachricht.

    Versteh ich das richtig, ein Vergleich wie z.B multidata_10 > 57 then ...
    ist immer Integer.
    Ein BYTE-Vergleich geht nciht direkt ?

    noeppkes ...
    Zitieren Zitieren Rechnen mit BYTE in SCL  

  6. #6
    Registriert seit
    30.06.2007
    Ort
    In der Pfalz
    Beiträge
    503
    Danke
    72
    Erhielt 77 Danke für 65 Beiträge

    Standard

    Mit INT,DINT und REAL gehen alle Vergleichsfunktionen (=,<>,>0,<0,>,<), mit BYTE,WORD und DWORD nur = und <>.

    Siehe Kapitel 11.8 im Anhang.
    Angehängte Dateien Angehängte Dateien

  7. #7
    noeppkes ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    150
    Danke
    47
    Erhielt 5 Danke für 2 Beiträge

    Standard

    Hallo,
    danke für die Antwort.
    Wie aber sieht es mit AND Verknüfungen aus.

    Es funktioniert anscheinend auch nicht, wenn ich ein INT folgendermaßen

    multidata_10 : INT;

    if multidata_10 AND 2 then ...
    Das funktioniert nicht ?

    Muss ich immer über die Sicht (AT) gehen

    multidata_10 : INT;
    b_multidata_10 AT multidata_10 ARRAY [0..15] of BOOL; // Hoffe ich habe es richtig geschrieben.

    if b_multidata_10[1] then ...

    Warum so umständlich ?

    noeppkes ...
    Geändert von noeppkes (25.01.2008 um 10:32 Uhr)
    Zitieren Zitieren Rechnen mi-Wert folgendermaßen abfragen möchtret BYTE in SCL  

  8. #8
    Registriert seit
    30.06.2007
    Ort
    In der Pfalz
    Beiträge
    503
    Danke
    72
    Erhielt 77 Danke für 65 Beiträge

    Standard

    AND funktioniert bei BOOL,BYTE,WORD,DWORD

    siehe Kapitel 11.7

  9. #9
    Registriert seit
    03.05.2007
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Leute,

    ich bin gerade auf der Suche nach einer
    Konvertierungsfunktionen mit der sich BYTE in INT konvertieren lässt (Jahr aus DATE_AND_TIME). Laut Siemens-Handbuch (
    S7-SCL V5.3 für S7-300/400) gibt es dafür wohl die
    Konvertierungsfunktionen Klasse B ( BYTE_TO_INT oder BCD_TO_INT(x) ). Wenn ich diese Funktionen aber in mein Prog kopiere zeigt er mir ein Fehler an oder die Jahreszahl ist nach der Umwandlung geändert. Kann mir vieleicht jemand einen Tip geben wie sich das Problem beheben lässt?

    Gruß

    Mario
    Zitieren Zitieren Anwendung Konvertierungsfunktionen  

  10. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... dann schreib uns doch mal deinen SCL-Code. Grundsätzlich funktioniert das nämlich ...

    Gruß
    LL

Ähnliche Themen

  1. Ethernetkommunikation geht nicht
    Von holgermaik im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 26.03.2010, 12:45
  2. Byte/Anfangswert nicht größer 99 möglich
    Von Kodan im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 24.05.2008, 12:21
  3. Antworten: 7
    Letzter Beitrag: 19.02.2008, 20:04
  4. CPU 313 alt mit MMC geht nicht
    Von HDD im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 13.03.2006, 08:40
  5. FB alleine geht, FB 2x geht nicht?
    Von MSP im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 18.08.2005, 15:00

Lesezeichen

Berechtigungen

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