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

poppycock

Level-1
Beiträge
253
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

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...
Code:
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
 
Code:
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! ;)
 
Danke, habe jetzt die Möglichkeit das zu testen.

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

Mit
Code:
Dim puffer(8) As Byte
funktioniert das nicht.

Ich will ja auch nur ein Bit setzen.
Schreib ich stattdessen
Code:
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?
 
Code:
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! ;)
Das mag die SPS nicht. Bits können nur einzeln geschrieben werden. Oder löst das libnodave auf?
 
Code:
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! ;)
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
Code:
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!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, eine 0 kommt in der SPS an! :p
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
Code:
Dim puffer(8) As Byte
und anschließend
Code:
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!
 
ES FUNKTIONIERT! *froi*

So geht's:

Code:
Dim puffer() As Byte = {"1"}
Code:
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?!
 
Probier's mal so:

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

Code:
[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
 
Zurück
Oben