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

Ergebnis 1 bis 10 von 10

Thema: Rechnen mit SCL

  1. #1
    Registriert seit
    26.11.2008
    Beiträge
    12
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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]
    Zitieren Zitieren Rechnen mit SCL  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    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
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    @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
    Registriert seit
    05.03.2012
    Beiträge
    39
    Danke
    10
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von Platinum Beitrag anzeigen
    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)

    Zitat Zitat von Platinum Beitrag anzeigen
    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
    Registriert seit
    05.03.2012
    Beiträge
    39
    Danke
    10
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Harald,

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

    Vielen Dank für die Hilfe

  8. #7
    Registriert seit
    05.03.2012
    Beiträge
    39
    Danke
    10
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    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
    Registriert seit
    05.03.2012
    Beiträge
    39
    Danke
    10
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Das war zu einfach

    Danke

  12. #10
    Registriert seit
    23.10.2009
    Beiträge
    391
    Danke
    58
    Erhielt 113 Danke für 87 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von PN/DP Beitrag anzeigen
    ...(*) 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)

Ähnliche Themen

  1. rechnen
    Von waldy im Forum Stammtisch
    Antworten: 12
    Letzter Beitrag: 12.06.2011, 10:17
  2. Rechnen mit LOG in SCL
    Von Waelder im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 23.07.2009, 16:12
  3. Mit SPS rechnen
    Von Moboso im Forum Simatic
    Antworten: 31
    Letzter Beitrag: 09.04.2008, 21:40
  4. Rechnen
    Von Mr. Smoth im Forum Simatic
    Antworten: 20
    Letzter Beitrag: 22.04.2007, 09:19
  5. Zuleitung Rechnen
    Von waldy im Forum Schaltschrankbau
    Antworten: 12
    Letzter Beitrag: 01.03.2006, 17:42

Lesezeichen

Berechtigungen

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