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

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

Thema: SCL OK Flag

  1. #1
    Registriert seit
    22.12.2015
    Beiträge
    90
    Danke
    21
    Erhielt 2 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ich komme nicht dahinter warum bei so einfachen umwandlungen das ok bit kippt. hat da jemand eine idee?

    Code:
    VAR_TEMP
      RET_V:  INT;
      i:      INT;
      dw:     DWORD;
      ANY1:   ANY;
      sAny1 AT ANY1: STRUCT
        S7BYTE :BYTE;   // Byte 0       Reserviert für S7 (10h)
        DatTyp :BYTE;   // Byte 1       Datentyp *1
        Anzahl :INT;    // Byte 2+3     Länge der Variablen
        DBNR   :INT;    // Byte 4+5     DB-Nummer
        Zeiger :DWORD;  // Byte 6+7+8+9 Bereichszeiger_DW OR Adressword_DW (ShiftLinks 3)
      END_STRUCT;
    END_VAR
    BEGIN
    //Init
    //----------------------------------------------------------------------------------------
      OK := TRUE; RET_V := 0;                                                  //Fehlerausgabe
    //----------------------------------------------------------------------------------------
    //Programm
    //----------------------------------------------------------------------------------------
      //i := DWORD_TO_INT(SHR(IN:= sAny1.Zeiger, N:= 3));  //OK-FEHLER
      OK:=OK;
      dw := sAny1.Zeiger;
      OK:=OK;
      dw := SHR(IN:= dw, N:= 3);
      OK:=OK;
      //i := DWORD_TO_INT(dw);      //OK-FEHLER
      i := WORD_TO_INT(DWORD_TO_WORD(dw)); //auch OK-FEHLER
      OK:=OK;
      
    //END ------------------------------------------------------------------------------------
      IF RET_V <> 0 OR NOT OK THEN
        UDF_RWo_Template := TRUE; 
      ELSE 
        UDF_RWo_Template := FALSE; 
      END_IF; 
      OK:=TRUE;
    END_FUNCTION
    Zitieren Zitieren SCL OK Flag  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.375
    Danke
    134
    Erhielt 1.587 Danke für 1.159 Beiträge

    Standard

    Das hängt vom Wert ab. Hast du bei einer Typwandlung auf einen kleineren Datentyp eine Wertüberschreitung, dann wird das OK-Flag zurückgesetzt.
    Bei
    i := DWORD_TO_INT(dw)
    also wenn in der Variable dw mehr als die niederwertigen 16 Bits gesetzt sind.
    Wenn du das Verhalten für das OK-Flag ignorieren willst, musst du vorher selbst ausmaskieren.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  3. #3
    s7Opa ist offline Benutzer
    Themenstarter
    Registriert seit
    22.12.2015
    Beiträge
    90
    Danke
    21
    Erhielt 2 Danke für 1 Beitrag

    Standard

    ok, das ist der fall. da es sich um eine pointeradresse handelt ist möglicherweise von SCL eine z.b. h8400000 für db geladen die durchs "kleinwandeln" rausfliegt". in dem beispiel oben wurde die variable "zeiger" noch nicht beschrieben - aber auch nicht initialisiert. trotzdem fehler.
    Geändert von s7Opa (31.07.2016 um 00:45 Uhr)

  4. #4
    s7Opa ist offline Benutzer
    Themenstarter
    Registriert seit
    22.12.2015
    Beiträge
    90
    Danke
    21
    Erhielt 2 Danke für 1 Beitrag

    Standard

    tatsächlich. wenn ich zu anfang
    Code:
    sAny1.Zeiger := dw#16#00000000;
    einfüge ist es weg. Also habe ich irgendwelchen schrott in der uninitialisierten variable oder SCL macht automatisch bei der deklaration irgend was rein.
    ...mal eben ausprobiert: SCL beschreibt die variable mit "16#DE8400000" toll, toll.

    ok, fazit wenn man das OK als fehlerabfrage benutzt nicht umwandeln mit "DWORD_TO_WORD" sondern "Shiften". mmm
    Geändert von s7Opa (31.07.2016 um 00:47 Uhr)

  5. #5
    s7Opa ist offline Benutzer
    Themenstarter
    Registriert seit
    22.12.2015
    Beiträge
    90
    Danke
    21
    Erhielt 2 Danke für 1 Beitrag

    Standard

    ich verstehe nicht warum ich einen ENO in KOP bekomme wenn ich ein double genauso wie oben in SCL beschnibble...

    Siehe Bild

    Step7ENO_01.jpg

  6. #6
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.073
    Danke
    1.072
    Erhielt 1.151 Danke für 908 Beiträge

    Standard

    Es gibt Unterschiede zwischen KOP/FUP/AWL und SCL.
    Bei ersteren wird mehr oder weniger einfach nur Wert im Akku mit der entsprechenden Variablenbreite betrachtet.
    Also eben 8,16 oder 32Bit.
    SCL nimmt es hier erfreulicherweise etwas genauer.
    Deshalb schadet es auch nicht die Zeigerkennung mit "AND W#16#00FFFFFF" auszublenden.
    Und wenn man es genau nimmt, dann ist "i" als Int falsch. Die Byteadresse im Zeiger ist eigentlich ein unsigned Int (Wertebereich bis 65535).

    Gruß
    Dieter

  7. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.375
    Danke
    134
    Erhielt 1.587 Danke für 1.159 Beiträge

    Standard

    Zitat Zitat von Blockmove Beitrag anzeigen
    Es gibt Unterschiede zwischen KOP/FUP/AWL und SCL.
    Den Unterschied gibt es aber nur, wenn in SCL die Compileroption {SCL_SetOKFlag := 'y'} gesetzt ist (oder über das Menü). Steht diese auf 'n' dann wird auch in SCL ein DWord direkt auf ein Word geschrieben. Wenn man das Ok-Flag nicht benötigt, dann würde ich das auf 'n' setzen, macht den generierten Code auch wesentlich kleiner. Die AWL-Programmierer kümmern sich üblicherweise nie um das Ok-Flag.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  8. #8
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.073
    Danke
    1.072
    Erhielt 1.151 Danke für 908 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    ... Wenn man das Ok-Flag nicht benötigt, dann würde ich das auf 'n' setzen ...
    Steht bei mir auch in 99% aller SCL-Bausteine auch auf 'n'.
    SCL ist ja netterweise sehr restriktiv bei der Typberprüfung und wenn da was angemäkelt wird, dann schau ich schon 3mal hin.
    Gerade wenn sich die Bit-Breite ändert.

    Hier eine nette Sammlung von Bugs

    http://www5.in.tum.de/~huckle/bugs.html


    Gruß
    Dieter

  9. Folgender Benutzer sagt Danke zu Blockmove für den nützlichen Beitrag:

    Onkel Dagobert (31.07.2016)

  10. #9
    s7Opa ist offline Benutzer
    Themenstarter
    Registriert seit
    22.12.2015
    Beiträge
    90
    Danke
    21
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Ja, leider ist SCL nicht so gnädig wie der in KOP alles verzeihenden "MOVE". Statt dessen wurde da (SCL) so ein Statusbit, "erschlag alle Registerflags" mit dem einfallsreichen Namen "OK" eingebaut. Nun wenn das Ding in mitten meines Quelltextes mauell wiederbelebt werden muß, da es auf eine gewollte "Variablenverkürzung" reagiert, sind alle Abfragen vorher für die Katz.
    Mal ehrlich, das SCL ist eigentlich mittelalterlich. Da hatte z.B QB schon bessere Debug *1) Möglichkeiten. Ist das noch okeeeey?

    *1) und "editier"

    ... nichts geht über englisch-kraut-englisch
    Geändert von s7Opa (31.07.2016 um 11:47 Uhr)

  11. #10
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.073
    Danke
    1.072
    Erhielt 1.151 Danke für 908 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von s7Opa Beitrag anzeigen
    Ja, leider ist SCL nicht so gnädig wie der in KOP alles verzeihenden "MOVE". Statt dessen wurde da (SCL) so ein Statusbit, "erschlag alle Registerflags" mit dem einfallsreichen Namen "OK" eingebaut. Nun wenn das Ding in mitten meines Quelltextes mauell wiederbelebt werden muß, da es auf eine gewollte "Variablenverkürzung" reagiert, sind alle Abfragen vorher für die Katz.
    Mal ehrlich, das SCL ist eigentlich mittelalterlich. Da hatte z.B QB schon bessere Debug Möglichkeiten. Ist das noch okeeeey?
    Naja ... Ist auch etwas eine Frage des Programmierstils.
    Ich persönlich versuche meine Bausteine so zu gestalten, dass ich das OK-Flag eigentlich nicht brauche.
    Schließlich bläst diese Compiler-Option den erzeugten Code auf und macht ihn auch noch schlechter lesbar.
    Aber mir waren die Errorhandler in Basic (On Error Gosub) auch schon immer ein Grauß

    Die Debugmöglichkeiten haben mir bislang eigentlich immer gereicht.
    Ein Freund meinte mal, je besser der Debugger umso schlechter der Source-Code.
    Denn dann wird mehr Quick'n'Dirty programmiert und man macht sich vorher weniger Gedanken über Strukturierung und Aufbau.

    Gruß
    Dieter

Ähnliche Themen

  1. TIA OK-Flag mit TIA in SCL
    Von Earny im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 22.08.2014, 21:26
  2. Step 7 SCL - OK-Flag über Compileroption aktivieren
    Von Onkel Dagobert im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 21.11.2013, 09:20
  3. Registrieren auf Merker Flag Änderung in AGLink
    Von lorgarn im Forum Hochsprachen - OPC
    Antworten: 12
    Letzter Beitrag: 08.05.2013, 16:44
  4. Antworten: 4
    Letzter Beitrag: 07.10.2006, 00:34
  5. Brauche Hilfe bei SCL.SFC Aufrufen in SCL
    Von Gerold im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 06.10.2005, 10:47

Lesezeichen

Berechtigungen

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