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

Results 1 to 10 of 10

Thread: Rechnen mit SCL

  1. #1
    Join Date
    26.11.2008
    Posts
    12
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen.

    Ich habe mal wieder ein Problem zu lösen, wo die Lösung für mich nicht direkt ersichtlich ist. Ich lese von einem Sensor einen AD-gewandelten Wert ein. Dieses rechne ich um, damit ich ihn anschließend in einem DB speichern kann. Meine Formel, die in SCL umzusetzen ist lautet:

    ((MW-17944)/3276*10

    MW hat hierbei den Typen INT. Sobald ich aber alles in INT mache und die Division durchführe meckert der Compiler. Um einen datensatz im DB speichern zu können, muss dieser in WORD vorliegen. INT kann ich dabei leicht konvertieren, REAL macht da mehr Probleme.

    Anebi noch mein Codeausschnitt

    [php]
    VAR
    // statische Variablen
    i : INT := 0;
    DIFF : INT;
    MW : REAL;
    MW_END : INT;
    END_VAR
    VAR_INPUT
    Messwert_IN : INT;
    END_VAR

    [/php]

    [php]
    IF (DB105.DX518.1) THEN
    MW := ABS(((INT_TO_REAL(Messwert_IN)-17616.0))/32767.0*100.0); // /3276*100
    MW_END:= REAL_TO_INT(MW);
    DB105.DW[416+i*2] := INT_TO_WORD(MW_END);

    IF i > 49 THEN
    DB105.DX518.1 := FALSE; //Aktiv-Bit entfernen
    i := 0;
    END_IF;

    [/php]
    Reply With Quote Reply With Quote Rechnen mit SCL  

  2. #2
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,806
    Danke
    746
    Erhielt 3,127 Danke für 2,231 Beiträge

    Default

    Was ist denn nun deine Frage?
    Der Code, den du angegeben hast läßt sich bei mir jedenfalls übersetzen.
    Was mit nicht gefällt, sind die direkten Zugriffe auf den DB105, aber das nur nebenbei.
    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

  3. #3
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,402
    Danke
    422
    Erhielt 2,536 Danke für 2,108 Beiträge

    Default

    @Ralle:
    ich glaube, ich verstehe das Problem ...

    @hulla66:
    Bei direkten Zugriffen auf Speicherstellen kannst du nur BYTE, WORD oder DWORD verwenden. Das macht SCL leider nunmal so. Wenn du dass umgehen willst, dann geht das nur symbolisch und das funktioniert nur, wenn dem SCL-Compiler der Aufbau des Ziel bekannt ist.

    Wenn du nicht möchtest, dass bei der Zuweisung der direkt adressierten Speicherstellen "etwas in die Hose geht", dann solltest du auf die Typ-Konvertierungen verzichten und anstelle dessen auf die zu übertragenen Variablen eine AT-Sicht in dem anderen Format machen ... Dein Ursprungswert wird sonst ggf. falsch gewandelt ...

    An deinem Beispiel :
    Code:
    VAR
      // statische Variablen
       i                    : INT := 0;
       DIFF                 : INT;
       MW                   : REAL;
       MW_END               : INT;
       w_MW_End at MW_End   : WORD ;
    END_VAR
    VAR_INPUT
        Messwert_IN         : INT;
    END_VAR  
    
    und im Programm dann :
     
    DB105.DW[416+i*2] := w_MW_END ;
    
    Gruß
    LL

  4. #4
    Join Date
    05.03.2012
    Posts
    48
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Default

    Hallo zusamen,

    ich habe auch eine Frage was das rechnen in SCL angeht. Ich habe einen AWL-Code den ich gerne in SCL umschreiben möchte. Da muss ja auf Punkt vor Strichrechnung geachtet werden oder?

    Mein Code in AWL wäre (Alles REAL-Werte):

    L #AER
    L #UGREBR
    -R
    L #D1
    *R
    L #D2
    /R
    L #UGRNB
    +R
    T #REAW


    Meine Idee in SCL:
    REAW:=(AER - UGREBR) * D1 / D2 + #UGRNB;

    Oder ist es besser mit Zwischenergebnissen zu arbeiten? Macht den Code natürlich länger.


    Danke euch

  5. #5
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    15,666
    Danke
    1,294
    Erhielt 4,614 Danke für 3,730 Beiträge

    Default

    Quote Originally Posted by Platinum View Post
    Meine Idee in SCL:
    REAW:=(AER - UGREBR) * D1 / D2 + #UGRNB;
    Kannste so lassen. Ist richtig so. (bis auf die Schreibweise mit/ohne '#' davor, die kann variieren je nach SCL-Version)

    Quote Originally Posted by Platinum View Post
    Oder ist es besser mit Zwischenergebnissen zu arbeiten? Macht den Code natürlich länger.
    Das macht den Quellcode länger (und eventuell übersichtlicher) - aber nicht unbedingt das ausführbare Compilat.

    Beim SCL-Compiler für S7-300 ist es manchmal hilfreich, mit Zwischenergebnissen zu arbeiten, weil der Compiler ziemlich schlecht compiliert/optimiert. Wenn es auf Effizienz ankommt, dann schau Dir für verschiedene Quellcode-Varianten die Größe des erzeugten Bausteins an oder schau auch mal den erzeugten AWL-Code an (*), um zu sehen, wo man dem SCL-Compiler unter die Arme greifen kann, sprich den Quellcode anders formuliert, damit der dumme Compiler den besser umsetzt.

    (*) AWL-Code ansehen: den erzeugten Baustein in einen anderen Bausteine-Ordner kopieren (z.B. anderes Projekt), dann kann er im AWL-Editor geöffnet werden.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Platinum (11.05.2016)

  7. #6
    Join Date
    05.03.2012
    Posts
    48
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Default

    Hallo Harald,

    alles klar dann werde ich das mal prüfen und evtl. mit Zwischenergebnissen arbeiten.

    Vielen Dank für die Hilfe

  8. #7
    Join Date
    05.03.2012
    Posts
    48
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Default

    Hallo,

    funktioniert super auch ohne Zwischnergebnissen.

    Wollte jetzt mal etwas runden, bekomme da aber irgendwie kein vernünftiges Ergebnis. Irgendwas mach ich da falsch.

    L #REAW (REAL)
    L #UGRNB (REAL)
    -R
    L #D1 (REAL)
    *R
    L #D2 (REAL)
    /R
    RND
    L #UGRAB (INT)
    +I
    T #AA (WORD)

    In SCL:
    AA:=(DINT_TO_WORD(ROUND(REAW - UGRNB * D1 / D2)) + (INT_TO_WORD(UGRAB));

    Bekomme die Meldung unzulässige Operandentypen

  9. #8
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    15,666
    Danke
    1,294
    Erhielt 4,614 Danke für 3,730 Beiträge

    Default

    WORD ist kein Datentyp zum Rechnen. Es ist einfach eine Ansammlung von 16 Bits.

    Code:
    AA:=DINT_TO_INT(ROUND(REAW - UGRNB * D1 / D2)) + UGRAB;
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Platinum (11.05.2016)

  11. #9
    Join Date
    05.03.2012
    Posts
    48
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Default

    Das war zu einfach

    Danke

  12. #10
    Join Date
    23.10.2009
    Posts
    526
    Danke
    86
    Erhielt 145 Danke für 115 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by PN/DP View Post
    ...(*) AWL-Code ansehen: den erzeugten Baustein in einen anderen Bausteine-Ordner kopieren (z.B. anderes Projekt), dann kann er im AWL-Editor geöffnet werden
    oder einfach den KOP/FUP/AWL-Editor starten und von dort die AWL-Datei ohne Umkopieren einfach öffnen.
    Gruß
    Erich

  13. Folgender Benutzer sagt Danke zu LargoD für den nützlichen Beitrag:

    PN/DP (11.05.2016)

Similar Threads

  1. Step 7 Mit Time rechnen
    By heiling36 in forum Simatic
    Replies: 9
    Last Post: 29.10.2014, 13:52
  2. Rechnen mit REAL in SCL ???
    By mkd in forum Simatic
    Replies: 3
    Last Post: 28.07.2009, 09:31
  3. Rechnen mit LOG in SCL
    By Waelder in forum Simatic
    Replies: 5
    Last Post: 23.07.2009, 16:12
  4. Rechnen mit BYTE in SCL geht nicht ?
    By noeppkes in forum Simatic
    Replies: 24
    Last Post: 31.01.2008, 14:00
  5. SCL -- Datentyp Any -- Rechnen
    By Dragonfire in forum Simatic
    Replies: 13
    Last Post: 01.11.2007, 13:54

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •