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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: SCL-Programmfehler Wer kann helfen?

  1. #1
    sps_nath Gast

    Standard


    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
    Zitieren Zitieren SCL-Programmfehler Wer kann helfen?  

  2. #2
    Registriert seit
    06.10.2003
    Beiträge
    3.765
    Danke
    501
    Erhielt 586 Danke für 467 Beiträge

    Standard

    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
    Zitieren Zitieren ✔ hilfreichste Antwort! fehler- oder mangelhafte Statusanzeige  

  3. #3
    sps_nath Gast

    Standard

    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?

  4. #4
    Registriert seit
    25.06.2003
    Ort
    Emden
    Beiträge
    61
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  5. #5
    Registriert seit
    06.10.2003
    Beiträge
    3.765
    Danke
    501
    Erhielt 586 Danke für 467 Beiträge

    Standard

    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
    Zitieren Zitieren ✔ hilfreichste Antwort! nur zum Test noch einmal abfragen  

  6. #6
    Registriert seit
    25.06.2003
    Ort
    Emden
    Beiträge
    61
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  7. #7
    sps_nath Gast

    Standard

    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.

  8. #8
    Registriert seit
    19.06.2003
    Beiträge
    2.205
    Danke
    85
    Erhielt 270 Danke für 179 Beiträge

    Standard

    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?

  9. #9
    sps_nath Gast

    Standard

    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.

  10. #10
    Registriert seit
    19.06.2003
    Beiträge
    2.205
    Danke
    85
    Erhielt 270 Danke für 179 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von 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).

Ähnliche Themen

  1. Wer kann mir bei diesem OB! helfen
    Von S7 Frischling im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 09.09.2009, 09:10
  2. Waage mit Siwarex - wer kann mir helfen?
    Von Aleks im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 30.03.2009, 11:09
  3. Logik-Problem - Wer kann helfen?
    Von Beren im Forum Programmierstrategien
    Antworten: 6
    Letzter Beitrag: 21.11.2008, 12:41
  4. Wer kann Neuling helfen ?
    Von Tomi200 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 10.07.2008, 17:15
  5. wer kann mir helfen S7-214
    Von geronimo_de im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 18.12.2005, 09:43

Lesezeichen

Berechtigungen

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