# Mehrere Bits gleichzeitig setzen bzw. rücksetzen



## funkey (13 Januar 2011)

Hallo.
Ich schaffe es nicht mittels daveWriteBits mehrere Bits gleichzeitig zu setzen, oder rückzusetzen. Ein Bit funktioniert tadellos, aber wenn ich 2 gleichzeitig setzen will funktioniert auch das erste nicht mehr. Das sollte doch möglich sein, zumindest gibtr es ja den Parameter 'len'.

Hat da jemand einen Tip für mich? Oder ein wirklich funktionierendes Beispiel in dem mehrere Bits gesetzt werden?

Danke.

Edit: Hab gerade in der faq.txt gefunden, dass das leider nicht möglich ist, schade! Der Parameter ist also umsonst.


----------



## SPSKILLER (14 Januar 2011)

hi,

dein Bild macht Kopfschmerz!


----------



## PN/DP (15 Januar 2011)

Hallo,

wenn die zu setzenden Bits im selben Byte/Word/Doppelword liegen, dann könntest Du das ganze Byte/Word/Doppelword schreiben. So ist vor allem gesichert, daß die Bits wirklich GLEICHZEITIG gesetzt werden.

Wenn die anderen Bits ihren unbekannten Zustand behalten sollen, dann könntest Du zuerst das Byte/Word/Doppelword auslesen, die gewünschten Bits setzen, und dann wieder zurückschreiben. So machen das viele Operatorpanels (Stichwort: Bit_setzen_in_Variable). Weil dabei aber Zeit vergeht zwischen dem lesen und dem zurückschreiben, muß dafür gesorgt werden, daß sich der Wert in der SPS in dieser Zeit nicht ändert - also am besten die Variable in der SPS grundsätzlich nur gelesen wird.

Wenn es auf das GLEICHZEITIG ankommt und die Bits mehr als 4 Byte auseinander liegen, dann müßtest Du zunächst den Datenbereich mit den Bits in einen Puffer in der SPS schreiben und danach ein "Übernehmen"-Bit setzen, woraufhin das SPS-Programm die Bits aus dem Puffer zur eigentlichen Speicherstelle kopiert. Stichworte: Rezepturen + SchreibeDatensatz oder implementiere ein eigenes Protokoll mit Handshake. Oder setze überhaupt nur 1 Signal-Bit und das SPS-Programm setzt daraufhin die gewünschten Bits.

PS: Nachdem ich Dein Benutzerbild weggescrollt hatte, konnte ich Deinen Beitrag relativ kopfschmerzfrei lesen. 

Harald


----------



## rostiger Nagel (15 Januar 2011)

Wenn ich auf das Bild schaue denke ich die ganze Zeit, was ich
gestern gesoffen habe


----------



## Thomas_v2.1 (15 Januar 2011)

PN/DP schrieb:


> wenn die zu setzenden Bits im selben Byte/Word/Doppelword liegen, dann könntest Du das ganze Byte/Word/Doppelword schreiben. So ist vor allem gesichert, daß die Bits wirklich GLEICHZEITIG gesetzt werden.
> 
> Wenn die anderen Bits ihren unbekannten Zustand behalten sollen, dann könntest Du zuerst das Byte/Word/Doppelword auslesen, die gewünschten Bits setzen, und dann wieder zurückschreiben. So machen das viele Operatorpanels (Stichwort: Bit_setzen_in_Variable). Weil dabei aber Zeit vergeht zwischen dem lesen und dem zurückschreiben, muß dafür gesorgt werden, daß sich der Wert in der SPS in dieser Zeit nicht ändert - also am besten die Variable in der SPS grundsätzlich nur gelesen wird.



Und was hat das Geschriebene mit libnodave und Bits setzen zu tun?

Um mit libnodave mehrere Bits (und hier werden nur einzelne Bits gesetzt, das ist kein Byte/Word-Ausmaskier-Gebastel) in einem Telegramm zu setzen, muss du mit PrepareRequest arbeiten.

Beispiel für den Programmablauf:


```
int setVal = 1;

// Telegramm vorbereiten
davePrepareWriteRequest(dc, &p);

// In Telegramm das Setzen von DB1.DBX1.0 eintragen
daveAddBitVarToWriteRequest(&p, daveDB, 1, 8, 1, &setVal);

// In Telegramm das Setzen von DB1.DBX1.2 eintragen
daveAddBitVarToWriteRequest(&p, daveDB, 1, 10, 1, &setVal);

// Telegramm abschicken
daveExecWriteRequest(dc, &p, &rs);
```


----------



## funkey (18 Januar 2011)

Vielen Dank für die Antworten.

Fazit der Sache ist, dass die Funktion 'daveWriteBits' eigentlich 'daveWriteBit' heißen sollte und ich werde mir deshalb Dank der Anweisungen von Thomas_v2.1 eine richtige 'daveWriteBits'-Funktion schreiben, der ein Array übergeben werden kann.


----------

