# 2 Bits schreiben mit LibNoDave



## Earny (23 November 2008)

Hallo,
es gelingt mir nicht, zwei Bits gleichzeitig in die CPU mit Hilfe von LibNoDave zu schreiben. Wenn ich die Bits mit zwei einzelnen Anweisungen schreibe, klappts.

Was muss ich hier korrigieren, damit es funktioniert?
Ich will mit einem Aufruf den M30.0 einschalten und den M30.1 ausschalten.


```
[COLOR=#0000ff]Private[/COLOR] [COLOR=#0000ff]Sub[/COLOR] btnKugelhahnOeffnen_MouseDown([COLOR=#0000ff]ByVal[/COLOR] sender [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Object[/COLOR], _
[COLOR=#0000ff]ByVal[/COLOR] e [COLOR=#0000ff]As[/COLOR] System.Windows.Forms.MouseEventArgs) _
[COLOR=#0000ff]Handles[/COLOR] btnKugelhahnOeffnen.MouseDown
[COLOR=#0000ff]Dim[/COLOR] bits(1) [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Byte[/COLOR]
bits(0) = 1
bits(1) = 0
[COLOR=#008000]'M30.0 = 30x8 = 240; M30.1 = 30x8+1 = 241[/COLOR]
res = dc.writeBits(libnodave.daveFlags, 0, 240, 1, bits)
[COLOR=#0000ff]End[/COLOR] [COLOR=#0000ff]Sub[/COLOR]
```
 

Gruß
Earny


----------



## Rainer Hönle (23 November 2008)

Das Protokoll zur S7 gibt kein Schreiben von Arrays of Bits her. Bits können immer nur einzeln geschrieben werden.


----------



## Earny (23 November 2008)

Hallo Rainer,
mein alter OPC-Server kann das. Man kann mit einem einzigen Aufruf der Objekt-Methode S7Data1.ReadMultiVariables(..., ..., ..., ...) die Werte beliebiger Bits in einem Byte lesen.
Ich habe deshalb nochmal bei Hergenhahn nachgelesen. Es git eine FAQ.txt-Datei da steht auch drin, dass der gleichzeitige Zugriff auf mehrere Bits nicht funktioniert. Schade.

Gruß
Earny


----------



## Ralle (23 November 2008)

Wozu denn unbedingt Bits schreiben und lesen, man könnte in diesem Falle ja auch das Byte lesen, Änderungen vornehmen und das dann zurückschreiben. Vorausgesetzt, es passiert inzwischen nichts in der Steuerung. Aber das könnte man ja bei Bedarf auch sicherstellen, indem man die Schnittstelle (Daten) zwischen SPS und libnodave entsprechend gestaltet.


----------



## Rainer Hönle (23 November 2008)

@Ralle:
Das halte ich für äußerst gefährlich. Sicherzustellen, dass innerhalb dieser langen Kommunikationszeit (1 x Lesen und danach 1 x Schreiben) keines der anderen Bits von der SPS geändert wird ist in der Regel schwierig (außer es handelt sich um eine reine Schnittstelle PC -> SPS). Dann lieber zwei Schreibaufträge absetzen.


----------



## Ralle (23 November 2008)

Rainer Hönle schrieb:


> @Ralle:
> Das halte ich für äußerst gefährlich. Sicherzustellen, dass innerhalb dieser langen Kommunikationszeit (1 x Lesen und danach 1 x Schreiben) keines der anderen Bits von der SPS geändert wird ist in der Regel schwierig (außer es handelt sich um eine reine Schnittstelle PC -> SPS). Dann lieber zwei Schreibaufträge absetzen.



Da hast du völlig recht, daher auch der Hinweis, die Schnittstelle entsprechend zu gestalten, z.Bsp. einen Schreib- und einen Lesebereich etc.
Andererseits, wenn es nicht tausende Bits sind, geht das schon mit hintereinander schreiben.


----------



## Earny (23 November 2008)

Hallo Ralle,
hallo Rainer,
das Lesen und Schreiben von 2 oder mehreren Bits eines Bytes mit LibNoDave klappt jetzt. Ich Schreibe für jedes einzelne Bit einen Aufruf. Das kostet möglicherweise etwas Zeit bei der Kommunikation, aber ist doch sicherer, als wenn man ganze Bytes schreibt.

Jetzt habe ich aber noch Probleme mit dem Lesen von Wörtern. 

Gruß
Earny


----------



## Rainer Hönle (23 November 2008)

Und welches?


----------

