seeba schrieb:
Also ich benutze jetzt den BitConverter von .NET... Funtioniert auch gut soweit. Allerdings bekomm ich mit dem keinen Float aus 4 Bytes gewandet... Hast du eine Funktion der ich die 4 Bytes übergebe und die mir dann einen Float rausschmeißt?
Wir reden hier irgendwie aneinader vorbei? Wo willst du die 4 Bytes hernehmen? Wenn du in einem Programm in .NET eine float-Variable f hast, kannst du sie mit:
d=libnodave.toPLCFloat(f)
oder
i=libnodave.daveToPLCFloat(f)
in eine float oder int-Variable konvertieren.
Die Ergebnis-Variable enthält das Bit-Muster so wie es auch in der SPS stehen würde. Für .NET oder einen i386-Prozessor ist dieses Bitmuster sinnlos.
Es kann aber mittels BitConverter die 32 Bit als eine Folge von 4 bytes an daveWriteBytes als Puffer übergeben werden. Das ist in testMPI.cs beispielhaft interpretiert und bewirkt, daß der Wert, der vorher aus dem MD12 gelesesen, ins PC-Format konvertiert und dann um 1.1 erhöht wurde, wieder so in die SPS ggeschrieben wird, daß in MD12 der erhöhte Wert steht.
Hast du dir das angesehen? Es ausprobiert?
testMPI -w COM1
Weitergehende Operationen mit Puffern sind sinnvoll, wenn mehrere aufeinaderfolgende Werte "in einem Rutsch" in den Merkerbereich oder einen DB geschrieben werden sollen.
Beispiel:
MD 0 INT
MD 4 REAL
MD 8 REAL
MD 12 INT
Sollen auf die Werte 42, 5.5, 6.123, 17 gesetzt werden:
byte[] buffer = new buffer[16];
int i,j=42;
i=libnodave.daveSwapIed_32(j);
Array.Copy(buffer,0,BitConverter(i),GetBytes,0,4);
i=libnodave.daveToPLCFloat(5.5);
Array.Copy(buffer,4,BitConverter(i),GetBytes,0,4);
i=libnodave.daveToPLCFloat(6.123);
Array.Copy(buffer,8,BitConverter(i),GetBytes,0,4);
i=libnodave.daveSwapIed_32(17);
Array.Copy(buffer,12,BitConverter(i),GetBytes,0,4);
dc.WriteBytes(...0,16,buffer);
Das ist kein getesteter Code, aber so oder so ähnlich geht es.