SCL OK Flag

s7Opa

Level-1
Beiträge
128
Reaktionspunkte
8
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
 
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.
 
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.
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
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
 
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
 
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.
 
... 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
 
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?:D

*1) und "editier"

... nichts geht über englisch-kraut-englisch
 
Zuletzt bearbeitet:
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?:D

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ß :p

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
 
Aber mir waren die Errorhandler in Basic (On Error Gosub) auch schon immer ein Grauß

...also, ich bitte Dich. Den Code nach Abarbeitung der Fehlerroutine an gleicher Stelle weiter auszuführen - versuch es mal mit SCL, war doch genial.
Gut, der Vergleich mit QB ist schon wie Dampfmaschine zu Servoantrieb. Doch wünschte ich mir die einfachen einzufügenden Comiplerattribute statt endloses anklicken aus "Dropdowns" und so generelle Sachen wie "private/public" in der Variablendeklaration. Zu schweigen von einer gescheiten Online Variablensicht in einem Infofenster.

Gruß
 
Zurück
Oben