# Bit in der SPS setzen mit VB.net 2008 und libnodave



## poppycock (9 Juni 2009)

Hallo,

ich habe gestern eine kleine Visualisierung in VB.net 2008 programmiert.
Mit libnodave kann ich wunderbar Daten aus einem DB auslesen.

Jetzt möchte ich aber auch ein Bit in der SPS setzen, wenn ich einen Button in der Visu drücke.
Wie man libnodave dafür einsetzt, steht ja hier: http://www.sps-forum.de/showpost.php?p=201372&postcount=6

*Ich habe ein Problem, wie ich das in VB.net lösen kann.*
Man muss doch beim Klick auf den Button eine "1" in einen Sendepuffer schreiben, die ich dann mittels daveWriteBytes zur SPS an die richtige Adresse schicke?!
Muss der Sendepuffer danach wieder gelöscht werden?
Beispielsweise möchte ich mit Klick auf einen Button in die Adresse DB51.DBX3.2 eine "1" reinschreiben.
Leider weiß ich nicht, wie ich das in VB.net lösen kann.

Kann mir da mal bitte jemand unter die Arme greifen?
Möchte noch anmerken, dass ich erst seit gestern engeren Kontakt mit VB.net und libnodave habe.

Vielen Dank,
poppycock


----------



## Human (9 Juni 2009)

Um nur ein Bit in der SPS zu setzen würde ich die Funktion daveWriteBits nehmen, weil du damit einfch nur das eine Bit setzten/rücksetzen kannst und nicht das ganze Byte überschreibst.

Den Sendepuffer musst du nicht löschen, sondern einfach beim nächsten Mal das überschreiben, was du dann wieder an die SPS sendest!


----------



## poppycock (9 Juni 2009)

Hallo!



Human schrieb:


> Um nur ein Bit in der SPS zu setzen würde ich die Funktion daveWriteBits nehmen, weil du damit einfch nur das eine Bit setzten/rücksetzen kannst und nicht das ganze Byte überschreibst.



Das klingt logisch, aber in der Doku habe ich nichts von daveWriteBits gefunden.
Gibt es eine Codezeile in VB.net, die diese Funktion verdeutlicht?

So geht das bestimmt nicht?! Habe gerade keine Möglichkeit zu testen...

```
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
dc.daveWriteBits(libnodave.daveDB, 51, 3, 2, puffer)
End Sub
```
Gruß,
poppycock


----------



## Human (9 Juni 2009)

```
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
daveWriteBits(dc,libnodave.daveDB, 51, 3, 2, puffer)
End Sub
```
 
So dürfte das eigentlich gehen, dann schreibst du ab DB51.DBX 0.3 2 Bit!


----------



## poppycock (9 Juni 2009)

Danke, habe jetzt die Möglichkeit das zu testen.

Hab nun aber ein neues Problem:
Wie deklariere ich "puffer"?

Mit

```
Dim puffer(8) As Byte
```
funktioniert das nicht.

Ich will ja auch nur ein Bit setzen.
Schreib ich stattdessen

```
Dim puffer As Boolean = True
```
kommt die Fehlermeldung "Der Wert vom Typ "Boolean" kann nicht in '1-dimensionales Array von Byte' konvertiert werden."

Hast du eine Idee?


----------



## Human (9 Juni 2009)

Da musst du auch einen Pointer übergeben... such mal nach Pointer und VB.net, dann wirst du fündig!


----------



## Rainer Hönle (9 Juni 2009)

Human schrieb:


> ```
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> daveWriteBits(dc,libnodave.daveDB, 51, 3, 2, puffer)
> End Sub
> ...


Das mag die SPS nicht. Bits können nur einzeln geschrieben werden. Oder löst das libnodave auf?


----------



## poppycock (9 Juni 2009)

Human schrieb:


> ```
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> daveWriteBits(dc,libnodave.daveDB, 51, 3, 2, puffer)
> End Sub
> ...


Ich hatte gedacht, dass man mit der 3 das Byte und mit der 2 das Bit angibt.
Ich will nur ein Bit setzen, also wäre

```
daveWriteBits(dc,libnodave.daveDB, 51, 3, [U][B]1[/B][/U], puffer)
```
wohl richtig.

Ich bin noch nicht wegen den Pointern fündig geworden. Wenn ich aber ein * mit angebe, wird die Fehlermeldung "Der *-Operator ist für die Typen '1-dimensionales Array von Byte' und 'Object' nicht definiert." ausgegeben.

Bitte um Hilfe, danke!


----------



## poppycock (9 Juni 2009)

Also, eine 0 kommt in der SPS an! 
Jetzt weiß ich wenigstens, dass ich die korrekte Adresse beschreibe und die Kommunikations "irgendwie" funktioniert.

Aber wie schreibe ich eine 1 in den Datenbaustein?
Mit

```
Dim puffer(8) As Byte
```
und anschließend

```
puffer = 1
daveWriteBits(dc,libnodave.daveDB, 51, 3, 1, puffer)
```
funktioniert nicht, da mir die 1 als Integer angezeigt wird. Puffer kann nur als Byte behandelt werden.

Pointer gibt es in VB.net nicht mehr direkt.
Ich steh aufm Schlauch und bitte um Hilfe!


----------



## poppycock (9 Juni 2009)

*ES FUNKTIONIERT! *froi**

So geht's:


```
Dim puffer() As Byte = {"1"}
```


```
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        dc.writeBits(libnodave.daveDB, 51, 3, 1, puffer)
End Sub
```
Vielleicht hilft es ja dem ein oder anderen, der auch dieses Problem hatte?!


----------



## Human (9 Juni 2009)

Rainer Hönle schrieb:


> Das mag die SPS nicht. Bits können nur einzeln geschrieben werden. Oder löst das libnodave auf?


 
Ich hab das ehrlich gesagt noch nie ausprobiert, aber ich denke mal nicht, dass die Länge da umsonst mit drinnen ist.


----------



## Rainer Hönle (9 Juni 2009)

Human schrieb:


> Ich hab das ehrlich gesagt noch nie ausprobiert, aber ich denke mal nicht, dass die Länge da umsonst mit drinnen ist.



Nicht umsonst. Die anderen Operandengrößen (Byte, Wort, Doppelwort) können da Werte größer 1 enthalten.


----------



## Manni01 (17 Juni 2009)

*Probier's mal so:*

Hier 2 .NET-Funktionen zum setzen und abfragen einzelner Bit's in einem Byte (z.B. dem Sendepuffer):


```
[COLOR=#0000ff][COLOR=#0000ff]Public[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Shared[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Function[/COLOR][/COLOR] SetBit([COLOR=#0000ff][COLOR=#0000ff]ByRef[/COLOR][/COLOR] Byt [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR], [COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] Bit [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Integer[/COLOR][/COLOR], [COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] State [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Boolean[/COLOR][/COLOR]) [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Boolean[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]Try[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]If[/COLOR][/COLOR] Bit > 7 [COLOR=#0000ff][COLOR=#0000ff]Then[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Return[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]False[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]Dim[/COLOR][/COLOR] OrMask [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR] = [COLOR=#0000ff][COLOR=#0000ff]CType[/COLOR][/COLOR](&H1 << Bit, [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR])
[COLOR=#0000ff][COLOR=#0000ff]Dim[/COLOR][/COLOR] AndMask [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR] = [COLOR=#0000ff][COLOR=#0000ff]CType[/COLOR][/COLOR](&HFF [COLOR=#0000ff][COLOR=#0000ff]Xor[/COLOR][/COLOR] OrMask, [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR])
[COLOR=#0000ff][COLOR=#0000ff]If[/COLOR][/COLOR] State = [COLOR=#0000ff][COLOR=#0000ff]True[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Then[/COLOR]
[/COLOR]Byt = Byt [COLOR=#0000ff][COLOR=#0000ff]Or[/COLOR][/COLOR] OrMask
[COLOR=#0000ff][COLOR=#0000ff]Return[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]True[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]Else[/COLOR]
[/COLOR]Byt = Byt [COLOR=#0000ff][COLOR=#0000ff]And[/COLOR][/COLOR] AndMask
[COLOR=#0000ff][COLOR=#0000ff]Return[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]True[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]End[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]If[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]Catch[/COLOR][/COLOR] ex [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] Exception
[COLOR=#0000ff][COLOR=#0000ff]Return[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]False[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]End[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Try[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]End[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Function[/COLOR][/COLOR]
[COLOR=#0000ff]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]Public[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Shared[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Function[/COLOR][/COLOR] GetBit([COLOR=#0000ff][COLOR=#0000ff]ByRef[/COLOR][/COLOR] Byt [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR], [COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] Bit [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Integer[/COLOR][/COLOR]) [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Boolean[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]Try[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]If[/COLOR][/COLOR] Bit > 7 [COLOR=#0000ff][COLOR=#0000ff]Then[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Return[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]False[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]Dim[/COLOR][/COLOR] AndMask [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR] = [COLOR=#0000ff][COLOR=#0000ff]CType[/COLOR][/COLOR](&H1 << Bit, [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR])
[COLOR=#0000ff][COLOR=#0000ff]Return[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]CType[/COLOR][/COLOR](((Byt [COLOR=#0000ff][COLOR=#0000ff]And[/COLOR][/COLOR] AndMask) >> Bit) [COLOR=#0000ff][COLOR=#0000ff]And[/COLOR][/COLOR] &H1, [COLOR=#0000ff][COLOR=#0000ff]Boolean[/COLOR][/COLOR])
[COLOR=#0000ff][COLOR=#0000ff]Catch[/COLOR][/COLOR] ex [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] Exception
[COLOR=#0000ff][COLOR=#0000ff]Return[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]False[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]End[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Try[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]End[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Function[/COLOR]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]End[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Class[/COLOR]
[/COLOR]
```
 
Viele Grüße,
Manni


----------

