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

Page 1 of 2 12 LastLast
Results 1 to 10 of 12

Thread: SCL-Programmfehler Wer kann helfen?

  1. #1
    sps_nath Gast

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das soll ein Programm zum Einlesen eines Analogwertes sein
    Es funktioniert soweit auch aber der Stringscan am Ende will nicht so wie ich es gerne will.
    Obwohl weiter hinten ein Minuszeichen steht wird meine Variable Ex_minus niemals true
    Kann mir jemand einen Tip geben sonst verzweifle ich bald.
    Compilerfehler gibt es keine.


    Function_Block FB1

    VAR_TEMP
    Analogwert: WORD;
    Ergebnis: STRING[ 20 ];
    Help, Lauf, Laenge: INT;
    Wert: REAL;
    Ex_minus: BOOL;
    END_VAR

    BEGIN

    Analogwert := PEW760 ;
    Help :=WORD_TO_INT (Analogwert);

    // Normierung des Wertes zwischen –104 und +104 °C Ergebnis ist ein //REALwert
    Wert:=((-104.0 * ( 2048 – Help)) + ( Help * 104.0)) / 2048 ;

    // Wert in einen String umwandeln
    Ergebnis := R_STRNG( IN:= Wert);
    // Stringlänge
    Laenge := LEN( S:= Ergebnis);

    // Der String sieht jetzt ungefähr so aus :
    // -1.234567e-001
    // Und ich möchte den String scannen um heraus zu finden ob ein Minus vorm Exponent steht
    // Das erste Minus will ich ignorieren deswegen ab Position 2
    FOR Lauf:= 2 TO Laenge DO

    IF MID( IN:= Ergebnis, L:= 1, P:= Lauf) = ‘-‘ THEN
    Ex_minus:= true;
    Exit;

    ELSE
    Ex_minus:= false;
    END_IF;
    END_FOR;
    // Auswertung der Variablen Ex_minus


    End_Function_Block
    Reply With Quote Reply With Quote Answered: SCL-Programmfehler Wer kann helfen?  

  2. "Das Problem liegt an dem Analogwert der zwischen 0 und 2047 liegt.
    Den muss ich auf einen Temperaturbereich normieren. Die dabei entstehende Zahl ist nun einmal
    vom Type REAL.
    Ich brauche 3 Stellen um eine Auflösung von 0.1 °C zu errechen."


  3. #2
    Join Date
    06.10.2003
    Posts
    4,567
    Danke
    628
    Erhielt 799 Danke für 624 Beiträge

    Default

    Hallo sps_nath,

    es scheint sich um eine fehler- oder mangelhafte Statusanzeige zu handeln. Das "Ex_minus = FALSE" wird noch aus dem vorherigem Schleifendurchlauf angezeigt. Wenn du nach "END_FOR" noch einmal "Ex_minus" abfragst, erhältst du das richtige Resultat. (S7-SCL V5.1 SP5).

    Gruß, Onkel
    Reply With Quote Reply With Quote fehler- oder mangelhafte Statusanzeige  

  4. #3
    sps_nath Gast

    Default

    Vielen Dank erst mal für die Hilfe.
    Aber wenn ich ehrlich bin leuchtet mir das nicht so richtig ein.
    Schließlich wird doch die Schleife über das Exit verlassen wenn ein Minus im String ist.
    Wieso sollte ich dann noch einmal ex_minus abfragen?

  5. #4
    Join Date
    25.06.2003
    Location
    Emden
    Posts
    61
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default

    Du hast 2 byte Kopfdaten im String, deshalb musst du nicht bei 2 sondern bei 4 anfangen zu suchen
    mfG
    Ingo dV

    Regelmässiges Versagen ist auch
    eine Form der Zuverlässigkeit

  6. #5
    Join Date
    06.10.2003
    Posts
    4,567
    Danke
    628
    Erhielt 799 Danke für 624 Beiträge

    Default

    Deine Schleife funktioniert richtig! Die Afrage deines "ex_minus" solltest du nur einmal testweise nach "END_FOR" einfügen, um dich von dem Ergebnis "ex_minus = true" zu überzeugen. Die Statusanzeige zwischen "ELSE" und "END_FOR" wird beim Verlassen der Schleife über "EXIT" in der aktuellen SCL-Version leider nicht aktualisiert! Das verwirrt schon manchmal ein bisschen.

    Die von Ingo angesprochenen 2 Byte Kopfdaten sollten eigentlich von der Funktion "MID" berücksichtigt werden, bin mir da jedoch nicht so ganz sicher.

    Betreibst du diesen enormen Aufwand eigentlich nur um zu überprüfen ob der Realwert zwischen -1.0 und +1.0 liegt? Oder machst du das nur so zum Probieren?

    Gruß, Onkel
    Reply With Quote Reply With Quote nur zum Test noch einmal abfragen  

  7. #6
    Join Date
    25.06.2003
    Location
    Emden
    Posts
    61
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default

    1. Wenn du z.B. -1234567e-001 als String wandelst, bekommst du den String als ||-0.1234567e+000. Die Ersten beide Bytes sind die Kopdaten und werden vom MID Baustein NICHT (wie zuerst gedacht) berücksichtigt.

    2. Die mit MID erzeugte Zeichenkette hat ebenfalls 2 Kopfdatenbytes. Das Ergebnis von z.B. L=1, P=2 würde in inserem Bspl. ||0 (3Bytes) sein.
    mfG
    Ingo dV

    Regelmässiges Versagen ist auch
    eine Form der Zuverlässigkeit

  8. #7
    sps_nath Gast

    Default

    Vielen Dank nochmal !
    Jetzt bin ich etwas schlauer. Also liegt der Fehler an der SCL-Version, die die Anzeige der Variable nach dem Else nicht aktualisiert. Da kann ich ja lang warten.

    Übrigens mache ich das um die Temperatur abhängig von einem PT100 an einer 7Segment-Anzeige auszugeben. Ich denke wenn ich diesen Real-Wert in einen String wandel und mir die Stellen die ich brauche aus dem String "herausschneide" komme ich mit den Stringfunktionen am schnellsten ans Ziel.
    Das Vorzeichen des Exponenten muss ich für den Fall berücksichtigen das der Wert zw. -0.9 und
    +0.9 liegt. ansonsten ist der Exponent immer positiv.

  9. #8
    Join Date
    19.06.2003
    Posts
    2,299
    Danke
    85
    Erhielt 274 Danke für 179 Beiträge

    Default

    Da eine 7-Segmentanzeige meist ohne Fliesskomma arbeitet, wäre es nicht einfacher, die Integers für die Stellen auf die Anzeige zu schreiben? Ohne den String?

  10. #9
    sps_nath Gast

    Default

    Das Problem liegt an dem Analogwert der zwischen 0 und 2047 liegt.
    Den muss ich auf einen Temperaturbereich normieren. Die dabei entstehende Zahl ist nun einmal
    vom Type REAL.
    Ich brauche 3 Stellen um eine Auflösung von 0.1 °C zu errechen.

  11. #10
    Join Date
    19.06.2003
    Posts
    2,299
    Danke
    85
    Erhielt 274 Danke für 179 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by sps_nath
    Das Problem liegt an dem Analogwert der zwischen 0 und 2047 liegt.
    Den muss ich auf einen Temperaturbereich normieren. Die dabei entstehende Zahl ist nun einmal
    vom Type REAL.
    Nicht zwangsläufig.
    L PEW...
    L 104 //Dein max-wert
    *D
    L 2047
    /D
    macht das mit ganzen Zahlen.
    Wenn Du die Zehntel brauchst, nimmst Du halt mit 1040 statt mit 104 mal. Multiplikation vor Division ergibt mehr gültige Bits.
    Egal wie, hier wird abgrundet. Um das zu vermeiden, nimmst Du mit 2080 (2*1040) mal, addierst zum Ergebnis einst und teilst durch 4094 (2*2047).

Similar Threads

  1. Aufzugsteuerung, wer kann helfen ???
    By d.joswig in forum Sonstige Steuerungen
    Replies: 8
    Last Post: 02.10.2017, 00:55
  2. Wer kann mir helfen!!!
    By Noxx797 in forum CODESYS und IEC61131
    Replies: 8
    Last Post: 03.07.2013, 20:10
  3. Wer kann mir Helfen?
    By manta56 in forum Antriebstechnik
    Replies: 5
    Last Post: 20.12.2012, 16:40
  4. Wer kann Neuling helfen ?
    By Tomi200 in forum Simatic
    Replies: 6
    Last Post: 10.07.2008, 16:15
  5. Suche Buch nur über SCL.Wer kann helfen
    By Gerold in forum Simatic
    Replies: 2
    Last Post: 16.08.2005, 21:23

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
  •