# Array von Integerwerten mit LibNoDave schreiben



## Earny (25 Dezember 2008)

Hallo,
wieder mal gibt es ein Problem mit LibNoDave. Ich will aus VB2005 heraus 100 Integerwerte in den DB1 der S7-CPU schreiben. Im DB1 habe ich eine Array von 100 Integerwerten angelegt.
Der nachfolgende Code schreibt auch 100 Werte in den DB1, aber nicht 0, 2, 4, 6, usw. wie gefordert, sondern 0, 512, 1024, 1536, usw.
Ich vermute, die VB-Short-Werte müssen noch Byteweise gedreht werden mit "libnodave.daveSwapIed_16(i)"
bevor sie in den DB1 geschrieben werden können.
Meine diesbezüglichen Versuche sind allerdings immer gescheitert. 



> Private Sub btnWerteInDB1Schreiben_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWerteInDB1Schreiben.Click
> Dim buf(198) As Byte, i As Short
> If fds.rfd > 0 Then
> For i = 0 To 198 Step 2
> ...


 
Frohe Weihnachten
Earny


----------



## Ralle (25 Dezember 2008)

Richtig, du mußt die Bytes tauschen!
Ich hab die Funktion noch nie genutzt, denn das kannst du doch auch selbst machen. buf ist doch byteweise organisiert, was hindert sich daran die Bytes selbst zu tauschen, du benötigt doch die libnodave-Funktion gar nicht dazu, sondern nur eine Hilfsvariable zum Zwischenmerken eines Bytes.

in der Schleife so etwa:



> Hilfsvar = buf(i)
> buf(i) = buf(i+1)
> buf(i+1) = Hilfsvar



Vielleicht gibts sogar ne einfachere Möglichkeit zum tauschen, aber so sollte es direkt mit buf gehen.


----------



## Question_mark (25 Dezember 2008)

*Wenn ich wollte, könnte ich. Aber ich will nicht*

Hallo,



			
				Ralle schrieb:
			
		

> denn das kannst du doch auch selbst machen.



Warum muss man immer alles selber machen ? Ein OPC-Client liefert mir zum Beispiel jedes S5/S7 Item als Datentyp Variant bereits im richtigen Format in der von mir benutzten Hochsprache.
Und der AGLink von Deltalogic hat bereits integrierte Funktionen zur Formatwandlung von Hause aus 'im Bauch'.
Vielleicht hat LibNoDave auch diese Funktionen drin ? Aber das wird hoffentlich der Zottel beantworten. Nach der heutigen, weihnachtlichen Fressorgie habe ich keine Lust mehr, selber nachzusehen 

Gruß

Question_mark


----------



## Earny (26 Dezember 2008)

Hallo Ralle,
hallo Question_mark,
mit der Hilfskonstruktion von Ralle hat es sofort funktioniert. Ich hatte vorher immer die LibNoDave-Funktionenen benutzt, um einzelene 16 Bit (Short), 32 Bit (Integer) und 32 Bit (Single) -Werte in die S7 zu schreiben. Die Bytes ließ ich von der entsprechenden LibNoDave-Funktion drehen.
Z.B. das Schreiben eines einzelnen Short-Wertes:


> res = dc.writeBytes(libnodave.daveFlags, 0, 22, 2, _
> BitConverter.GetBytes(libnodave.daveSwapIed_16(MW22)))


 
Die "libnodave.daveSwapIed_16(Short-Wert)"-Funktion dreht die Bytes, so dass sie in der S7 richtig ankommen (Little Endian nach Big Endian) 

Nur beim Schreiben eines Arrays wollte die Sache nicht klappen. Aber das hat sich ja nun erledigt.

Erstaunlicherweise ist die Dreherei beim Lesen von S7-Werten nicht erforderlich. 
Z.B. kann ich aus einem Datenbaustein ein Array von 100 Integerwerten lesen, ohne irgendwas zu drehen:
Ich benutze


> res = dc.readBytes(libnodave.daveDB, 1, 0, 200, buf)


und lese den Speicher mit 


> dc.getS16At(i * 2)


aus. Da muss nichts gedreht werden.
Ich hatte bisher vermutet, dass dies durch die getS16At( )-Funktion (und auch andere Lesefunktionen) von LibNoDave automatisch gemacht wird und nicht vom jeweiligen Adapter erledigt wird.
Erstaunlich bleibt, dass das beim Lesen aus der S7 automatisch passiert, beim Schreiben aber extra programmiert werden muss.
Hauptsache, es funktioniert!

Gruß
Earny 









Nur beim Schreiben


----------

