1)
In AWL wird mir DD22 jedoch nicht angenommen; warum ist das so?
Ganz einfach: weil AWL nicht SCL ist.
2)
Könnte ich in SCL dann auch schreiben?
DB17.DBD22 := DINT_TO_DWORD( DINT#198 );
Nein. Du musst immer die Datentypen der Operanden beachten.
Wenn man nur die Datentypen heranzieht, hast du eine Anweisung:
BYTE := DINT_TO_DWORD(DINT);
Du versuchst dann eine Wert vom Typ DWORD einer vom Typ BYTE zuzuweisen. Das meckert der Compiler zurecht an. Wenn du dir absolut sicher bist dass das richtig ist und du genau weißt was du da tuts, musst du eine explizite Typwandlung hinschreiben. Dann bist du selber dafür verantwortlich, wie die 4 Bytes eines Dword auf ein einzelnes Byte geschrieben werden soll.
Ein gutes SCL-Programm zeichnet sich dadurch aus, dass es wenige explizite Typumwandlung aufweist.
In AWL ist eine Anweisung eine einzelne Zeile. Und nur diese wird auf Korrektheit überprüft.
In SCL ist eine Anweisung komplexer, bei einer Wertzuweisung muss der ganze Ausdruck korrekt sein.
3)
Dieses DINT# in SCL enstpricht also dem L# in AWL und besagt, dass ich eine 32-Bit-Zahl laden möchte, richtig? Was passiert, wenn ich es weglasse?
In diesem konkreten Fall passiert nichts.
Es gibt aber Fälle in denen das zu einem Fehler führen kann:
Beispiel:
Code:
intVar : INT;
dintVar : DINT;
intVar := 30000;
dintVar := intVar * 10;
Du würdest jetzt wohl annehmen, dass in dintVar der Wert 300000 steht. Das ist aber nicht der Fall, denn dort steht der Wert -27680!
Wenn man sich die Datentypen der Zuweisung hinschreibt, bekommt man:
DINT := INT * INT;
Damit wird die Mulitplikation auf dem Datentyp INT ausgeführt. Dort gibt es dann einen Wertebereichsüberlauf.
Bei der Zuweisung auf den DINT wird dann eine implizite (automatische) Typwandlung auf DINT durchgeführt.
Um das Problem zu beheben, musst du schreiben:
Code:
dintVar := intVar * DINT#10;
oder
Code:
dintVar := intVar * INT_TO_DINT(10);
Dadurch wird intVar vorher durch die implizite Konvertierung auf DINT hochgezogen, und die Multiplikation erfolgt dann auf dem DINT Datentyp.
Das ist nicht nur bei SCL so, sondern auch bei anderen Sprachen wie C.