Addressierungsproblem Datenbaustein S7

Arbeite mich gerade erst in die Materie ein, aber das ist mir komisch:

<?
//Bit Setzen =>
$ID_Bit=38019;
//Area: Datablock  Area Adress:1
//Adresse: 2  Bit:0
S7_WriteBit($ID_Bit, true);
//Entspricht DB1.DBX 2.0

//Integer schreiben =>
$ID_Int=49129;
//Area: Datablock  Area Adress:1
//Adresse: 0
$Soll=100;
S7_WriteInteger($ID_Int, $Soll);
//Adresse 0  Schreibt in DB1.DBW2 , statt in DBW0!
//Adresse 2  Schreibt in DB1.DBW4 , statt in DBW2!

//Real schreiben =>
$ID_Int=20784;
//Area: Datablock  Area Adress:1
//Adresse: 4
$Soll=123.45;
S7_Writereal($ID_Int, $Soll);
//Entspricht DB1.DBD4
?>

Woher kommt der Versatz, wenn ich eine Instanz als Integer verwende?

Ist diese Verschiebung auch beim Lesen vorhanden? Da alle Funktionen die intern die selbe Schreibroutine verwenden wüsste ich nicht, warum das passieren sollte.

Passiert es mit WriteDWord auch? (Wäre auch ein 4 Byte großer Typ)

paresy

Ja, auch gelesen wird mit Versatz.
Doppelworte machen keine Probleme.
Ich werde morgen nochmal von vorn anfangen, ggfs. liegts ja auch bei mir - habs bestimmt 5x kontrolliert und konnte keinen Dreher feststellen.

Ich hab hier geguckt und es wäre mir total schleierhaft, warum solch ein Versatz auftreten sollte, zumal ich immer die selbe Funktion zum Schreiben nutze.

paresy

Hab nochmal verglichen, es bleibt dabei - Bei Int Werten greife ich daneben

Was mir erst jetzt auffällt: Im Test Center lassen sich Int Instanzen garnicht schreiben

Moment, das fällt mir erst jetzt auf - in der S7 ist ein Int 16Bit groß und kann von −32.768 bis 32.767 zählen.

Das ist dann aber ein ShortInt.

paresy

Dann ist ein IPS Integer ein S7 DINT,
ein IPS ShortInt ein S7 INT und
ein IPS SmallInt ein S7 Byte ???

Da kann man aber böse stolpern