Array von Integerwerten mit LibNoDave schreiben

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
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
buf(i) = i
'BitConverter.GetBytes(libnodave.daveSwapIed_16(buf))
Next
res = dc.writeBytes(libnodave.daveDB, 1, 0, 200, buf)
End If
End Sub

Frohe Weihnachten
Earny
 
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.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Zurück
Oben